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

Artifact 89e569b263535662f54b537eb9118b2c554ae7aa:


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 2c 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 20 20 69 6e 74 20 6e 50 72  ray */.  int nPr
3f40: 65 66 69 78 52 65 67 20 20 20 20 20 20 20 20 20  efixReg         
3f50: 2f 2a 20 4e 6f 2e 20 6f 66 20 72 65 67 20 70 72  /* No. of reg pr
3f60: 69 6f 72 20 74 6f 20 72 65 67 44 61 74 61 20 61  ior to regData a
3f70: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
3f80: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
3f90: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
3fa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6d            /* Stm
3fc0: 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
3fd0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 53  tion */.  int bS
3fe0: 65 71 20 3d 20 28 28 70 53 6f 72 74 2d 3e 73 6f  eq = ((pSort->so
3ff0: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
4000: 41 47 5f 55 73 65 53 6f 72 74 65 72 29 3d 3d 30  AG_UseSorter)==0
4010: 29 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d  );.  int nExpr =
4020: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
4030: 2d 3e 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20  ->nExpr;        
4040: 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20        /* No. of 
4050: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a  ORDER BY terms *
4060: 2f 0a 20 20 69 6e 74 20 6e 42 61 73 65 20 3d 20  /.  int nBase = 
4070: 6e 45 78 70 72 20 2b 20 62 53 65 71 20 2b 20 6e  nExpr + bSeq + n
4080: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
4090: 20 20 20 20 20 2f 2a 20 46 69 65 6c 64 73 20 69       /* Fields i
40a0: 6e 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  n sorter record 
40b0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65  */.  int regBase
40c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
40d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40e0: 20 20 20 20 20 20 2f 2a 20 52 65 67 73 20 66 6f        /* Regs fo
40f0: 72 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  r sorter record 
4100: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  */.  int regReco
4110: 72 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rd = ++pParse->n
4120: 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
4130: 20 20 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c        /* Assembl
4140: 65 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  ed sorter record
4150: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74   */.  int nOBSat
4160: 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74   = pSort->nOBSat
4170: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4180: 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20         /* ORDER 
4190: 42 59 20 74 65 72 6d 73 20 74 6f 20 73 6b 69 70  BY terms to skip
41a0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f           /* Opco
41d0: 64 65 20 74 6f 20 61 64 64 20 73 6f 72 74 65 72  de to add sorter
41e0: 20 72 65 63 6f 72 64 20 74 6f 20 73 6f 72 74 65   record to sorte
41f0: 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
4200: 62 53 65 71 3d 3d 30 20 7c 7c 20 62 53 65 71 3d  bSeq==0 || bSeq=
4210: 3d 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 72 65  =1 );.  if( nPre
4220: 66 69 78 52 65 67 20 29 7b 0a 20 20 20 20 61 73  fixReg ){.    as
4230: 73 65 72 74 28 20 6e 50 72 65 66 69 78 52 65 67  sert( nPrefixReg
4240: 3d 3d 6e 45 78 70 72 2b 62 53 65 71 20 29 3b 0a  ==nExpr+bSeq );.
4250: 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 72 65      regBase = re
4260: 67 44 61 74 61 20 2d 20 6e 45 78 70 72 20 2d 20  gData - nExpr - 
4270: 62 53 65 71 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  bSeq;.  }else{. 
4280: 20 20 20 72 65 67 42 61 73 65 20 3d 20 70 50 61     regBase = pPa
4290: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
42a0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
42b0: 2b 3d 20 6e 42 61 73 65 3b 0a 20 20 7d 0a 20 20  += nBase;.  }.  
42c0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
42d0: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
42e0: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c  pSort->pOrderBy,
42f0: 20 72 65 67 42 61 73 65 2c 20 53 51 4c 49 54 45   regBase, SQLITE
4300: 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20 69 66  _ECEL_DUP);.  if
4310: 28 20 62 53 65 71 20 29 7b 0a 20 20 20 20 73 71  ( bSeq ){.    sq
4320: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
4330: 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20  v, OP_Sequence, 
4340: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c  pSort->iECursor,
4350: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b   regBase+nExpr);
4360: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 72 65 66  .  }.  if( nPref
4370: 69 78 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ixReg==0 ){.    
4380: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4390: 33 28 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20 72 65  3(v, OP_Move, re
43a0: 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e  gData, regBase+n
43b0: 45 78 70 72 2b 62 53 65 71 2c 20 6e 44 61 74 61  Expr+bSeq, nData
43c0: 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
43d0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
43e0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
43f0: 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42  gBase+nOBSat, nB
4400: 61 73 65 2d 6e 4f 42 53 61 74 2c 20 72 65 67 52  ase-nOBSat, regR
4410: 65 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 6e 4f  ecord);.  if( nO
4420: 42 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e  BSat>0 ){.    in
4430: 74 20 72 65 67 50 72 65 76 4b 65 79 3b 20 20 20  t regPrevKey;   
4440: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 6e 4f 42  /* The first nOB
4450: 53 61 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  Sat columns of t
4460: 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20  he previous row 
4470: 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 46  */.    int addrF
4480: 69 72 73 74 3b 20 20 20 20 2f 2a 20 41 64 64 72  irst;    /* Addr
4490: 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 49 66  ess of the OP_If
44a0: 4e 6f 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  Not opcode */.  
44b0: 20 20 69 6e 74 20 61 64 64 72 4a 6d 70 3b 20 20    int addrJmp;  
44c0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
44d0: 66 20 74 68 65 20 4f 50 5f 4a 75 6d 70 20 6f 70  f the OP_Jump op
44e0: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 56 64 62 65  code */.    Vdbe
44f0: 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 2f 2a  Op *pOp;      /*
4500: 20 4f 70 63 6f 64 65 20 74 68 61 74 20 6f 70 65   Opcode that ope
4510: 6e 73 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f  ns the sorter */
4520: 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20  .    int nKey;  
4530: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4540: 20 6f 66 20 73 6f 72 74 69 6e 67 20 6b 65 79 20   of sorting key 
4550: 63 6f 6c 75 6d 6e 73 2c 20 69 6e 63 6c 75 64 69  columns, includi
4560: 6e 67 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 2a  ng OP_Sequence *
4570: 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  /.    KeyInfo *p
4580: 4b 49 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  KI;     /* Origi
4590: 6e 61 6c 20 4b 65 79 49 6e 66 6f 20 6f 6e 20 74  nal KeyInfo on t
45a0: 68 65 20 73 6f 72 74 65 72 20 74 61 62 6c 65 20  he sorter table 
45b0: 2a 2f 0a 0a 20 20 20 20 72 65 67 50 72 65 76 4b  */..    regPrevK
45c0: 65 79 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ey = pParse->nMe
45d0: 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
45e0: 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e  >nMem += pSort->
45f0: 6e 4f 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65 79  nOBSat;.    nKey
4600: 20 3d 20 6e 45 78 70 72 20 2d 20 70 53 6f 72 74   = nExpr - pSort
4610: 2d 3e 6e 4f 42 53 61 74 20 2b 20 62 53 65 71 3b  ->nOBSat + bSeq;
4620: 0a 20 20 20 20 69 66 28 20 62 53 65 71 20 29 7b  .    if( bSeq ){
4630: 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73 74  .      addrFirst
4640: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
4650: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
4660: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29  , regBase+nExpr)
4670: 3b 20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ; .    }else{.  
4680: 20 20 20 20 61 64 64 72 46 69 72 73 74 20 3d 20      addrFirst = 
4690: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
46a0: 31 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  1(v, OP_Sequence
46b0: 54 65 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43  Test, pSort->iEC
46c0: 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20  ursor);.    }.  
46d0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
46e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
46f0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
4700: 6f 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76 4b  ompare, regPrevK
4710: 65 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53 6f  ey, regBase, pSo
4720: 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20  rt->nOBSat);.   
4730: 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
4740: 62 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74  beGetOp(v, pSort
4750: 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  ->addrSortIndex)
4760: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  ;.    if( pParse
4770: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
4780: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ed ) return;.   
4790: 20 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79 20   pOp->p2 = nKey 
47a0: 2b 20 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b 49  + nData;.    pKI
47b0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49   = pOp->p4.pKeyI
47c0: 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  nfo;.    memset(
47d0: 70 4b 49 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c  pKI->aSortOrder,
47e0: 20 30 2c 20 70 4b 49 2d 3e 6e 46 69 65 6c 64 29   0, pKI->nField)
47f0: 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50 5f 4a 75  ; /* Makes OP_Ju
4800: 6d 70 20 62 65 6c 6f 77 20 74 65 73 74 61 62 6c  mp below testabl
4810: 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  e */.    sqlite3
4820: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
4830: 2d 31 2c 20 28 63 68 61 72 2a 29 70 4b 49 2c 20  -1, (char*)pKI, 
4840: 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
4850: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
4860: 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
4870: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
4880: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c  pSort->pOrderBy,
4890: 20 6e 4f 42 53 61 74 2c 20 31 29 3b 0a 20 20 20   nOBSat, 1);.   
48a0: 20 61 64 64 72 4a 6d 70 20 3d 20 73 71 6c 69 74   addrJmp = sqlit
48b0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
48c0: 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(v);.    sqlite
48d0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
48e0: 50 5f 4a 75 6d 70 2c 20 61 64 64 72 4a 6d 70 2b  P_Jump, addrJmp+
48f0: 31 2c 20 30 2c 20 61 64 64 72 4a 6d 70 2b 31 29  1, 0, addrJmp+1)
4900: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
4910: 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e 6c 61  );.    pSort->la
4920: 62 65 6c 42 6b 4f 75 74 20 3d 20 73 71 6c 69 74  belBkOut = sqlit
4930: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
4940: 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e 72  v);.    pSort->r
4950: 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
4960: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
4970: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
4980: 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53  (v, OP_Gosub, pS
4990: 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  ort->regReturn, 
49a0: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
49b0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
49c0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
49d0: 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70 53 6f  ResetSorter, pSo
49e0: 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20  rt->iECursor);. 
49f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
4a00: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 46 69  mpHere(v, addrFi
4a10: 72 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rst);.    sqlite
4a20: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4a30: 50 5f 4d 6f 76 65 2c 20 72 65 67 42 61 73 65 2c  P_Move, regBase,
4a40: 20 72 65 67 50 72 65 76 4b 65 79 2c 20 70 53 6f   regPrevKey, pSo
4a50: 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20  rt->nOBSat);.   
4a60: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
4a70: 48 65 72 65 28 76 2c 20 61 64 64 72 4a 6d 70 29  Here(v, addrJmp)
4a80: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72  ;.  }.  if( pSor
4a90: 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53  t->sortFlags & S
4aa0: 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65  ORTFLAG_UseSorte
4ab0: 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50  r ){.    op = OP
4ac0: 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 3b 0a 20  _SorterInsert;. 
4ad0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d   }else{.    op =
4ae0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 3b 0a 20   OP_IdxInsert;. 
4af0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
4b00: 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 70 53  AddOp2(v, op, pS
4b10: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72  ort->iECursor, r
4b20: 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 69 66 28  egRecord);.  if(
4b30: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
4b40: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
4b50: 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 69 6e  1, addr2;.    in
4b60: 74 20 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69 66  t iLimit;.    if
4b70: 28 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73  ( pSelect->iOffs
4b80: 65 74 20 29 7b 0a 20 20 20 20 20 20 69 4c 69 6d  et ){.      iLim
4b90: 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f  it = pSelect->iO
4ba0: 66 66 73 65 74 2b 31 3b 0a 20 20 20 20 7d 65 6c  ffset+1;.    }el
4bb0: 73 65 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74  se{.      iLimit
4bc0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d   = pSelect->iLim
4bd0: 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64  it;.    }.    ad
4be0: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
4bf0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
4c00: 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29 3b 20 56  Zero, iLimit); V
4c10: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
4c20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4c30: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
4c40: 6d 6d 2c 20 69 4c 69 6d 69 74 2c 20 2d 31 29 3b  mm, iLimit, -1);
4c50: 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c  .    addr2 = sql
4c60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
4c70: 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20  , OP_Goto);.    
4c80: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
4c90: 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
4ca0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4cb0: 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73 74 2c  dOp1(v, OP_Last,
4cc0: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
4cd0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4ce0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44  beAddOp1(v, OP_D
4cf0: 65 6c 65 74 65 2c 20 70 53 6f 72 74 2d 3e 69 45  elete, pSort->iE
4d00: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c  Cursor);.    sql
4d10: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
4d20: 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 7d 0a  (v, addr2);.  }.
4d30: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64  }../*.** Add cod
4d40: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
4d50: 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61  he OFFSET.*/.sta
4d60: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66  tic void codeOff
4d70: 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  set(.  Vdbe *v, 
4d80: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
4d90: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
4da0: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
4db0: 69 4f 66 66 73 65 74 2c 20 20 20 20 20 20 2f 2a  iOffset,      /*
4dc0: 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
4dd0: 67 20 74 68 65 20 6f 66 66 73 65 74 20 63 6f 75  g the offset cou
4de0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43  nter */.  int iC
4df0: 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a  ontinue     /* J
4e00: 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
4e10: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63   the current rec
4e20: 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ord */.){.  if( 
4e30: 69 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20  iOffset>0 ){.   
4e40: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 61   int addr;.    a
4e50: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
4e60: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
4e70: 4e 65 67 2c 20 69 4f 66 66 73 65 74 2c 20 30 2c  Neg, iOffset, 0,
4e80: 20 2d 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61   -1); VdbeCovera
4e90: 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
4ea0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4eb0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e  OP_Goto, 0, iCon
4ec0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65  tinue);.    Vdbe
4ed0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69  Comment((v, "ski
4ee0: 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72 64 73  p OFFSET records
4ef0: 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
4f00: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
4f10: 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  addr);.  }.}../*
4f20: 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61  .** Add code tha
4f30: 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20  t will check to 
4f40: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20  make sure the N 
4f50: 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
4f60: 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f  ng at iMem.** fo
4f70: 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e  rm a distinct en
4f80: 74 72 79 2e 20 20 69 54 61 62 20 69 73 20 61 20  try.  iTab is a 
4f90: 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68  sorting index th
4fa0: 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75  at holds previou
4fb0: 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62  sly.** seen comb
4fc0: 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  inations of the 
4fd0: 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77  N values.  A new
4fe0: 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69   entry is made i
4ff0: 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65  n iTab.** if the
5000: 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65   current N value
5010: 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a  s are new..**.**
5020: 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52   A jump to addrR
5030: 65 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e  epeat is made an
5040: 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73  d the N+1 values
5050: 20 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d   are popped from
5060: 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66   the.** stack if
5070: 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65   the top N eleme
5080: 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74  nts are not dist
5090: 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  inct..*/.static 
50a0: 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63  void codeDistinc
50b0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
50c0: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
50d0: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
50e0: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
50f0: 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20  /.  int iTab,   
5100: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74         /* A sort
5110: 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74  ing index used t
5120: 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69  o test for disti
5130: 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74  nctness */.  int
5140: 20 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20   addrRepeat,    
5150: 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20  /* Jump to here 
5160: 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20  if not distinct 
5170: 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  */.  int N,     
5180: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5190: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  r of elements */
51a0: 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20  .  int iMem     
51b0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65        /* First e
51c0: 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56  lement */.){.  V
51d0: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31  dbe *v;.  int r1
51e0: 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  ;..  v = pParse-
51f0: 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73  >pVdbe;.  r1 = s
5200: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
5210: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
5220: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
5230: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54  (v, OP_Found, iT
5240: 61 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20  ab, addrRepeat, 
5250: 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65 43 6f  iMem, N); VdbeCo
5260: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
5270: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5280: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
5290: 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20   iMem, N, r1);. 
52a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
52b0: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
52c0: 72 74 2c 20 69 54 61 62 2c 20 72 31 29 3b 0a 20  rt, iTab, r1);. 
52d0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
52e0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
52f0: 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  1);.}..#ifndef S
5300: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
5310: 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  ERY./*.** Genera
5320: 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  te an error mess
5330: 61 67 65 20 77 68 65 6e 20 61 20 53 45 4c 45 43  age when a SELEC
5340: 54 20 69 73 20 75 73 65 64 20 77 69 74 68 69 6e  T is used within
5350: 20 61 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e   a subexpression
5360: 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a 20 20 22  .** (example:  "
5370: 61 20 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46  a IN (SELECT * F
5380: 52 4f 4d 20 74 61 62 6c 65 29 22 29 20 62 75 74  ROM table)") but
5390: 20 69 74 20 68 61 73 20 6d 6f 72 65 20 74 68 61   it has more tha
53a0: 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a 20 63 6f  n 1 result.** co
53b0: 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20 74 68 69  lumn.  We do thi
53c0: 73 20 69 6e 20 61 20 73 75 62 72 6f 75 74 69 6e  s in a subroutin
53d0: 65 20 62 65 63 61 75 73 65 20 74 68 65 20 65 72  e because the er
53e0: 72 6f 72 20 75 73 65 64 20 74 6f 20 6f 63 63 75  ror used to occu
53f0: 72 0a 2a 2a 20 69 6e 20 6d 75 6c 74 69 70 6c 65  r.** in multiple
5400: 20 70 6c 61 63 65 73 2e 20 20 28 54 68 65 20 65   places.  (The e
5410: 72 72 6f 72 20 6f 6e 6c 79 20 6f 63 63 75 72 73  rror only occurs
5420: 20 69 6e 20 6f 6e 65 20 70 6c 61 63 65 20 6e 6f   in one place no
5430: 77 2c 20 62 75 74 20 77 65 0a 2a 2a 20 72 65 74  w, but we.** ret
5440: 61 69 6e 20 74 68 65 20 73 75 62 72 6f 75 74 69  ain the subrouti
5450: 6e 65 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 63  ne to minimize c
5460: 6f 64 65 20 64 69 73 72 75 70 74 69 6f 6e 2e 29  ode disruption.)
5470: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
5480: 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75  heckForMultiColu
5490: 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 0a 20  mnSelectError(. 
54a0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
54b0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
54c0: 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20 53 65 6c  ontext. */.  Sel
54d0: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
54e0: 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e    /* Destination
54f0: 20 6f 66 20 53 45 4c 45 43 54 20 72 65 73 75 6c   of SELECT resul
5500: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70  ts */.  int nExp
5510: 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r            /* 
5520: 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  Number of result
5530: 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65   columns returne
5540: 64 20 62 79 20 53 45 4c 45 43 54 20 2a 2f 0a 29  d by SELECT */.)
5550: 7b 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20  {.  int eDest = 
5560: 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20  pDest->eDest;.  
5570: 69 66 28 20 6e 45 78 70 72 3e 31 20 26 26 20 28  if( nExpr>1 && (
5580: 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c  eDest==SRT_Mem |
5590: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74  | eDest==SRT_Set
55a0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
55b0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
55c0: 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20   "only a single 
55d0: 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66  result allowed f
55e0: 6f 72 20 22 0a 20 20 20 20 20 20 20 22 61 20 53  or ".       "a S
55f0: 45 4c 45 43 54 20 74 68 61 74 20 69 73 20 70 61  ELECT that is pa
5600: 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
5610: 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ion");.    retur
5620: 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n 1;.  }else{.  
5630: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
5640: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
5650: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
5660: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
5670: 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f  for the inside o
5680: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
5690: 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e  .** of a SELECT.
56a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62  .**.** If srcTab
56b0: 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
56c0: 65 6e 20 74 68 65 20 70 45 4c 69 73 74 20 65 78  en the pEList ex
56d0: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65  pressions.** are
56e0: 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72   evaluated in or
56f0: 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 64  der to get the d
5700: 61 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77  ata for this row
5710: 2e 20 20 49 66 20 73 72 63 54 61 62 20 69 73 0a  .  If srcTab is.
5720: 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 2c  ** zero or more,
5730: 20 74 68 65 6e 20 64 61 74 61 20 69 73 20 70 75   then data is pu
5740: 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62  lled from srcTab
5750: 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75   and pEList is u
5760: 73 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20  sed only .** to 
5770: 67 65 74 20 6e 75 6d 62 65 72 20 63 6f 6c 75 6d  get number colum
5780: 6e 73 20 61 6e 64 20 74 68 65 20 64 61 74 61 74  ns and the datat
5790: 79 70 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  ype for each col
57a0: 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  umn..*/.static v
57b0: 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  oid selectInnerL
57c0: 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  oop(.  Parse *pP
57d0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
57e0: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
57f0: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
5800: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
5810: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74    /* The complet
5820: 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
5830: 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  nt being coded *
5840: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
5850: 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c  List,       /* L
5860: 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20 62 65  ist of values be
5870: 69 6e 67 20 65 78 74 72 61 63 74 65 64 20 2a 2f  ing extracted */
5880: 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20  .  int srcTab,  
5890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75             /* Pu
58a0: 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69  ll data from thi
58b0: 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 6f 72  s table */.  Sor
58c0: 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20  tCtx *pSort,    
58d0: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
58e0: 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77  ULL, info on how
58f0: 20 74 6f 20 70 72 6f 63 65 73 73 20 4f 52 44 45   to process ORDE
5900: 52 20 42 59 20 2a 2f 0a 20 20 44 69 73 74 69 6e  R BY */.  Distin
5910: 63 74 43 74 78 20 2a 70 44 69 73 74 69 6e 63 74  ctCtx *pDistinct
5920: 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c  , /* If not NULL
5930: 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  , info on how to
5940: 20 70 72 6f 63 65 73 73 20 44 49 53 54 49 4e 43   process DISTINC
5950: 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  T */.  SelectDes
5960: 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f  t *pDest,      /
5970: 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
5980: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   of the results 
5990: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  */.  int iContin
59a0: 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ue,          /* 
59b0: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e  Jump here to con
59c0: 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20  tinue with next 
59d0: 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72  row */.  int iBr
59e0: 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  eak             
59f0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
5a00: 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
5a10: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a  e inner loop */.
5a20: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
5a30: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
5a40: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73  int i;.  int has
5a50: 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  Distinct;       
5a60: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
5a70: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
5a80: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
5a90: 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b 20   int regResult; 
5aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5ab0: 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20  Start of memory 
5ac0: 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 73  holding result s
5ad0: 65 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  et */.  int eDes
5ae0: 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74  t = pDest->eDest
5af0: 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69  ;   /* How to di
5b00: 73 70 6f 73 65 20 6f 66 20 72 65 73 75 6c 74 73  spose of results
5b10: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20   */.  int iParm 
5b20: 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  = pDest->iSDParm
5b30: 3b 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d  ; /* First argum
5b40: 65 6e 74 20 74 6f 20 64 69 73 70 6f 73 61 6c 20  ent to disposal 
5b50: 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20  method */.  int 
5b60: 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20  nResultCol;     
5b70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5b80: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
5b90: 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72  mns */.  int nPr
5ba0: 65 66 69 78 52 65 67 20 3d 20 30 3b 20 20 20 20  efixReg = 0;    
5bb0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5bc0: 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  f extra register
5bd0: 73 20 62 65 66 6f 72 65 20 72 65 67 52 65 73 75  s before regResu
5be0: 6c 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  lt */..  assert(
5bf0: 20 76 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20   v );.  assert( 
5c00: 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 68  pEList!=0 );.  h
5c10: 61 73 44 69 73 74 69 6e 63 74 20 3d 20 70 44 69  asDistinct = pDi
5c20: 73 74 69 6e 63 74 20 3f 20 70 44 69 73 74 69 6e  stinct ? pDistin
5c30: 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 3a 20  ct->eTnctType : 
5c40: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e  WHERE_DISTINCT_N
5c50: 4f 4f 50 3b 0a 20 20 69 66 28 20 70 53 6f 72 74  OOP;.  if( pSort
5c60: 20 26 26 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65   && pSort->pOrde
5c70: 72 42 79 3d 3d 30 20 29 20 70 53 6f 72 74 20 3d  rBy==0 ) pSort =
5c80: 20 30 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 3d   0;.  if( pSort=
5c90: 3d 30 20 26 26 20 21 68 61 73 44 69 73 74 69 6e  =0 && !hasDistin
5ca0: 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ct ){.    assert
5cb0: 28 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29  ( iContinue!=0 )
5cc0: 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74  ;.    codeOffset
5cd0: 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  (v, p->iOffset, 
5ce0: 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a  iContinue);.  }.
5cf0: 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72  .  /* Pull the r
5d00: 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73  equested columns
5d10: 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65 73 75 6c 74  ..  */.  nResult
5d20: 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  Col = pEList->nE
5d30: 78 70 72 3b 0a 0a 20 20 69 66 28 20 70 44 65 73  xpr;..  if( pDes
5d40: 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20  t->iSdst==0 ){. 
5d50: 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a     if( pSort ){.
5d60: 20 20 20 20 20 20 6e 50 72 65 66 69 78 52 65 67        nPrefixReg
5d70: 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72   = pSort->pOrder
5d80: 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
5d90: 20 69 66 28 20 21 28 70 53 6f 72 74 2d 3e 73 6f   if( !(pSort->so
5da0: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
5db0: 41 47 5f 55 73 65 53 6f 72 74 65 72 29 20 29 20  AG_UseSorter) ) 
5dc0: 6e 50 72 65 66 69 78 52 65 67 2b 2b 3b 0a 20 20  nPrefixReg++;.  
5dd0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
5de0: 20 2b 3d 20 6e 50 72 65 66 69 78 52 65 67 3b 0a   += nPrefixReg;.
5df0: 20 20 20 20 7d 0a 20 20 20 20 70 44 65 73 74 2d      }.    pDest-
5e00: 3e 69 53 64 73 74 20 3d 20 70 50 61 72 73 65 2d  >iSdst = pParse-
5e10: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
5e20: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
5e30: 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65  sultCol;.  }else
5e40: 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73   if( pDest->iSds
5e50: 74 2b 6e 52 65 73 75 6c 74 43 6f 6c 20 3e 20 70  t+nResultCol > p
5e60: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20  Parse->nMem ){. 
5e70: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e     /* This is an
5e80: 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e   error condition
5e90: 20 74 68 61 74 20 63 61 6e 20 72 65 73 75 6c 74   that can result
5ea0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77  , for example, w
5eb0: 68 65 6e 20 61 20 53 45 4c 45 43 54 0a 20 20 20  hen a SELECT.   
5ec0: 20 2a 2a 20 6f 6e 20 74 68 65 20 72 69 67 68 74   ** on the right
5ed0: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 6e  -hand side of an
5ee0: 20 49 4e 53 45 52 54 20 63 6f 6e 74 61 69 6e 73   INSERT contains
5ef0: 20 6d 6f 72 65 20 72 65 73 75 6c 74 20 63 6f 6c   more result col
5f00: 75 6d 6e 73 20 74 68 61 6e 0a 20 20 20 20 2a 2a  umns than.    **
5f10: 20 74 68 65 72 65 20 61 72 65 20 63 6f 6c 75 6d   there are colum
5f20: 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ns in the table 
5f30: 6f 6e 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68  on the left.  Th
5f40: 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20  e error will be 
5f50: 63 61 75 67 68 74 0a 20 20 20 20 2a 2a 20 61 6e  caught.    ** an
5f60: 64 20 72 65 70 6f 72 74 65 64 20 6c 61 74 65 72  d reported later
5f70: 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 20 74  .  But we need t
5f80: 6f 20 6d 61 6b 65 20 73 75 72 65 20 65 6e 6f 75  o make sure enou
5f90: 67 68 20 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c  gh memory is all
5fa0: 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 74 6f  ocated.    ** to
5fb0: 20 61 76 6f 69 64 20 6f 74 68 65 72 20 73 70 75   avoid other spu
5fc0: 72 69 6f 75 73 20 65 72 72 6f 72 73 20 69 6e 20  rious errors in 
5fd0: 74 68 65 20 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f  the meantime. */
5fe0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
5ff0: 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  m += nResultCol;
6000: 0a 20 20 7d 0a 20 20 70 44 65 73 74 2d 3e 6e 53  .  }.  pDest->nS
6010: 64 73 74 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  dst = nResultCol
6020: 3b 0a 20 20 72 65 67 52 65 73 75 6c 74 20 3d 20  ;.  regResult = 
6030: 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20  pDest->iSdst;.  
6040: 69 66 28 20 73 72 63 54 61 62 3e 3d 30 20 29 7b  if( srcTab>=0 ){
6050: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
6060: 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29  nResultCol; i++)
6070: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
6080: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6090: 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20  Column, srcTab, 
60a0: 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 29 3b  i, regResult+i);
60b0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
60c0: 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 45 4c  nt((v, "%s", pEL
60d0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
60e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
60f0: 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f   if( eDest!=SRT_
6100: 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a  Exists ){.    /*
6110: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
6120: 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53  ion is an EXISTS
6130: 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
6140: 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20  , the actual.   
6150: 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72   ** values retur
6160: 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43  ned by the SELEC
6170: 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72  T are not requir
6180: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
6190: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
61a0: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
61b0: 45 4c 69 73 74 2c 20 72 65 67 52 65 73 75 6c 74  EList, regResult
61c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
61d0: 20 20 20 20 28 65 44 65 73 74 3d 3d 53 52 54 5f      (eDest==SRT_
61e0: 4f 75 74 70 75 74 7c 7c 65 44 65 73 74 3d 3d 53  Output||eDest==S
61f0: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 29 3f 53 51  RT_Coroutine)?SQ
6200: 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 3a 30 29  LITE_ECEL_DUP:0)
6210: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
6220: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
6230: 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74 20  ord was present 
6240: 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  on the SELECT st
6250: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64  atement.  ** and
6260: 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62 65   this row has be
6270: 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20  en seen before, 
6280: 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65  then do not make
6290: 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70   this row.  ** p
62a0: 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c  art of the resul
62b0: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61  t..  */.  if( ha
62c0: 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
62d0: 20 73 77 69 74 63 68 28 20 70 44 69 73 74 69 6e   switch( pDistin
62e0: 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 29 7b  ct->eTnctType ){
62f0: 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
6300: 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
6310: 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64  ED: {.        Vd
6320: 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20  beOp *pOp;      
6330: 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67        /* No long
6340: 65 72 20 72 65 71 75 69 72 65 64 20 4f 70 65 6e  er required Open
6350: 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e  Ephemeral instr.
6360: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
6370: 69 4a 75 6d 70 3b 20 20 20 20 20 20 20 20 20 20  iJump;          
6380: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74      /* Jump dest
6390: 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ination */.     
63a0: 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20     int regPrev; 
63b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
63c0: 65 76 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74 65  evious row conte
63d0: 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f  nt */..        /
63e0: 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
63f0: 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75   for the previou
6400: 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20  s row */.       
6410: 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72 73   regPrev = pPars
6420: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20  e->nMem+1;.     
6430: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
6440: 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a  += nResultCol;..
6450: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67          /* Chang
6460: 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  e the OP_OpenEph
6470: 65 6d 65 72 61 6c 20 63 6f 64 65 64 20 65 61 72  emeral coded ear
6480: 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e 75  lier to an OP_Nu
6490: 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  ll.        ** se
64a0: 74 73 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61 72  ts the MEM_Clear
64b0: 65 64 20 62 69 74 20 6f 6e 20 74 68 65 20 66 69  ed bit on the fi
64c0: 72 73 74 20 72 65 67 69 73 74 65 72 20 6f 66 20  rst register of 
64d0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  the.        ** p
64e0: 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e 20 20  revious value.  
64f0: 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20  This will cause 
6500: 74 68 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77 20  the OP_Ne below 
6510: 74 6f 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20  to always.      
6520: 20 20 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68 65    ** fail on the
6530: 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
6540: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 65 76 65   of the loop eve
6550: 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20  n if the first. 
6560: 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 69 73         ** row is
6570: 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20 20   all NULLs..    
6580: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
6590: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
65a0: 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69  ToNoop(v, pDisti
65b0: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
65c0: 20 20 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71          pOp = sq
65d0: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
65e0: 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64  , pDistinct->add
65f0: 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20  rTnct);.        
6600: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
6610: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  _Null;.        p
6620: 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20 20  Op->p1 = 1;.    
6630: 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72 65      pOp->p2 = re
6640: 67 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 20 20  gPrev;..        
6650: 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56  iJump = sqlite3V
6660: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
6670: 29 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a  ) + nResultCol;.
6680: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
6690: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69   i<nResultCol; i
66a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 43  ++){.          C
66b0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
66c0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
66d0: 65 71 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  eq(pParse, pELis
66e0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
66f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
6700: 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 20 29 7b 0a  nResultCol-1 ){.
6710: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
6720: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6730: 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73 75 6c   OP_Ne, regResul
6740: 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65 67 50  t+i, iJump, regP
6750: 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20  rev+i);.        
6760: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
6770: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  (v);.          }
6780: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
6790: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
67a0: 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65  Op3(v, OP_Eq, re
67b0: 67 52 65 73 75 6c 74 2b 69 2c 20 69 43 6f 6e 74  gResult+i, iCont
67c0: 69 6e 75 65 2c 20 72 65 67 50 72 65 76 2b 69 29  inue, regPrev+i)
67d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64  ;.            Vd
67e0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
67f0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6800: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6810: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
6820: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
6830: 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
6840: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
6850: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
6860: 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  (v, SQLITE_NULLE
6870: 51 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  Q);.        }.  
6880: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
6890: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
68a0: 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d 70 20 7c  Addr(v)==iJump |
68b0: 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
68c0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
68d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
68e0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
68f0: 70 79 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72  py, regResult, r
6900: 65 67 50 72 65 76 2c 20 6e 52 65 73 75 6c 74 43  egPrev, nResultC
6910: 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 62  ol-1);.        b
6920: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
6930: 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
6940: 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a  DISTINCT_UNIQUE:
6950: 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
6960: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
6970: 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d  op(v, pDistinct-
6980: 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20  >addrTnct);.    
6990: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
69a0: 20 7d 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c   }..      defaul
69b0: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 61 73 73  t: {.        ass
69c0: 65 72 74 28 20 70 44 69 73 74 69 6e 63 74 2d 3e  ert( pDistinct->
69d0: 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52 45  eTnctType==WHERE
69e0: 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45  _DISTINCT_UNORDE
69f0: 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 63  RED );.        c
6a00: 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72  odeDistinct(pPar
6a10: 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 74  se, pDistinct->t
6a20: 61 62 54 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75  abTnct, iContinu
6a30: 65 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72  e, nResultCol, r
6a40: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
6a50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6a60: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
6a70: 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pSort==0 ){.    
6a80: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
6a90: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e  p->iOffset, iCon
6aa0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20  tinue);.    }.  
6ab0: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  }..  switch( eDe
6ac0: 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  st ){.    /* In 
6ad0: 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65  this mode, write
6ae0: 20 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75   each query resu
6af0: 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66  lt to the key of
6b00: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
6b10: 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72     ** table iPar
6b20: 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  m..    */.#ifnde
6b30: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
6b40: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
6b50: 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e    case SRT_Union
6b60: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
6b70: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
6b80: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
6b90: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
6ba0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6bb0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
6bc0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
6bd0: 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a 20 20  sultCol, r1);.  
6be0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6bf0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
6c00: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
6c10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6c20: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
6c30: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
6c40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
6c50: 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74      /* Construct
6c60: 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74   a record from t
6c70: 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c  he query result,
6c80: 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   but instead of.
6c90: 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68      ** saving th
6ca0: 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69  at record, use i
6cb0: 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65  t as a key to de
6cc0: 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72  lete elements fr
6cd0: 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65  om.    ** the te
6ce0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
6cf0: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  arm..    */.    
6d00: 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a  case SRT_Except:
6d10: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
6d20: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6d30: 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 50 61 72  _IdxDelete, iPar
6d40: 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  m, regResult, nR
6d50: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
6d60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
6d70: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
6d80: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
6d90: 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ECT */..    /* S
6da0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
6db0: 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20  as data using a 
6dc0: 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20  unique key..    
6dd0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
6de0: 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20 53  Fifo:.    case S
6df0: 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a 20 20 20  RT_DistFifo:.   
6e00: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
6e10: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
6e20: 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
6e30: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
6e40: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
6e50: 72 73 65 2c 20 6e 50 72 65 66 69 78 52 65 67 2b  rse, nPrefixReg+
6e60: 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
6e70: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54  se( eDest==SRT_T
6e80: 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65  able );.      te
6e90: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
6ea0: 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20  RT_EphemTab );. 
6eb0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6ec0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
6ed0: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
6ee0: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20  lt, nResultCol, 
6ef0: 72 31 2b 6e 50 72 65 66 69 78 52 65 67 29 3b 0a  r1+nPrefixReg);.
6f00: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6f10: 4d 49 54 5f 43 54 45 0a 20 20 20 20 20 20 69 66  MIT_CTE.      if
6f20: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
6f30: 74 46 69 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  tFifo ){.       
6f40: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
6f50: 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74 46 69  nation is DistFi
6f60: 66 6f 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20  fo, then cursor 
6f70: 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65  (iParm+1) is ope
6f80: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20  n.        ** on 
6f90: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  an ephemeral ind
6fa0: 65 78 2e 20 49 66 20 74 68 65 20 63 75 72 72 65  ex. If the curre
6fb0: 6e 74 20 72 6f 77 20 69 73 20 61 6c 72 65 61 64  nt row is alread
6fc0: 79 20 70 72 65 73 65 6e 74 0a 20 20 20 20 20 20  y present.      
6fd0: 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65    ** in the inde
6fe0: 78 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  x, do not write 
6ff0: 69 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  it to the output
7000: 2e 20 49 66 20 6e 6f 74 2c 20 61 64 64 20 74 68  . If not, add th
7010: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72  e.        ** cur
7020: 72 65 6e 74 20 72 6f 77 20 74 6f 20 74 68 65 20  rent row to the 
7030: 69 6e 64 65 78 20 61 6e 64 20 70 72 6f 63 65 65  index and procee
7040: 64 20 77 69 74 68 20 77 72 69 74 69 6e 67 20 69  d with writing i
7050: 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  t to the.       
7060: 20 2a 2a 20 6f 75 74 70 75 74 20 74 61 62 6c 65   ** output table
7070: 20 61 73 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20   as well.  */.  
7080: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
7090: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
70a0: 65 6e 74 41 64 64 72 28 76 29 20 2b 20 34 3b 0a  entAddr(v) + 4;.
70b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
70c0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
70d0: 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b  OP_Found, iParm+
70e0: 31 2c 20 61 64 64 72 2c 20 72 31 2c 20 30 29 3b  1, addr, r1, 0);
70f0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
7100: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7110: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7120: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
7130: 72 6d 2b 31 2c 20 72 31 29 3b 0a 20 20 20 20 20  rm+1, r1);.     
7140: 20 20 20 61 73 73 65 72 74 28 20 70 53 6f 72 74     assert( pSort
7150: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23  ==0 );.      }.#
7160: 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
7170: 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  pSort ){.       
7180: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
7190: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70  pParse, pSort, p
71a0: 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65 67 2c  , r1+nPrefixReg,
71b0: 20 31 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b   1, nPrefixReg);
71c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
71d0: 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73        int r2 = s
71e0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
71f0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
7200: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7210: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
7220: 69 64 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a  id, iParm, r2);.
7230: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7240: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
7250: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
7260: 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20  1, r2);.        
7270: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
7280: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
7290: 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73  PEND);.        s
72a0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
72b0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
72c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
72d0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
72e0: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
72f0: 72 31 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31  r1, nPrefixReg+1
7300: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7310: 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
7320: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
7330: 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  ERY.    /* If we
7340: 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20   are creating a 
7350: 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72  set for an "expr
7360: 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
7370: 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20  " construct,.   
7380: 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73   ** then there s
7390: 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c  hould be a singl
73a0: 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74  e item on the st
73b0: 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73  ack.  Write this
73c0: 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74  .    ** item int
73d0: 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20  o the set table 
73e0: 77 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e  with bogus data.
73f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
7400: 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
7410: 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c    assert( nResul
7420: 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20  tCol==1 );.     
7430: 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20   pDest->affSdst 
7440: 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
7450: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61      sqlite3Compa
7460: 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c 69 73  reAffinity(pELis
7470: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70  t->a[0].pExpr, p
7480: 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a  Dest->affSdst);.
7490: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
74a0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74  ){.        /* At
74b0: 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f   first glance yo
74c0: 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65  u would think we
74d0: 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20   could optimize 
74e0: 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20 20 20  out the.        
74f0: 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74  ** ORDER BY in t
7500: 68 69 73 20 63 61 73 65 20 73 69 6e 63 65 20 74  his case since t
7510: 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72  he order of entr
7520: 69 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20  ies in the set. 
7530: 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e         ** does n
7540: 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20  ot matter.  But 
7550: 74 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 61  there might be a
7560: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69   LIMIT clause, i
7570: 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20  n which.        
7580: 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64 65  ** case the orde
7590: 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f  r does matter */
75a0: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
75b0: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
75c0: 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73  pSort, p, regRes
75d0: 75 6c 74 2c 20 31 2c 20 6e 50 72 65 66 69 78 52  ult, 1, nPrefixR
75e0: 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
75f0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31  {.        int r1
7600: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7610: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
7620: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7630: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
7640: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
7650: 75 6c 74 2c 31 2c 72 31 2c 20 26 70 44 65 73 74  ult,1,r1, &pDest
7660: 2d 3e 61 66 66 53 64 73 74 2c 20 31 29 3b 0a 20  ->affSdst, 1);. 
7670: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
7680: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
7690: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
76a0: 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20  gResult, 1);.   
76b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
76c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
76d0: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
76e0: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
76f0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
7700: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
7710: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
7720: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
7730: 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69  * If any row exi
7740: 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  st in the result
7750: 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61   set, record tha
7760: 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74  t fact and abort
7770: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
7780: 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a  e SRT_Exists: {.
7790: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
77a0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
77b0: 74 65 67 65 72 2c 20 31 2c 20 69 50 61 72 6d 29  teger, 1, iParm)
77c0: 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;.      /* The L
77d0: 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c  IMIT clause will
77e0: 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
77f0: 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
7800: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7810: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
7820: 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c   is a scalar sel
7830: 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74  ect that is part
7840: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
7850: 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73  n, then.    ** s
7860: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
7870: 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69   in the appropri
7880: 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  ate memory cell 
7890: 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20  and break out.  
78a0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e    ** of the scan
78b0: 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
78c0: 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
78d0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
78e0: 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b  nResultCol==1 );
78f0: 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74  .      if( pSort
7900: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68   ){.        push
7910: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
7920: 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67  e, pSort, p, reg
7930: 52 65 73 75 6c 74 2c 20 31 2c 20 6e 50 72 65 66  Result, 1, nPref
7940: 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65  ixReg);.      }e
7950: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
7960: 65 72 74 28 20 72 65 67 52 65 73 75 6c 74 3d 3d  ert( regResult==
7970: 69 50 61 72 6d 20 29 3b 0a 20 20 20 20 20 20 20  iParm );.       
7980: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
7990: 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f  ause will jump o
79a0: 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66  ut of the loop f
79b0: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d  or us */.      }
79c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
79d0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    }.#endif /* #i
79e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
79f0: 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20  T_SUBQUERY */.. 
7a00: 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f     case SRT_Coro
7a10: 75 74 69 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20  utine:       /* 
7a20: 53 65 6e 64 20 64 61 74 61 20 74 6f 20 61 20 63  Send data to a c
7a30: 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20  o-routine */.   
7a40: 20 63 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74   case SRT_Output
7a50: 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  : {        /* Re
7a60: 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 73  turn the results
7a70: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
7a80: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  se( eDest==SRT_C
7a90: 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20  oroutine );.    
7aa0: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
7ab0: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
7ac0: 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74  .      if( pSort
7ad0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68   ){.        push
7ae0: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
7af0: 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67  e, pSort, p, reg
7b00: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
7b10: 6f 6c 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b  ol, nPrefixReg);
7b20: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
7b30: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
7b40: 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20  utine ){.       
7b50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7b60: 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
7b70: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b  pDest->iSDParm);
7b80: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7b90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7ba0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
7bb0: 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75  sultRow, regResu
7bc0: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  lt, nResultCol);
7bd0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7be0: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
7bf0: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
7c00: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
7c10: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  ltCol);.      }.
7c20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7c30: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
7c40: 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
7c50: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 73  /* Write the res
7c60: 75 6c 74 73 20 69 6e 74 6f 20 61 20 70 72 69 6f  ults into a prio
7c70: 72 69 74 79 20 71 75 65 75 65 20 74 68 61 74 20  rity queue that 
7c80: 69 73 20 6f 72 64 65 72 20 61 63 63 6f 72 64 69  is order accordi
7c90: 6e 67 20 74 6f 0a 20 20 20 20 2a 2a 20 70 44 65  ng to.    ** pDe
7ca0: 73 74 2d 3e 70 4f 72 64 65 72 42 79 20 28 69 6e  st->pOrderBy (in
7cb0: 20 70 53 4f 29 2e 20 20 70 44 65 73 74 2d 3e 69   pSO).  pDest->i
7cc0: 53 44 50 61 72 6d 20 28 69 6e 20 69 50 61 72 6d  SDParm (in iParm
7cd0: 29 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20  ) is the cursor 
7ce0: 66 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e  for an.    ** in
7cf0: 64 65 78 20 77 69 74 68 20 70 53 4f 2d 3e 6e 45  dex with pSO->nE
7d00: 78 70 72 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20 20  xpr+2 columns.  
7d10: 42 75 69 6c 64 20 61 20 6b 65 79 20 75 73 69 6e  Build a key usin
7d20: 67 20 70 53 4f 20 66 6f 72 20 74 68 65 20 66 69  g pSO for the fi
7d30: 72 73 74 0a 20 20 20 20 2a 2a 20 70 53 4f 2d 3e  rst.    ** pSO->
7d40: 6e 45 78 70 72 20 63 6f 6c 75 6d 6e 73 2c 20 74  nExpr columns, t
7d50: 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 61 6c  hen make sure al
7d60: 6c 20 6b 65 79 73 20 61 72 65 20 75 6e 69 71 75  l keys are uniqu
7d70: 65 20 62 79 20 61 64 64 69 6e 67 20 61 0a 20 20  e by adding a.  
7d80: 20 20 2a 2a 20 66 69 6e 61 6c 20 4f 50 5f 53 65    ** final OP_Se
7d90: 71 75 65 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20 20  quence column.  
7da0: 54 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  The last column 
7db0: 69 73 20 74 68 65 20 72 65 63 6f 72 64 20 61 73  is the record as
7dc0: 20 61 20 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a   a blob..    */.
7dd0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73      case SRT_Dis
7de0: 74 51 75 65 75 65 3a 0a 20 20 20 20 63 61 73 65  tQueue:.    case
7df0: 20 53 52 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20   SRT_Queue: {.  
7e00: 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20      int nKey;.  
7e10: 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20      int r1, r2, 
7e20: 72 33 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  r3;.      int ad
7e30: 64 72 54 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  drTest = 0;.    
7e40: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 53 4f 3b    ExprList *pSO;
7e50: 0a 20 20 20 20 20 20 70 53 4f 20 3d 20 70 44 65  .      pSO = pDe
7e60: 73 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  st->pOrderBy;.  
7e70: 20 20 20 20 61 73 73 65 72 74 28 20 70 53 4f 20      assert( pSO 
7e80: 29 3b 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d 20  );.      nKey = 
7e90: 70 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pSO->nExpr;.    
7ea0: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
7eb0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
7ec0: 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
7ed0: 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
7ee0: 28 70 50 61 72 73 65 2c 20 6e 4b 65 79 2b 32 29  (pParse, nKey+2)
7ef0: 3b 0a 20 20 20 20 20 20 72 33 20 3d 20 72 32 2b  ;.      r3 = r2+
7f00: 6e 4b 65 79 2b 31 3b 0a 20 20 20 20 20 20 69 66  nKey+1;.      if
7f10: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
7f20: 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20  tQueue ){.      
7f30: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74    /* If the dest
7f40: 69 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74 51  ination is DistQ
7f50: 75 65 75 65 2c 20 74 68 65 6e 20 63 75 72 73 6f  ueue, then curso
7f60: 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f  r (iParm+1) is o
7f70: 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  pen.        ** o
7f80: 6e 20 61 20 73 65 63 6f 6e 64 20 65 70 68 65 6d  n a second ephem
7f90: 65 72 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20  eral index that 
7fa0: 68 6f 6c 64 73 20 61 6c 6c 20 76 61 6c 75 65 73  holds all values
7fb0: 20 65 76 65 72 79 20 70 72 65 76 69 6f 75 73 6c   every previousl
7fc0: 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64  y.        ** add
7fd0: 65 64 20 74 6f 20 74 68 65 20 71 75 65 75 65 2e  ed to the queue.
7fe0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 64 64 72   */.        addr
7ff0: 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Test = sqlite3Vd
8000: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
8010: 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31  P_Found, iParm+1
8020: 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
8030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
8050: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
8060: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 56 64  Col);.        Vd
8070: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
8080: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
8090: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
80a0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
80b0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
80c0: 75 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a 20 20 20  ultCol, r3);.   
80d0: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
80e0: 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20  T_DistQueue ){. 
80f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8100: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
8110: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b  dxInsert, iParm+
8120: 31 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20  1, r3);.        
8130: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
8140: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53  eP5(v, OPFLAG_US
8150: 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20  ESEEKRESULT);.  
8160: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
8170: 69 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b  i=0; i<nKey; i++
8180: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8190: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
81a0: 4f 50 5f 53 43 6f 70 79 2c 0a 20 20 20 20 20 20  OP_SCopy,.      
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81c0: 20 20 20 20 72 65 67 52 65 73 75 6c 74 20 2b 20      regResult + 
81d0: 70 53 4f 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f  pSO->a[i].u.x.iO
81e0: 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 2c 0a 20  rderByCol - 1,. 
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8200: 20 20 20 20 20 20 20 20 20 72 32 2b 69 29 3b 0a           r2+i);.
8210: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
8220: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8230: 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20  v, OP_Sequence, 
8240: 69 50 61 72 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b  iParm, r2+nKey);
8250: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8260: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
8270: 61 6b 65 52 65 63 6f 72 64 2c 20 72 32 2c 20 6e  akeRecord, r2, n
8280: 4b 65 79 2b 32 2c 20 72 31 29 3b 0a 20 20 20 20  Key+2, r1);.    
8290: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
82a0: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
82b0: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b  ert, iParm, r1);
82c0: 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72 54  .      if( addrT
82d0: 65 73 74 20 29 20 73 71 6c 69 74 65 33 56 64 62  est ) sqlite3Vdb
82e0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
82f0: 72 54 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71  rTest);.      sq
8300: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
8310: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
8320: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
8330: 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
8340: 50 61 72 73 65 2c 20 72 32 2c 20 6e 4b 65 79 2b  Parse, r2, nKey+
8350: 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  2);.      break;
8360: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
8370: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
8380: 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69   */....#if !defi
8390: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
83a0: 54 52 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20  TRIGGER).    /* 
83b0: 44 69 73 63 61 72 64 20 74 68 65 20 72 65 73 75  Discard the resu
83c0: 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  lts.  This is us
83d0: 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74  ed for SELECT st
83e0: 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a  atements inside.
83f0: 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20      ** the body 
8400: 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20 20 54  of a TRIGGER.  T
8410: 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75  he purpose of su
8420: 63 68 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f  ch selects is to
8430: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65   call.    ** use
8440: 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
8450: 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 73 69  ons that have si
8460: 64 65 20 65 66 66 65 63 74 73 2e 20 20 57 65 20  de effects.  We 
8470: 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20  do not care.    
8480: 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63 74  ** about the act
8490: 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74  ual results of t
84a0: 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a  he select..    *
84b0: 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  /.    default: {
84c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
84d0: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72  Dest==SRT_Discar
84e0: 64 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d );.      break
84f0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
8500: 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f   }..  /* Jump to
8510: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
8520: 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49  loop if the LIMI
8530: 54 20 69 73 20 72 65 61 63 68 65 64 2e 20 20 45  T is reached.  E
8540: 78 63 65 70 74 2c 20 69 66 0a 20 20 2a 2a 20 74  xcept, if.  ** t
8550: 68 65 72 65 20 69 73 20 61 20 73 6f 72 74 65 72  here is a sorter
8560: 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  , in which case 
8570: 74 68 65 20 73 6f 72 74 65 72 20 68 61 73 20 61  the sorter has a
8580: 6c 72 65 61 64 79 20 6c 69 6d 69 74 65 64 0a 20  lready limited. 
8590: 20 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 20 66   ** the output f
85a0: 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  or us..  */.  if
85b0: 28 20 70 53 6f 72 74 3d 3d 30 20 26 26 20 70 2d  ( pSort==0 && p-
85c0: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  >iLimit ){.    s
85d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
85e0: 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70  (v, OP_IfZero, p
85f0: 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  ->iLimit, iBreak
8600: 2c 20 2d 31 29 3b 20 56 64 62 65 43 6f 76 65 72  , -1); VdbeCover
8610: 61 67 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  age(v);.  }.}../
8620: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
8630: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73  KeyInfo object s
8640: 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e  ufficient for an
8650: 20 69 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20   index of N key 
8660: 63 6f 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58  columns and.** X
8670: 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a   extra columns..
8680: 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69  */.KeyInfo *sqli
8690: 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
86a0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
86b0: 20 4e 2c 20 69 6e 74 20 58 29 7b 0a 20 20 4b 65   N, int X){.  Ke
86c0: 79 49 6e 66 6f 20 2a 70 20 3d 20 73 71 6c 69 74  yInfo *p = sqlit
86d0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 30  e3DbMallocZero(0
86e0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
86f0: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 4b 65 79        sizeof(Key
8700: 49 6e 66 6f 29 20 2b 20 28 4e 2b 58 29 2a 28 73  Info) + (N+X)*(s
8710: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b  izeof(CollSeq*)+
8720: 31 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  1));.  if( p ){.
8730: 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65      p->aSortOrde
8740: 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 43 6f  r = (u8*)&p->aCo
8750: 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20 20 20 70 2d 3e  ll[N+X];.    p->
8760: 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 4e 3b  nField = (u16)N;
8770: 0a 20 20 20 20 70 2d 3e 6e 58 46 69 65 6c 64 20  .    p->nXField 
8780: 3d 20 28 75 31 36 29 58 3b 0a 20 20 20 20 70 2d  = (u16)X;.    p-
8790: 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a  >enc = ENC(db);.
87a0: 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a      p->db = db;.
87b0: 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b      p->nRef = 1;
87c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62  .  }else{.    db
87d0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
87e0: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
87f0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61   p;.}../*.** Dea
8800: 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66  llocate a KeyInf
8810: 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64  o object.*/.void
8820: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
8830: 6e 72 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29  nref(KeyInfo *p)
8840: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
8850: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66   assert( p->nRef
8860: 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  >0 );.    p->nRe
8870: 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  f--;.    if( p->
8880: 6e 52 65 66 3d 3d 30 20 29 20 73 71 6c 69 74 65  nRef==0 ) sqlite
8890: 33 44 62 46 72 65 65 28 30 2c 20 70 29 3b 0a 20  3DbFree(0, p);. 
88a0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
88b0: 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 20 74   a new pointer t
88c0: 6f 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  o a KeyInfo obje
88d0: 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73  ct.*/.KeyInfo *s
88e0: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66  qlite3KeyInfoRef
88f0: 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20  (KeyInfo *p){.  
8900: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73  if( p ){.    ass
8910: 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29  ert( p->nRef>0 )
8920: 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b  ;.    p->nRef++;
8930: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
8940: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
8950: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65  E_DEBUG./*.** Re
8960: 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 20 4b  turn TRUE if a K
8970: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 61  eyInfo object ca
8980: 6e 20 62 65 20 63 68 61 6e 67 65 2e 20 20 54 68  n be change.  Th
8990: 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  e KeyInfo object
89a0: 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  .** can only be 
89b0: 63 68 61 6e 67 65 64 20 69 66 20 74 68 69 73 20  changed if this 
89c0: 69 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65  is just a single
89d0: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
89e0: 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  e object..**.** 
89f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
8a00: 75 73 65 64 20 6f 6e 6c 79 20 69 6e 73 69 64 65  used only inside
8a10: 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61   of assert() sta
8a20: 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20  tements..*/.int 
8a30: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
8a40: 57 72 69 74 65 61 62 6c 65 28 4b 65 79 49 6e 66  Writeable(KeyInf
8a50: 6f 20 2a 70 29 7b 20 72 65 74 75 72 6e 20 70 2d  o *p){ return p-
8a60: 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23 65 6e 64  >nRef==1; }.#end
8a70: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
8a80: 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  UG */../*.** Giv
8a90: 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  en an expression
8aa0: 20 6c 69 73 74 2c 20 67 65 6e 65 72 61 74 65 20   list, generate 
8ab0: 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
8ac0: 75 72 65 20 74 68 61 74 20 72 65 63 6f 72 64 73  ure that records
8ad0: 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  .** the collatin
8ae0: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65  g sequence for e
8af0: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ach expression i
8b00: 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  n that expressio
8b10: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  n list..**.** If
8b20: 20 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73   the ExprList is
8b30: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20   an ORDER BY or 
8b40: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
8b50: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 69  then the resulti
8b60: 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74  ng.** KeyInfo st
8b70: 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f  ructure is appro
8b80: 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69  priate for initi
8b90: 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61  alizing a virtua
8ba0: 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d  l index to.** im
8bb0: 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 63 6c 61  plement that cla
8bc0: 75 73 65 2e 20 20 49 66 20 74 68 65 20 45 78 70  use.  If the Exp
8bd0: 72 4c 69 73 74 20 69 73 20 74 68 65 20 72 65 73  rList is the res
8be0: 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c  ult set of a SEL
8bf0: 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  ECT.** then the 
8c00: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
8c10: 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  e is appropriate
8c20: 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e   for initializin
8c30: 67 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69  g a virtual.** i
8c40: 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  ndex to implemen
8c50: 74 20 61 20 44 49 53 54 49 4e 43 54 20 74 65 73  t a DISTINCT tes
8c60: 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  t..**.** Space t
8c70: 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e  o hold the KeyIn
8c80: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
8c90: 6f 62 74 61 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c  obtain from mall
8ca0: 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  oc.  The calling
8cb0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
8cc0: 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
8cd0: 73 65 65 69 6e 67 20 74 68 61 74 20 74 68 69 73  seeing that this
8ce0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76   structure is ev
8cf0: 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65  entually.** free
8d00: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79  d..*/.static Key
8d10: 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f  Info *keyInfoFro
8d20: 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  mExprList(.  Par
8d30: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
8d40: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
8d50: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
8d60: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
8d70: 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65 79 49 6e  * Form the KeyIn
8d80: 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74  fo object from t
8d90: 68 69 73 20 45 78 70 72 4c 69 73 74 20 2a 2f 0a  his ExprList */.
8da0: 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20 20 20    int iStart,   
8db0: 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20         /* Begin 
8dc0: 77 69 74 68 20 74 68 69 73 20 63 6f 6c 75 6d 6e  with this column
8dd0: 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69   of pList */.  i
8de0: 6e 74 20 6e 45 78 74 72 61 20 20 20 20 20 20 20  nt nExtra       
8df0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20      /* Add this 
8e00: 6d 61 6e 79 20 65 78 74 72 61 20 63 6f 6c 75 6d  many extra colum
8e10: 6e 73 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f  ns to the end */
8e20: 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b  .){.  int nExpr;
8e30: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66  .  KeyInfo *pInf
8e40: 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  o;.  struct Expr
8e50: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
8e60: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
8e70: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
8e80: 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20  int i;..  nExpr 
8e90: 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
8ea0: 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65    pInfo = sqlite
8eb0: 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
8ec0: 2c 20 6e 45 78 70 72 2b 6e 45 78 74 72 61 2d 69  , nExpr+nExtra-i
8ed0: 53 74 61 72 74 2c 20 31 29 3b 0a 20 20 69 66 28  Start, 1);.  if(
8ee0: 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 61 73   pInfo ){.    as
8ef0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79  sert( sqlite3Key
8f00: 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
8f10: 70 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 66 6f  pInfo) );.    fo
8f20: 72 28 69 3d 69 53 74 61 72 74 2c 20 70 49 74 65  r(i=iStart, pIte
8f30: 6d 3d 70 4c 69 73 74 2d 3e 61 2b 69 53 74 61 72  m=pList->a+iStar
8f40: 74 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c  t; i<nExpr; i++,
8f50: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
8f60: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
8f70: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  .      pColl = s
8f80: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
8f90: 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  q(pParse, pItem-
8fa0: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69  >pExpr);.      i
8fb0: 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
8fc0: 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
8fd0: 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  l;.      pInfo->
8fe0: 61 43 6f 6c 6c 5b 69 2d 69 53 74 61 72 74 5d 20  aColl[i-iStart] 
8ff0: 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70  = pColl;.      p
9000: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
9010: 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20 70 49 74  [i-iStart] = pIt
9020: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  em->sortOrder;. 
9030: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
9040: 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 23 69 66 6e  n pInfo;.}..#ifn
9050: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9060: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
9070: 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68  /*.** Name of th
9080: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65  e connection ope
9090: 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20  rator, used for 
90a0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a  error messages..
90b0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
90c0: 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61  char *selectOpNa
90d0: 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68  me(int id){.  ch
90e0: 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28  ar *z;.  switch(
90f0: 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20   id ){.    case 
9100: 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20  TK_ALL:       z 
9110: 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20  = "UNION ALL";  
9120: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9130: 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a   TK_INTERSECT: z
9140: 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20   = "INTERSECT"; 
9150: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9160: 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20  e TK_EXCEPT:    
9170: 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20  z = "EXCEPT";   
9180: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
9190: 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20  fault:          
91a0: 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20   z = "UNION";   
91b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
91c0: 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e   return z;.}.#en
91d0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
91e0: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
91f0: 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  CT */..#ifndef S
9200: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
9210: 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  IN./*.** Unless 
9220: 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52  an "EXPLAIN QUER
9230: 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20  Y PLAN" command 
9240: 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73  is being process
9250: 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
9260: 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  n.** is a no-op.
9270: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 61   Otherwise, it a
9280: 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  dds a single row
9290: 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74 68   of output to th
92a0: 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a  e EQP result,.**
92b0: 20 77 68 65 72 65 20 74 68 65 20 63 61 70 74 69   where the capti
92c0: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
92d0: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55 53 45 20  m:.**.**   "USE 
92e0: 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20  TEMP B-TREE FOR 
92f0: 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  xxx".**.** where
9300: 20 78 78 78 20 69 73 20 6f 6e 65 20 6f 66 20 22   xxx is one of "
9310: 44 49 53 54 49 4e 43 54 22 2c 20 22 4f 52 44 45  DISTINCT", "ORDE
9320: 52 20 42 59 22 20 6f 72 20 22 47 52 4f 55 50 20  R BY" or "GROUP 
9330: 42 59 22 2e 20 45 78 61 63 74 6c 79 20 77 68 69  BY". Exactly whi
9340: 63 68 0a 2a 2a 20 69 73 20 64 65 74 65 72 6d 69  ch.** is determi
9350: 6e 65 64 20 62 79 20 74 68 65 20 7a 55 73 61 67  ned by the zUsag
9360: 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  e argument..*/.s
9370: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61  tatic void expla
9380: 69 6e 54 65 6d 70 54 61 62 6c 65 28 50 61 72 73  inTempTable(Pars
9390: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
93a0: 20 63 68 61 72 20 2a 7a 55 73 61 67 65 29 7b 0a   char *zUsage){.
93b0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
93c0: 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
93d0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
93e0: 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61  ->pVdbe;.    cha
93f0: 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65  r *zMsg = sqlite
9400: 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d  3MPrintf(pParse-
9410: 3e 64 62 2c 20 22 55 53 45 20 54 45 4d 50 20 42  >db, "USE TEMP B
9420: 2d 54 52 45 45 20 46 4f 52 20 25 73 22 2c 20 7a  -TREE FOR %s", z
9430: 55 73 61 67 65 29 3b 0a 20 20 20 20 73 71 6c 69  Usage);.    sqli
9440: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
9450: 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61   OP_Explain, pPa
9460: 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
9470: 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44  0, 0, zMsg, P4_D
9480: 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a  YNAMIC);.  }.}..
9490: 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 65 78 70  /*.** Assign exp
94a0: 72 65 73 73 69 6f 6e 20 62 20 74 6f 20 6c 76 61  ression b to lva
94b0: 6c 75 65 20 61 2e 20 41 20 73 65 63 6f 6e 64 2c  lue a. A second,
94c0: 20 6e 6f 2d 6f 70 2c 20 76 65 72 73 69 6f 6e 20   no-op, version 
94d0: 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 0a 2a 2a  of this macro.**
94e0: 20 69 73 20 70 72 6f 76 69 64 65 64 20 77 68 65   is provided whe
94f0: 6e 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  n SQLITE_OMIT_EX
9500: 50 4c 41 49 4e 20 69 73 20 64 65 66 69 6e 65 64  PLAIN is defined
9510: 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68  . This allows th
9520: 65 20 63 6f 64 65 0a 2a 2a 20 69 6e 20 73 71 6c  e code.** in sql
9530: 69 74 65 33 53 65 6c 65 63 74 28 29 20 74 6f 20  ite3Select() to 
9540: 61 73 73 69 67 6e 20 76 61 6c 75 65 73 20 74 6f  assign values to
9550: 20 73 74 72 75 63 74 75 72 65 20 6d 65 6d 62 65   structure membe
9560: 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74  r variables that
9570: 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69 73 74 20 69  .** only exist i
9580: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
9590: 50 4c 41 49 4e 20 69 73 20 6e 6f 74 20 64 65 66  PLAIN is not def
95a0: 69 6e 65 64 20 77 69 74 68 6f 75 74 20 70 6f 6c  ined without pol
95b0: 6c 75 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f  luting the.** co
95c0: 64 65 20 77 69 74 68 20 23 69 66 6e 64 65 66 20  de with #ifndef 
95d0: 64 69 72 65 63 74 69 76 65 73 2e 0a 2a 2f 0a 23  directives..*/.#
95e0: 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53   define explainS
95f0: 65 74 49 6e 74 65 67 65 72 28 61 2c 20 62 29 20  etInteger(a, b) 
9600: 61 20 3d 20 62 0a 0a 23 65 6c 73 65 0a 2f 2a 20  a = b..#else./* 
9610: 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f  No-op versions o
9620: 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58 58  f the explainXXX
9630: 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64  () functions and
9640: 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65   macros. */.# de
9650: 66 69 6e 65 20 65 78 70 6c 61 69 6e 54 65 6d 70  fine explainTemp
9660: 54 61 62 6c 65 28 79 2c 7a 29 0a 23 20 64 65 66  Table(y,z).# def
9670: 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e  ine explainSetIn
9680: 74 65 67 65 72 28 79 2c 7a 29 0a 23 65 6e 64 69  teger(y,z).#endi
9690: 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
96a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
96b0: 41 49 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64  AIN) && !defined
96c0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d  (SQLITE_OMIT_COM
96d0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29 0a 2f 2a  POUND_SELECT)./*
96e0: 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45  .** Unless an "E
96f0: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
9700: 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65  N" command is be
9710: 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74  ing processed, t
9720: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
9730: 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65  is a no-op. Othe
9740: 72 77 69 73 65 2c 20 69 74 20 61 64 64 73 20 61  rwise, it adds a
9750: 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f   single row of o
9760: 75 74 70 75 74 20 74 6f 20 74 68 65 20 45 51 50  utput to the EQP
9770: 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72   result,.** wher
9780: 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73  e the caption is
9790: 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   of one of the t
97a0: 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20  wo forms:.**.** 
97b0: 20 20 22 43 4f 4d 50 4f 53 49 54 45 20 53 55 42    "COMPOSITE SUB
97c0: 51 55 45 52 49 45 53 20 69 53 75 62 31 20 61 6e  QUERIES iSub1 an
97d0: 64 20 69 53 75 62 32 20 28 6f 70 29 22 0a 2a 2a  d iSub2 (op)".**
97e0: 20 20 20 22 43 4f 4d 50 4f 53 49 54 45 20 53 55     "COMPOSITE SU
97f0: 42 51 55 45 52 49 45 53 20 69 53 75 62 31 20 61  BQUERIES iSub1 a
9800: 6e 64 20 69 53 75 62 32 20 55 53 49 4e 47 20 54  nd iSub2 USING T
9810: 45 4d 50 20 42 2d 54 52 45 45 20 28 6f 70 29 22  EMP B-TREE (op)"
9820: 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 69 53 75  .**.** where iSu
9830: 62 31 20 61 6e 64 20 69 53 75 62 32 20 61 72 65  b1 and iSub2 are
9840: 20 74 68 65 20 69 6e 74 65 67 65 72 73 20 70 61   the integers pa
9850: 73 73 65 64 20 61 73 20 74 68 65 20 63 6f 72 72  ssed as the corr
9860: 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 66 75 6e  esponding.** fun
9870: 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 73  ction parameters
9880: 2c 20 61 6e 64 20 6f 70 20 69 73 20 74 68 65 20  , and op is the 
9890: 74 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74  text representat
98a0: 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 72 61 6d  ion of the param
98b0: 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 73  eter.** of the s
98c0: 61 6d 65 20 6e 61 6d 65 2e 20 54 68 65 20 70 61  ame name. The pa
98d0: 72 61 6d 65 74 65 72 20 22 6f 70 22 20 6d 75 73  rameter "op" mus
98e0: 74 20 62 65 20 6f 6e 65 20 6f 66 20 54 4b 5f 55  t be one of TK_U
98f0: 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c  NION, TK_EXCEPT,
9900: 0a 2a 2a 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  .** TK_INTERSECT
9910: 20 6f 72 20 54 4b 5f 41 4c 4c 2e 20 54 68 65 20   or TK_ALL. The 
9920: 66 69 72 73 74 20 66 6f 72 6d 20 69 73 20 75 73  first form is us
9930: 65 64 20 69 66 20 61 72 67 75 6d 65 6e 74 20 62  ed if argument b
9940: 55 73 65 54 6d 70 20 69 73 20 0a 2a 2a 20 66 61  UseTmp is .** fa
9950: 6c 73 65 2c 20 6f 72 20 74 68 65 20 73 65 63 6f  lse, or the seco
9960: 6e 64 20 66 6f 72 6d 20 69 66 20 69 74 20 69 73  nd form if it is
9970: 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   true..*/.static
9980: 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 43 6f 6d   void explainCom
9990: 70 6f 73 69 74 65 28 0a 20 20 50 61 72 73 65 20  posite(.  Parse 
99a0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
99b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
99c0: 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
99d0: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99f0: 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49  /* One of TK_UNI
9a00: 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 20 65 74  ON, TK_EXCEPT et
9a10: 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  c. */.  int iSub
9a20: 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
9a30: 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75          /* Subqu
9a40: 65 72 79 20 69 64 20 31 20 2a 2f 0a 20 20 69 6e  ery id 1 */.  in
9a50: 74 20 69 53 75 62 32 2c 20 20 20 20 20 20 20 20  t iSub2,        
9a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9a70: 20 53 75 62 71 75 65 72 79 20 69 64 20 32 20 2a   Subquery id 2 *
9a80: 2f 0a 20 20 69 6e 74 20 62 55 73 65 54 6d 70 20  /.  int bUseTmp 
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9aa0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
9ab0: 20 74 65 6d 70 20 74 61 62 6c 65 20 77 61 73 20   temp table was 
9ac0: 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  used */.){.  ass
9ad0: 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ert( op==TK_UNIO
9ae0: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 45 58 43 45  N || op==TK_EXCE
9af0: 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54  PT || op==TK_INT
9b00: 45 52 53 45 43 54 20 7c 7c 20 6f 70 3d 3d 54 4b  ERSECT || op==TK
9b10: 5f 41 4c 4c 20 29 3b 0a 20 20 69 66 28 20 70 50  _ALL );.  if( pP
9b20: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
9b30: 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   ){.    Vdbe *v 
9b40: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
9b50: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20  .    char *zMsg 
9b60: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
9b70: 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  (.        pParse
9b80: 2d 3e 64 62 2c 20 22 43 4f 4d 50 4f 55 4e 44 20  ->db, "COMPOUND 
9b90: 53 55 42 51 55 45 52 49 45 53 20 25 64 20 41 4e  SUBQUERIES %d AN
9ba0: 44 20 25 64 20 25 73 28 25 73 29 22 2c 20 69 53  D %d %s(%s)", iS
9bb0: 75 62 31 2c 20 69 53 75 62 32 2c 0a 20 20 20 20  ub1, iSub2,.    
9bc0: 20 20 20 20 62 55 73 65 54 6d 70 3f 22 55 53 49      bUseTmp?"USI
9bd0: 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45 20 22  NG TEMP B-TREE "
9be0: 3a 22 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d  :"", selectOpNam
9bf0: 65 28 6f 70 29 0a 20 20 20 20 29 3b 0a 20 20 20  e(op).    );.   
9c00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9c10: 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  p4(v, OP_Explain
9c20: 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  , pParse->iSelec
9c30: 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c  tId, 0, 0, zMsg,
9c40: 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
9c50: 7d 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d  }.}.#else./* No-
9c60: 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  op versions of t
9c70: 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20  he explainXXX() 
9c80: 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61  functions and ma
9c90: 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e  cros. */.# defin
9ca0: 65 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69  e explainComposi
9cb0: 74 65 28 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65  te(v,w,x,y,z).#e
9cc0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ndif../*.** If t
9cd0: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61  he inner loop wa
9ce0: 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e  s generated usin
9cf0: 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72  g a non-null pOr
9d00: 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a  derBy argument,.
9d10: 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  ** then the resu
9d20: 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64 20  lts were placed 
9d30: 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41 66  in a sorter.  Af
9d40: 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73 20  ter the loop is 
9d50: 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65  terminated.** we
9d60: 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68 65   need to run the
9d70: 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74 70   sorter and outp
9d80: 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  ut the results. 
9d90: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   The following.*
9da0: 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  * routine genera
9db0: 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65  tes the code nee
9dc0: 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  ded to do that..
9dd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
9de0: 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
9df0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9e00: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
9e10: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
9e20: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f  ect *p,        /
9e30: 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
9e40: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 6f 72 74  tement */.  Sort
9e50: 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 2f 2a  Ctx *pSort,   /*
9e60: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   Information on 
9e70: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
9e80: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  use */.  int nCo
9e90: 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75  lumn,      /* Nu
9ea0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
9eb0: 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c  of data */.  Sel
9ec0: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 2f  ectDest *pDest /
9ed0: 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f 72 74  * Write the sort
9ee0: 65 64 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ed results here 
9ef0: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
9f00: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
9f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f20: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70       /* The prep
9f30: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a  ared statement *
9f40: 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72 65 61  /.  int addrBrea
9f50: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
9f60: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 20 20  akeLabel(v);    
9f70: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
9f80: 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20   exit loop */.  
9f90: 69 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e 75 65  int addrContinue
9fa0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
9fb0: 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20  keLabel(v);  /* 
9fc0: 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20 6e 65  Jump here for ne
9fd0: 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e  xt cycle */.  in
9fe0: 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 61 64  t addr;.  int ad
9ff0: 64 72 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 69 6e  drOnce = 0;.  in
a000: 74 20 69 54 61 62 3b 0a 20 20 45 78 70 72 4c 69  t iTab;.  ExprLi
a010: 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
a020: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  Sort->pOrderBy;.
a030: 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44    int eDest = pD
a040: 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e  est->eDest;.  in
a050: 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d  t iParm = pDest-
a060: 3e 69 53 44 50 61 72 6d 3b 0a 20 20 69 6e 74 20  >iSDParm;.  int 
a070: 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65  regRow;.  int re
a080: 67 52 6f 77 69 64 3b 0a 20 20 69 6e 74 20 6e 4b  gRowid;.  int nK
a090: 65 79 3b 0a 20 20 69 6e 74 20 69 53 6f 72 74 54  ey;.  int iSortT
a0a0: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
a0b0: 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 72 20        /* Sorter 
a0c0: 63 75 72 73 6f 72 20 74 6f 20 72 65 61 64 20 66  cursor to read f
a0d0: 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6f  rom */.  int nSo
a0e0: 72 74 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  rtData;         
a0f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61 69           /* Trai
a100: 6c 69 6e 67 20 76 61 6c 75 65 73 20 74 6f 20 72  ling values to r
a110: 65 61 64 20 66 72 6f 6d 20 73 6f 72 74 65 72 20  ead from sorter 
a120: 2a 2f 0a 20 20 75 38 20 70 35 3b 20 20 20 20 20  */.  u8 p5;     
a130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a140: 20 20 20 20 20 2f 2a 20 70 35 20 70 61 72 61 6d       /* p5 param
a150: 65 74 65 72 20 66 6f 72 20 31 73 74 20 4f 50 5f  eter for 1st OP_
a160: 43 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20  Column */.  int 
a170: 69 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b 20 20  i;.  int bSeq;  
a180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a190: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
a1a0: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 69 6e  sorter record in
a1b0: 63 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f 2e 20  cludes seq. no. 
a1c0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
a1d0: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
a1e0: 43 4f 4d 4d 45 4e 54 53 0a 20 20 73 74 72 75 63  COMMENTS.  struc
a1f0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
a200: 2a 61 4f 75 74 45 78 20 3d 20 70 2d 3e 70 45 4c  *aOutEx = p->pEL
a210: 69 73 74 2d 3e 61 3b 0a 23 65 6e 64 69 66 0a 0a  ist->a;.#endif..
a220: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62    if( pSort->lab
a230: 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 73  elBkOut ){.    s
a240: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a250: 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53  (v, OP_Gosub, pS
a260: 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  ort->regReturn, 
a270: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
a280: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
a290: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a2a0: 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 42 72 65  Goto, 0, addrBre
a2b0: 61 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ak);.    sqlite3
a2c0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
a2d0: 28 76 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  (v, pSort->label
a2e0: 42 6b 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 54  BkOut);.  }.  iT
a2f0: 61 62 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75  ab = pSort->iECu
a300: 72 73 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73  rsor;.  if( eDes
a310: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c  t==SRT_Output ||
a320: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
a330: 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 72 65 67  utine ){.    reg
a340: 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 72  Rowid = 0;.    r
a350: 65 67 52 6f 77 20 3d 20 70 44 65 73 74 2d 3e 69  egRow = pDest->i
a360: 53 64 73 74 3b 0a 20 20 20 20 6e 53 6f 72 74 44  Sdst;.    nSortD
a370: 61 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20  ata = nColumn;. 
a380: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 52   }else{.    regR
a390: 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65  owid = sqlite3Ge
a3a0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
a3b0: 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20 73  ;.    regRow = s
a3c0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
a3d0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 6e 53  (pParse);.    nS
a3e0: 6f 72 74 44 61 74 61 20 3d 20 31 3b 0a 20 20 7d  ortData = 1;.  }
a3f0: 0a 20 20 6e 4b 65 79 20 3d 20 70 4f 72 64 65 72  .  nKey = pOrder
a400: 42 79 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72  By->nExpr - pSor
a410: 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 69 66 28  t->nOBSat;.  if(
a420: 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67   pSort->sortFlag
a430: 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  s & SORTFLAG_Use
a440: 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 69 6e  Sorter ){.    in
a450: 74 20 72 65 67 53 6f 72 74 4f 75 74 20 3d 20 2b  t regSortOut = +
a460: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
a470: 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20 70 50     iSortTab = pP
a480: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
a490: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62    if( pSort->lab
a4a0: 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 20  elBkOut ){.     
a4b0: 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69   addrOnce = sqli
a4c0: 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72  te3CodeOnce(pPar
a4d0: 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  se); VdbeCoverag
a4e0: 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e(v);.    }.    
a4f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a500: 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75  3(v, OP_OpenPseu
a510: 64 6f 2c 20 69 53 6f 72 74 54 61 62 2c 20 72 65  do, iSortTab, re
a520: 67 53 6f 72 74 4f 75 74 2c 20 6e 4b 65 79 2b 31  gSortOut, nKey+1
a530: 2b 6e 53 6f 72 74 44 61 74 61 29 3b 0a 20 20 20  +nSortData);.   
a540: 20 69 66 28 20 61 64 64 72 4f 6e 63 65 20 29 20   if( addrOnce ) 
a550: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
a560: 65 72 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29  ere(v, addrOnce)
a570: 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b  ;.    addr = 1 +
a580: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a590: 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53  p2(v, OP_SorterS
a5a0: 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42  ort, iTab, addrB
a5b0: 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43  reak);.    VdbeC
a5c0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
a5d0: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d  codeOffset(v, p-
a5e0: 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f  >iOffset, addrCo
a5f0: 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c  ntinue);.    sql
a600: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a610: 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c  , OP_SorterData,
a620: 20 69 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75   iTab, regSortOu
a630: 74 29 3b 0a 20 20 20 20 70 35 20 3d 20 4f 50 46  t);.    p5 = OPF
a640: 4c 41 47 5f 43 4c 45 41 52 43 41 43 48 45 3b 0a  LAG_CLEARCACHE;.
a650: 20 20 20 20 62 53 65 71 20 3d 20 30 3b 0a 20 20      bSeq = 0;.  
a660: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 20  }else{.    addr 
a670: 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  = 1 + sqlite3Vdb
a680: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
a690: 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72  rt, iTab, addrBr
a6a0: 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
a6b0: 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f  ge(v);.    codeO
a6c0: 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
a6d0: 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  set, addrContinu
a6e0: 65 29 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62  e);.    iSortTab
a6f0: 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 35 20   = iTab;.    p5 
a700: 3d 20 30 3b 0a 20 20 20 20 62 53 65 71 20 3d 20  = 0;.    bSeq = 
a710: 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  1;.  }.  for(i=0
a720: 3b 20 69 3c 6e 53 6f 72 74 44 61 74 61 3b 20 69  ; i<nSortData; i
a730: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
a740: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
a750: 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61  _Column, iSortTa
a760: 62 2c 20 6e 4b 65 79 2b 62 53 65 71 2b 69 2c 20  b, nKey+bSeq+i, 
a770: 72 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20 69  regRow+i);.    i
a780: 66 28 20 69 3d 3d 30 20 29 20 73 71 6c 69 74 65  f( i==0 ) sqlite
a790: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
a7a0: 20 70 35 29 3b 0a 20 20 20 20 56 64 62 65 43 6f   p5);.    VdbeCo
a7b0: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
a7c0: 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20  aOutEx[i].zName 
a7d0: 3f 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d  ? aOutEx[i].zNam
a7e0: 65 20 3a 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 53  e : aOutEx[i].zS
a7f0: 70 61 6e 29 29 3b 0a 20 20 7d 0a 20 20 73 77 69  pan));.  }.  swi
a800: 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20  tch( eDest ){.  
a810: 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65    case SRT_Table
a820: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  :.    case SRT_E
a830: 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
a840: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
a850: 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20  ==SRT_Table );. 
a860: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
a870: 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
a880: 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ab );.      sqli
a890: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a8a0: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50   OP_NewRowid, iP
a8b0: 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  arm, regRowid);.
a8c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a8d0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
a8e0: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67  sert, iParm, reg
a8f0: 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  Row, regRowid);.
a900: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a910: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
a920: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
a930: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a940: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a950: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
a960: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
a970: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
a980: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
a990: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a9a0: 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
a9b0: 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 31  ecord, regRow, 1
a9c0: 2c 20 72 65 67 52 6f 77 69 64 2c 0a 20 20 20 20  , regRowid,.    
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9e0: 20 20 20 20 26 70 44 65 73 74 2d 3e 61 66 66 53      &pDest->affS
a9f0: 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  dst, 1);.      s
aa00: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
aa10: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
aa20: 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 31 29  arse, regRow, 1)
aa30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
aa40: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
aa50: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
aa60: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
aa70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
aa80: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
aa90: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
aaa0: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
aab0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
aac0: 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
aad0: 2c 20 72 65 67 52 6f 77 2c 20 69 50 61 72 6d 2c  , regRow, iParm,
aae0: 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68   1);.      /* Th
aaf0: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
ab00: 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
ab10: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
ab20: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ab30: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
ab40: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
ab50: 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53  assert( eDest==S
ab60: 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65  RT_Output || eDe
ab70: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
ab80: 65 20 29 3b 20 0a 20 20 20 20 20 20 74 65 73 74  e ); .      test
ab90: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
aba0: 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20  _Output );.     
abb0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
abc0: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
abd0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  );.      if( eDe
abe0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
abf0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ac00: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ac10: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 44 65  P_ResultRow, pDe
ac20: 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75  st->iSdst, nColu
ac30: 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  mn);.        sql
ac40: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
ac50: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
ac60: 73 65 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74  se, pDest->iSdst
ac70: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
ac80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ac90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
aca0: 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
acb0: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b  pDest->iSDParm);
acc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
acd0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
ace0: 20 20 69 66 28 20 72 65 67 52 6f 77 69 64 20 29    if( regRowid )
acf0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  {.    sqlite3Rel
ad00: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
ad10: 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20  se, regRow);.   
ad20: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
ad30: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
ad40: 65 67 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20  egRowid);.  }.  
ad50: 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66  /* The bottom of
ad60: 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20   the loop.  */. 
ad70: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
ad80: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
ad90: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28  Continue);.  if(
ada0: 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67   pSort->sortFlag
adb0: 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  s & SORTFLAG_Use
adc0: 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Sorter ){.    sq
add0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
ade0: 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74  v, OP_SorterNext
adf0: 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56  , iTab, addr); V
ae00: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
ae10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
ae20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
ae30: 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c  , OP_Next, iTab,
ae40: 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65   addr); VdbeCove
ae50: 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69  rage(v);.  }.  i
ae60: 66 28 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74  f( pSort->regRet
ae70: 75 72 6e 20 29 20 73 71 6c 69 74 65 33 56 64 62  urn ) sqlite3Vdb
ae80: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
ae90: 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 72 65 67  turn, pSort->reg
aea0: 52 65 74 75 72 6e 29 3b 0a 20 20 73 71 6c 69 74  Return);.  sqlit
aeb0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
aec0: 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29  el(v, addrBreak)
aed0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
aee0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
aef0: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
af00: 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72 61 74  ng the 'declarat
af10: 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65  ion type' of the
af20: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
af30: 45 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67  Expr. The string
af40: 20 6d 61 79 20 62 65 20 74 72 65 61 74 65 64 20   may be treated 
af50: 61 73 20 73 74 61 74 69 63 20 62 79 20 74 68 65  as static by the
af60: 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41   caller..**.** A
af70: 6c 73 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d  lso try to estim
af80: 61 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ate the size of 
af90: 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  the returned val
afa0: 75 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ue and return th
afb0: 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  at.** result in 
afc0: 2a 70 45 73 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a  *pEstWidth..**.*
afd0: 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f  * The declaratio
afe0: 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65 78  n type is the ex
aff0: 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65 66  act datatype def
b000: 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65  inition extracte
b010: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72  d from the.** or
b020: 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41  iginal CREATE TA
b030: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66  BLE statement if
b040: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
b050: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65  is a column. The
b060: 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  .** declaration 
b070: 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44  type for a ROWID
b080: 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45   field is INTEGE
b090: 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20  R. Exactly when 
b0a0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  an expression.**
b0b0: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
b0c0: 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63   column can be c
b0d0: 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72  omplex in the pr
b0e0: 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65  esence of subque
b0f0: 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73  ries. The.** res
b100: 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69  ult-set expressi
b110: 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65  on in all of the
b120: 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43   following SELEC
b130: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20  T statements is 
b140: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61  .** considered a
b150: 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20   column by this 
b160: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
b170: 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f    SELECT col FRO
b180: 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45  M tbl;.**   SELE
b190: 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46  CT (SELECT col F
b1a0: 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45  ROM tbl;.**   SE
b1b0: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c  LECT (SELECT col
b1c0: 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20   FROM tbl);.**  
b1d0: 20 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d   SELECT abc FROM
b1e0: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20   (SELECT col AS 
b1f0: 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a  abc FROM tbl);.*
b200: 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  * .** The declar
b210: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
b220: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74  ny expression ot
b230: 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d  her than a colum
b240: 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  n is NULL..**.**
b250: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61   This routine ha
b260: 73 20 65 69 74 68 65 72 20 33 20 6f 72 20 36 20  s either 3 or 6 
b270: 70 61 72 61 6d 65 74 65 72 73 20 64 65 70 65 6e  parameters depen
b280: 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
b290: 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 53 51  or not.** the SQ
b2a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
b2b0: 4d 4e 5f 4d 45 54 41 44 41 54 41 20 63 6f 6d 70  MN_METADATA comp
b2c0: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
b2d0: 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64  is used..*/.#ifd
b2e0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
b2f0: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
b300: 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e  .# define column
b310: 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46  Type(A,B,C,D,E,F
b320: 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c  ) columnTypeImpl
b330: 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 0a 73 74  (A,B,C,D,E,F).st
b340: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
b350: 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28  *columnTypeImpl(
b360: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
b370: 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45  pNC, .  Expr *pE
b380: 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  xpr,.  const cha
b390: 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20 20  r **pzOrigDb,.  
b3a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
b3b0: 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20  rigTab,.  const 
b3c0: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c  char **pzOrigCol
b3d0: 2c 0a 20 20 75 38 20 2a 70 45 73 74 57 69 64 74  ,.  u8 *pEstWidt
b3e0: 68 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73  h.){.  char cons
b3f0: 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a  t *zOrigDb = 0;.
b400: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
b410: 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 63 68  rigTab = 0;.  ch
b420: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 43  ar const *zOrigC
b430: 6f 6c 20 3d 20 30 3b 0a 23 65 6c 73 65 20 2f 2a  ol = 0;.#else /*
b440: 20 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c   if !defined(SQL
b450: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
b460: 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a 23  N_METADATA) */.#
b470: 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79   define columnTy
b480: 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20  pe(A,B,C,D,E,F) 
b490: 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41  columnTypeImpl(A
b4a0: 2c 42 2c 46 29 0a 73 74 61 74 69 63 20 63 6f 6e  ,B,F).static con
b4b0: 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54  st char *columnT
b4c0: 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d 65 43  ypeImpl(.  NameC
b4d0: 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20  ontext *pNC, .  
b4e0: 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 75  Expr *pExpr,.  u
b4f0: 38 20 2a 70 45 73 74 57 69 64 74 68 0a 29 7b 0a  8 *pEstWidth.){.
b500: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
b510: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
b520: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
b530: 29 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73  ) */.  char cons
b540: 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20  t *zType = 0;.  
b550: 69 6e 74 20 6a 3b 0a 20 20 75 38 20 65 73 74 57  int j;.  u8 estW
b560: 69 64 74 68 20 3d 20 31 3b 0a 0a 20 20 69 66 28  idth = 1;..  if(
b570: 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29   NEVER(pExpr==0)
b580: 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73   || pNC->pSrcLis
b590: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
b5a0: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
b5b0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
b5c0: 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a   TK_AGG_COLUMN:.
b5d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
b5e0: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  MN: {.      /* T
b5f0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
b600: 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74   a column. Locat
b610: 65 20 74 68 65 20 74 61 62 6c 65 20 74 68 65 20  e the table the 
b620: 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a  column is being.
b630: 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74        ** extract
b640: 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43  ed from in NameC
b650: 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e  ontext.pSrcList.
b660: 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20   This table may 
b670: 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a  be real.      **
b680: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
b690: 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20  or a subquery.. 
b6a0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61       */.      Ta
b6b0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20  ble *pTab = 0;  
b6c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
b6d0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c  le structure col
b6e0: 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64  umn is extracted
b6f0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53   from */.      S
b700: 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20  elect *pS = 0;  
b710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
b720: 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lect the column 
b730: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
b740: 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  m */.      int i
b750: 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  Col = pExpr->iCo
b760: 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20  lumn;  /* Index 
b770: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61  of column in pTa
b780: 62 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  b */.      testc
b790: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
b7a0: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b  TK_AGG_COLUMN );
b7b0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
b7c0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
b7d0: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 77  OLUMN );.      w
b7e0: 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54  hile( pNC && !pT
b7f0: 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72  ab ){.        Sr
b800: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20  cList *pTabList 
b810: 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
b820: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
b830: 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ;j<pTabList->nSr
b840: 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61  c && pTabList->a
b850: 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78  [j].iCursor!=pEx
b860: 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b  pr->iTable;j++);
b870: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70  .        if( j<p
b880: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b  TabList->nSrc ){
b890: 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62 20  .          pTab 
b8a0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
b8b0: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  .pTab;.         
b8c0: 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e   pS = pTabList->
b8d0: 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20  a[j].pSelect;.  
b8e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b8f0: 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43         pNC = pNC
b900: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
b910: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
b920: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
b930: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f  .        /* At o
b940: 6e 65 20 74 69 6d 65 2c 20 63 6f 64 65 20 73 75  ne time, code su
b950: 63 68 20 61 73 20 22 53 45 4c 45 43 54 20 6e 65  ch as "SELECT ne
b960: 77 2e 78 22 20 77 69 74 68 69 6e 20 61 20 74 72  w.x" within a tr
b970: 69 67 67 65 72 20 77 6f 75 6c 64 0a 20 20 20 20  igger would.    
b980: 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68 69      ** cause thi
b990: 73 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72  s condition to r
b9a0: 75 6e 2e 20 20 53 69 6e 63 65 20 74 68 65 6e 2c  un.  Since then,
b9b0: 20 77 65 20 68 61 76 65 20 72 65 73 74 72 75 63   we have restruc
b9c0: 74 75 72 65 64 20 68 6f 77 0a 20 20 20 20 20 20  tured how.      
b9d0: 20 20 2a 2a 20 74 72 69 67 67 65 72 20 63 6f 64    ** trigger cod
b9e0: 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61  e is generated a
b9f0: 6e 64 20 73 6f 20 74 68 69 73 20 63 6f 6e 64 69  nd so this condi
ba00: 74 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  tion is no longe
ba10: 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  r .        ** po
ba20: 73 73 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c  ssible. However,
ba30: 20 69 74 20 63 61 6e 20 73 74 69 6c 6c 20 62 65   it can still be
ba40: 20 74 72 75 65 20 66 6f 72 20 73 74 61 74 65 6d   true for statem
ba50: 65 6e 74 73 20 6c 69 6b 65 0a 20 20 20 20 20 20  ents like.      
ba60: 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
ba70: 6e 67 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ng:.        **. 
ba80: 20 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41         **   CREA
ba90: 54 45 20 54 41 42 4c 45 20 74 31 28 63 6f 6c 20  TE TABLE t1(col 
baa0: 49 4e 54 45 47 45 52 29 3b 0a 20 20 20 20 20 20  INTEGER);.      
bab0: 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53    **   SELECT (S
bac0: 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 20 46 52  ELECT t1.col) FR
bad0: 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  OM FROM t1;.    
bae0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
baf0: 2a 20 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70  * when columnTyp
bb00: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
bb10: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
bb20: 22 74 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20  "t1.col" in the 
bb30: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75 62 2d  .        ** sub-
bb40: 73 65 6c 65 63 74 2e 20 49 6e 20 74 68 69 73 20  select. In this 
bb50: 63 61 73 65 2c 20 73 65 74 20 74 68 65 20 63 6f  case, set the co
bb60: 6c 75 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c  lumn type to NUL
bb70: 4c 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 20 20  L, even.        
bb80: 2a 2a 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f  ** though it sho
bb90: 75 6c 64 20 72 65 61 6c 6c 79 20 62 65 20 22 49  uld really be "I
bba0: 4e 54 45 47 45 52 22 2e 0a 20 20 20 20 20 20 20  NTEGER"..       
bbb0: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
bbc0: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 70 72 6f  his is not a pro
bbd0: 62 6c 65 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c  blem, as the col
bbe0: 75 6d 6e 20 74 79 70 65 20 6f 66 20 22 74 31 2e  umn type of "t1.
bbf0: 63 6f 6c 22 20 69 73 20 6e 65 76 65 72 0a 20 20  col" is never.  
bc00: 20 20 20 20 20 20 2a 2a 20 75 73 65 64 2e 20 57        ** used. W
bc10: 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29  hen columnType()
bc20: 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
bc30: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20  e expression .  
bc40: 20 20 20 20 20 20 2a 2a 20 22 28 53 45 4c 45 43        ** "(SELEC
bc50: 54 20 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20  T t1.col)", the 
bc60: 63 6f 72 72 65 63 74 20 74 79 70 65 20 69 73 20  correct type is 
bc70: 72 65 74 75 72 6e 65 64 20 28 73 65 65 20 74 68  returned (see th
bc80: 65 20 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20  e TK_SELECT.    
bc90: 20 20 20 20 2a 2a 20 62 72 61 6e 63 68 20 62 65      ** branch be
bca0: 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  low.  */.       
bcb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
bcc0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
bcd0: 54 61 62 20 26 26 20 70 45 78 70 72 2d 3e 70 54  Tab && pExpr->pT
bce0: 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20  ab==pTab );.    
bcf0: 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20    if( pS ){.    
bd00: 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c      /* The "tabl
bd10: 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  e" is actually a
bd20: 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61   sub-select or a
bd30: 20 76 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f   view in the FRO
bd40: 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20  M clause.       
bd50: 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43   ** of the SELEC
bd60: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74  T statement. Ret
bd70: 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74  urn the declarat
bd80: 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69  ion type and ori
bd90: 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  gin.        ** d
bda0: 61 74 61 20 66 6f 72 20 74 68 65 20 72 65 73 75  ata for the resu
bdb0: 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66  lt-set column of
bdc0: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e   the sub-select.
bdd0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
bde0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
bdf0: 26 26 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70  && ALWAYS(iCol<p
be00: 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  S->pEList->nExpr
be10: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
be20: 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73  * If iCol is les
be30: 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
be40: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
be50: 20 72 65 71 75 65 73 74 73 20 74 68 65 0a 20 20   requests the.  
be60: 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64          ** rowid
be70: 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65   of the sub-sele
be80: 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73  ct or view. This
be90: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c   expression is l
bea0: 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20  egal (see .     
beb0: 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73       ** test cas
bec0: 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69  e misc2.2.2) - i
bed0: 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74  t always evaluat
bee0: 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20  es to NULL..    
bef0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
bf00: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
bf10: 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78  NC;.          Ex
bf20: 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69  pr *p = pS->pELi
bf30: 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70  st->a[iCol].pExp
bf40: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  r;.          sNC
bf50: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e  .pSrcList = pS->
bf60: 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  pSrc;.          
bf70: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b  sNC.pNext = pNC;
bf80: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
bf90: 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
bfa0: 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  rse;.          z
bfb0: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
bfc0: 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f 72 69 67  e(&sNC, p,&zOrig
bfd0: 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c 26 7a 4f  Db,&zOrigTab,&zO
bfe0: 72 69 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74  rigCol, &estWidt
bff0: 68 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20  h); .        }. 
c000: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
c010: 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  Tab->pSchema ){.
c020: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61          /* A rea
c030: 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  l table */.     
c040: 20 20 20 61 73 73 65 72 74 28 20 21 70 53 20 29     assert( !pS )
c050: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
c060: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
c070: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
c080: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
c090: 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  =-1 || (iCol>=0 
c0a0: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
c0b0: 6f 6c 29 20 29 3b 0a 23 69 66 64 65 66 20 53 51  ol) );.#ifdef SQ
c0c0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
c0d0: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20  MN_METADATA.    
c0e0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
c0f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
c100: 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
c110: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f           zOrigCo
c120: 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20  l = "rowid";.   
c130: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c140: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54        zType = pT
c150: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
c160: 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Type;.          
c170: 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54 61 62 2d  zOrigCol = pTab-
c180: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
c190: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73 74  e;.          est
c1a0: 57 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43  Width = pTab->aC
c1b0: 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a  ol[iCol].szEst;.
c1c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c1d0: 20 20 7a 4f 72 69 67 54 61 62 20 3d 20 70 54 61    zOrigTab = pTa
c1e0: 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
c1f0: 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73    if( pNC->pPars
c200: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  e ){.          i
c210: 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
c220: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e  SchemaToIndex(pN
c230: 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  C->pParse->db, p
c240: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
c250: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 44 62           zOrigDb
c260: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e   = pNC->pParse->
c270: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
c280: 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  me;.        }.#e
c290: 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28 20  lse.        if( 
c2a0: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
c2b0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54      zType = "INT
c2c0: 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 7d  EGER";.        }
c2d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
c2e0: 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43  zType = pTab->aC
c2f0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a  ol[iCol].zType;.
c300: 20 20 20 20 20 20 20 20 20 20 65 73 74 57 69 64            estWid
c310: 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  th = pTab->aCol[
c320: 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20 20  iCol].szEst;.   
c330: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
c340: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
c350: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
c360: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
c370: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
c380: 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
c390: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
c3a0: 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c  ion is a sub-sel
c3b0: 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ect. Return the 
c3c0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
c3d0: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72   and.      ** or
c3e0: 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68  igin info for th
c3f0: 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  e single column 
c400: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
c410: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a  t of the SELECT.
c420: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
c430: 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
c440: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
c450: 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  NC;.      Select
c460: 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e   *pS = pExpr->x.
c470: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45  pSelect;.      E
c480: 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c  xpr *p = pS->pEL
c490: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
c4a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45  .      assert( E
c4b0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
c4c0: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
c4d0: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43  ct) );.      sNC
c4e0: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e  .pSrcList = pS->
c4f0: 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e  pSrc;.      sNC.
c500: 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20  pNext = pNC;.   
c510: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
c520: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pNC->pParse;.   
c530: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
c540: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
c550: 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54  zOrigDb, &zOrigT
c560: 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 26  ab, &zOrigCol, &
c570: 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20 20 20  estWidth); .    
c580: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
c590: 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64 65  endif.  }..#ifde
c5a0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
c5b0: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20  COLUMN_METADATA 
c5c0: 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 44 62   .  if( pzOrigDb
c5d0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
c5e0: 70 7a 4f 72 69 67 54 61 62 20 26 26 20 70 7a 4f  pzOrigTab && pzO
c5f0: 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70  rigCol );.    *p
c600: 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69 67 44  zOrigDb = zOrigD
c610: 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54 61  b;.    *pzOrigTa
c620: 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20 20  b = zOrigTab;.  
c630: 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a    *pzOrigCol = z
c640: 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e  OrigCol;.  }.#en
c650: 64 69 66 0a 20 20 69 66 28 20 70 45 73 74 57 69  dif.  if( pEstWi
c660: 64 74 68 20 29 20 2a 70 45 73 74 57 69 64 74 68  dth ) *pEstWidth
c670: 20 3d 20 65 73 74 57 69 64 74 68 3b 0a 20 20 72   = estWidth;.  r
c680: 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a  eturn zType;.}..
c690: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
c6a0: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65  ode that will te
c6b0: 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20  ll the VDBE the 
c6c0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
c6d0: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
c6e0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
c6f0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
c700: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
c710: 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Types(.  Parse *
c720: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
c730: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
c740: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
c750: 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  bList,  /* List 
c760: 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45  of tables */.  E
c770: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
c780: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
c790: 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72  s defining the r
c7a0: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a  esult set */.){.
c7b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c7c0: 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 56  MIT_DECLTYPE.  V
c7d0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
c7e0: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
c7f0: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73  .  NameContext s
c800: 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  NC;.  sNC.pSrcLi
c810: 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
c820: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
c830: 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  arse;.  for(i=0;
c840: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
c850: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
c860: 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   *p = pEList->a[
c870: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f  i].pExpr;.    co
c880: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
c890: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
c8a0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
c8b0: 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74 20  ADATA.    const 
c8c0: 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20  char *zOrigDb = 
c8d0: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
c8e0: 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b  r *zOrigTab = 0;
c8f0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
c900: 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20  *zOrigCol = 0;. 
c910: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
c920: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
c930: 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54  zOrigDb, &zOrigT
c940: 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 30  ab, &zOrigCol, 0
c950: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76  );..    /* The v
c960: 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74  dbe must make it
c970: 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68  s own copy of th
c980: 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e  e column-type an
c990: 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20  d other .    ** 
c9a0: 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20  column specific 
c9b0: 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65  strings, in case
c9c0: 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 72   the schema is r
c9d0: 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69 73  eset before this
c9e0: 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  .    ** virtual 
c9f0: 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74  machine is delet
ca00: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
ca10: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
ca20: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
ca30: 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72  ME_DATABASE, zOr
ca40: 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52 41  igDb, SQLITE_TRA
ca50: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
ca60: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
ca70: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
ca80: 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62  _TABLE, zOrigTab
ca90: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
caa0: 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
cab0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
cac0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c  , i, COLNAME_COL
cad0: 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53  UMN, zOrigCol, S
cae0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
caf0: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70  ;.#else.    zTyp
cb00: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
cb10: 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 2c  sNC, p, 0, 0, 0,
cb20: 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
cb30: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
cb40: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
cb50: 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54  AME_DECLTYPE, zT
cb60: 79 70 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  ype, SQLITE_TRAN
cb70: 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64  SIENT);.  }.#end
cb80: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
cb90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54  QLITE_OMIT_DECLT
cba0: 59 50 45 29 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  YPE) */.}../*.**
cbb0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
cbc0: 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68  hat will tell th
cbd0: 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73  e VDBE the names
cbe0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69   of columns.** i
cbf0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
cc00: 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
cc10: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70  ion is used to p
cc20: 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a  rovide the.** az
cc30: 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20  Col[] values in 
cc40: 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f  the callback..*/
cc50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
cc60: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
cc70: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
cc80: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  e,      /* Parse
cc90: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
cca0: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
ccb0: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61  ,  /* List of ta
ccc0: 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69  bles */.  ExprLi
ccd0: 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a  st *pEList    /*
cce0: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66   Expressions def
ccf0: 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  ining the result
cd00: 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62   set */.){.  Vdb
cd10: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
cd20: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Vdbe;.  int i, j
cd30: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
cd40: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
cd50: 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73  int fullNames, s
cd60: 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e  hortNames;..#ifn
cd70: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
cd80: 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20  EXPLAIN.  /* If 
cd90: 74 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41  this is an EXPLA
cda0: 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74  IN, skip this st
cdb0: 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  ep */.  if( pPar
cdc0: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
cdd0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
cde0: 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50 61  endif..  if( pPa
cdf0: 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74  rse->colNamesSet
ce00: 20 7c 7c 20 4e 45 56 45 52 28 76 3d 3d 30 29 20   || NEVER(v==0) 
ce10: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
ce20: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
ce30: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
ce40: 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e  Set = 1;.  fullN
ce50: 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67  ames = (db->flag
ce60: 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43  s & SQLITE_FullC
ce70: 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73  olNames)!=0;.  s
ce80: 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d  hortNames = (db-
ce90: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
cea0: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d  ShortColNames)!=
ceb0: 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  0;.  sqlite3Vdbe
cec0: 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45  SetNumCols(v, pE
ced0: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
cee0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
cef0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
cf00: 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20      Expr *p;.   
cf10: 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69   p = pEList->a[i
cf20: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
cf30: 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 63   NEVER(p==0) ) c
cf40: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
cf50: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
cf60: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ame ){.      cha
cf70: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73  r *zName = pELis
cf80: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[i].zName;. 
cf90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cfa0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
cfb0: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
cfc0: 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  Name, SQLITE_TRA
cfd0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c  NSIENT);.    }el
cfe0: 73 65 20 69 66 28 20 28 70 2d 3e 6f 70 3d 3d 54  se if( (p->op==T
cff0: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 6f  K_COLUMN || p->o
d000: 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
d010: 29 20 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b  ) && pTabList ){
d020: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
d030: 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  ab;.      char *
d040: 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20  zCol;.      int 
d050: 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d  iCol = p->iColum
d060: 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  n;.      for(j=0
d070: 3b 20 41 4c 57 41 59 53 28 6a 3c 70 54 61 62 4c  ; ALWAYS(j<pTabL
d080: 69 73 74 2d 3e 6e 53 72 63 29 3b 20 6a 2b 2b 29  ist->nSrc); j++)
d090: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  {.        if( pT
d0a0: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75  abList->a[j].iCu
d0b0: 72 73 6f 72 3d 3d 70 2d 3e 69 54 61 62 6c 65 20  rsor==p->iTable 
d0c0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
d0d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a  .      assert( j
d0e0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
d0f0: 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  );.      pTab = 
d100: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
d110: 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 69  Tab;.      if( i
d120: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
d130: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
d140: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
d150: 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26  -1 || (iCol>=0 &
d160: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
d170: 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l) );.      if( 
d180: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
d190: 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22    zCol = "rowid"
d1a0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d1b0: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54         zCol = pT
d1c0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
d1d0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Name;.      }.  
d1e0: 20 20 20 20 69 66 28 20 21 73 68 6f 72 74 4e 61      if( !shortNa
d1f0: 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65  mes && !fullName
d200: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  s ){.        sql
d210: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
d220: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
d230: 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20 20 20  _NAME, .        
d240: 20 20 20 20 73 71 6c 69 74 65 33 44 62 53 74 72      sqlite3DbStr
d250: 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e  Dup(db, pEList->
d260: 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20 53 51 4c  a[i].zSpan), SQL
d270: 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ITE_DYNAMIC);.  
d280: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 75      }else if( fu
d290: 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20  llNames ){.     
d2a0: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
d2b0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   0;.        zNam
d2c0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
d2d0: 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20  tf(db, "%s.%s", 
d2e0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pTab->zName, zCo
d2f0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
d300: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
d310: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
d320: 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c  NAME, zName, SQL
d330: 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ITE_DYNAMIC);.  
d340: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d350: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
d360: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
d370: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f  OLNAME_NAME, zCo
d380: 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  l, SQLITE_TRANSI
d390: 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ENT);.      }.  
d3a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
d3b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
d3c0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  EList->a[i].zSpa
d3d0: 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a 3d 3d  n;.      z = z==
d3e0: 30 20 3f 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  0 ? sqlite3MPrin
d3f0: 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25 64  tf(db, "column%d
d400: 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69 74 65  ", i+1) : sqlite
d410: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 29  3DbStrDup(db, z)
d420: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d430: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
d440: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
d450: 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41  , z, SQLITE_DYNA
d460: 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  MIC);.    }.  }.
d470: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
d480: 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54  Types(pParse, pT
d490: 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b  abList, pEList);
d4a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
d4b0: 61 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  a an expression 
d4c0: 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 20 72  list (which is r
d4d0: 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f  eally the list o
d4e0: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  f expressions.**
d4f0: 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72   that form the r
d500: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
d510: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29  ELECT statement)
d520: 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72   compute appropr
d530: 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e  iate.** column n
d540: 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ames for a table
d550: 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64   that would hold
d560: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
d570: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  list..**.** All 
d580: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c  column names wil
d590: 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a  l be unique..**.
d5a0: 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75  ** Only the colu
d5b0: 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d  mn names are com
d5c0: 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a  puted.  Column.z
d5d0: 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f  Type, Column.zCo
d5e0: 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72  ll,.** and other
d5f0: 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d   fields of Colum
d600: 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a  n are zeroed..**
d610: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
d620: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
d630: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
d640: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
d650: 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20  ccurs,.** store 
d660: 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61  NULL in *paCol a
d670: 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61  nd 0 in *pnCol a
d680: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
d690: 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69  _NOMEM..*/.stati
d6a0: 63 20 69 6e 74 20 73 65 6c 65 63 74 43 6f 6c 75  c int selectColu
d6b0: 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
d6c0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d6d0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
d6e0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
d6f0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
d700: 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45 78  ist,       /* Ex
d710: 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68 69  pr list from whi
d720: 63 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f 6c  ch to derive col
d730: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69  umn names */.  i
d740: 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20  16 *pnCol,      
d750: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
d760: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
d770: 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20  lumns here */.  
d780: 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20  Column **paCol  
d790: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
d7a0: 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20   the new column 
d7b0: 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  list here */.){.
d7c0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
d7d0: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
d7e0: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
d7f0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  tion */.  int i,
d800: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
d810: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
d820: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
d830: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  cnt;            
d840: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
d850: 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20 74   added to make t
d860: 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a  he name unique *
d870: 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  /.  Column *aCol
d880: 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20 20  , *pCol;        
d890: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
d8a0: 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  ver result colum
d8b0: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  ns */.  int nCol
d8c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d8d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d8e0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
d8f0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
d900: 45 78 70 72 20 2a 70 3b 20 20 20 20 20 20 20 20  Expr *p;        
d910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
d920: 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 61 20  xpression for a 
d930: 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f  single result co
d940: 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lumn */.  char *
d950: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
d960: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
d970: 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  name */.  int nN
d980: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
d990: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
d9a0: 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d   name in zName[]
d9b0: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 4c 69 73   */..  if( pELis
d9c0: 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  t ){.    nCol = 
d9d0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
d9e0: 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65     aCol = sqlite
d9f0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
da00: 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d  , sizeof(aCol[0]
da10: 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73  )*nCol);.    tes
da20: 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29  tcase( aCol==0 )
da30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
da40: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43 6f  Col = 0;.    aCo
da50: 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 6e  l = 0;.  }.  *pn
da60: 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70  Col = nCol;.  *p
da70: 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20  aCol = aCol;..  
da80: 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43  for(i=0, pCol=aC
da90: 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c  ol; i<nCol; i++,
daa0: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a   pCol++){.    /*
dab0: 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69   Get an appropri
dac0: 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65  ate name for the
dad0: 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20   column.    */. 
dae0: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78     p = sqlite3Ex
daf0: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
db00: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
db10: 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d  );.    if( (zNam
db20: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
db30: 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  .zName)!=0 ){.  
db40: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
db50: 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e  lumn contains an
db60: 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72   "AS <name>" phr
db70: 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20  ase, use <name> 
db80: 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20  as the name */. 
db90: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
dba0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
dbb0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
dbc0: 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
dbd0: 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f  pColExpr = p;  /
dbe0: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
dbf0: 20 74 68 61 74 20 69 73 20 74 68 65 20 72 65 73   that is the res
dc00: 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ult column name 
dc10: 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  */.      Table *
dc20: 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 2f 2a  pTab;         /*
dc30: 20 54 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65   Table associate
dc40: 64 20 77 69 74 68 20 74 68 69 73 20 65 78 70 72  d with this expr
dc50: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
dc60: 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d  while( pColExpr-
dc70: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20  >op==TK_DOT ){. 
dc80: 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20         pColExpr 
dc90: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67  = pColExpr->pRig
dca0: 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ht;.        asse
dcb0: 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20  rt( pColExpr!=0 
dcc0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
dcd0: 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f   if( pColExpr->o
dce0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
dcf0: 41 4c 57 41 59 53 28 70 43 6f 6c 45 78 70 72 2d  ALWAYS(pColExpr-
dd00: 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20  >pTab!=0) ){.   
dd10: 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75       /* For colu
dd20: 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75  mns use the colu
dd30: 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a  mn name name */.
dd40: 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
dd50: 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f   = pColExpr->iCo
dd60: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 54  lumn;.        pT
dd70: 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70  ab = pColExpr->p
dd80: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Tab;.        if(
dd90: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
dda0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
ddb0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
ddc0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
ddd0: 20 22 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20   "%s",.         
dde0: 20 20 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30 20          iCol>=0 
ddf0: 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  ? pTab->aCol[iCo
de00: 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69  l].zName : "rowi
de10: 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  d");.      }else
de20: 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f   if( pColExpr->o
de30: 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20  p==TK_ID ){.    
de40: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
de50: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f  rHasProperty(pCo
de60: 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  lExpr, EP_IntVal
de70: 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a  ue) );.        z
de80: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
de90: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20  rintf(db, "%s", 
dea0: 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  pColExpr->u.zTok
deb0: 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  en);.      }else
dec0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  {.        /* Use
ded0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65   the original te
dee0: 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  xt of the column
def0: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69   expression as i
df00: 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  ts name */.     
df10: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
df20: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
df30: 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  s", pEList->a[i]
df40: 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d  .zSpan);.      }
df50: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
df60: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
df70: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
df80: 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
df90: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
dfa0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
dfb0: 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75  ke sure the colu
dfc0: 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75  mn name is uniqu
dfd0: 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20  e.  If the name 
dfe0: 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20  is not unique,. 
dff0: 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69     ** append a i
e000: 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61  nteger to the na
e010: 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20 62 65  me so that it be
e020: 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20  comes unique..  
e030: 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d    */.    nName =
e040: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
e050: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72  (zName);.    for
e060: 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a  (j=cnt=0; j<i; j
e070: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
e080: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61 43  qlite3StrICmp(aC
e090: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61  ol[j].zName, zNa
e0a0: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
e0b0: 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65    char *zNewName
e0c0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b  ;.        int k;
e0d0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 6e  .        for(k=n
e0e0: 4e 61 6d 65 2d 31 3b 20 6b 3e 31 20 26 26 20 73  Name-1; k>1 && s
e0f0: 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 4e  qlite3Isdigit(zN
e100: 61 6d 65 5b 6b 5d 29 3b 20 6b 2d 2d 29 7b 7d 0a  ame[k]); k--){}.
e110: 20 20 20 20 20 20 20 20 69 66 28 20 6b 3e 3d 30          if( k>=0
e120: 20 26 26 20 7a 4e 61 6d 65 5b 6b 5d 3d 3d 27 3a   && zName[k]==':
e130: 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6b 3b 0a 20  ' ) nName = k;. 
e140: 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61         zName[nNa
e150: 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  me] = 0;.       
e160: 20 7a 4e 65 77 4e 61 6d 65 20 3d 20 73 71 6c 69   zNewName = sqli
e170: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
e180: 25 73 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b  %s:%d", zName, +
e190: 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73  +cnt);.        s
e1a0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
e1b0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
e1c0: 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e 61 6d   zName = zNewNam
e1d0: 65 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 2d  e;.        j = -
e1e0: 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  1;.        if( z
e1f0: 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Name==0 ) break;
e200: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e210: 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d     pCol->zName =
e220: 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69 66   zName;.  }.  if
e230: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
e240: 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d  ed ){.    for(j=
e250: 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<i; j++){.  
e260: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
e270: 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e  e(db, aCol[j].zN
e280: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
e290: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
e2a0: 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61  , aCol);.    *pa
e2b0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e  Col = 0;.    *pn
e2c0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Col = 0;.    ret
e2d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
e2e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
e2f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
e300: 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64 20  ** Add type and 
e310: 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
e320: 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d  ation to a colum
e330: 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a  n list based on.
e340: 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ** a SELECT stat
e350: 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  ement..** .** Th
e360: 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72  e column list pr
e370: 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72  esumably came fr
e380: 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e  om selectColumnN
e390: 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  amesFromExprList
e3a0: 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d  ()..** The colum
e3b0: 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20  n list has only 
e3c0: 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73  names, not types
e3d0: 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20   or collations. 
e3e0: 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
e3f0: 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e   goes through an
e400: 64 20 61 64 64 73 20 74 68 65 20 74 79 70 65 73  d adds the types
e410: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e   and collations.
e420: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
e430: 69 6e 65 20 72 65 71 75 69 72 65 73 20 74 68 61  ine requires tha
e440: 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72  t all identifier
e450: 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a  s in the SELECT.
e460: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20  ** statement be 
e470: 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73 74 61  resolved..*/.sta
e480: 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41  tic void selectA
e490: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
e4a0: 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73  ollation(.  Pars
e4b0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
e4c0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
e4d0: 74 65 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c 65  texts */.  Table
e4e0: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
e4f0: 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20 74   /* Add column t
e500: 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ype information 
e510: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
e520: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
e530: 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45  ct       /* SELE
e540: 43 54 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  CT used to deter
e550: 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20 63  mine types and c
e560: 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  ollations */.){.
e570: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
e580: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e 61  pParse->db;.  Na
e590: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
e5a0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
e5b0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
e5c0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72  .  int i;.  Expr
e5d0: 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45 78   *p;.  struct Ex
e5e0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
e5f0: 20 20 75 36 34 20 73 7a 41 6c 6c 20 3d 20 30 3b    u64 szAll = 0;
e600: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c  ..  assert( pSel
e610: 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ect!=0 );.  asse
e620: 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65  rt( (pSelect->se
e630: 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f  lFlags & SF_Reso
e640: 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61 73  lved)!=0 );.  as
e650: 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c  sert( pTab->nCol
e660: 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  ==pSelect->pELis
e670: 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e  t->nExpr || db->
e680: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
e690: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
e6a0: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
e6b0: 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20  .  memset(&sNC, 
e6c0: 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
e6d0: 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
e6e0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b  = pSelect->pSrc;
e6f0: 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e  .  a = pSelect->
e700: 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72  pEList->a;.  for
e710: 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d  (i=0, pCol=pTab-
e720: 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e  >aCol; i<pTab->n
e730: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
e740: 29 7b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e  ){.    p = a[i].
e750: 70 45 78 70 72 3b 0a 20 20 20 20 70 43 6f 6c 2d  pExpr;.    pCol-
e760: 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33  >zType = sqlite3
e770: 44 62 53 74 72 44 75 70 28 64 62 2c 20 63 6f 6c  DbStrDup(db, col
e780: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
e790: 30 2c 30 2c 30 2c 20 26 70 43 6f 6c 2d 3e 73 7a  0,0,0, &pCol->sz
e7a0: 45 73 74 29 29 3b 0a 20 20 20 20 73 7a 41 6c 6c  Est));.    szAll
e7b0: 20 2b 3d 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 3b   += pCol->szEst;
e7c0: 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  .    pCol->affin
e7d0: 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
e7e0: 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20  rAffinity(p);.  
e7f0: 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69    if( pCol->affi
e800: 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e  nity==0 ) pCol->
e810: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
e820: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
e830: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
e840: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
e850: 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70  e, p);.    if( p
e860: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43  Coll ){.      pC
e870: 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69  ol->zColl = sqli
e880: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
e890: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
e8a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d     }.  }.  pTab-
e8b0: 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c 69  >szTabRow = sqli
e8c0: 74 65 33 4c 6f 67 45 73 74 28 73 7a 41 6c 6c 2a  te3LogEst(szAll*
e8d0: 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  4);.}../*.** Giv
e8e0: 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  en a SELECT stat
e8f0: 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20  ement, generate 
e900: 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
e910: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
e920: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
e930: 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43  et of that SELEC
e940: 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  T..*/.Table *sql
e950: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
e960: 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
e970: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
e980: 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  lect){.  Table *
e990: 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20  pTab;.  sqlite3 
e9a0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
e9b0: 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c 61  ;.  int savedFla
e9c0: 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61 67  gs;..  savedFlag
e9d0: 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20  s = db->flags;. 
e9e0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
e9f0: 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
ea00: 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  es;.  db->flags 
ea10: 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43  |= SQLITE_ShortC
ea20: 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74  olNames;.  sqlit
ea30: 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
ea40: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29  rse, pSelect, 0)
ea50: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
ea60: 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b  nErr ) return 0;
ea70: 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63  .  while( pSelec
ea80: 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c  t->pPrior ) pSel
ea90: 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ect = pSelect->p
eaa0: 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c 61  Prior;.  db->fla
eab0: 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b  gs = savedFlags;
eac0: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
ead0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
eae0: 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20  , sizeof(Table) 
eaf0: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  );.  if( pTab==0
eb00: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
eb10: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73  ;.  }.  /* The s
eb20: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
eb30: 66 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e 6c  fSelect() is onl
eb40: 79 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78 74  y used n context
eb50: 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69 64  s where lookasid
eb60: 65 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c  e.  ** is disabl
eb70: 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ed */.  assert( 
eb80: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45  db->lookaside.bE
eb90: 6e 61 62 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 70  nabled==0 );.  p
eba0: 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  Tab->nRef = 1;. 
ebb0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30   pTab->zName = 0
ebc0: 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  ;.  pTab->nRowLo
ebd0: 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65  gEst = 200; asse
ebe0: 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33  rt( 200==sqlite3
ebf0: 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20  LogEst(1048576) 
ec00: 29 3b 0a 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d  );.  selectColum
ec10: 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  nsFromExprList(p
ec20: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e  Parse, pSelect->
ec30: 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e  pEList, &pTab->n
ec40: 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c  Col, &pTab->aCol
ec50: 29 3b 0a 20 20 73 65 6c 65 63 74 41 64 64 43 6f  );.  selectAddCo
ec60: 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
ec70: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61  tion(pParse, pTa
ec80: 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 70  b, pSelect);.  p
ec90: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  Tab->iPKey = -1;
eca0: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
ecb0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
ecc0: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
ecd0: 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  e(db, pTab);.   
ece0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
ecf0: 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
ed00: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42  ./*.** Get a VDB
ed10: 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  E for the given 
ed20: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20  parser context. 
ed30: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   Create a new on
ed40: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
ed50: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
ed60: 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55  ccurs, return NU
ed70: 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d  LL and leave a m
ed80: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
ed90: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
eda0: 65 33 47 65 74 56 64 62 65 28 50 61 72 73 65 20  e3GetVdbe(Parse 
edb0: 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65  *pParse){.  Vdbe
edc0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
edd0: 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  dbe;.  if( v==0 
ede0: 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73  ){.    v = pPars
edf0: 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74  e->pVdbe = sqlit
ee00: 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50 61  e3VdbeCreate(pPa
ee10: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 20  rse);.    if( v 
ee20: 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  ) sqlite3VdbeAdd
ee30: 4f 70 30 28 76 2c 20 4f 50 5f 49 6e 69 74 29 3b  Op0(v, OP_Init);
ee40: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
ee50: 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 0a 20 20  >pToplevel==0.  
ee60: 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
ee70: 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61 72 73 65  onEnabled(pParse
ee80: 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 46 61 63 74  ->db,SQLITE_Fact
ee90: 6f 72 4f 75 74 43 6f 6e 73 74 29 0a 20 20 20 20  orOutConst).    
eea0: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
eeb0: 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d  >okConstFactor =
eec0: 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a 20   1;.    }..  }. 
eed0: 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f   return v;.}.../
eee0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
eef0: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
ef00: 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  set fields of th
ef10: 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f  e SELECT based o
ef20: 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20  n the.** pLimit 
ef30: 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70 72  and pOffset expr
ef40: 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74  essions.  pLimit
ef50: 20 61 6e 64 20 70 4f 66 66 73 65 74 20 68 6f 6c   and pOffset hol
ef60: 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  d the expression
ef70: 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72  s.** that appear
ef80: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
ef90: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61   SQL statement a
efa0: 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61  fter the LIMIT a
efb0: 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79  nd OFFSET.** key
efc0: 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20  words.  Or NULL 
efd0: 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64  if those keyword
efe0: 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69  s are omitted. i
eff0: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
f000: 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e  t .** are the in
f010: 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67  teger memory reg
f020: 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f  ister numbers fo
f030: 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20  r counters used 
f040: 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74  to compute .** t
f050: 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66  he limit and off
f060: 73 65 74 2e 20 20 49 66 20 74 68 65 72 65 20 69  set.  If there i
f070: 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f  s no limit and/o
f080: 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a  r offset, then .
f090: 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  ** iLimit and iO
f0a0: 66 66 73 65 74 20 61 72 65 20 6e 65 67 61 74 69  ffset are negati
f0b0: 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ve..**.** This r
f0c0: 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74  outine changes t
f0d0: 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c 69  he values of iLi
f0e0: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
f0f0: 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d  only if.** a lim
f100: 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20  it or offset is 
f110: 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d 69  defined by pLimi
f120: 74 20 61 6e 64 20 70 4f 66 66 73 65 74 2e 20 20  t and pOffset.  
f130: 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f  iLimit and.** iO
f140: 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76  ffset should hav
f150: 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f  e been preset to
f160: 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65 66   appropriate def
f170: 61 75 6c 74 20 76 61 6c 75 65 73 20 28 7a 65 72  ault values (zer
f180: 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63  o).** prior to c
f190: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
f1a0: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ine..**.** The i
f1b0: 4f 66 66 73 65 74 20 72 65 67 69 73 74 65 72 20  Offset register 
f1c0: 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69  (if it exists) i
f1d0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
f1e0: 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66   the value.** of
f1f0: 20 74 68 65 20 4f 46 46 53 45 54 2e 20 20 54 68   the OFFSET.  Th
f200: 65 20 69 4c 69 6d 69 74 20 72 65 67 69 73 74 65  e iLimit registe
f210: 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  r is initialized
f220: 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67 69   to LIMIT.  Regi
f230: 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74 2b  ster.** iOffset+
f240: 31 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  1 is initialized
f250: 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54   to LIMIT+OFFSET
f260: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20  ..**.** Only if 
f270: 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66  pLimit!=0 or pOf
f280: 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c  fset!=0 do the l
f290: 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67  imit registers g
f2a0: 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e  et.** redefined.
f2b0: 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20    The UNION ALL 
f2c0: 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68  operator uses th
f2d0: 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66  is property to f
f2e0: 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73  orce.** the reus
f2f0: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69  e of the same li
f300: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72  mit and offset r
f310: 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20  egisters across 
f320: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45  multiple.** SELE
f330: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CT statements..*
f340: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
f350: 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
f360: 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ers(Parse *pPars
f370: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
f380: 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62  t iBreak){.  Vdb
f390: 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20  e *v = 0;.  int 
f3a0: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e  iLimit = 0;.  in
f3b0: 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74  t iOffset;.  int
f3c0: 20 61 64 64 72 31 2c 20 6e 3b 0a 20 20 69 66 28   addr1, n;.  if(
f3d0: 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65 74   p->iLimit ) ret
f3e0: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  urn;..  /* .  **
f3f0: 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61   "LIMIT -1" alwa
f400: 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77  ys shows all row
f410: 73 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d  s.  There is som
f420: 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65 72  e.  ** controver
f430: 73 79 20 61 62 6f 75 74 20 77 68 61 74 20 74 68  sy about what th
f440: 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69  e correct behavi
f450: 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20  or should be..  
f460: 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 69  ** The current i
f470: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
f480: 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20  terprets "LIMIT 
f490: 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20  0" to mean.  ** 
f4a0: 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20  no rows..  */.  
f4b0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
f4c0: 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
f4d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66   assert( p->pOff
f4e0: 73 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69  set==0 || p->pLi
f4f0: 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  mit!=0 );.  if( 
f500: 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->pLimit ){.   
f510: 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69   p->iLimit = iLi
f520: 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  mit = ++pParse->
f530: 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71  nMem;.    v = sq
f540: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
f550: 72 73 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  rse);.    assert
f560: 28 20 76 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  ( v!=0 );.    if
f570: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
f580: 6e 74 65 67 65 72 28 70 2d 3e 70 4c 69 6d 69 74  nteger(p->pLimit
f590: 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 73  , &n) ){.      s
f5a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f5b0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
f5c0: 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  n, iLimit);.    
f5d0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
f5e0: 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72  , "LIMIT counter
f5f0: 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  "));.      if( n
f600: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
f610: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f620: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
f630: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d  iBreak);.      }
f640: 65 6c 73 65 20 69 66 28 20 6e 3e 3d 30 20 26 26  else if( n>=0 &&
f650: 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 28   p->nSelectRow>(
f660: 75 36 34 29 6e 20 29 7b 0a 20 20 20 20 20 20 20  u64)n ){.       
f670: 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
f680: 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   n;.      }.    
f690: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
f6a0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
f6b0: 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20  rse, p->pLimit, 
f6c0: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73  iLimit);.      s
f6d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
f6e0: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
f6f0: 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43  , iLimit); VdbeC
f700: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
f710: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
f720: 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72  , "LIMIT counter
f730: 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
f740: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f750: 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69  OP_IfZero, iLimi
f760: 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65  t, iBreak); Vdbe
f770: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
f780: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f   }.    if( p->pO
f790: 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 70  ffset ){.      p
f7a0: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  ->iOffset = iOff
f7b0: 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  set = ++pParse->
f7c0: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72  nMem;.      pPar
f7d0: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a  se->nMem++;   /*
f7e0: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74   Allocate an ext
f7f0: 72 61 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ra register for 
f800: 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a  limit+offset */.
f810: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f820: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d  rCode(pParse, p-
f830: 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65  >pOffset, iOffse
f840: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
f850: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
f860: 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66  P_MustBeInt, iOf
f870: 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65 72  fset); VdbeCover
f880: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64  age(v);.      Vd
f890: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  beComment((v, "O
f8a0: 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29  FFSET counter"))
f8b0: 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d 20  ;.      addr1 = 
f8c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f8d0: 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  1(v, OP_IfPos, i
f8e0: 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76  Offset); VdbeCov
f8f0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
f900: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f910: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
f920: 20 30 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20   0, iOffset);.  
f930: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
f940: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
f950: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f960: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
f970: 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c 20 69 4f  _Add, iLimit, iO
f980: 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 2b 31  ffset, iOffset+1
f990: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
f9a0: 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b  ment((v, "LIMIT+
f9b0: 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20 20  OFFSET"));.     
f9c0: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
f9d0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
f9e0: 5f 49 66 50 6f 73 2c 20 69 4c 69 6d 69 74 29 3b  _IfPos, iLimit);
f9f0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
fa00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
fa10: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
fa20: 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 69 4f 66  Integer, -1, iOf
fa30: 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 73  fset+1);.      s
fa40: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
fa50: 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
fa60: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64    }.  }.}..#ifnd
fa70: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
fa80: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f  OMPOUND_SELECT./
fa90: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
faa0: 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c  appropriate coll
fab0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
fac0: 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63  or the iCol-th c
fad0: 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20  olumn of.** the 
fae0: 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20 74  result set for t
faf0: 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65  he compound-sele
fb00: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70 22  ct statement "p"
fb10: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
fb20: 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20  f.** the column 
fb30: 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63  has no default c
fb40: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
fb50: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  e..**.** The col
fb60: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
fb70: 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  for the compound
fb80: 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65 6e   select is taken
fb90: 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66   from the.** lef
fba0: 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74  t-most term of t
fbb0: 68 65 20 73 65 6c 65 63 74 20 74 68 61 74 20 68  he select that h
fbc0: 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  as a collating s
fbd0: 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74  equence..*/.stat
fbe0: 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74  ic CollSeq *mult
fbf0: 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50  iSelectCollSeq(P
fc00: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
fc10: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f  lect *p, int iCo
fc20: 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  l){.  CollSeq *p
fc30: 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  Ret;.  if( p->pP
fc40: 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65 74  rior ){.    pRet
fc50: 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
fc60: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
fc70: 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a  >pPrior, iCol);.
fc80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65    }else{.    pRe
fc90: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  t = 0;.  }.  ass
fca0: 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a  ert( iCol>=0 );.
fcb0: 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 26 26    if( pRet==0 &&
fcc0: 20 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d   iCol<p->pEList-
fcd0: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 70 52  >nExpr ){.    pR
fce0: 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
fcf0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
fd00: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  p->pEList->a[iCo
fd10: 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20  l].pExpr);.  }. 
fd20: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
fd30: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63  ./*.** The selec
fd40: 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  t statement pass
fd50: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
fd60: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
fd70: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a  compound SELECT.
fd80: 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52  ** with an ORDER
fd90: 20 42 59 20 63 6c 61 75 73 65 2e 20 54 68 69 73   BY clause. This
fda0: 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
fdb0: 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20  tes and returns 
fdc0: 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73 74 72  a KeyInfo.** str
fdd0: 75 63 74 75 72 65 20 73 75 69 74 61 62 6c 65 20  ucture suitable 
fde0: 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67  for implementing
fdf0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a   the ORDER BY..*
fe00: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
fe10: 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ld the KeyInfo s
fe20: 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61  tructure is obta
fe30: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
fe40: 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  . The calling.**
fe50: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73   function is res
fe60: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73  ponsible for ens
fe70: 75 72 69 6e 67 20 74 68 61 74 20 74 68 69 73 20  uring that this 
fe80: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65  structure is eve
fe90: 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64  ntually.** freed
fea0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49  ..*/.static KeyI
feb0: 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74  nfo *multiSelect
fec0: 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 50  OrderByKeyInfo(P
fed0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
fee0: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 6e 45 78  lect *p, int nEx
fef0: 74 72 61 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  tra){.  ExprList
ff00: 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e   *pOrderBy = p->
ff10: 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20  pOrderBy;.  int 
ff20: 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  nOrderBy = p->pO
ff30: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
ff40: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
ff50: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79  Parse->db;.  Key
ff60: 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20 73 71 6c  Info *pRet = sql
ff70: 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
ff80: 28 64 62 2c 20 6e 4f 72 64 65 72 42 79 2b 6e 45  (db, nOrderBy+nE
ff90: 78 74 72 61 2c 20 31 29 3b 0a 20 20 69 66 28 20  xtra, 1);.  if( 
ffa0: 70 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  pRet ){.    int 
ffb0: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
ffc0: 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
ffd0: 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  {.      struct E
ffe0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
fff0: 74 65 6d 20 3d 20 26 70 4f 72 64 65 72 42 79 2d  tem = &pOrderBy-
10000 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 45 78 70  >a[i];.      Exp
10010 72 20 2a 70 54 65 72 6d 20 3d 20 70 49 74 65 6d  r *pTerm = pItem
10020 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 43  ->pExpr;.      C
10030 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a  ollSeq *pColl;..
10040 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
10050 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
10060 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ate ){.        p
10070 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
10080 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
10090 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
100a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
100b0 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
100c0 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
100d0 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  , p, pItem->u.x.
100e0 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 29 3b 0a  iOrderByCol-1);.
100f0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
10100 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64  l==0 ) pColl = d
10110 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
10120 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
10130 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20  a[i].pExpr =.   
10140 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
10150 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69  prAddCollateStri
10160 6e 67 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  ng(pParse, pTerm
10170 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
10180 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
10190 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
101a0 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
101b0 28 70 52 65 74 29 20 29 3b 0a 20 20 20 20 20 20  (pRet) );.      
101c0 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  pRet->aColl[i] =
101d0 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 52   pColl;.      pR
101e0 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  et->aSortOrder[i
101f0 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ] = pOrderBy->a[
10200 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
10210 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
10220 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64  n pRet;.}..#ifnd
10230 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
10240 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  TE./*.** This ro
10250 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
10260 56 44 42 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d  VDBE code to com
10270 70 75 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  pute the content
10280 20 6f 66 20 61 20 57 49 54 48 20 52 45 43 55 52   of a WITH RECUR
10290 53 49 56 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66  SIVE.** query of
102a0 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
102b0 20 20 20 3c 72 65 63 75 72 73 69 76 65 2d 74 61     <recursive-ta
102c0 62 6c 65 3e 20 41 53 20 28 3c 73 65 74 75 70 2d  ble> AS (<setup-
102d0 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c  query> UNION [AL
102e0 4c 5d 20 3c 72 65 63 75 72 73 69 76 65 2d 71 75  L] <recursive-qu
102f0 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20 20 20 20  ery>).**        
10300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10310 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20   \___________/  
10320 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
10330 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20  ___________/.** 
10340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10350 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
10360 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ior             
10370 20 20 20 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a           p.**.**
10380 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 65 78 61  .** There is exa
10390 63 74 6c 79 20 6f 6e 65 20 72 65 66 65 72 65 6e  ctly one referen
103a0 63 65 20 74 6f 20 74 68 65 20 72 65 63 75 72 73  ce to the recurs
103b0 69 76 65 2d 74 61 62 6c 65 20 69 6e 20 74 68 65  ive-table in the
103c0 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20   FROM clause.** 
103d0 6f 66 20 72 65 63 75 72 73 69 76 65 2d 71 75 65  of recursive-que
103e0 72 79 2c 20 6d 61 72 6b 65 64 20 77 69 74 68 20  ry, marked with 
103f0 74 68 65 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d  the SrcList->a[]
10400 2e 69 73 52 65 63 75 72 73 69 76 65 20 66 6c 61  .isRecursive fla
10410 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 74  g..**.** The set
10420 75 70 2d 71 75 65 72 79 20 72 75 6e 73 20 6f 6e  up-query runs on
10430 63 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ce to generate a
10440 6e 20 69 6e 69 74 69 61 6c 20 73 65 74 20 6f 66  n initial set of
10450 20 72 6f 77 73 20 74 68 61 74 20 67 6f 0a 2a 2a   rows that go.**
10460 20 69 6e 74 6f 20 61 20 51 75 65 75 65 20 74 61   into a Queue ta
10470 62 6c 65 2e 20 20 52 6f 77 73 20 61 72 65 20 65  ble.  Rows are e
10480 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
10490 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 6f 6e  e Queue table on
104a0 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45 61  e by.** one.  Ea
104b0 63 68 20 72 6f 77 20 65 78 74 72 61 63 74 65 64  ch row extracted
104c0 20 66 72 6f 6d 20 51 75 65 75 65 20 69 73 20 6f   from Queue is o
104d0 75 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20  utput to pDest. 
104e0 20 54 68 65 6e 20 74 68 65 20 73 69 6e 67 6c 65   Then the single
104f0 0a 2a 2a 20 65 78 74 72 61 63 74 65 64 20 72 6f  .** extracted ro
10500 77 20 28 6e 6f 77 20 69 6e 20 74 68 65 20 69 43  w (now in the iC
10510 75 72 72 65 6e 74 20 74 61 62 6c 65 29 20 62 65  urrent table) be
10520 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e 74 65 6e  comes the conten
10530 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63 75  t of the.** recu
10540 72 73 69 76 65 2d 74 61 62 6c 65 20 66 6f 72 20  rsive-table for 
10550 61 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72  a recursive-quer
10560 79 20 72 75 6e 2e 20 20 54 68 65 20 6f 75 74 70  y run.  The outp
10570 75 74 20 6f 66 20 74 68 65 20 72 65 63 75 72 73  ut of the recurs
10580 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20 69 73 20  ive-query.** is 
10590 61 64 64 65 64 20 62 61 63 6b 20 69 6e 74 6f 20  added back into 
105a0 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e  the Queue table.
105b0 20 20 54 68 65 6e 20 61 6e 6f 74 68 65 72 20 72    Then another r
105c0 6f 77 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ow is extracted 
105d0 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a 20 61 6e  from Queue.** an
105e0 64 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20  d the iteration 
105f0 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74 69 6c 20  continues until 
10600 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
10610 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20  is empty..**.** 
10620 49 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  If the compound 
10630 71 75 65 72 79 20 6f 70 65 72 61 74 6f 72 20 69  query operator i
10640 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f 20  s UNION then no 
10650 64 75 70 6c 69 63 61 74 65 20 72 6f 77 73 20 61  duplicate rows a
10660 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e 73 65 72  re ever.** inser
10670 74 65 64 20 69 6e 74 6f 20 74 68 65 20 51 75 65  ted into the Que
10680 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 69  ue table.  The i
10690 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6b  Distinct table k
106a0 65 65 70 73 20 61 20 63 6f 70 79 20 6f 66 20 61  eeps a copy of a
106b0 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68 61 74 20  ll rows.** that 
106c0 68 61 76 65 20 65 76 65 72 20 62 65 65 6e 20 69  have ever been i
106d0 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 51 75 65  nserted into Que
106e0 75 65 20 61 6e 64 20 63 61 75 73 65 73 20 64 75  ue and causes du
106f0 70 6c 69 63 61 74 65 73 20 74 6f 20 62 65 0a 2a  plicates to be.*
10700 2a 20 64 69 73 63 61 72 64 65 64 2e 20 20 49 66  * discarded.  If
10710 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73   the operator is
10720 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74 68 65 6e   UNION ALL, then
10730 20 64 75 70 6c 69 63 61 74 65 73 20 61 72 65 20   duplicates are 
10740 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a 20  allowed..** .** 
10750 49 66 20 74 68 65 20 71 75 65 72 79 20 68 61 73  If the query has
10760 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68   an ORDER BY, th
10770 65 6e 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  en entries in th
10780 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 61 72  e Queue table ar
10790 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20 4f 52 44  e kept in.** ORD
107a0 45 52 20 42 59 20 6f 72 64 65 72 20 61 6e 64 20  ER BY order and 
107b0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
107c0 69 73 20 65 78 74 72 61 63 74 65 64 20 66 6f 72  is extracted for
107d0 20 65 61 63 68 20 63 79 63 6c 65 2e 20 20 57 69   each cycle.  Wi
107e0 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f 52 44 45  thout.** an ORDE
107f0 52 20 42 59 2c 20 74 68 65 20 51 75 65 75 65 20  R BY, the Queue 
10800 74 61 62 6c 65 20 69 73 20 6a 75 73 74 20 61 20  table is just a 
10810 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  FIFO..**.** If a
10820 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 69 73   LIMIT clause is
10830 20 70 72 6f 76 69 64 65 64 2c 20 74 68 65 6e 20   provided, then 
10840 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20 73 74  the iteration st
10850 6f 70 73 20 61 66 74 65 72 20 4c 49 4d 49 54 20  ops after LIMIT 
10860 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20 62 65 65  rows.** have bee
10870 6e 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73  n output to pDes
10880 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f 66 20 7a  t.  A LIMIT of z
10890 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74  ero means to out
108a0 70 75 74 20 6e 6f 20 72 6f 77 73 20 61 6e 64 20  put no rows and 
108b0 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 4c 49  a.** negative LI
108c0 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74  MIT means to out
108d0 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49  put all rows.  I
108e0 66 20 74 68 65 72 65 20 69 73 20 61 6c 73 6f 20  f there is also 
108f0 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  an OFFSET clause
10900 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f 73 69 74  .** with a posit
10910 69 76 65 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  ive value, then 
10920 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54  the first OFFSET
10930 20 6f 75 74 70 75 74 73 20 61 72 65 20 64 69 73   outputs are dis
10940 63 61 72 64 65 64 20 72 61 74 68 65 72 0a 2a 2a  carded rather.**
10950 20 74 68 61 6e 20 62 65 69 6e 67 20 73 65 6e 74   than being sent
10960 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65 20   to pDest.  The 
10970 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64 6f 65 73  LIMIT count does
10980 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e 74 69 6c   not begin until
10990 20 61 66 74 65 72 20 4f 46 46 53 45 54 0a 2a 2a   after OFFSET.**
109a0 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20   rows have been 
109b0 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74  skipped..*/.stat
109c0 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
109d0 57 69 74 68 52 65 63 75 72 73 69 76 65 51 75 65  WithRecursiveQue
109e0 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ry(.  Parse *pPa
109f0 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
10a00 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
10a10 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
10a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10a30 20 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43   recursive SELEC
10a40 54 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  T to be coded */
10a50 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
10a60 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
10a70 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
10a80 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
10a90 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20    SrcList *pSrc 
10aa0 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20 20 20 20  = p->pSrc;      
10ab0 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
10ac0 73 65 20 6f 66 20 74 68 65 20 72 65 63 75 72 73  se of the recurs
10ad0 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ive query */.  i
10ae0 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c  nt nCol = p->pEL
10af0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a 20  ist->nExpr;  /* 
10b00 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
10b10 73 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69  s in the recursi
10b20 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 56 64  ve table */.  Vd
10b30 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
10b40 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54  pVdbe;      /* T
10b50 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
10b60 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73  ement under cons
10b70 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65  truction */.  Se
10b80 6c 65 63 74 20 2a 70 53 65 74 75 70 20 3d 20 70  lect *pSetup = p
10b90 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f 2a 20 54  ->pPrior;   /* T
10ba0 68 65 20 73 65 74 75 70 20 71 75 65 72 79 20 2a  he setup query *
10bb0 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b  /.  int addrTop;
10bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bd0 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
10be0 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
10bf0 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61  drCont, addrBrea
10c00 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f 4e 54 49  k;      /* CONTI
10c10 4e 55 45 20 61 6e 64 20 42 52 45 41 4b 20 61 64  NUE and BREAK ad
10c20 64 72 65 73 73 65 73 20 2a 2f 0a 20 20 69 6e 74  dresses */.  int
10c30 20 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 20 20   iCurrent = 0;  
10c40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10c50 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e Current table 
10c60 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43 75 72 72  */.  int regCurr
10c70 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ent;            
10c80 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
10c90 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e 74 20 74  olding Current t
10ca0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 51  able */.  int iQ
10cb0 75 65 75 65 3b 20 20 20 20 20 20 20 20 20 20 20  ueue;           
10cc0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 51          /* The Q
10cd0 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ueue table */.  
10ce0 69 6e 74 20 69 44 69 73 74 69 6e 63 74 20 3d 20  int iDistinct = 
10cf0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
10d00 20 54 6f 20 65 6e 73 75 72 65 20 75 6e 69 71 75   To ensure uniqu
10d10 65 20 72 65 73 75 6c 74 73 20 69 66 20 55 4e 49  e results if UNI
10d20 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  ON */.  int eDes
10d30 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b 20 20 20  t = SRT_Fifo;   
10d40 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
10d50 77 72 69 74 65 20 74 6f 20 51 75 65 75 65 20 2a  write to Queue *
10d60 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
10d70 65 73 74 51 75 65 75 65 3b 20 20 20 20 20 20 20  estQueue;       
10d80 20 20 2f 2a 20 53 65 6c 65 63 74 44 65 73 74 20    /* SelectDest 
10d90 74 61 72 67 65 74 74 69 6e 67 20 74 68 65 20 51  targetting the Q
10da0 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ueue table */.  
10db0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
10dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10dd0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
10de0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
10df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e00 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
10e10 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
10e20 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
10e30 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
10e40 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  BY clause */.  E
10e50 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
10e60 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20  ffset;       /* 
10e70 53 61 76 65 64 20 4c 49 4d 49 54 20 61 6e 64 20  Saved LIMIT and 
10e80 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 6e 74 20  OFFSET */.  int 
10e90 72 65 67 4c 69 6d 69 74 2c 20 72 65 67 4f 66 66  regLimit, regOff
10ea0 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 52 65 67  set;      /* Reg
10eb0 69 73 74 65 72 73 20 75 73 65 64 20 62 79 20 4c  isters used by L
10ec0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
10ed0 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20  */..  /* Obtain 
10ee0 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f  authorization to
10ef0 20 64 6f 20 61 20 72 65 63 75 72 73 69 76 65 20   do a recursive 
10f00 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 73  query */.  if( s
10f10 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
10f20 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52  pParse, SQLITE_R
10f30 45 43 55 52 53 49 56 45 2c 20 30 2c 20 30 2c 20  ECURSIVE, 0, 0, 
10f40 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  0) ) return;..  
10f50 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20 4c  /* Process the L
10f60 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
10f70 63 6c 61 75 73 65 73 2c 20 69 66 20 74 68 65 79  clauses, if they
10f80 20 65 78 69 73 74 20 2a 2f 0a 20 20 61 64 64 72   exist */.  addr
10f90 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
10fa0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
10fb0 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
10fc0 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
10fd0 20 70 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a   p, addrBreak);.
10fe0 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
10ff0 69 6d 69 74 3b 0a 20 20 70 4f 66 66 73 65 74 20  imit;.  pOffset 
11000 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
11010 72 65 67 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c  regLimit = p->iL
11020 69 6d 69 74 3b 0a 20 20 72 65 67 4f 66 66 73 65  imit;.  regOffse
11030 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a  t = p->iOffset;.
11040 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d    p->pLimit = p-
11050 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
11060 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69  p->iLimit = p->i
11070 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4f  Offset = 0;.  pO
11080 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
11090 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61  erBy;..  /* Loca
110a0 74 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  te the cursor nu
110b0 6d 62 65 72 20 6f 66 20 74 68 65 20 43 75 72 72  mber of the Curr
110c0 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66  ent table */.  f
110d0 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59 53 28 69  or(i=0; ALWAYS(i
110e0 3c 70 53 72 63 2d 3e 6e 53 72 63 29 3b 20 69 2b  <pSrc->nSrc); i+
110f0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 53 72 63  +){.    if( pSrc
11100 2d 3e 61 5b 69 5d 2e 69 73 52 65 63 75 72 73 69  ->a[i].isRecursi
11110 76 65 20 29 7b 0a 20 20 20 20 20 20 69 43 75 72  ve ){.      iCur
11120 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69  rent = pSrc->a[i
11130 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ].iCursor;.     
11140 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
11150 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
11160 20 63 75 72 73 6f 72 73 20 6e 75 6d 62 65 72 73   cursors numbers
11170 20 66 6f 72 20 51 75 65 75 65 20 61 6e 64 20 44   for Queue and D
11180 69 73 74 69 6e 63 74 2e 20 20 54 68 65 20 63 75  istinct.  The cu
11190 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a  rsor number for.
111a0 20 20 2a 2a 20 74 68 65 20 44 69 73 74 69 6e 63    ** the Distinc
111b0 74 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20  t table must be 
111c0 65 78 61 63 74 6c 79 20 6f 6e 65 20 67 72 65 61  exactly one grea
111d0 74 65 72 20 74 68 61 6e 20 51 75 65 75 65 20 69  ter than Queue i
111e0 6e 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72  n order.  ** for
111f0 20 74 68 65 20 53 52 54 5f 44 69 73 74 46 69 66   the SRT_DistFif
11200 6f 20 61 6e 64 20 53 52 54 5f 44 69 73 74 51 75  o and SRT_DistQu
11210 65 75 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73  eue destinations
11220 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69   to work. */.  i
11230 51 75 65 75 65 20 3d 20 70 50 61 72 73 65 2d 3e  Queue = pParse->
11240 6e 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d  nTab++;.  if( p-
11250 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b  >op==TK_UNION ){
11260 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72  .    eDest = pOr
11270 64 65 72 42 79 20 3f 20 53 52 54 5f 44 69 73 74  derBy ? SRT_Dist
11280 51 75 65 75 65 20 3a 20 53 52 54 5f 44 69 73 74  Queue : SRT_Dist
11290 46 69 66 6f 3b 0a 20 20 20 20 69 44 69 73 74 69  Fifo;.    iDisti
112a0 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
112b0 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ab++;.  }else{. 
112c0 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65     eDest = pOrde
112d0 72 42 79 20 3f 20 53 52 54 5f 51 75 65 75 65 20  rBy ? SRT_Queue 
112e0 3a 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a  : SRT_Fifo;.  }.
112f0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
11300 65 73 74 49 6e 69 74 28 26 64 65 73 74 51 75 65  estInit(&destQue
11310 75 65 2c 20 65 44 65 73 74 2c 20 69 51 75 65 75  ue, eDest, iQueu
11320 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  e);..  /* Alloca
11330 74 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20 43  te cursors for C
11340 75 72 72 65 6e 74 2c 20 51 75 65 75 65 2c 20 61  urrent, Queue, a
11350 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a  nd Distinct. */.
11360 20 20 72 65 67 43 75 72 72 65 6e 74 20 3d 20 2b    regCurrent = +
11370 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
11380 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11390 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65  p3(v, OP_OpenPse
113a0 75 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20 72  udo, iCurrent, r
113b0 65 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29  egCurrent, nCol)
113c0 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
113d0 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   ){.    KeyInfo 
113e0 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74  *pKeyInfo = mult
113f0 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65  iSelectOrderByKe
11400 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c  yInfo(pParse, p,
11410 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
11420 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
11430 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
11440 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79  iQueue, pOrderBy
11450 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20  ->nExpr+2, 0,.  
11460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11470 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
11480 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
11490 3b 0a 20 20 20 20 64 65 73 74 51 75 65 75 65 2e  ;.    destQueue.
114a0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
114b0 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rBy;.  }else{.  
114c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
114d0 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
114e0 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c  hemeral, iQueue,
114f0 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64   nCol);.  }.  Vd
11500 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51  beComment((v, "Q
11510 75 65 75 65 20 74 61 62 6c 65 22 29 29 3b 0a 20  ueue table"));. 
11520 20 69 66 28 20 69 44 69 73 74 69 6e 63 74 20 29   if( iDistinct )
11530 7b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65  {.    p->addrOpe
11540 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74  nEphm[0] = sqlit
11550 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11560 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
11570 2c 20 69 44 69 73 74 69 6e 63 74 2c 20 30 29 3b  , iDistinct, 0);
11580 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
11590 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
115a0 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  eral;.  }..  /* 
115b0 44 65 74 61 63 68 20 74 68 65 20 4f 52 44 45 52  Detach the ORDER
115c0 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20   BY clause from 
115d0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  the compound SEL
115e0 45 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64  ECT */.  p->pOrd
115f0 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  erBy = 0;..  /* 
11600 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
11610 73 20 6f 66 20 74 68 65 20 73 65 74 75 70 2d 71  s of the setup-q
11620 75 65 72 79 20 69 6e 20 51 75 65 75 65 2e 20 2a  uery in Queue. *
11630 2f 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78  /.  pSetup->pNex
11640 74 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71  t = 0;.  rc = sq
11650 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
11660 73 65 2c 20 70 53 65 74 75 70 2c 20 26 64 65 73  se, pSetup, &des
11670 74 51 75 65 75 65 29 3b 0a 20 20 70 53 65 74 75  tQueue);.  pSetu
11680 70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  p->pNext = p;.  
11690 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
116a0 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71  d_of_recursive_q
116b0 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64  uery;..  /* Find
116c0 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e   the next row in
116d0 20 74 68 65 20 51 75 65 75 65 20 61 6e 64 20 6f   the Queue and o
116e0 75 74 70 75 74 20 74 68 61 74 20 72 6f 77 20 2a  utput that row *
116f0 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71  /.  addrTop = sq
11700 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11710 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 51  v, OP_Rewind, iQ
11720 75 65 75 65 2c 20 61 64 64 72 42 72 65 61 6b 29  ueue, addrBreak)
11730 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
11740 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65  );..  /* Transfe
11750 72 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69  r the next row i
11760 6e 20 51 75 65 75 65 20 6f 76 65 72 20 74 6f 20  n Queue over to 
11770 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 73 71 6c  Current */.  sql
11780 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
11790 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43  , OP_NullRow, iC
117a0 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54 6f 20 72  urrent); /* To r
117b0 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68  eset column cach
117c0 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65  e */.  if( pOrde
117d0 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
117e0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
117f0 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75 65 75  OP_Column, iQueu
11800 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  e, pOrderBy->nEx
11810 70 72 2b 31 2c 20 72 65 67 43 75 72 72 65 6e 74  pr+1, regCurrent
11820 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
11830 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11840 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c  2(v, OP_RowData,
11850 20 69 51 75 65 75 65 2c 20 72 65 67 43 75 72 72   iQueue, regCurr
11860 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ent);.  }.  sqli
11870 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
11880 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 51 75 65   OP_Delete, iQue
11890 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75  ue);..  /* Outpu
118a0 74 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77  t the single row
118b0 20 69 6e 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20   in Current */. 
118c0 20 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69   addrCont = sqli
118d0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
118e0 28 76 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65  (v);.  codeOffse
118f0 74 28 76 2c 20 72 65 67 4f 66 66 73 65 74 2c 20  t(v, regOffset, 
11900 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c  addrCont);.  sel
11910 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
11920 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
11930 74 2c 20 69 43 75 72 72 65 6e 74 2c 0a 20 20 20  t, iCurrent,.   
11940 20 20 20 30 2c 20 30 2c 20 70 44 65 73 74 2c 20     0, 0, pDest, 
11950 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72  addrCont, addrBr
11960 65 61 6b 29 3b 0a 20 20 69 66 28 20 72 65 67 4c  eak);.  if( regL
11970 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
11980 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
11990 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 72 65 67 4c   OP_IfZero, regL
119a0 69 6d 69 74 2c 20 61 64 64 72 42 72 65 61 6b 2c  imit, addrBreak,
119b0 20 2d 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f   -1);.    VdbeCo
119c0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20  verage(v);.  }. 
119d0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
119e0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
119f0 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20 45 78 65  Cont);..  /* Exe
11a00 63 75 74 65 20 74 68 65 20 72 65 63 75 72 73 69  cute the recursi
11a10 76 65 20 53 45 4c 45 43 54 20 74 61 6b 69 6e 67  ve SELECT taking
11a20 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20   the single row 
11a30 69 6e 20 43 75 72 72 65 6e 74 20 61 73 0a 20 20  in Current as.  
11a40 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  ** the value for
11a50 20 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 74   the recursive-t
11a60 61 62 6c 65 2e 20 53 74 6f 72 65 20 74 68 65 20  able. Store the 
11a70 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 51  results in the Q
11a80 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  ueue..  */.  p->
11a90 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 73 71  pPrior = 0;.  sq
11aa0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
11ab0 73 65 2c 20 70 2c 20 26 64 65 73 74 51 75 65 75  se, p, &destQueu
11ac0 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  e);.  assert( p-
11ad0 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20  >pPrior==0 );.  
11ae0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 53 65 74  p->pPrior = pSet
11af0 75 70 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 72  up;..  /* Keep r
11b00 75 6e 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 70 20  unning the loop 
11b10 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65 20  until the Queue 
11b20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 73 71  is empty */.  sq
11b30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11b40 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
11b50 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74  ddrTop);.  sqlit
11b60 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
11b70 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29  el(v, addrBreak)
11b80 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73  ;..end_of_recurs
11b90 69 76 65 5f 71 75 65 72 79 3a 0a 20 20 73 71 6c  ive_query:.  sql
11ba0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
11bb0 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
11bc0 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70  ->pOrderBy);.  p
11bd0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
11be0 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d  derBy;.  p->pLim
11bf0 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70  it = pLimit;.  p
11c00 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
11c10 73 65 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  set;.  return;.}
11c20 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
11c30 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 2f  E_OMIT_CTE */../
11c40 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
11c50 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  nces */.static i
11c60 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  nt multiSelectOr
11c70 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a  derBy(.  Parse *
11c80 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
11c90 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
11ca0 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
11cb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
11cc0 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
11cd0 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
11ce0 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
11cf0 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
11d00 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
11d10 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
11d20 73 20 2a 2f 0a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20  s */.);.../*.** 
11d30 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
11d40 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73  called to proces
11d50 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  s a compound que
11d60 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20  ry form from.** 
11d70 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  two or more sepa
11d80 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73 69  rate queries usi
11d90 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20  ng UNION, UNION 
11da0 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a  ALL, EXCEPT, or.
11db0 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a  ** INTERSECT.**.
11dc0 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f  ** "p" points to
11dd0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
11de0 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69  of the two queri
11df0 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f  es.  the query o
11e00 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73  n the.** left is
11e10 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65   p->pPrior.  The
11e20 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c   left query coul
11e30 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70  d also be a comp
11e40 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e  ound query.** in
11e50 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73   which case this
11e60 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
11e70 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
11e80 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ely. .**.** The 
11e90 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74  results of the t
11ea0 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74  otal query are t
11eb0 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
11ec0 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  o a destination.
11ed0 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74  ** of type eDest
11ee0 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20   with parameter 
11ef0 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  iParm..**.** Exa
11f00 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65  mple 1:  Conside
11f10 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f  r a three-way co
11f20 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65  mpound SQL state
11f30 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment..**.**     
11f40 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
11f50 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20   UNION SELECT b 
11f60 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45  FROM t2 UNION SE
11f70 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
11f80 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d  *.** This statem
11f90 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70  ent is parsed up
11fa0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
11fb0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20  **     SELECT c 
11fc0 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20  FROM t3.**      
11fd0 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d  |.**      `-----
11fe0 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  >  SELECT b FROM
11ff0 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   t2.**          
12000 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
12010 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d            `-----
12020 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f  ->  SELECT a FRO
12030 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  M t1.**.** The a
12040 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61  rrows in the dia
12050 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65  gram above repre
12060 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e  sent the Select.
12070 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a  pPrior pointer..
12080 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  ** So if this ro
12090 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
120a0 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20  with p equal to 
120b0 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68  the t3 query, th
120c0 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c  en.** pPrior wil
120d0 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72  l be the t2 quer
120e0 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62  y.  p->op will b
120f0 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68  e TK_UNION in th
12100 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e  is case..**.** N
12110 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75  otice that becau
12120 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51  se of the way SQ
12130 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70  Lite parses comp
12140 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68  ound SELECTs, th
12150 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
12160 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67  selects always g
12170 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74  roup from left t
12180 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74  o right..*/.stat
12190 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
121a0 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
121b0 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
121c0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
121d0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
121e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
121f0 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
12200 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
12210 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
12220 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
12230 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
12240 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
12250 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
12260 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20  SQLITE_OK;   /* 
12270 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f  Success code fro
12280 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  m a subroutine *
12290 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
122a0 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
122b0 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
122c0 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
122d0 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
122e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
122f0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
12300 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
12310 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
12320 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72  t;      /* Alter
12330 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73 74  native data dest
12340 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  ination */.  Sel
12350 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30  ect *pDelete = 0
12360 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73  ;  /* Chain of s
12370 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f  imple selects to
12380 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c   delete */.  sql
12390 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
123a0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
123b0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66  onnection */.#if
123c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
123d0 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69  _EXPLAIN.  int i
123e0 53 75 62 31 20 3d 20 30 3b 20 20 20 20 20 20 20  Sub1 = 0;       
123f0 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65   /* EQP id of le
12400 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f  ft-hand query */
12410 0a 20 20 69 6e 74 20 69 53 75 62 32 20 3d 20 30  .  int iSub2 = 0
12420 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20  ;        /* EQP 
12430 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64  id of right-hand
12440 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66   query */.#endif
12450 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
12460 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
12470 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63  ER BY or LIMIT c
12480 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53  lause on prior S
12490 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20  ELECTs.  Only.  
124a0 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69 67  ** the last (rig
124b0 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20  ht-most) SELECT 
124c0 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61  in the series ma
124d0 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  y have an ORDER 
124e0 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a  BY or LIMIT..  *
124f0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26 26  /.  assert( p &&
12500 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f   p->pPrior );  /
12510 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * Calling functi
12520 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  on guarantees th
12530 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73  is much */.  ass
12540 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
12550 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
12560 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  )==0 || p->op==T
12570 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  K_ALL || p->op==
12580 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62  TK_UNION );.  db
12590 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
125a0 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
125b0 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70  ior;.  dest = *p
125c0 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50 72 69  Dest;.  if( pPri
125d0 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  or->pOrderBy ){.
125e0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
125f0 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45  Msg(pParse,"ORDE
12600 52 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75  R BY clause shou
12610 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
12620 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
12630 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
12640 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
12650 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
12660 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
12670 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69 6f  .  }.  if( pPrio
12680 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  r->pLimit ){.   
12690 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
126a0 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20 63  (pParse,"LIMIT c
126b0 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d  lause should com
126c0 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62  e after %s not b
126d0 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65  efore",.      se
126e0 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
126f0 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
12700 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
12710 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
12720 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
12730 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
12740 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20  assert( v!=0 ); 
12750 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61 6c 72   /* The VDBE alr
12760 65 61 64 79 20 63 72 65 61 74 65 64 20 62 79 20  eady created by 
12770 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
12780 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65   */..  /* Create
12790 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
127a0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
127b0 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20   if necessary.  
127c0 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44  */.  if( dest.eD
127d0 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
127e0 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
127f0 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
12800 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12810 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
12820 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69 53  hemeral, dest.iS
12830 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74  DParm, p->pEList
12840 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 73 71  ->nExpr);.    sq
12850 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
12860 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44  5(v, BTREE_UNORD
12870 45 52 45 44 29 3b 0a 20 20 20 20 64 65 73 74 2e  ERED);.    dest.
12880 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c  eDest = SRT_Tabl
12890 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  e;.  }..  /* Mak
128a0 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43  e sure all SELEC
128b0 54 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  Ts in the statem
128c0 65 6e 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  ent have the sam
128d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
128e0 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ents.  ** in the
128f0 69 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a  ir result sets..
12900 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
12910 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72 69  ->pEList && pPri
12920 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20  or->pEList );.  
12930 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  if( p->pEList->n
12940 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45  Expr!=pPrior->pE
12950 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
12960 20 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61     if( p->selFla
12970 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29  gs & SF_Values )
12980 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
12990 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
129a0 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d 75 73 74  "all VALUES must
129b0 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
129c0 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 22 29  umber of terms")
129d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
129e0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
129f0 73 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45  sg(pParse, "SELE
12a00 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  CTs to the left 
12a10 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 22  and right of %s"
12a20 0a 20 20 20 20 20 20 20 20 22 20 64 6f 20 6e 6f  .        " do no
12a30 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
12a40 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
12a50 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63   columns", selec
12a60 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
12a70 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
12a80 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
12a90 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
12aa0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
12ab0 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 69 66 28  E_OMIT_CTE.  if(
12ac0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
12ad0 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  F_Recursive ){. 
12ae0 20 20 20 67 65 6e 65 72 61 74 65 57 69 74 68 52     generateWithR
12af0 65 63 75 72 73 69 76 65 51 75 65 72 79 28 70 50  ecursiveQuery(pP
12b00 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b  arse, p, &dest);
12b10 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
12b20 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53  .  /* Compound S
12b30 45 4c 45 43 54 73 20 74 68 61 74 20 68 61 76 65  ELECTs that have
12b40 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
12b50 75 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20  use are handled 
12b60 73 65 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f  separately..  */
12b70 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
12b80 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  By ){.    return
12b90 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
12ba0 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70  rBy(pParse, p, p
12bb0 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  Dest);.  }else..
12bc0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
12bd0 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20  de for the left 
12be0 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54  and right SELECT
12bf0 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
12c00 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  /.  switch( p->o
12c10 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
12c20 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _ALL: {.      in
12c30 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  t addr = 0;.    
12c40 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20    int nLimit;.  
12c50 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72      assert( !pPr
12c60 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20  ior->pLimit );. 
12c70 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69       pPrior->iLi
12c80 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b  mit = p->iLimit;
12c90 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69  .      pPrior->i
12ca0 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66  Offset = p->iOff
12cb0 73 65 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  set;.      pPrio
12cc0 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  r->pLimit = p->p
12cd0 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72  Limit;.      pPr
12ce0 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70  ior->pOffset = p
12cf0 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->pOffset;.     
12d00 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
12d10 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65  er(iSub1, pParse
12d20 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
12d30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
12d40 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
12d50 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74  e, pPrior, &dest
12d60 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  );.      p->pLim
12d70 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  it = 0;.      p-
12d80 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
12d90 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
12da0 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
12db0 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
12dc0 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50     }.      p->pP
12dd0 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
12de0 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69  p->iLimit = pPri
12df0 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20  or->iLimit;.    
12e00 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70    p->iOffset = p
12e10 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a  Prior->iOffset;.
12e20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69        if( p->iLi
12e30 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  mit ){.        a
12e40 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
12e50 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
12e60 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 29  Zero, p->iLimit)
12e70 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
12e80 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
12e90 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70  omment((v, "Jump
12ea0 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20   ahead if LIMIT 
12eb0 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20  reached"));.    
12ec0 20 20 7d 0a 20 20 20 20 20 20 65 78 70 6c 61 69    }.      explai
12ed0 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
12ee0 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  2, pParse->iNext
12ef0 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
12f00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
12f10 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
12f20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
12f30 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
12f40 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44  E_OK );.      pD
12f50 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
12f60 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
12f70 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
12f80 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
12f90 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c   += pPrior->nSel
12fa0 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 69 66  ectRow;.      if
12fb0 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  ( pPrior->pLimit
12fc0 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
12fd0 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
12fe0 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c 20  pPrior->pLimit, 
12ff0 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20 20 20  &nLimit).       
13000 26 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70  && nLimit>0 && p
13010 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 28  ->nSelectRow > (
13020 75 36 34 29 6e 4c 69 6d 69 74 20 0a 20 20 20 20  u64)nLimit .    
13030 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e    ){.        p->
13040 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 4c 69  nSelectRow = nLi
13050 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  mit;.      }.   
13060 20 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20     if( addr ){. 
13070 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13080 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
13090 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dr);.      }.   
130a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
130b0 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
130c0 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  PT:.    case TK_
130d0 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69  UNION: {.      i
130e0 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20  nt unionTab;    
130f0 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
13100 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
13110 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20  y table holding 
13120 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20  result */.      
13130 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20  u8 op = 0;      
13140 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53   /* One of the S
13150 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74  RT_ operations t
13160 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20  o apply to self 
13170 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69  */.      int pri
13180 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  orOp;     /* The
13190 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20   SRT_ operation 
131a0 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f  to apply to prio
131b0 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20  r selects */.   
131c0 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c     Expr *pLimit,
131d0 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61   *pOffset; /* Sa
131e0 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d  ved values of p-
131f0 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e  >nLimit and p->n
13200 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20  Offset */.      
13210 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
13220 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69 6f 6e  SelectDest union
13230 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 74 65 73  dest;..      tes
13240 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
13250 5f 45 58 43 45 50 54 20 29 3b 0a 20 20 20 20 20  _EXCEPT );.     
13260 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70   testcase( p->op
13270 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
13280 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53 52      priorOp = SR
13290 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69  T_Union;.      i
132a0 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70  f( dest.eDest==p
132b0 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20  riorOp ){.      
132c0 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73    /* We can reus
132d0 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  e a temporary ta
132e0 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ble generated by
132f0 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72   a SELECT to our
13300 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68  .        ** righ
13310 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
13320 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
13330 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20  >pLimit==0 );   
13340 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65     /* Not allowe
13350 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c  d on leftward el
13360 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  ements */.      
13370 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66    assert( p->pOf
13380 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 2f  fset==0 );     /
13390 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e  * Not allowed on
133a0 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e   leftward elemen
133b0 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e  ts */.        un
133c0 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 53  ionTab = dest.iS
133d0 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  DParm;.      }el
133e0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57  se{.        /* W
133f0 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  e will need to c
13400 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65  reate our own te
13410 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f  mporary table to
13420 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20   hold the.      
13430 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74    ** intermediat
13440 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20  e results..     
13450 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e     */.        un
13460 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d  ionTab = pParse-
13470 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
13480 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
13490 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  erBy==0 );.     
134a0 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
134b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
134c0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
134d0 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
134e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
134f0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
13500 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
13510 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
13520 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[0] = addr;.  
13530 20 20 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d        findRightm
13540 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73  ost(p)->selFlags
13550 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
13560 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61 73  eral;.        as
13570 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
13580 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
13590 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
135a0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
135b0 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20  to our left.    
135c0 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
135d0 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64  t( !pPrior->pOrd
135e0 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20 73 71  erBy );.      sq
135f0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
13600 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20  nit(&uniondest, 
13610 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61  priorOp, unionTa
13620 62 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  b);.      explai
13630 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
13640 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  1, pParse->iNext
13650 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
13660 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
13670 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
13680 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b  or, &uniondest);
13690 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
136a0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
136b0 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
136c0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
136d0 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
136e0 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nt SELECT statem
136f0 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ent.      */.   
13700 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
13710 5f 45 58 43 45 50 54 20 29 7b 0a 20 20 20 20 20  _EXCEPT ){.     
13720 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65     op = SRT_Exce
13730 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  pt;.      }else{
13740 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13750 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
13760 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d   );.        op =
13770 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20   SRT_Union;.    
13780 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72    }.      p->pPr
13790 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
137a0 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
137b0 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  t;.      p->pLim
137c0 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  it = 0;.      pO
137d0 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
137e0 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  et;.      p->pOf
137f0 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
13800 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74 20  uniondest.eDest 
13810 3d 20 6f 70 3b 0a 20 20 20 20 20 20 65 78 70 6c  = op;.      expl
13820 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
13830 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub2, pParse->iNe
13840 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
13850 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
13860 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
13870 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20   &uniondest);.  
13880 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
13890 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
138a0 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6c       /* Query fl
138b0 61 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69  attening in sqli
138c0 74 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67 68  te3Select() migh
138d0 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64  t refill p->pOrd
138e0 65 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42  erBy..      ** B
138f0 65 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74 65  e sure to delete
13900 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74 68   p->pOrderBy, th
13910 65 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69  erefore, to avoi
13920 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e  d a memory leak.
13930 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
13940 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
13950 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  db, p->pOrderBy)
13960 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20  ;.      pDelete 
13970 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
13980 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
13990 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
139a0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
139b0 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
139c0 4b 5f 55 4e 49 4f 4e 20 29 20 70 2d 3e 6e 53 65  K_UNION ) p->nSe
139d0 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f  lectRow += pPrio
139e0 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  r->nSelectRow;. 
139f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
13a00 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
13a10 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  imit);.      p->
13a20 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
13a30 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
13a40 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20  t = pOffset;.   
13a50 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30     p->iLimit = 0
13a60 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73  ;.      p->iOffs
13a70 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f  et = 0;..      /
13a80 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61  * Convert the da
13a90 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72  ta in the tempor
13aa0 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77  ary table into w
13ab0 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20  hatever form.   
13ac0 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74     ** it is that
13ad0 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65   we currently ne
13ae0 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
13af0 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 6f 6e     assert( union
13b00 54 61 62 3d 3d 64 65 73 74 2e 69 53 44 50 61 72  Tab==dest.iSDPar
13b10 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65 73 74 21  m || dest.eDest!
13b20 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20  =priorOp );.    
13b30 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
13b40 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20  !=priorOp ){.   
13b50 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
13b60 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a  iBreak, iStart;.
13b70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13b80 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
13b90 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
13ba0 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
13bb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c  ){.          Sel
13bc0 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b  ect *pFirst = p;
13bd0 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
13be0 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  ( pFirst->pPrior
13bf0 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72   ) pFirst = pFir
13c00 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  st->pPrior;.    
13c10 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f        generateCo
13c20 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
13c30 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c  , 0, pFirst->pEL
13c40 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ist);.        }.
13c50 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d          iBreak =
13c60 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
13c70 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
13c80 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65    iCont = sqlite
13c90 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
13ca0 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75  );.        compu
13cb0 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
13cc0 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65  (pParse, p, iBre
13cd0 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
13ce0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13cf0 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69  , OP_Rewind, uni
13d00 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 20  onTab, iBreak); 
13d10 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
13d20 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20  .        iStart 
13d30 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
13d40 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
13d50 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
13d60 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
13d70 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e  p->pEList, union
13d80 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Tab,.           
13d90 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
13da0 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c  0, &dest, iCont,
13db0 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
13dc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
13dd0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
13de0 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nt);.        sql
13df0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13e00 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e  , OP_Next, union
13e10 54 61 62 2c 20 69 53 74 61 72 74 29 3b 20 56 64  Tab, iStart); Vd
13e20 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
13e30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13e40 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
13e50 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
13e60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13e70 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
13e80 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
13e90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
13ea0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
13eb0 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20  efault: assert( 
13ec0 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  p->op==TK_INTERS
13ed0 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20 69  ECT ); {.      i
13ee0 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20  nt tab1, tab2;. 
13ef0 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
13f00 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a  iBreak, iStart;.
13f10 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d        Expr *pLim
13f20 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20  it, *pOffset;.  
13f30 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
13f40 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 69      SelectDest i
13f50 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a 20 20  ntersectdest;.  
13f60 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 20      int r1;..   
13f70 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20     /* INTERSECT 
13f80 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  is different fro
13f90 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e  m the others sin
13fa0 63 65 20 69 74 20 72 65 71 75 69 72 65 73 0a 20  ce it requires. 
13fb0 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70       ** two temp
13fc0 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48  orary tables.  H
13fd0 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73 20  ence it has its 
13fe0 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e  own case.  Begin
13ff0 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c  .      ** by all
14000 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c  ocating the tabl
14010 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e  es we will need.
14020 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14030 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab1 = pParse->n
14040 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62  Tab++;.      tab
14050 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  2 = pParse->nTab
14060 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ++;.      assert
14070 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
14080 20 29 3b 0a 0a 20 20 20 20 20 20 61 64 64 72 20   );..      addr 
14090 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
140a0 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
140b0 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20 30  hemeral, tab1, 0
140c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
140d0 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
140e0 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [0] == -1 );.   
140f0 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
14100 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[0] = addr;.  
14110 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f 73      findRightmos
14120 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  t(p)->selFlags |
14130 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72  = SF_UsesEphemer
14140 61 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  al;.      assert
14150 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a  ( p->pEList );..
14160 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
14170 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72  e SELECTs to our
14180 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f   left into tempo
14190 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31  rary table "tab1
141a0 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
141b0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
141c0 65 73 74 49 6e 69 74 28 26 69 6e 74 65 72 73 65  estInit(&interse
141d0 63 74 64 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f  ctdest, SRT_Unio
141e0 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20 20  n, tab1);.      
141f0 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
14200 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d  r(iSub1, pParse-
14210 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
14220 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
14230 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
14240 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74 65 72  , pPrior, &inter
14250 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20  sectdest);.     
14260 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
14270 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
14280 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
14290 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
142a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
142b0 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61  ECT into tempora
142c0 72 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a  ry table "tab2".
142d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
142e0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
142f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
14300 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62  enEphemeral, tab
14310 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  2, 0);.      ass
14320 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
14330 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b  Ephm[1] == -1 );
14340 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  .      p->addrOp
14350 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72  enEphm[1] = addr
14360 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
14370 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69  r = 0;.      pLi
14380 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
14390 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
143a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66   = 0;.      pOff
143b0 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
143c0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
143d0 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  et = 0;.      in
143e0 74 65 72 73 65 63 74 64 65 73 74 2e 69 53 44 50  tersectdest.iSDP
143f0 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20 20  arm = tab2;.    
14400 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
14410 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73  ger(iSub2, pPars
14420 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
14430 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
14440 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
14450 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73 65 63  se, p, &intersec
14460 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65  tdest);.      te
14470 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
14480 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70  TE_OK );.      p
14490 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69  Delete = p->pPri
144a0 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  or;.      p->pPr
144b0 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
144c0 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65      if( p->nSele
144d0 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e 53  ctRow>pPrior->nS
144e0 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53  electRow ) p->nS
144f0 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f  electRow = pPrio
14500 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  r->nSelectRow;. 
14510 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
14520 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
14530 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  imit);.      p->
14540 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
14550 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
14560 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 0a 20 20  t = pOffset;..  
14570 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
14580 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65  code to take the
14590 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66   intersection of
145a0 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61   the two tempora
145b0 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  ry.      ** tabl
145c0 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  es..      */.   
145d0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
145e0 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66  List );.      if
145f0 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52  ( dest.eDest==SR
14600 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
14610 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72      Select *pFir
14620 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  st = p;.        
14630 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70  while( pFirst->p
14640 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d  Prior ) pFirst =
14650 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b   pFirst->pPrior;
14660 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74  .        generat
14670 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
14680 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e  rse, 0, pFirst->
14690 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d  pEList);.      }
146a0 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20  .      iBreak = 
146b0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
146c0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
146d0 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
146e0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
146f0 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
14700 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
14710 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
14720 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14730 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
14740 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65  wind, tab1, iBre
14750 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
14760 65 28 76 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  e(v);.      r1 =
14770 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
14780 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
14790 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
147a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
147b0 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c  OP_RowKey, tab1,
147c0 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
147d0 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
147e0 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
147f0 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31   tab2, iCont, r1
14800 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 0); VdbeCovera
14810 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
14820 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
14830 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
14840 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
14850 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
14860 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31   p->pEList, tab1
14870 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14880 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64          0, 0, &d
14890 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65  est, iCont, iBre
148a0 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
148b0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
148c0 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
148d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
148e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
148f0 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b  , tab1, iStart);
14900 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
14910 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
14920 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
14930 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
14940 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14950 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
14960 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20   tab2, 0);.     
14970 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14980 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
14990 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
149a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
149b0 0a 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f  ..  explainCompo
149c0 73 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  site(pParse, p->
149d0 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32  op, iSub1, iSub2
149e0 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29  , p->op!=TK_ALL)
149f0 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  ;..  /* Compute 
14a00 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
14a10 63 65 73 20 75 73 65 64 20 62 79 20 0a 20 20 2a  ces used by .  *
14a20 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  * temporary tabl
14a30 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70  es needed to imp
14a40 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f  lement the compo
14a50 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a  und select..  **
14a60 20 41 74 74 61 63 68 20 74 68 65 20 4b 65 79 49   Attach the KeyI
14a70 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f  nfo structure to
14a80 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74   all temporary t
14a90 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ables..  **.  **
14aa0 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73   This section is
14ab0 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67 68   run by the righ
14ac0 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
14ad0 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20  atement only..  
14ae0 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
14af0 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ents to the left
14b00 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69   always skip thi
14b10 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69 67  s part.  The rig
14b20 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c  ht-most.  ** SEL
14b30 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73  ECT might also s
14b40 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69 66  kip this part if
14b50 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52   it has no ORDER
14b60 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20   BY clause and. 
14b70 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c   ** no temp tabl
14b80 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64 2e  es are required.
14b90 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
14ba0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65  elFlags & SF_Use
14bb0 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20  sEphemeral ){.  
14bc0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
14bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14be0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
14bf0 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  */.    KeyInfo *
14c00 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20  pKeyInfo;       
14c10 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e       /* Collatin
14c20 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
14c30 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
14c40 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f  .    Select *pLo
14c50 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
14c60 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
14c70 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54  g through SELECT
14c80 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20   statements */. 
14c90 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43     CollSeq **apC
14ca0 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
14cb0 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
14cc0 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f  through pKeyInfo
14cd0 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20  ->aColl[] */.   
14ce0 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
14cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14d00 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
14d10 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65  mns in result se
14d20 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  t */..    assert
14d30 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b  ( p->pNext==0 );
14d40 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70  .    nCol = p->p
14d50 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
14d60 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
14d70 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
14d80 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20  (db, nCol, 1);. 
14d90 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f     if( !pKeyInfo
14da0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
14db0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
14dc0 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
14dd0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
14de0 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43      for(i=0, apC
14df0 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  oll=pKeyInfo->aC
14e00 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  oll; i<nCol; i++
14e10 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20  , apColl++){.   
14e20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c     *apColl = mul
14e30 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
14e40 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
14e50 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43       if( 0==*apC
14e60 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  oll ){.        *
14e70 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66  apColl = db->pDf
14e80 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
14e90 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70      }..    for(p
14ea0 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
14eb0 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
14ec0 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  or){.      for(i
14ed0 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
14ee0 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
14ef0 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  = pLoop->addrOpe
14f00 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20  nEphm[i];.      
14f10 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
14f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
14f30 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68  [0] is unused th
14f40 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75  en [1] is also u
14f50 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61  nused.  So we ca
14f60 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  n.          ** a
14f70 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f  lways safely abo
14f80 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  rt as soon as th
14f90 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73  e first unused s
14fa0 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a  lot is found */.
14fb0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
14fc0 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  ( pLoop->addrOpe
14fd0 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20  nEphm[1]<0 );.  
14fe0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
14ff0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15000 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
15010 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43  geP2(v, addr, nC
15020 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
15030 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
15040 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a  (v, addr, (char*
15050 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  )sqlite3KeyInfoR
15060 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 0a 20 20  ef(pKeyInfo),.  
15070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15080 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59            P4_KEY
15090 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70  INFO);.        p
150a0 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
150b0 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20  hm[i] = -1;.    
150c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
150d0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
150e0 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d  f(pKeyInfo);.  }
150f0 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  ..multi_select_e
15100 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53 64  nd:.  pDest->iSd
15110 73 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b  st = dest.iSdst;
15120 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20  .  pDest->nSdst 
15130 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20  = dest.nSdst;.  
15140 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
15150 65 74 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29  ete(db, pDelete)
15160 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
15170 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
15180 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
15190 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SELECT */../*.**
151a0 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74 20   Code an output 
151b0 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 61  subroutine for a
151c0 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65   coroutine imple
151d0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a  mentation of a.*
151e0 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65 6e  * SELECT statmen
151f0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74  t..**.** The dat
15200 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20 69  a to be output i
15210 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70  s contained in p
15220 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 72  In->iSdst.  Ther
15230 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53  e are.** pIn->nS
15240 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62  dst columns to b
15250 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73 74  e output.  pDest
15260 20 69 73 20 77 68 65 72 65 20 74 68 65 20 6f 75   is where the ou
15270 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  tput should.** b
15280 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65  e sent..**.** re
15290 67 52 65 74 75 72 6e 20 69 73 20 74 68 65 20 6e  gReturn is the n
152a0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65 67  umber of the reg
152b0 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68  ister holding th
152c0 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20  e subroutine.** 
152d0 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e 0a  return address..
152e0 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65 76  **.** If regPrev
152f0 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  >0 then it is th
15300 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72  e first register
15310 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68 61   in a vector tha
15320 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68 65  t.** records the
15330 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
15340 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20  .  mem[regPrev] 
15350 69 73 20 61 20 66 6c 61 67 20 74 68 61 74 20 69  is a flag that i
15360 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68  s false.** if th
15370 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f 20  ere has been no 
15380 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e  previous output.
15390 20 20 49 66 20 72 65 67 50 72 65 76 3e 30 20 74    If regPrev>0 t
153a0 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67  hen code is.** g
153b0 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70 70  enerated to supp
153c0 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 2e  ress duplicates.
153d0 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75 73    pKeyInfo is us
153e0 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67  ed for comparing
153f0 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20  .** keys..**.** 
15400 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f 75  If the LIMIT fou
15410 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20  nd in p->iLimit 
15420 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d 70  is reached, jump
15430 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a   immediately to.
15440 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74  ** iBreak..*/.st
15450 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61 74  atic int generat
15460 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
15470 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
15480 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
15490 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
154a0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
154b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
154c0 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
154d0 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ment */.  Select
154e0 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20 20  Dest *pIn,      
154f0 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73    /* Coroutine s
15500 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f  upplying data */
15510 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
15520 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57 68  Dest,      /* Wh
15530 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65 20  ere to send the 
15540 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65  data */.  int re
15550 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20 20  gReturn,        
15560 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20    /* The return 
15570 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  address register
15580 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65   */.  int regPre
15590 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v,            /*
155a0 20 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c 74   Previous result
155b0 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20 75   register.  No u
155c0 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30 20 2a  niqueness if 0 *
155d0 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
155e0 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46  yInfo,      /* F
155f0 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69 74  or comparing wit
15600 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  h previous entry
15610 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
15620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15630 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77 65   Jump here if we
15640 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20 2a   hit the LIMIT *
15650 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
15660 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
15670 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b    int iContinue;
15680 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20  .  int addr;..  
15690 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
156a0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
156b0 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20  ;.  iContinue = 
156c0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
156d0 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53  abel(v);..  /* S
156e0 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74  uppress duplicat
156f0 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58  es for UNION, EX
15700 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53  CEPT, and INTERS
15710 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ECT .  */.  if( 
15720 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20 69  regPrev ){.    i
15730 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20 20 6a  nt j1, j2;.    j
15740 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
15750 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
15760 74 2c 20 72 65 67 50 72 65 76 29 3b 20 56 64 62  t, regPrev); Vdb
15770 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
15780 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64    j2 = sqlite3Vd
15790 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
157a0 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 53 64  ompare, pIn->iSd
157b0 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70  st, regPrev+1, p
157c0 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20 20 20 20  In->nSdst,.     
157d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157e0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
157f0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65  sqlite3KeyInfoRe
15800 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f  f(pKeyInfo), P4_
15810 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71  KEYINFO);.    sq
15820 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
15830 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 32 2b 32  v, OP_Jump, j2+2
15840 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6a 32 2b  , iContinue, j2+
15850 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  2); VdbeCoverage
15860 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
15870 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
15880 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  j1);.    sqlite3
15890 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
158a0 5f 43 6f 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73  _Copy, pIn->iSds
158b0 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49  t, regPrev+1, pI
158c0 6e 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20  n->nSdst-1);.   
158d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
158e0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
158f0 2c 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20  , 1, regPrev);. 
15900 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d   }.  if( pParse-
15910 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
15920 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  d ) return 0;.. 
15930 20 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68 65   /* Suppress the
15940 20 66 69 72 73 74 20 4f 46 46 53 45 54 20 65 6e   first OFFSET en
15950 74 72 69 65 73 20 69 66 20 74 68 65 72 65 20 69  tries if there i
15960 73 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75  s an OFFSET clau
15970 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66  se.  */.  codeOf
15980 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73  fset(v, p->iOffs
15990 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a  et, iContinue);.
159a0 0a 20 20 73 77 69 74 63 68 28 20 70 44 65 73 74  .  switch( pDest
159b0 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f  ->eDest ){.    /
159c0 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
159d0 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67  lt as data using
159e0 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20   a unique key.. 
159f0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
15a00 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61  RT_Table:.    ca
15a10 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a  se SRT_EphemTab:
15a20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20   {.      int r1 
15a30 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
15a40 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
15a50 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69     int r2 = sqli
15a60 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
15a70 61 72 73 65 29 3b 0a 20 20 20 20 20 20 74 65 73  arse);.      tes
15a80 74 63 61 73 65 28 20 70 44 65 73 74 2d 3e 65 44  tcase( pDest->eD
15a90 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29  est==SRT_Table )
15aa0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
15ab0 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
15ac0 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a  SRT_EphemTab );.
15ad0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15ae0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
15af0 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69  keRecord, pIn->i
15b00 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
15b10 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
15b20 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15b30 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70  , OP_NewRowid, p
15b40 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
15b50 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
15b60 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
15b70 50 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d  P_Insert, pDest-
15b80 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c 20 72 32  >iSDParm, r1, r2
15b90 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15ba0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
15bb0 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
15bc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
15bd0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
15be0 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  se, r2);.      s
15bf0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
15c00 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
15c10 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
15c20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
15c30 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
15c40 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  RY.    /* If we 
15c50 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73  are creating a s
15c60 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20  et for an "expr 
15c70 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
15c80 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20   construct,.    
15c90 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68  ** then there sh
15ca0 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65  ould be a single
15cb0 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61   item on the sta
15cc0 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a  ck.  Write this.
15cd0 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f      ** item into
15ce0 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77   the set table w
15cf0 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a  ith bogus data..
15d00 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
15d10 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
15d20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 61   int r1;.      a
15d30 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73  ssert( pIn->nSds
15d40 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 44  t==1 );.      pD
15d50 65 73 74 2d 3e 61 66 66 53 64 73 74 20 3d 20 0a  est->affSdst = .
15d60 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15d70 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
15d80 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
15d90 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61 66  pExpr, pDest->af
15da0 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 72 31  fSdst);.      r1
15db0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
15dc0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
15dd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15de0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
15df0 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64  Record, pIn->iSd
15e00 73 74 2c 20 31 2c 20 72 31 2c 20 26 70 44 65 73  st, 1, r1, &pDes
15e10 74 2d 3e 61 66 66 53 64 73 74 2c 31 29 3b 0a 20  t->affSdst,1);. 
15e20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
15e30 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
15e40 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  nge(pParse, pIn-
15e50 3e 69 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20  >iSdst, 1);.    
15e60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15e70 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
15e80 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ert, pDest->iSDP
15e90 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  arm, r1);.      
15ea0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
15eb0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
15ec0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
15ed0 20 20 20 20 7d 0a 0a 23 69 66 20 30 20 20 2f 2a      }..#if 0  /*
15ee0 20 4e 65 76 65 72 20 6f 63 63 75 72 73 20 6f 6e   Never occurs on
15ef0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 71 75 65   an ORDER BY que
15f00 72 79 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20  ry */.    /* If 
15f10 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e  any row exist in
15f20 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
15f30 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63   record that fac
15f40 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20  t and abort..   
15f50 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
15f60 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20  _Exists: {.     
15f70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15f80 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
15f90 2c 20 31 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  , 1, pDest->iSDP
15fa0 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  arm);.      /* T
15fb0 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
15fc0 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  will terminate t
15fd0 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
15fe0 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
15ff0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
16000 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
16010 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74   scalar select t
16020 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
16030 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  n expression, th
16040 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  en.    ** store 
16050 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
16060 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
16070 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62  emory cell and b
16080 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20  reak out.    ** 
16090 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70  of the scan loop
160a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
160b0 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
160c0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e     assert( pIn->
160d0 6e 53 64 73 74 3d 3d 31 20 29 3b 0a 20 20 20 20  nSdst==1 );.    
160e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
160f0 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49  eMove(pParse, pI
16100 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d  n->iSdst, pDest-
16110 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20  >iSDParm, 1);.  
16120 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
16130 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
16140 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
16150 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
16160 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
16170 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
16180 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
16190 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a  QUERY */..    /*
161a0 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
161b0 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71   stored in a seq
161c0 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
161d0 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69  rs.    ** starti
161e0 6e 67 20 61 74 20 70 44 65 73 74 2d 3e 69 53 64  ng at pDest->iSd
161f0 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f  st.  Then the co
16200 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e  -routine yields.
16210 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
16220 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20   SRT_Coroutine: 
16230 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 73  {.      if( pDes
16240 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20  t->iSdst==0 ){. 
16250 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69 53         pDest->iS
16260 64 73 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74  dst = sqlite3Get
16270 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
16280 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
16290 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e 53         pDest->nS
162a0 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74  dst = pIn->nSdst
162b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
162c0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
162d0 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  ove(pParse, pIn-
162e0 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69  >iSdst, pDest->i
162f0 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 6e 53 64  Sdst, pDest->nSd
16300 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
16310 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
16320 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d  OP_Yield, pDest-
16330 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  >iSDParm);.     
16340 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
16350 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66     /* If none of
16360 20 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65 6e   the above, then
16370 20 74 68 65 20 72 65 73 75 6c 74 20 64 65 73 74   the result dest
16380 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a  ination must be.
16390 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75      ** SRT_Outpu
163a0 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
163b0 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
163c0 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72 0a   with any other.
163d0 20 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69      ** destinati
163e0 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  on other than th
163f0 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20 61  e ones handled a
16400 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74 70  bove or SRT_Outp
16410 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ut..    **.    *
16420 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75 74  * For SRT_Output
16430 2c 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74  , results are st
16440 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e  ored in a sequen
16450 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e  ce of registers.
16460 20 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 74    .    ** Then t
16470 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20  he OP_ResultRow 
16480 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20 74  opcode is used t
16490 6f 20 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f  o cause sqlite3_
164a0 73 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a  step() to.    **
164b0 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74   return the next
164c0 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a   row of result..
164d0 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
164e0 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
164f0 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  rt( pDest->eDest
16500 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a  ==SRT_Output );.
16510 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16520 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
16530 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53  sultRow, pIn->iS
16540 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
16550 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
16560 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
16570 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  Change(pParse, p
16580 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
16590 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 62 72  nSdst);.      br
165a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
165b0 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
165c0 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
165d0 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
165e0 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20   reached..  */. 
165f0 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29   if( p->iLimit )
16600 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
16610 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
16620 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  Zero, p->iLimit,
16630 20 69 42 72 65 61 6b 2c 20 2d 31 29 3b 20 56 64   iBreak, -1); Vd
16640 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
16650 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
16660 65 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  e the subroutine
16670 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73   return.  */.  s
16680 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
16690 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69  eLabel(v, iConti
166a0 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  nue);.  sqlite3V
166b0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
166c0 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72  Return, regRetur
166d0 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64  n);..  return ad
166e0 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74  dr;.}../*.** Alt
166f0 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e  ernative compoun
16700 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65  d select code ge
16710 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65  nerator for case
16720 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20  s when there.** 
16730 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
16740 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  lause..**.** We 
16750 61 73 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f  assume a query o
16760 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
16770 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
16780 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65   <selectA>  <ope
16790 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42  rator>  <selectB
167a0 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64  >  ORDER BY <ord
167b0 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20  erbylist>.**.** 
167c0 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e  <operator> is on
167d0 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  e of UNION ALL, 
167e0 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f  UNION, EXCEPT, o
167f0 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68  r INTERSECT.  Th
16800 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20  e idea.** is to 
16810 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63  code both <selec
16820 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42  tA> and <selectB
16830 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52  > with the ORDER
16840 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a   BY clause as.**
16850 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54   co-routines.  T
16860 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72  hen run the co-r
16870 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c  outines in paral
16880 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68  lel and merge th
16890 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74  e results.** int
168a0 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49  o the output.  I
168b0 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68  n addition to th
168c0 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73  e two coroutines
168d0 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41   (called selectA
168e0 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29   and.** selectB)
168f0 20 74 68 65 72 65 20 61 72 65 20 37 20 73 75 62   there are 7 sub
16900 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20  routines:.**.** 
16910 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65     outA:    Move
16920 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   the output of t
16930 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75  he selectA corou
16940 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75  tine into the ou
16950 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  tput.**         
16960 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f      of the compo
16970 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a  und query..**.**
16980 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76      outB:    Mov
16990 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  e the output of 
169a0 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f  the selectB coro
169b0 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f  utine into the o
169c0 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  utput.**        
169d0 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70       of the comp
169e0 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e  ound query.  (On
169f0 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72  ly generated for
16a00 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20   UNION and.**   
16a10 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20            UNION 
16a20 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64  ALL.  EXCEPT and
16a30 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65   INSERTSECT neve
16a40 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74  r output a row t
16a50 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
16a60 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20     appears only 
16a70 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20  in B.).**.**    
16a80 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  AltB:    Called 
16a90 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61  when there is da
16aa0 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72  ta from both cor
16ab0 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e  outines and A<B.
16ac0 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20  .**.**    AeqB: 
16ad0 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
16ae0 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
16af0 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
16b00 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a  s and A==B..**.*
16b10 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20 43 61  *    AgtB:    Ca
16b20 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
16b30 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
16b40 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
16b50 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45   A>B..**.**    E
16b60 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ofA:    Called w
16b70 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61  hen data is exha
16b80 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63  usted from selec
16b90 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66  tA..**.**    Eof
16ba0 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
16bb0 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73  n data is exhaus
16bc0 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42  ted from selectB
16bd0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ..**.** The impl
16be0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
16bf0 65 20 6c 61 74 74 65 72 20 66 69 76 65 20 73 75  e latter five su
16c00 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64  broutines depend
16c10 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f   on which .** <o
16c20 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64  perator> is used
16c30 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  :.**.**.**      
16c40 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
16c50 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20           UNION  
16c60 20 20 20 20 20 20 20 20 20 20 45 58 43 45 50 54            EXCEPT
16c70 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 53            INTERS
16c80 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ECT.**          
16c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
16ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16cb0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
16cc0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
16cd0 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20  ---.**   AltB:  
16ce0 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
16cf0 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
16d00 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
16d10 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a          nextA.**
16d20 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75  .**   AeqB:   ou
16d30 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
16d40 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20    nextA         
16d50 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20      nextA       
16d60 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a    outA, nextA.**
16d70 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75  .**   AgtB:   ou
16d80 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f  tB, nextB      o
16d90 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
16da0 20 20 20 20 6e 65 78 74 42 20 20 20 20 20 20 20      nextB       
16db0 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a       nextB.**.**
16dc0 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c     EofA:   outB,
16dd0 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42   nextB      outB
16de0 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20  , nextB         
16df0 20 68 61 6c 74 20 20 20 20 20 20 20 20 20 20 20   halt           
16e00 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45    halt.**.**   E
16e10 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78  ofB:   outA, nex
16e20 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  tA      outA, ne
16e30 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20  xtA       outA, 
16e40 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 68 61  nextA         ha
16e50 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  lt.**.** In the 
16e60 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20  AltB, AeqB, and 
16e70 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73  AgtB subroutines
16e80 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f  , an EOF on A fo
16e90 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a  llowing nextA.**
16ea0 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64   causes an immed
16eb0 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66  iate jump to Eof
16ec0 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20  A and an EOF on 
16ed0 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  B following next
16ee0 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69  B causes.** an i
16ef0 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f  mmediate jump to
16f00 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45   EofB.  Within E
16f10 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e  ofA and EofB, an
16f20 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f  d EOF on entry o
16f30 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e  r.** following n
16f40 65 78 74 58 20 63 61 75 73 65 73 20 61 20 6a 75  extX causes a ju
16f50 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
16f60 20 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63   the select proc
16f70 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75  essing..**.** Du
16f80 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20  plicate removal 
16f90 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58  in the UNION, EX
16fa0 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53  CEPT, and INTERS
16fb0 45 43 54 20 63 61 73 65 73 20 69 73 20 68 61 6e  ECT cases is han
16fc0 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74  dled.** within t
16fd0 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  he output subrou
16fe0 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72  tine.  The regPr
16ff0 65 76 20 72 65 67 69 73 74 65 72 20 73 65 74 20  ev register set 
17000 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f  holds the previo
17010 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76  usly.** output v
17020 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69  alue.  A compari
17030 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69  son is made agai
17040 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65 20 61  nst this value a
17050 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  nd the output.**
17060 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74   is skipped if t
17070 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20  he next results 
17080 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d  would be the sam
17090 65 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75  e as the previou
170a0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  s..**.** The imp
170b0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e  lementation plan
170c0 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74   is to implement
170d0 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69   the two corouti
170e0 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a  nes and seven.**
170f0 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72   subroutines fir
17100 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65  st, then put the
17110 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61   control logic a
17120 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c  t the bottom.  L
17130 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
17140 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e           goto In
17150 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63  it.**     coA: c
17160 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66  oroutine for lef
17170 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20  t query (A).**  
17180 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e     coB: coroutin
17190 65 20 66 6f 72 20 72 69 67 68 74 20 71 75 65 72  e for right quer
171a0 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41  y (B).**    outA
171b0 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77  : output one row
171c0 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42   of A.**    outB
171d0 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77  : output one row
171e0 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64   of B (UNION and
171f0 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29   UNION ALL only)
17200 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e  .**    EofA: ...
17210 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e  .**    EofB: ...
17220 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e  .**    AltB: ...
17230 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e  .**    AeqB: ...
17240 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e  .**    AgtB: ...
17250 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69  .**    Init: ini
17260 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e  tialize coroutin
17270 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20  e registers.**  
17280 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f          yield co
17290 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66  A.**          if
172a0 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66   eof(A) goto Eof
172b0 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69  A.**          yi
172c0 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20  eld coB.**      
172d0 20 20 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f      if eof(B) go
172e0 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d  to EofB.**    Cm
172f0 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42  pr: Compare A, B
17300 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d  .**          Jum
17310 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67  p AltB, AeqB, Ag
17320 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e  tB.**     End: .
17330 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c  ...**.** We call
17340 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74   AltB, AeqB, Agt
17350 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66  B, EofA, and Eof
17360 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20  B "subroutines" 
17370 62 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74  but they are not
17380 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c  .** actually cal
17390 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20  led using Gosub 
173a0 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  and they do not 
173b0 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e  Return.  EofA an
173c0 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75  d EofB loop.** u
173d0 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73  ntil all data is
173e0 20 65 78 68 61 75 73 74 65 64 20 74 68 65 6e 20   exhausted then 
173f0 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64  jump to the "end
17400 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41  " labe.  AltB, A
17410 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42  eqB,.** and AgtB
17420 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20   jump to either 
17430 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20  L2 or to one of 
17440 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f  EofA or EofB..*/
17450 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17460 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
17470 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20  LECT.static int 
17480 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
17490 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  By(.  Parse *pPa
174a0 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
174b0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
174c0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
174d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
174e0 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
174f0 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
17500 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
17510 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
17520 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
17530 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
17540 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
17550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17560 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
17570 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
17580 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  r;       /* Anot
17590 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64  her SELECT immed
175a0 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65  iately to our le
175b0 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ft */.  Vdbe *v;
175c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
175d0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
175e0 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
175f0 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
17600 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e  A;     /* Destin
17610 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74  ation for corout
17620 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63  ine A */.  Selec
17630 74 44 65 73 74 20 64 65 73 74 42 3b 20 20 20 20  tDest destB;    
17640 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20   /* Destination 
17650 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20  for coroutine B 
17660 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72  */.  int regAddr
17670 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  A;         /* Ad
17680 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
17690 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f  or select-A coro
176a0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
176b0 65 67 41 64 64 72 42 3b 20 20 20 20 20 20 20 20  egAddrB;        
176c0 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
176d0 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
176e0 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  B coroutine */. 
176f0 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41   int addrSelectA
17700 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
17710 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
17720 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  A coroutine */. 
17730 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42   int addrSelectB
17740 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
17750 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
17760 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  B coroutine */. 
17770 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20   int regOutA;   
17780 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
17790 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74  s register for t
177a0 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72  he output-A subr
177b0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
177c0 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20  regOutB;        
177d0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
177e0 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75  ister for the ou
177f0 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  tput-B subroutin
17800 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f  e */.  int addrO
17810 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  utA;         /* 
17820 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f  Address of the o
17830 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69  utput-A subrouti
17840 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
17850 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a  OutB = 0;     /*
17860 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
17870 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74  output-B subrout
17880 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
17890 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f  rEofA;         /
178a0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
178b0 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73   select-A-exhaus
178c0 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ted subroutine *
178d0 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41  /.  int addrEofA
178e0 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41 6c 74  _noB;     /* Alt
178f0 65 72 6e 61 74 65 20 61 64 64 72 45 6f 66 41 20  ernate addrEofA 
17900 69 66 20 42 20 69 73 20 75 6e 69 6e 69 74 69 61  if B is uninitia
17910 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61  lized */.  int a
17920 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20  ddrEofB;        
17930 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
17940 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61  he select-B-exha
17950 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  usted subroutine
17960 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c   */.  int addrAl
17970 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tB;         /* A
17980 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c  ddress of the A<
17990 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
179a0 20 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20    int addrAeqB; 
179b0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
179c0 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73  ss of the A==B s
179d0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
179e0 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20 20 20  nt addrAgtB;    
179f0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
17a00 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62 72 6f  of the A>B subro
17a10 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
17a20 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20  egLimitA;       
17a30 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74   /* Limit regist
17a40 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20  er for select-A 
17a50 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69  */.  int regLimi
17a60 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  tB;        /* Li
17a70 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72  mit register for
17a80 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69   select-A */.  i
17a90 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20  nt regPrev;     
17aa0 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20       /* A range 
17ab0 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  of registers to 
17ac0 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75  hold previous ou
17ad0 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61  tput */.  int sa
17ae0 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  vedLimit;       
17af0 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f  /* Saved value o
17b00 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20  f p->iLimit */. 
17b10 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74   int savedOffset
17b20 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20  ;      /* Saved 
17b30 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66  value of p->iOff
17b40 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  set */.  int lab
17b50 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f  elCmpr;        /
17b60 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20  * Label for the 
17b70 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72  start of the mer
17b80 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a  ge algorithm */.
17b90 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20    int labelEnd; 
17ba0 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c          /* Label
17bb0 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20   for the end of 
17bc0 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45  the overall SELE
17bd0 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74  CT stmt */.  int
17be0 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   j1;            
17bf0 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72     /* Jump instr
17c00 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74  uctions that get
17c10 20 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a   retargetted */.
17c20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
17c30 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
17c40 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49  f TK_ALL, TK_UNI
17c50 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54  ON, TK_EXCEPT, T
17c60 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20  K_INTERSECT */. 
17c70 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75   KeyInfo *pKeyDu
17c80 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72  p = 0; /* Compar
17c90 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ison information
17ca0 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72   for duplicate r
17cb0 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49  emoval */.  KeyI
17cc0 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20  nfo *pKeyMerge; 
17cd0 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20    /* Comparison 
17ce0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
17cf0 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a  merging rows */.
17d00 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
17d10 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
17d20 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
17d30 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
17d40 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65  rderBy;   /* The
17d50 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
17d60 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72   */.  int nOrder
17d70 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  By;         /* N
17d80 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
17d90 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
17da0 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  lause */.  int *
17db0 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20  aPermute;       
17dc0 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
17dd0 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
17de0 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f  to result set co
17df0 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66  lumns */.#ifndef
17e00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
17e10 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31  LAIN.  int iSub1
17e20 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
17e30 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68  EQP id of left-h
17e40 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  and query */.  i
17e50 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20 20 20  nt iSub2;       
17e60 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f       /* EQP id o
17e70 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65  f right-hand que
17e80 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ry */.#endif..  
17e90 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
17ea0 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rBy!=0 );.  asse
17eb0 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29  rt( pKeyDup==0 )
17ec0 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63  ; /* "Managed" c
17ed0 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20  ode needs this. 
17ee0 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a   Ticket #3382. *
17ef0 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
17f00 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73  >db;.  v = pPars
17f10 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
17f20 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20  rt( v!=0 );     
17f30 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72    /* Already thr
17f40 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66  own the error if
17f50 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c   VDBE alloc fail
17f60 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64  ed */.  labelEnd
17f70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
17f80 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61  keLabel(v);.  la
17f90 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65  belCmpr = sqlite
17fa0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
17fb0 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20  );...  /* Patch 
17fc0 75 70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  up the ORDER BY 
17fd0 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70  clause.  */.  op
17fe0 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50   = p->op;  .  pP
17ff0 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
18000 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69  ;.  assert( pPri
18010 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  or->pOrderBy==0 
18020 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  );.  pOrderBy = 
18030 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61  p->pOrderBy;.  a
18040 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20  ssert( pOrderBy 
18050 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  );.  nOrderBy = 
18060 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
18070 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61  ..  /* For opera
18080 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20  tors other than 
18090 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76  UNION ALL we hav
180a0 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
180b0 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44  hat.  ** the ORD
180c0 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76  ER BY clause cov
180d0 65 72 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f  ers every term o
180e0 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
180f0 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d  .  Add.  ** term
18100 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42  s to the ORDER B
18110 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65  Y clause as nece
18120 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ssary..  */.  if
18130 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op!=TK_ALL ){.
18140 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d      for(i=1; db-
18150 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
18160 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74   && i<=p->pEList
18170 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
18180 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
18190 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
181a0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c  ;.      for(j=0,
181b0 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d   pItem=pOrderBy-
181c0 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20  >a; j<nOrderBy; 
181d0 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  j++, pItem++){. 
181e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
181f0 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
18200 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20  ByCol>0 );.     
18210 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e     if( pItem->u.
18220 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 69  x.iOrderByCol==i
18230 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
18240 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e  }.      if( j==n
18250 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
18260 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20     Expr *pNew = 
18270 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
18280 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a  TK_INTEGER, 0);.
18290 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
182a0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
182b0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
182c0 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
182d0 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20  = EP_IntValue;. 
182e0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69         pNew->u.i
182f0 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20 20  Value = i;.     
18300 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71     pOrderBy = sq
18310 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
18320 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72 64  end(pParse, pOrd
18330 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20  erBy, pNew);.   
18340 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
18350 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  y ) pOrderBy->a[
18360 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e  nOrderBy++].u.x.
18370 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75  iOrderByCol = (u
18380 31 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  16)i;.      }.  
18390 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f    }.  }..  /* Co
183a0 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72  mpute the compar
183b0 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e  ison permutation
183c0 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61   and keyinfo tha
183d0 74 20 69 73 20 75 73 65 64 20 77 69 74 68 0a 20  t is used with. 
183e0 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74   ** the permutat
183f0 69 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65  ion used to dete
18400 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78  rmine if the nex
18410 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65  t.  ** row of re
18420 73 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d  sults comes from
18430 20 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65   selectA or sele
18440 63 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65  ctB.  Also add e
18450 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c  xplicit.  ** col
18460 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f  lations to the O
18470 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
18480 65 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65  erms so that whe
18490 6e 20 74 68 65 20 73 75 62 71 75 65 72 69 65 73  n the subqueries
184a0 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67  .  ** to the rig
184b0 68 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20  ht and the left 
184c0 61 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74  are evaluated, t
184d0 68 65 79 20 75 73 65 20 74 68 65 20 63 6f 72 72  hey use the corr
184e0 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69  ect.  ** collati
184f0 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d  on..  */.  aPerm
18500 75 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ute = sqlite3DbM
18510 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
18520 65 6f 66 28 69 6e 74 29 2a 6e 4f 72 64 65 72 42  eof(int)*nOrderB
18530 79 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75  y);.  if( aPermu
18540 74 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  te ){.    struct
18550 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
18560 70 49 74 65 6d 3b 0a 20 20 20 20 66 6f 72 28 69  pItem;.    for(i
18570 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72  =0, pItem=pOrder
18580 42 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65 72 42  By->a; i<nOrderB
18590 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  y; i++, pItem++)
185a0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
185b0 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
185c0 72 42 79 43 6f 6c 3e 30 0a 20 20 20 20 20 20 20  rByCol>0.       
185d0 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 75 2e 78     && pItem->u.x
185e0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d  .iOrderByCol<=p-
185f0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
18600 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74 65  ;.      aPermute
18610 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78  [i] = pItem->u.x
18620 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31  .iOrderByCol - 1
18630 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79  ;.    }.    pKey
18640 4d 65 72 67 65 20 3d 20 6d 75 6c 74 69 53 65 6c  Merge = multiSel
18650 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66  ectOrderByKeyInf
18660 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b  o(pParse, p, 1);
18670 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b  .  }else{.    pK
18680 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d  eyMerge = 0;.  }
18690 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68 20  ..  /* Reattach 
186a0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
186b0 75 73 65 20 74 6f 20 74 68 65 20 71 75 65 72 79  use to the query
186c0 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64  ..  */.  p->pOrd
186d0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
186e0 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  .  pPrior->pOrde
186f0 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
18700 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65 2d  rListDup(pParse-
18710 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20 30  >db, pOrderBy, 0
18720 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
18730 65 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65 6d  e a range of tem
18740 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73  porary registers
18750 20 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66 6f   and the KeyInfo
18760 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72   needed.  ** for
18770 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20   the logic that 
18780 72 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61 74  removes duplicat
18790 65 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77 68  e result rows wh
187a0 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72  en the.  ** oper
187b0 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45  ator is UNION, E
187c0 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53  XCEPT, or INTERS
187d0 45 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e 49  ECT (but not UNI
187e0 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20  ON ALL)..  */.  
187f0 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  if( op==TK_ALL )
18800 7b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20  {.    regPrev = 
18810 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
18820 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70  int nExpr = p->p
18830 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
18840 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72    assert( nOrder
18850 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d  By>=nExpr || db-
18860 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
18870 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70  .    regPrev = p
18880 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
18890 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
188a0 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20  += nExpr+1;.    
188b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
188c0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
188d0 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20   0, regPrev);.  
188e0 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69    pKeyDup = sqli
188f0 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
18900 64 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20  db, nExpr, 1);. 
18910 20 20 20 69 66 28 20 70 4b 65 79 44 75 70 20 29     if( pKeyDup )
18920 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
18930 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
18940 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 44 75  Writeable(pKeyDu
18950 70 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  p) );.      for(
18960 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b  i=0; i<nExpr; i+
18970 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79  +){.        pKey
18980 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Dup->aColl[i] = 
18990 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
189a0 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29  eq(pParse, p, i)
189b0 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75  ;.        pKeyDu
189c0 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  p->aSortOrder[i]
189d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
189e0 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53    }.  }. .  /* S
189f0 65 70 61 72 61 74 65 20 74 68 65 20 6c 65 66 74  eparate the left
18a00 20 61 6e 64 20 74 68 65 20 72 69 67 68 74 20 71   and the right q
18a10 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e  uery from one an
18a20 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e  other.  */.  p->
18a30 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50  pPrior = 0;.  pP
18a40 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  rior->pNext = 0;
18a50 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  .  sqlite3Resolv
18a60 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50  eOrderGroupBy(pP
18a70 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64  arse, p, p->pOrd
18a80 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a  erBy, "ORDER");.
18a90 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50    if( pPrior->pP
18aa0 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73  rior==0 ){.    s
18ab0 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64  qlite3ResolveOrd
18ac0 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65  erGroupBy(pParse
18ad0 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72  , pPrior, pPrior
18ae0 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44  ->pOrderBy, "ORD
18af0 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ER");.  }..  /* 
18b00 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69  Compute the limi
18b10 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20  t registers */. 
18b20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
18b30 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
18b40 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69  , labelEnd);.  i
18b50 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20  f( p->iLimit && 
18b60 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op==TK_ALL ){.  
18b70 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b    regLimitA = ++
18b80 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
18b90 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b    regLimitB = ++
18ba0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
18bb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18bc0 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
18bd0 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e  p->iOffset ? p->
18be0 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69  iOffset+1 : p->i
18bf0 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20  Limit,.         
18c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c10 20 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69           regLimi
18c20 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tA);.    sqlite3
18c30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18c40 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41  _Copy, regLimitA
18c50 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20  , regLimitB);.  
18c60 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69  }else{.    regLi
18c70 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42  mitA = regLimitB
18c80 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
18c90 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
18ca0 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
18cb0 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
18cc0 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
18cd0 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65  te(db, p->pOffse
18ce0 74 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74  t);.  p->pOffset
18cf0 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64 72   = 0;..  regAddr
18d00 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
18d10 65 6d 3b 0a 20 20 72 65 67 41 64 64 72 42 20 3d  em;.  regAddrB =
18d20 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
18d30 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70  .  regOutA = ++p
18d40 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
18d50 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73  egOutB = ++pPars
18d60 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74  e->nMem;.  sqlit
18d70 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
18d80 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72  (&destA, SRT_Cor
18d90 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41  outine, regAddrA
18da0 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
18db0 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
18dc0 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  B, SRT_Coroutine
18dd0 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20  , regAddrB);..  
18de0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f  /* Generate a co
18df0 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75  routine to evalu
18e00 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ate the SELECT s
18e10 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a  tatement to the.
18e20 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68 65    ** left of the
18e30 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74   compound operat
18e40 6f 72 20 2d 20 74 68 65 20 22 41 22 20 73 65 6c  or - the "A" sel
18e50 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72  ect..  */.  addr
18e60 53 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74 65  SelectA = sqlite
18e70 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
18e80 28 76 29 20 2b 20 31 3b 0a 20 20 6a 31 20 3d 20  (v) + 1;.  j1 = 
18e90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18ea0 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
18eb0 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 2c  utine, regAddrA,
18ec0 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74 41 29   0, addrSelectA)
18ed0 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
18ee0 28 76 2c 20 22 6c 65 66 74 20 53 45 4c 45 43 54  (v, "left SELECT
18ef0 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69  "));.  pPrior->i
18f00 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74  Limit = regLimit
18f10 41 3b 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49  A;.  explainSetI
18f20 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
18f30 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
18f40 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  tId);.  sqlite3S
18f50 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
18f60 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a 20  rior, &destA);. 
18f70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18f80 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f  p1(v, OP_EndCoro
18f90 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29  utine, regAddrA)
18fa0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
18fb0 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
18fc0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
18fd0 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76   coroutine to ev
18fe0 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43  aluate the SELEC
18ff0 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a  T statement on .
19000 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d    ** the right -
19010 20 74 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a   the "B" select.
19020 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63    */.  addrSelec
19030 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
19040 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
19050 20 31 3b 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74   1;.  j1 = sqlit
19060 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
19070 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
19080 2c 20 72 65 67 41 64 64 72 42 2c 20 30 2c 20 61  , regAddrB, 0, a
19090 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20 56  ddrSelectB);.  V
190a0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
190b0 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b  right SELECT"));
190c0 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20  .  savedLimit = 
190d0 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76  p->iLimit;.  sav
190e0 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f  edOffset = p->iO
190f0 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d  ffset;.  p->iLim
19100 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a  it = regLimitB;.
19110 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30    p->iOffset = 0
19120 3b 20 20 0a 20 20 65 78 70 6c 61 69 6e 53 65 74  ;  .  explainSet
19130 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70  Integer(iSub2, p
19140 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
19150 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ctId);.  sqlite3
19160 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
19170 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e  , &destB);.  p->
19180 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c 69  iLimit = savedLi
19190 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65  mit;.  p->iOffse
191a0 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74 3b  t = savedOffset;
191b0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
191c0 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f  dOp1(v, OP_EndCo
191d0 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
191e0 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  B);..  /* Genera
191f0 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
19200 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65  that outputs the
19210 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
19220 74 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63  the A.  ** selec
19230 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75  t as the next ou
19240 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20  tput row of the 
19250 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
19260 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
19270 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74  Comment((v, "Out
19280 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  put routine for 
19290 41 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41  A"));.  addrOutA
192a0 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75   = generateOutpu
192b0 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72  tSubroutine(pPar
192c0 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
192d0 20 20 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20       p, &destA, 
192e0 70 44 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a  pDest, regOutA,.
192f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19300 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75   regPrev, pKeyDu
19310 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
19320 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
19330 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
19340 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72   outputs the cur
19350 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
19360 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73  B.  ** select as
19370 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74   the next output
19380 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70   row of the comp
19390 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
193a0 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
193b0 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49  LL || op==TK_UNI
193c0 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f  ON ){.    VdbeNo
193d0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  opComment((v, "O
193e0 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f  utput routine fo
193f0 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72  r B"));.    addr
19400 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f  OutB = generateO
19410 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28  utputSubroutine(
19420 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
19430 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73           p, &des
19440 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75  tB, pDest, regOu
19450 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tB,.            
19460 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b       regPrev, pK
19470 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29  eyDup, labelEnd)
19480 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b  ;.  }.  sqlite3K
19490 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
194a0 44 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  Dup);..  /* Gene
194b0 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
194c0 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68  e to run when th
194d0 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73  e results from s
194e0 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65  elect A.  ** are
194f0 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f   exhausted and o
19500 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65  nly data in sele
19510 63 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20  ct B remains..  
19520 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
19530 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b  EXCEPT || op==TK
19540 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20  _INTERSECT ){.  
19550 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d    addrEofA_noB =
19560 20 61 64 64 72 45 6f 66 41 20 3d 20 6c 61 62 65   addrEofA = labe
19570 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 20 20  lEnd;.  }else{  
19580 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
19590 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20  ment((v, "eof-A 
195a0 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
195b0 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71     addrEofA = 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 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
195e0 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b  OutB, addrOutB);
195f0 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f  .    addrEofA_no
19600 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
19610 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
19620 64 2c 20 72 65 67 41 64 64 72 42 2c 20 6c 61 62  d, regAddrB, lab
19630 65 6c 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  elEnd);.        
19640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19650 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62               Vdb
19660 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
19670 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19680 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
19690 30 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20  0, addrEofA);.  
196a0 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
196b0 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  += pPrior->nSele
196c0 63 74 52 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ctRow;.  }..  /*
196d0 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
196e0 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68  outine to run wh
196f0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66  en the results f
19700 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a  rom select B.  *
19710 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20  * are exhausted 
19720 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e  and only data in
19730 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e   select A remain
19740 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  s..  */.  if( op
19750 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
19760 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d  {.    addrEofB =
19770 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20 20 69   addrEofA;.    i
19780 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
19790 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65   > pPrior->nSele
197a0 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65  ctRow ) p->nSele
197b0 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e  ctRow = pPrior->
197c0 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65  nSelectRow;.  }e
197d0 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e  lse{  .    VdbeN
197e0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
197f0 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  eof-B subroutine
19800 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66  "));.    addrEof
19810 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
19820 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
19830 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72  b, regOutA, addr
19840 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74  OutA);.    sqlit
19850 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19860 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
19870 72 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56  rA, labelEnd); V
19880 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
19890 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
198a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
198b0 2c 20 30 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a  , 0, addrEofB);.
198c0 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
198d0 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
198e0 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c  e the case of A<
198f0 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  B.  */.  VdbeNoo
19900 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d  pComment((v, "A-
19910 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  lt-B subroutine"
19920 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d  ));.  addrAltB =
19930 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19940 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
19950 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74  regOutA, addrOut
19960 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
19970 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
19980 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61  eld, regAddrA, a
19990 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f  ddrEofA); VdbeCo
199a0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
199b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
199c0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61  , OP_Goto, 0, la
199d0 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20  belCmpr);..  /* 
199e0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
199f0 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65   handle the case
19a00 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20   of A==B.  */.  
19a10 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  if( op==TK_ALL )
19a20 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d  {.    addrAeqB =
19a30 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c   addrAltB;.  }el
19a40 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  se if( op==TK_IN
19a50 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
19a60 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c  ddrAeqB = addrAl
19a70 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74 42  tB;.    addrAltB
19a80 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
19a90 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
19aa0 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75 62  ((v, "A-eq-B sub
19ab0 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20  routine"));.    
19ac0 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20 73  addrAeqB =.    s
19ad0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19ae0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
19af0 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41  gAddrA, addrEofA
19b00 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
19b10 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
19b20 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19b30 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d  Goto, 0, labelCm
19b40 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  pr);.  }..  /* G
19b50 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
19b60 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20  handle the case 
19b70 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64  of A>B.  */.  Vd
19b80 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
19b90 2c 20 22 41 2d 67 74 2d 42 20 73 75 62 72 6f 75  , "A-gt-B subrou
19ba0 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41  tine"));.  addrA
19bb0 67 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  gtB = sqlite3Vdb
19bc0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
19bd0 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
19be0 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  L || op==TK_UNIO
19bf0 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  N ){.    sqlite3
19c00 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19c10 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c  _Gosub, regOutB,
19c20 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a   addrOutB);.  }.
19c30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19c40 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
19c50 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45   regAddrB, addrE
19c60 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ofB); VdbeCovera
19c70 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
19c80 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19c90 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43  _Goto, 0, labelC
19ca0 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  mpr);..  /* This
19cb0 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65 20   code runs once 
19cc0 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65 76  to initialize ev
19cd0 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20  erything..  */. 
19ce0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
19cf0 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 73  Here(v, j1);.  s
19d00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19d10 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
19d20 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41  gAddrA, addrEofA
19d30 5f 6e 6f 42 29 3b 20 56 64 62 65 43 6f 76 65 72  _noB); VdbeCover
19d40 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
19d50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19d60 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
19d70 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64  B, addrEofB); Vd
19d80 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
19d90 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74    /* Implement t
19da0 68 65 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f  he main merge lo
19db0 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  op.  */.  sqlite
19dc0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
19dd0 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b  l(v, labelCmpr);
19de0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
19df0 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75  dOp4(v, OP_Permu
19e00 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c  tation, 0, 0, 0,
19e10 20 28 63 68 61 72 2a 29 61 50 65 72 6d 75 74 65   (char*)aPermute
19e20 2c 20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a  , P4_INTARRAY);.
19e30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19e40 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72  Op4(v, OP_Compar
19e50 65 2c 20 64 65 73 74 41 2e 69 53 64 73 74 2c 20  e, destA.iSdst, 
19e60 64 65 73 74 42 2e 69 53 64 73 74 2c 20 6e 4f 72  destB.iSdst, nOr
19e70 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20  derBy,.         
19e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e90 28 63 68 61 72 2a 29 70 4b 65 79 4d 65 72 67 65  (char*)pKeyMerge
19ea0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
19eb0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
19ec0 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50  geP5(v, OPFLAG_P
19ed0 45 52 4d 55 54 45 29 3b 0a 20 20 73 71 6c 69 74  ERMUTE);.  sqlit
19ee0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
19ef0 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74  OP_Jump, addrAlt
19f00 42 2c 20 61 64 64 72 41 65 71 42 2c 20 61 64 64  B, addrAeqB, add
19f10 72 41 67 74 42 29 3b 20 56 64 62 65 43 6f 76 65  rAgtB); VdbeCove
19f20 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 4a  rage(v);..  /* J
19f30 75 6d 70 20 74 6f 20 74 68 65 20 74 68 69 73 20  ump to the this 
19f40 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74  point in order t
19f50 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
19f60 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71  query..  */.  sq
19f70 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
19f80 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e  Label(v, labelEn
19f90 64 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  d);..  /* Set th
19fa0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  e number of outp
19fb0 75 74 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a  ut columns.  */.
19fc0 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65    if( pDest->eDe
19fd0 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
19fe0 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46  {.    Select *pF
19ff0 69 72 73 74 20 3d 20 70 50 72 69 6f 72 3b 0a 20  irst = pPrior;. 
1a000 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74     while( pFirst
1a010 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73  ->pPrior ) pFirs
1a020 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69  t = pFirst->pPri
1a030 6f 72 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65  or;.    generate
1a040 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
1a050 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70  se, 0, pFirst->p
1a060 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  EList);.  }..  /
1a070 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65  * Reassembly the
1a080 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
1a090 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20  so that it will 
1a0a0 62 65 20 66 72 65 65 64 20 63 6f 72 72 65 63 74  be freed correct
1a0b0 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63  ly.  ** by the c
1a0c0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
1a0d0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
1a0e0 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
1a0f0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
1a100 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
1a110 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  }.  p->pPrior = 
1a120 70 50 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f 72  pPrior;.  pPrior
1a130 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20 20  ->pNext = p;..  
1a140 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72  /*** TBD:  Inser
1a150 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c  t subroutine cal
1a160 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73  ls to close curs
1a170 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74  ors on incomplet
1a180 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72  e.  **** subquer
1a190 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c  ies ****/.  expl
1a1a0 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61  ainComposite(pPa
1a1b0 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62  rse, p->op, iSub
1a1c0 31 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a 20 20  1, iSub2, 0);.  
1a1d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a1e0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
1a1f0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1a200 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
1a210 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
1a220 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 20  E_OMIT_VIEW)./* 
1a230 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61 74  Forward Declarat
1a240 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76  ions */.static v
1a250 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73  oid substExprLis
1a260 74 28 73 71 6c 69 74 65 33 2a 2c 20 45 78 70 72  t(sqlite3*, Expr
1a270 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72  List*, int, Expr
1a280 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76  List*);.static v
1a290 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28  oid substSelect(
1a2a0 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63 74  sqlite3*, Select
1a2b0 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73   *, int, ExprLis
1a2c0 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61  t *);../*.** Sca
1a2d0 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78  n through the ex
1a2e0 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
1a2f0 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72   Replace every r
1a300 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61  eference to.** a
1a310 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65   column in table
1a320 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77   number iTable w
1a330 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
1a340 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20  e iColumn-th.** 
1a350 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e  entry in pEList.
1a360 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66    (But leave ref
1a370 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52  erences to the R
1a380 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20  OWID column .** 
1a390 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a  unchanged.).**.*
1a3a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1a3b0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c  s part of the fl
1a3c0 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75  attening procedu
1a3d0 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a  re.  A subquery.
1a3e0 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20  ** whose result 
1a3f0 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
1a400 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73  y pEList appears
1a410 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65   as entry in the
1a420 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  .** FROM clause 
1a430 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68  of a SELECT such
1a440 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63   that the VDBE c
1a450 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74  ursor assigned t
1a460 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63  o that.** FORM c
1a470 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69  lause entry is i
1a480 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75  Table.  This rou
1a490 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65  tine make the ne
1a4a0 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e  cessary .** chan
1a4b0 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20  ges to pExpr so 
1a4c0 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64  that it refers d
1a4d0 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73  irectly to the s
1a4e0 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f  ource table.** o
1a4f0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72  f the subquery r
1a500 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74  ather the result
1a510 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71   set of the subq
1a520 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uery..*/.static 
1a530 45 78 70 72 20 2a 73 75 62 73 74 45 78 70 72 28  Expr *substExpr(
1a540 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
1a550 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74         /* Report
1a560 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74   malloc errors t
1a570 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  o this connectio
1a580 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  n */.  Expr *pEx
1a590 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78  pr,        /* Ex
1a5a0 70 72 20 69 6e 20 77 68 69 63 68 20 73 75 62 73  pr in which subs
1a5b0 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20  titution occurs 
1a5c0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
1a5d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
1a5e0 65 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75  e to be substitu
1a5f0 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ted */.  ExprLis
1a600 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
1a610 53 75 62 73 74 69 74 75 74 65 20 65 78 70 72 65  Substitute expre
1a620 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69  ssions */.){.  i
1a630 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
1a640 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
1a650 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
1a660 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  MN && pExpr->iTa
1a670 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20  ble==iTable ){. 
1a680 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
1a690 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
1a6a0 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
1a6b0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  NULL;.    }else{
1a6c0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
1a6d0 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  w;.      assert(
1a6e0 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45   pEList!=0 && pE
1a6f0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c  xpr->iColumn<pEL
1a700 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
1a710 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1a720 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70  r->pLeft==0 && p
1a730 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
1a740 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  );.      pNew = 
1a750 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
1a760 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78  b, pEList->a[pEx
1a770 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78  pr->iColumn].pEx
1a780 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  pr, 0);.      sq
1a790 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
1a7a0 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  db, pExpr);.    
1a7b0 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a    pExpr = pNew;.
1a7c0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1a7d0 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20     pExpr->pLeft 
1a7e0 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
1a7f0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54  pExpr->pLeft, iT
1a800 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1a810 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
1a820 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
1a830 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1a840 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1a850 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
1a860 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1a870 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
1a880 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65  .      substSele
1a890 63 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e  ct(db, pExpr->x.
1a8a0 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c  pSelect, iTable,
1a8b0 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 65   pEList);.    }e
1a8c0 6c 73 65 7b 0a 20 20 20 20 20 20 73 75 62 73 74  lse{.      subst
1a8d0 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 45 78  ExprList(db, pEx
1a8e0 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61  pr->x.pList, iTa
1a8f0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1a900 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1a910 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63   pExpr;.}.static
1a920 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
1a930 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ist(.  sqlite3 *
1a940 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  db,         /* R
1a950 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72  eport malloc err
1a960 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45 78  ors here */.  Ex
1a970 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
1a980 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63     /* List to sc
1a990 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20  an and in which 
1a9a0 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75  to make substitu
1a9b0 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  tes */.  int iTa
1a9c0 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ble,          /*
1a9d0 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62   Table to be sub
1a9e0 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78  stituted */.  Ex
1a9f0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
1aa00 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
1aa10 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20   values */.){.  
1aa20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
1aa30 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
1aa40 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
1aa50 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
1aa60 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  .    pList->a[i]
1aa70 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74 45 78  .pExpr = substEx
1aa80 70 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  pr(db, pList->a[
1aa90 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65  i].pExpr, iTable
1aaa0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d  , pEList);.  }.}
1aab0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
1aac0 73 74 53 65 6c 65 63 74 28 0a 20 20 73 71 6c 69  stSelect(.  sqli
1aad0 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
1aae0 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f   /* Report mallo
1aaf0 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f  c errors here */
1ab00 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
1ab10 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43          /* SELEC
1ab20 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77  T statement in w
1ab30 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62  hich to make sub
1ab40 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20  stitutions */.  
1ab50 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
1ab60 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
1ab70 20 62 65 20 72 65 70 6c 61 63 65 64 20 2a 2f 0a   be replaced */.
1ab80 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
1ab90 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69  st     /* Substi
1aba0 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29  tute values */.)
1abb0 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
1abc0 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  c;.  struct SrcL
1abd0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
1abe0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1abf0 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  !p ) return;.  s
1ac00 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
1ac10 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61 62   p->pEList, iTab
1ac20 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73  le, pEList);.  s
1ac30 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
1ac40 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 54   p->pGroupBy, iT
1ac50 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1ac60 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
1ac70 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  b, p->pOrderBy, 
1ac80 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1ac90 0a 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20  .  p->pHaving = 
1aca0 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d  substExpr(db, p-
1acb0 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65  >pHaving, iTable
1acc0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e  , pEList);.  p->
1acd0 70 57 68 65 72 65 20 3d 20 73 75 62 73 74 45 78  pWhere = substEx
1ace0 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  pr(db, p->pWhere
1acf0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1ad00 29 3b 0a 20 20 73 75 62 73 74 53 65 6c 65 63 74  );.  substSelect
1ad10 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20  (db, p->pPrior, 
1ad20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1ad30 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
1ad40 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
1ad50 63 20 29 3b 20 20 2f 2a 20 45 76 65 6e 20 66 6f  c );  /* Even fo
1ad60 72 20 28 53 45 4c 45 43 54 20 31 29 20 77 65 20  r (SELECT 1) we 
1ad70 68 61 76 65 3a 20 70 53 72 63 21 3d 30 20 62 75  have: pSrc!=0 bu
1ad80 74 20 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20  t pSrc->nSrc==0 
1ad90 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  */.  if( ALWAYS(
1ada0 70 53 72 63 29 20 29 7b 0a 20 20 20 20 66 6f 72  pSrc) ){.    for
1adb0 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70  (i=pSrc->nSrc, p
1adc0 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e  Item=pSrc->a; i>
1add0 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; i--, pItem++)
1ade0 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c  {.      substSel
1adf0 65 63 74 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ect(db, pItem->p
1ae00 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20  Select, iTable, 
1ae10 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  pEList);.    }. 
1ae20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21   }.}.#endif /* !
1ae30 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1ae40 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
1ae50 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1ae60 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a  _OMIT_VIEW) */..
1ae70 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1ae80 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1ae90 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
1aea0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
1aeb0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1aec0 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
1aed0 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69  flatten subqueri
1aee0 65 73 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61  es as a performa
1aef0 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  nce optimization
1af00 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
1af10 65 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69  e returns 1 if i
1af20 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20  t makes changes 
1af30 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74  and 0 if no flat
1af40 74 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a  tening occurs..*
1af50 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61  *.** To understa
1af60 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f  nd the concept o
1af70 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f  f flattening, co
1af80 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
1af90 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a  wing.** query:.*
1afa0 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
1afb0 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  a FROM (SELECT x
1afc0 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20  +y AS a FROM t1 
1afd0 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45  WHERE z<100) WHE
1afe0 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  RE a>5.**.** The
1aff0 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20   default way of 
1b000 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69  implementing thi
1b010 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78  s query is to ex
1b020 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62  ecute the.** sub
1b030 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20  query first and 
1b040 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
1b050 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  s in a temporary
1b060 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20   table, then.** 
1b070 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75  run the outer qu
1b080 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70  ery on that temp
1b090 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68  orary table.  Th
1b0a0 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a  is requires two.
1b0b0 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74  ** passes over t
1b0c0 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65  he data.  Furthe
1b0d0 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74  rmore, because t
1b0e0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
1b0f0 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64  le.** has no ind
1b100 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20  ices, the WHERE 
1b110 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75  clause on the ou
1b120 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74  ter query cannot
1b130 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64   be.** optimized
1b140 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1b150 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
1b160 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73   rewrite queries
1b170 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f   such as the abo
1b180 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e  ve into.** a sin
1b190 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c  gle flat select,
1b1a0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
1b1b0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79  *     SELECT x+y
1b1c0 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
1b1d0 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e  ERE z<100 AND a>
1b1e0 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  5.**.** The code
1b1f0 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74   generated for t
1b200 68 69 73 20 73 69 6d 70 69 66 69 63 61 74 69 6f  his simpificatio
1b210 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65  n gives the same
1b220 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f   result.** but o
1b230 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20  nly has to scan 
1b240 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20  the data once.  
1b250 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69  And because indi
1b260 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78  ces might .** ex
1b270 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ist on the table
1b280 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20   t1, a complete 
1b290 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61  scan of the data
1b2a0 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f   might be.** avo
1b2b0 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74  ided..**.** Flat
1b2c0 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61  tening is only a
1b2d0 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20  ttempted if all 
1b2e0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1b2f0 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
1b300 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71     (1)  The subq
1b310 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74  uery and the out
1b320 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
1b330 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67 61  both use aggrega
1b340 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29  tes..**.**   (2)
1b350 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
1b360 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
1b370 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  te or the outer 
1b380 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
1b390 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29  oin..**.**   (3)
1b3a0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
1b3b0 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20  s not the right 
1b3c0 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
1b3d0 74 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a 20  t outer join.** 
1b3e0 20 20 20 20 20 20 20 28 4f 72 69 67 69 6e 61 6c         (Original
1b3f0 6c 79 20 74 69 63 6b 65 74 20 23 33 30 36 2e 20  ly ticket #306. 
1b400 20 53 74 72 65 6e 67 74 68 65 6e 65 64 20 62 79   Strengthened by
1b410 20 74 69 63 6b 65 74 20 23 33 33 30 30 29 0a 2a   ticket #3300).*
1b420 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20  *.**   (4)  The 
1b430 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
1b440 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
1b450 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f   (**)  At one po
1b460 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73  int restrictions
1b470 20 28 34 29 20 61 6e 64 20 28 35 29 20 64 65 66   (4) and (5) def
1b480 69 6e 65 64 20 61 20 73 75 62 73 65 74 20 6f 66  ined a subset of
1b490 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20   DISTINCT.**    
1b4a0 20 20 20 20 73 75 62 2d 71 75 65 72 69 65 73 20      sub-queries 
1b4b0 74 68 61 74 20 77 65 72 65 20 65 78 63 6c 75 64  that were exclud
1b4c0 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74  ed from this opt
1b4d0 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72  imization. Restr
1b4e0 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20  iction .**      
1b4f0 20 20 28 34 29 20 68 61 73 20 73 69 6e 63 65 20    (4) has since 
1b500 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f  been expanded to
1b510 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53   exclude all DIS
1b520 54 49 4e 43 54 20 73 75 62 71 75 65 72 69 65 73  TINCT subqueries
1b530 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54  ..**.**   (6)  T
1b540 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1b550 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61   not use aggrega
1b560 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72  tes or the outer
1b570 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a   query is not.**
1b580 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54          DISTINCT
1b590 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54  ..**.**   (7)  T
1b5a0 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
1b5b0 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  a FROM clause.  
1b5c0 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62 71 75  TODO:  For subqu
1b5d0 65 72 69 65 73 20 77 69 74 68 6f 75 74 0a 2a 2a  eries without.**
1b5e0 20 20 20 20 20 20 20 20 41 20 46 52 4f 4d 20 63          A FROM c
1b5f0 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64 65 72 20  lause, consider 
1b600 61 64 64 69 6e 67 20 61 20 46 52 4f 4d 20 63 6c  adding a FROM cl
1b610 6f 73 65 20 77 69 74 68 20 74 68 65 20 73 70 65  ose with the spe
1b620 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74  cial.**        t
1b630 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65  able sqlite_once
1b640 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f   that consists o
1b650 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 63  f a single row c
1b660 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20  ontaining a.**  
1b670 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c        single NUL
1b680 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20  L..**.**   (8)  
1b690 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1b6a0 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
1b6b0 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1b6c0 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
1b6d0 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54  ..**.**   (9)  T
1b6e0 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1b6f0 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
1b700 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
1b710 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a  y does not use.*
1b720 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61  *        aggrega
1b730 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29  tes..**.**  (10)
1b740 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
1b750 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72  oes not use aggr
1b760 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75  egates or the ou
1b770 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
1b780 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65  ot.**        use
1b790 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28   LIMIT..**.**  (
1b7a0 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72  11)  The subquer
1b7b0 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  y and the outer 
1b7c0 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74  query do not bot
1b7d0 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59 20  h have ORDER BY 
1b7e0 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  clauses..**.**  
1b7f0 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d  (**)  Not implem
1b800 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64  ented.  Subsumed
1b810 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f   into restrictio
1b820 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72 65 76  n (3).  Was prev
1b830 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20  iously.**       
1b840 20 61 20 73 65 70 61 72 61 74 65 20 72 65 73 74   a separate rest
1b850 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67  riction deriving
1b860 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35   from ticket #35
1b870 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20  0..**.**  (13)  
1b880 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
1b890 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
1b8a0 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d  not both use LIM
1b8b0 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20  IT..**.**  (14) 
1b8c0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
1b8d0 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45  es not use OFFSE
1b8e0 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20  T..**.**  (15)  
1b8f0 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
1b900 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  is not part of a
1b910 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1b920 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   or the.**      
1b930 20 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20    subquery does 
1b940 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49 54  not have a LIMIT
1b950 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20   clause..**     
1b960 20 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 23     (See ticket #
1b970 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65 74 20  2339 and ticket 
1b980 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e 0a 2a  [02a8e81d44])..*
1b990 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65 20  *.**  (16)  The 
1b9a0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1b9b0 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
1b9c0 6f 72 20 74 68 65 20 73 75 62 71 75 65 72 79 20  or the subquery 
1b9d0 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e  does.**        n
1b9e0 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52  ot contain ORDER
1b9f0 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32   BY.  (Ticket #2
1ba00 39 34 32 29 20 20 54 68 69 73 20 75 73 65 64 20  942)  This used 
1ba10 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a  to not matter.**
1ba20 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65          until we
1ba30 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20   introduced the 
1ba40 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66  group_concat() f
1ba50 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a  unction.  .**.**
1ba60 20 20 28 31 37 29 20 20 54 68 65 20 73 75 62 2d    (17)  The sub-
1ba70 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 63  query is not a c
1ba80 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
1ba90 6f 72 20 69 74 20 69 73 20 61 20 55 4e 49 4f 4e  or it is a UNION
1baa0 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20 20   ALL .**        
1bab0 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65 20  compound clause 
1bac0 6d 61 64 65 20 75 70 20 65 6e 74 69 72 65 6c 79  made up entirely
1bad0 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74   of non-aggregat
1bae0 65 20 71 75 65 72 69 65 73 2c 20 61 6e 64 20 0a  e queries, and .
1baf0 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 70 61  **        the pa
1bb00 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a  rent query:.**.*
1bb10 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20  *          * is 
1bb20 6e 6f 74 20 69 74 73 65 6c 66 20 70 61 72 74 20  not itself part 
1bb30 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
1bb40 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20 20  lect,.**        
1bb50 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61 67    * is not an ag
1bb60 67 72 65 67 61 74 65 20 6f 72 20 44 49 53 54 49  gregate or DISTI
1bb70 4e 43 54 20 71 75 65 72 79 2c 20 61 6e 64 0a 2a  NCT query, and.*
1bb80 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20  *          * is 
1bb90 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 0a 2a 2a  not a join.**.**
1bba0 20 20 20 20 20 20 20 20 54 68 65 20 70 61 72 65          The pare
1bbb0 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79  nt and sub-query
1bbc0 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45   may contain WHE
1bbd0 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a  RE clauses. Subj
1bbe0 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ect to.**       
1bbf0 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33   rules (11), (13
1bc00 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79  ) and (14), they
1bc10 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69   may also contai
1bc20 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20  n ORDER BY,.**  
1bc30 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20        LIMIT and 
1bc40 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20  OFFSET clauses. 
1bc50 20 54 68 65 20 73 75 62 71 75 65 72 79 20 63 61   The subquery ca
1bc60 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f 6d  nnot use any com
1bc70 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  pound.**        
1bc80 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20 74  operator other t
1bc90 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65  han UNION ALL be
1bca0 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f 74  cause all the ot
1bcb0 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20  her compound.** 
1bcc0 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73         operators
1bcd0 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65 64   have an implied
1bce0 20 44 49 53 54 49 4e 43 54 20 77 68 69 63 68 20   DISTINCT which 
1bcf0 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62 79  is disallowed by
1bd00 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74 72  .**        restr
1bd10 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a  iction (4)..**.*
1bd20 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20 65  *        Also, e
1bd30 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66  ach component of
1bd40 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d   the sub-query m
1bd50 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 73  ust return the s
1bd60 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20  ame number.**   
1bd70 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20 63       of result c
1bd80 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73 20  olumns. This is 
1bd90 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75 69  actually a requi
1bda0 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20 63  rement for any c
1bdb0 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
1bdc0 20 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65    SELECT stateme
1bdd0 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20  nt, but all the 
1bde0 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20 69  code here does i
1bdf0 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  s make sure that
1be00 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 75   no.**        su
1be10 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75 62  ch (illegal) sub
1be20 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74 74 65  -query is flatte
1be30 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ned. The caller 
1be40 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65 0a  will detect the.
1be50 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61 78  **        syntax
1be60 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72   error and retur
1be70 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65 73  n a detailed mes
1be80 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38  sage..**.**  (18
1be90 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  )  If the sub-qu
1bea0 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
1beb0 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61  d select, then a
1bec0 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a  ll terms of the.
1bed0 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20  **        ORDER 
1bee0 62 79 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  by clause of the
1bef0 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20   parent must be 
1bf00 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65  simple reference
1bf10 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20  s to .**        
1bf20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73  columns of the s
1bf30 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  ub-query..**.** 
1bf40 20 28 31 39 29 20 20 54 68 65 20 73 75 62 71 75   (19)  The subqu
1bf50 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
1bf60 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75   LIMIT or the ou
1bf70 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
1bf80 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76  ot.**        hav
1bf90 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  e a WHERE clause
1bfa0 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49  ..**.**  (20)  I
1bfb0 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
1bfc0 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  is a compound se
1bfd0 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75  lect, then it mu
1bfe0 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20  st not use.**   
1bff0 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59       an ORDER BY
1c000 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74   clause.  Ticket
1c010 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c   #3773.  We coul
1c020 64 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e  d relax this con
1c030 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20  straint.**      
1c040 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61    somewhat by sa
1c050 79 69 6e 67 20 74 68 61 74 20 74 68 65 20 74 65  ying that the te
1c060 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
1c070 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a   BY clause must.
1c080 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65 61 72  **        appear
1c090 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72   as unmodified r
1c0a0 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e  esult columns in
1c0b0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1c0c0 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20 20 20 20  .  But we.**    
1c0d0 20 20 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f      have other o
1c0e0 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20  ptimizations in 
1c0f0 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74  mind to deal wit
1c100 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a  h that case..**.
1c110 2a 2a 20 20 28 32 31 29 20 20 54 68 65 20 73 75  **  (21)  The su
1c120 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
1c130 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
1c140 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
1c150 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49  not.**        DI
1c160 53 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74 69  STINCT.  (See ti
1c170 63 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66 63  cket [752e1646fc
1c180 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29 20  ])..**.**  (22) 
1c190 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
1c1a0 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65   not a recursive
1c1b0 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 33   CTE..**.**  (23
1c1c0 29 20 20 54 68 65 20 70 61 72 65 6e 74 20 69 73  )  The parent is
1c1d0 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65   not a recursive
1c1e0 20 43 54 45 2c 20 6f 72 20 74 68 65 20 73 75 62   CTE, or the sub
1c1f0 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 0a  -query is not a.
1c200 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75  **        compou
1c210 6e 64 20 71 75 65 72 79 2e 20 54 68 69 73 20 72  nd query. This r
1c220 65 73 74 72 69 63 74 69 6f 6e 20 69 73 20 62 65  estriction is be
1c230 63 61 75 73 65 20 74 72 61 6e 73 66 6f 72 6d 69  cause transformi
1c240 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  ng the.**       
1c250 20 70 61 72 65 6e 74 20 74 6f 20 61 20 63 6f 6d   parent to a com
1c260 70 6f 75 6e 64 20 71 75 65 72 79 20 63 6f 6e 66  pound query conf
1c270 75 73 65 73 20 74 68 65 20 63 6f 64 65 20 74 68  uses the code th
1c280 61 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 20 20  at handles.**   
1c290 20 20 20 20 20 72 65 63 75 72 73 69 76 65 20 71       recursive q
1c2a0 75 65 72 69 65 73 20 69 6e 20 6d 75 6c 74 69 53  ueries in multiS
1c2b0 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 0a 2a  elect()..**.**.*
1c2c0 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  * In this routin
1c2d0 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d  e, the "p" param
1c2e0 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65  eter is a pointe
1c2f0 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71  r to the outer q
1c300 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62  uery..** The sub
1c310 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63  query is p->pSrc
1c320 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41  ->a[iFrom].  isA
1c330 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  gg is true if th
1c340 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a  e outer query.**
1c350 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73   uses aggregates
1c360 20 61 6e 64 20 73 75 62 71 75 65 72 79 49 73 41   and subqueryIsA
1c370 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  gg is true if th
1c380 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
1c390 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
1c3a0 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
1c3b0 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64  is not attempted
1c3c0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1c3d0 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65  s a no-op and re
1c3e0 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66  turns 0..** If f
1c3f0 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74  lattening is att
1c400 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75 74  empted this rout
1c410 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a  ine returns 1..*
1c420 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20  *.** All of the 
1c430 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79  expression analy
1c440 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f  sis must occur o
1c450 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72  n both the outer
1c460 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68   query and.** th
1c470 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f 72  e subquery befor
1c480 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  e this routine r
1c490 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  uns..*/.static i
1c4a0 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65  nt flattenSubque
1c4b0 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ry(.  Parse *pPa
1c4c0 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
1c4d0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1c4e0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
1c4f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
1c500 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53  arent or outer S
1c510 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1c520 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20  */.  int iFrom, 
1c530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1c540 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61  ex in p->pSrc->a
1c550 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  [] of the inner 
1c560 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  subquery */.  in
1c570 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20 20  t isAgg,        
1c580 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75     /* True if ou
1c590 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20  ter SELECT uses 
1c5a0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
1c5b0 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62  ons */.  int sub
1c5c0 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a  queryIsAgg    /*
1c5d0 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75 62   True if the sub
1c5e0 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65  query uses aggre
1c5f0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
1c600 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
1c610 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e  r *zSavedAuthCon
1c620 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a  text = pParse->z
1c630 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53  AuthContext;.  S
1c640 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b 0a  elect *pParent;.
1c650 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20    Select *pSub; 
1c660 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e        /* The inn
1c670 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62  er query or "sub
1c680 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65  query" */.  Sele
1c690 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20  ct *pSub1;      
1c6a0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
1c6b0 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65  e rightmost sele
1c6c0 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20  ct in sub-query 
1c6d0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
1c6e0 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  rc;      /* The 
1c6f0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1c700 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
1c710 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75  /.  SrcList *pSu
1c720 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46  bSrc;   /* The F
1c730 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
1c740 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
1c750 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
1c760 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c      /* The resul
1c770 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74  t set of the out
1c780 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  er query */.  in
1c790 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20  t iParent;      
1c7a0 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72    /* VDBE cursor
1c7b0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
1c7c0 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20 74  Sub result set t
1c7d0 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  emp table */.  i
1c7e0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
1c7f0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1c800 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  er */.  Expr *pW
1c810 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 20  here;           
1c820 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1c830 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
1c840 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1c850 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b  _item *pSubitem;
1c860 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65     /* The subque
1c870 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ry */.  sqlite3 
1c880 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1c890 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
1c8a0 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69   see if flatteni
1c8b0 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ng is permitted.
1c8c0 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f    Return 0 if no
1c8d0 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
1c8e0 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
1c8f0 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30  rt( p->pPrior==0
1c900 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74   );  /* Unable t
1c910 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70 6f 75  o flatten compou
1c920 6e 64 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20  nd queries */.  
1c930 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
1c940 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  Disabled(db, SQL
1c950 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e  ITE_QueryFlatten
1c960 65 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  er) ) return 0;.
1c970 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
1c980 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
1c990 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20   && iFrom>=0 && 
1c9a0 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63  iFrom<pSrc->nSrc
1c9b0 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d   );.  pSubitem =
1c9c0 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d   &pSrc->a[iFrom]
1c9d0 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53  ;.  iParent = pS
1c9e0 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  ubitem->iCursor;
1c9f0 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74  .  pSub = pSubit
1ca00 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61  em->pSelect;.  a
1ca10 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29  ssert( pSub!=0 )
1ca20 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26  ;.  if( isAgg &&
1ca30 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
1ca40 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1ca50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1ca60 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20 2a  striction (1)  *
1ca70 2f 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79  /.  if( subquery
1ca80 49 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e  IsAgg && pSrc->n
1ca90 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30  Src>1 ) return 0
1caa0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
1cab0 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20 20 2a  striction (2)  *
1cac0 2f 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53  /.  pSubSrc = pS
1cad0 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65  ub->pSrc;.  asse
1cae0 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20  rt( pSubSrc );. 
1caf0 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72   /* Prior to ver
1cb00 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e  sion 3.1.2, when
1cb10 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
1cb20 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70  T had to be simp
1cb30 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20  le constants,.  
1cb40 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79  ** not arbitrary
1cb50 20 65 78 70 72 65 73 73 73 69 6f 6e 73 2c 20 77   expresssions, w
1cb60 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63  e allowed some c
1cb70 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49  ombining of LIMI
1cb80 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
1cb90 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63  * because they c
1cba0 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
1cbb0 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
1cbc0 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49  .  But when LIMI
1cbd0 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
1cbe0 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61  * became arbitra
1cbf0 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  ry expressions, 
1cc00 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74  we were forced t
1cc10 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f  o add restrictio
1cc20 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64  ns (13).  ** and
1cc30 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20   (14). */.  if( 
1cc40 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
1cc50 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
1cc60 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1cc70 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1cc80 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20  n (13) */.  if( 
1cc90 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20  pSub->pOffset ) 
1cca0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1ccb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccc0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1ccd0 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20  n (14) */.  if( 
1cce0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1ccf0 46 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d 30 20 26  F_Compound)!=0 &
1cd00 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29  & pSub->pLimit )
1cd10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
1cd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1cd50 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a  striction (15) *
1cd60 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  /.  }.  if( pSub
1cd70 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72  Src->nSrc==0 ) r
1cd80 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1cd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cda0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37  * Restriction (7
1cdb0 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
1cdc0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1cdd0 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
1cde0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  n 0;           /
1cdf0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 35  * Restriction (5
1ce00 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
1ce10 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72  ->pLimit && (pSr
1ce20 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41  c->nSrc>1 || isA
1ce30 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75  gg) ){.     retu
1ce40 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
1ce50 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38   Restrictions (8
1ce60 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  )(9) */.  }.  if
1ce70 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
1ce80 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
1ce90 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67   && subqueryIsAg
1cea0 67 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  g ){.     return
1ceb0 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52   0;         /* R
1cec0 65 73 74 72 69 63 74 69 6f 6e 20 28 36 29 20 20  estriction (6)  
1ced0 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  */.  }.  if( p->
1cee0 70 4f 72 64 65 72 42 79 20 26 26 20 70 53 75 62  pOrderBy && pSub
1cef0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
1cf00 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1cf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf30 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1cf40 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20  ction (11) */.  
1cf50 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26  }.  if( isAgg &&
1cf60 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1cf70 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1cf80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1cf90 73 74 72 69 63 74 69 6f 6e 20 28 31 36 29 20 2a  striction (16) *
1cfa0 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
1cfb0 69 6d 69 74 20 26 26 20 70 2d 3e 70 57 68 65 72  imit && p->pWher
1cfc0 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
1cfd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1cfe0 73 74 72 69 63 74 69 6f 6e 20 28 31 39 29 20 2a  striction (19) *
1cff0 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
1d000 69 6d 69 74 20 26 26 20 28 70 2d 3e 73 65 6c 46  imit && (p->selF
1d010 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
1d020 63 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 72  ct)!=0 ){.     r
1d030 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1d040 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1d050 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (21) */.  }.  if
1d060 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  ( pSub->selFlags
1d070 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20   & SF_Recursive 
1d080 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1d090 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1d0a0 69 6f 6e 20 28 32 32 29 20 20 2a 2f 0a 20 20 69  ion (22)  */.  i
1d0b0 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
1d0c0 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 29 20  & SF_Recursive) 
1d0d0 26 26 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20  && pSub->pPrior 
1d0e0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1d0f0 20 20 2f 2a 20 28 32 33 29 20 20 2a 2f 0a 0a 20    /* (23)  */.. 
1d100 20 2f 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d   /* OBSOLETE COM
1d110 4d 45 4e 54 20 31 3a 0a 20 20 2a 2a 20 52 65 73  MENT 1:.  ** Res
1d120 74 72 69 63 74 69 6f 6e 20 33 3a 20 20 49 66 20  triction 3:  If 
1d130 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
1d140 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72  a join, make sur
1d150 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  e the subquery i
1d160 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64  s .  ** not used
1d170 20 61 73 20 74 68 65 20 72 69 67 68 74 20 6f 70   as the right op
1d180 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65  erand of an oute
1d190 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65  r join.  Example
1d1a0 73 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20  s of why this.  
1d1b0 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  ** is not allowe
1d1c0 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  d:.  **.  **    
1d1d0 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54       t1 LEFT OUT
1d1e0 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e  ER JOIN (t2 JOIN
1d1f0 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49   t3).  **.  ** I
1d200 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65  f we flatten the
1d210 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64   above, we would
1d220 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   get.  **.  **  
1d230 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20         (t1 LEFT 
1d240 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a  OUTER JOIN t2) J
1d250 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a  OIN t3.  **.  **
1d260 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74   which is not at
1d270 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68   all the same th
1d280 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f  ing..  **.  ** O
1d290 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20  BSOLETE COMMENT 
1d2a0 32 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74  2:.  ** Restrict
1d2b0 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20  ion 12:  If the 
1d2c0 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20  subquery is the 
1d2d0 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
1d2e0 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20   a left outer.  
1d2f0 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75  ** join, make su
1d300 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  re the subquery 
1d310 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  has no WHERE cla
1d320 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61  use..  ** An exa
1d330 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69  mples of why thi
1d340 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  s is not allowed
1d350 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
1d360 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45      t1 LEFT OUTE
1d370 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a  R JOIN (SELECT *
1d380 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74   FROM t2 WHERE t
1d390 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a  2.x>0).  **.  **
1d3a0 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74   If we flatten t
1d3b0 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75  he above, we wou
1d3c0 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a  ld get.  **.  **
1d3d0 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46           (t1 LEF
1d3e0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29  T OUTER JOIN t2)
1d3f0 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20   WHERE t2.x>0.  
1d400 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20  **.  ** But the 
1d410 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c  t2.x>0 test will
1d420 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20   always fail on 
1d430 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32  a NULL row of t2
1d440 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66  , which.  ** eff
1d450 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74  ectively convert
1d460 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e  s the OUTER JOIN
1d470 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a   into an INNER J
1d480 4f 49 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  OIN..  **.  ** T
1d490 48 49 53 20 4f 56 45 52 52 49 44 45 53 20 4f 42  HIS OVERRIDES OB
1d4a0 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 53 20  SOLETE COMMENTS 
1d4b0 31 20 41 4e 44 20 32 20 41 42 4f 56 45 3a 0a 20  1 AND 2 ABOVE:. 
1d4c0 20 2a 2a 20 54 69 63 6b 65 74 20 23 33 33 30 30   ** Ticket #3300
1d4d0 20 73 68 6f 77 73 20 74 68 61 74 20 66 6c 61 74   shows that flat
1d4e0 74 65 6e 69 6e 67 20 74 68 65 20 72 69 67 68 74  tening the right
1d4f0 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20   term of a LEFT 
1d500 4a 4f 49 4e 0a 20 20 2a 2a 20 69 73 20 66 72 61  JOIN.  ** is fra
1d510 75 67 68 74 20 77 69 74 68 20 64 61 6e 67 65 72  ught with danger
1d520 2e 20 20 42 65 73 74 20 74 6f 20 61 76 6f 69 64  .  Best to avoid
1d530 20 74 68 65 20 77 68 6f 6c 65 20 74 68 69 6e 67   the whole thing
1d540 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 73  .  If the.  ** s
1d550 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72  ubquery is the r
1d560 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c  ight term of a L
1d570 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 64  EFT JOIN, then d
1d580 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e 2e 0a 20  o not flatten.. 
1d590 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62 69   */.  if( (pSubi
1d5a0 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  tem->jointype & 
1d5b0 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a  JT_OUTER)!=0 ){.
1d5c0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1d5d0 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74  }..  /* Restrict
1d5e0 69 6f 6e 20 31 37 3a 20 49 66 20 74 68 65 20 73  ion 17: If the s
1d5f0 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
1d600 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20 74  mpound SELECT, t
1d610 68 65 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a  hen it must.  **
1d620 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e   use only the UN
1d630 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
1d640 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68  . And none of th
1d650 65 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 20  e simple select 
1d660 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 68 61  queries.  ** tha
1d670 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63 6f  t make up the co
1d680 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61 72  mpound SELECT ar
1d690 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20  e allowed to be 
1d6a0 61 67 67 72 65 67 61 74 65 20 6f 72 20 64 69 73  aggregate or dis
1d6b0 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72 69  tinct.  ** queri
1d6c0 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  es..  */.  if( p
1d6d0 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  Sub->pPrior ){. 
1d6e0 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72     if( pSub->pOr
1d6f0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 72  derBy ){.      r
1d700 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65 73  eturn 0;  /* Res
1d710 74 72 69 63 74 69 6f 6e 20 32 30 20 2a 2f 0a 20  triction 20 */. 
1d720 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 41     }.    if( isA
1d730 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61  gg || (p->selFla
1d740 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
1d750 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53  )!=0 || pSrc->nS
1d760 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72  rc!=1 ){.      r
1d770 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
1d780 20 20 20 66 6f 72 28 70 53 75 62 31 3d 70 53 75     for(pSub1=pSu
1d790 62 3b 20 70 53 75 62 31 3b 20 70 53 75 62 31 3d  b; pSub1; pSub1=
1d7a0 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a  pSub1->pPrior){.
1d7b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1d7c0 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73  (pSub1->selFlags
1d7d0 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
1d7e0 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
1d7f0 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  SF_Distinct );. 
1d800 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1d810 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
1d820 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
1d830 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
1d840 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20  F_Aggregate );. 
1d850 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
1d860 62 2d 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20 20  b->pSrc!=0 );.  
1d870 20 20 20 20 69 66 28 20 28 70 53 75 62 31 2d 3e      if( (pSub1->
1d880 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
1d890 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
1d8a0 67 61 74 65 29 29 21 3d 30 0a 20 20 20 20 20 20  gate))!=0.      
1d8b0 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70 50 72 69   || (pSub1->pPri
1d8c0 6f 72 20 26 26 20 70 53 75 62 31 2d 3e 6f 70 21  or && pSub1->op!
1d8d0 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20 20 20 20 20  =TK_ALL) .      
1d8e0 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72 63 2d   || pSub1->pSrc-
1d8f0 3e 6e 53 72 63 3c 31 0a 20 20 20 20 20 20 20 7c  >nSrc<1.       |
1d900 7c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  | pSub->pEList->
1d910 6e 45 78 70 72 21 3d 70 53 75 62 31 2d 3e 70 45  nExpr!=pSub1->pE
1d920 4c 69 73 74 2d 3e 6e 45 78 70 72 0a 20 20 20 20  List->nExpr.    
1d930 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74    ){.        ret
1d940 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
1d950 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1d960 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  Sub1->pSrc->nSrc
1d970 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  >1 );.    }..   
1d980 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1d990 31 38 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  18. */.    if( p
1d9a0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
1d9b0 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
1d9c0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
1d9d0 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
1d9e0 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  r; ii++){.      
1d9f0 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
1da00 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72  y->a[ii].u.x.iOr
1da10 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65  derByCol==0 ) re
1da20 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
1da30 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a      }.  }..  /**
1da40 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68 20  *** If we reach 
1da50 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74  this point, flat
1da60 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
1da70 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 0a 20 20 2f  ted. *****/..  /
1da80 2a 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65 20  * Authorize the 
1da90 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 50  subquery */.  pP
1daa0 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
1dab0 78 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a  xt = pSubitem->z
1dac0 4e 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59  Name;.  TESTONLY
1dad0 28 69 20 3d 29 20 73 71 6c 69 74 65 33 41 75 74  (i =) sqlite3Aut
1dae0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
1daf0 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c  QLITE_SELECT, 0,
1db00 20 30 2c 20 30 29 3b 0a 20 20 74 65 73 74 63 61   0, 0);.  testca
1db10 73 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45  se( i==SQLITE_DE
1db20 4e 59 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  NY );.  pParse->
1db30 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a  zAuthContext = z
1db40 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
1db50 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  ;..  /* If the s
1db60 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
1db70 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74  mpound SELECT st
1db80 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62  atement, then (b
1db90 79 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 20  y restrictions. 
1dba0 20 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61 62   ** 17 and 18 ab
1dbb0 6f 76 65 29 20 69 74 20 6d 75 73 74 20 62 65 20  ove) it must be 
1dbc0 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20  a UNION ALL and 
1dbd0 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
1dbe0 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f   must .  ** be o
1dbf0 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a  f the form:.  **
1dc00 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
1dc10 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f   <expr-list> FRO
1dc20 4d 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20  M (<sub-query>) 
1dc30 3c 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a  <where-clause> .
1dc40 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77    **.  ** follow
1dc50 65 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20  ed by any ORDER 
1dc60 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72  BY, LIMIT and/or
1dc70 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e   OFFSET clauses.
1dc80 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a   This block.  **
1dc90 20 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f 70   creates N-1 cop
1dca0 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e  ies of the paren
1dcb0 74 20 71 75 65 72 79 20 77 69 74 68 6f 75 74 20  t query without 
1dcc0 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49  any ORDER BY, LI
1dcd0 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46  MIT or .  ** OFF
1dce0 53 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20  SET clauses and 
1dcf0 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68  joins them to th
1dd00 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65  e left-hand-side
1dd10 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
1dd20 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f  .  ** using UNIO
1dd30 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e  N ALL operators.
1dd40 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20   In this case N 
1dd50 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1dd60 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c   simple.  ** sel
1dd70 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ect statements i
1dd80 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  n the compound s
1dd90 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20  ub-query..  **. 
1dda0 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a   ** Example:.  *
1ddb0 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
1ddc0 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a  T a+1 FROM (.  *
1ddd0 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
1dde0 78 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20  x FROM tab.  ** 
1ddf0 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
1de00 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  .  **        SEL
1de10 45 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a 20  ECT y FROM tab. 
1de20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e   **        UNION
1de30 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20   ALL.  **       
1de40 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29   SELECT abs(z*2)
1de50 20 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20   FROM tab2.  ** 
1de60 20 20 20 20 29 20 57 48 45 52 45 20 61 21 3d 35      ) WHERE a!=5
1de70 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a   ORDER BY 1.  **
1de80 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65  .  ** Transforme
1de90 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  d into:.  **.  *
1dea0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 31  *     SELECT x+1
1deb0 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20   FROM tab WHERE 
1dec0 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20  x+1!=5.  **     
1ded0 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
1dee0 20 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46 52     SELECT y+1 FR
1def0 4f 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b 31  OM tab WHERE y+1
1df00 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49  !=5.  **     UNI
1df10 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
1df20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 2b  SELECT abs(z*2)+
1df30 31 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45 52  1 FROM tab2 WHER
1df40 45 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a  E abs(z*2)+1!=5.
1df50 20 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42    **     ORDER B
1df60 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65  Y 1.  **.  ** We
1df70 20 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22   call this the "
1df80 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
1df90 79 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20  y flattening".. 
1dfa0 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70   */.  for(pSub=p
1dfb0 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75  Sub->pPrior; pSu
1dfc0 62 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50  b; pSub=pSub->pP
1dfd0 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63  rior){.    Selec
1dfe0 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70  t *pNew;.    Exp
1dff0 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
1e000 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
1e010 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20     Expr *pLimit 
1e020 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
1e030 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20 3d   Expr *pOffset =
1e040 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
1e050 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20   Select *pPrior 
1e060 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
1e070 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
1e080 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20  ;.    p->pSrc = 
1e090 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  0;.    p->pPrior
1e0a0 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69   = 0;.    p->pLi
1e0b0 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  mit = 0;.    p->
1e0c0 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
1e0d0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53   pNew = sqlite3S
1e0e0 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2c 20  electDup(db, p, 
1e0f0 30 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73  0);.    p->pOffs
1e100 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20  et = pOffset;.  
1e110 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
1e120 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  imit;.    p->pOr
1e130 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
1e140 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20  ;.    p->pSrc = 
1e150 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20  pSrc;.    p->op 
1e160 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69 66  = TK_ALL;.    if
1e170 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
1e180 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
1e190 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65  Prior;.    }else
1e1a0 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50  {.      pNew->pP
1e1b0 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
1e1c0 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 20       if( pPrior 
1e1d0 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20  ) pPrior->pNext 
1e1e0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e  = pNew;.      pN
1e1f0 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20  ew->pNext = p;. 
1e200 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
1e210 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 20   pNew;.    }.   
1e220 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1e230 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31  ailed ) return 1
1e240 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
1e250 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65  n flattening the
1e260 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20   iFrom-th entry 
1e270 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
1e280 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  se .  ** in the 
1e290 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a  outer query..  *
1e2a0 2f 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 31  /.  pSub = pSub1
1e2b0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65   = pSubitem->pSe
1e2c0 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  lect;..  /* Dele
1e2d0 74 65 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74  te the transient
1e2e0 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
1e2f0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1e300 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
1e310 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ry.  */.  sqlite
1e320 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
1e330 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  item->zDatabase)
1e340 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1e350 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e  e(db, pSubitem->
1e360 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
1e370 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
1e380 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  item->zAlias);. 
1e390 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61   pSubitem->zData
1e3a0 62 61 73 65 20 3d 20 30 3b 0a 20 20 70 53 75 62  base = 0;.  pSub
1e3b0 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b  item->zName = 0;
1e3c0 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c  .  pSubitem->zAl
1e3d0 69 61 73 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ias = 0;.  pSubi
1e3e0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30  tem->pSelect = 0
1e3f0 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20 64 65  ;..  /* Defer de
1e400 6c 65 74 69 6e 67 20 74 68 65 20 54 61 62 6c 65  leting the Table
1e410 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74   object associat
1e420 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a  ed with the.  **
1e430 20 73 75 62 71 75 65 72 79 20 75 6e 74 69 6c 20   subquery until 
1e440 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20  code generation 
1e450 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65  is.  ** complete
1e460 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 6d 61  , since there ma
1e470 79 20 73 74 69 6c 6c 20 65 78 69 73 74 20 45 78  y still exist Ex
1e480 70 72 2e 70 54 61 62 20 65 6e 74 72 69 65 73 20  pr.pTab entries 
1e490 74 68 61 74 0a 20 20 2a 2a 20 72 65 66 65 72 20  that.  ** refer 
1e4a0 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20  to the subquery 
1e4b0 65 76 65 6e 20 61 66 74 65 72 20 66 6c 61 74 74  even after flatt
1e4c0 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74 20 23  ening.  Ticket #
1e4d0 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  3346..  **.  ** 
1e4e0 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 69  pSubitem->pTab i
1e4f0 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c  s always non-NUL
1e500 4c 20 62 79 20 74 65 73 74 20 72 65 73 74 72 69  L by test restri
1e510 63 74 69 6f 6e 73 20 61 6e 64 20 74 65 73 74 73  ctions and tests
1e520 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69   above..  */.  i
1e530 66 28 20 41 4c 57 41 59 53 28 70 53 75 62 69 74  f( ALWAYS(pSubit
1e540 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a  em->pTab!=0) ){.
1e550 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 54      Table *pTabT
1e560 6f 44 65 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d  oDel = pSubitem-
1e570 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  >pTab;.    if( p
1e580 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d  TabToDel->nRef==
1e590 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65  1 ){.      Parse
1e5a0 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
1e5b0 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
1e5c0 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
1e5d0 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65    pTabToDel->pNe
1e5e0 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c  xtZombie = pTopl
1e5f0 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62  evel->pZombieTab
1e600 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65  ;.      pTopleve
1e610 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20  l->pZombieTab = 
1e620 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d  pTabToDel;.    }
1e630 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62  else{.      pTab
1e640 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  ToDel->nRef--;. 
1e650 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69 74 65     }.    pSubite
1e660 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d  m->pTab = 0;.  }
1e670 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
1e680 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f  wing loop runs o
1e690 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 65 72  nce for each ter
1e6a0 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d  m in a compound-
1e6b0 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c  subquery.  ** fl
1e6c0 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64 65 73  attening (as des
1e6d0 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e 20 20  cribed above).  
1e6e0 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20  If we are doing 
1e6f0 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69 6e 64  a different kind
1e700 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e  .  ** of flatten
1e710 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65 6e 69  ing - a flatteni
1e720 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  ng other than a 
1e730 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
1e740 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20  y flattening -. 
1e750 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 6c 6f   ** then this lo
1e760 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63  op only runs onc
1e770 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
1e780 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c  s loop moves all
1e790 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65   of the FROM ele
1e7a0 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62  ments of the sub
1e7b0 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20  query into the. 
1e7c0 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   ** the FROM cla
1e7d0 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
1e7e0 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20   query.  Before 
1e7f0 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65  doing this, reme
1e800 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75  mber.  ** the cu
1e810 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
1e820 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74  the original out
1e830 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c  er query FROM el
1e840 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50  ement in.  ** iP
1e850 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72  arent.  The iPar
1e860 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  ent cursor will 
1e870 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20 20  never be used.  
1e880 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a  Subsequent code.
1e890 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65    ** will scan e
1e8a0 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69  xpressions looki
1e8b0 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72  ng for iParent r
1e8c0 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65  eferences and re
1e8d0 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65  place.  ** those
1e8e0 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74 68   references with
1e8f0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1e900 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65  t resolve to the
1e910 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20   subquery FROM. 
1e920 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20   ** elements we 
1e930 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20  are now copying 
1e940 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  in..  */.  for(p
1e950 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e  Parent=p; pParen
1e960 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61 72 65  t; pParent=pPare
1e970 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75 62  nt->pPrior, pSub
1e980 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a  =pSub->pPrior){.
1e990 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63 3b      int nSubSrc;
1e9a0 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79 70 65  .    u8 jointype
1e9b0 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 53 72   = 0;.    pSubSr
1e9c0 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 20  c = pSub->pSrc; 
1e9d0 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
1e9e0 73 65 20 6f 66 20 73 75 62 71 75 65 72 79 20 2a  se of subquery *
1e9f0 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20 3d 20  /.    nSubSrc = 
1ea00 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20  pSubSrc->nSrc;  
1ea10 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
1ea20 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79 20 46  ms in subquery F
1ea30 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
1ea40 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74    pSrc = pParent
1ea50 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46  ->pSrc;     /* F
1ea60 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
1ea70 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
1ea80 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 20 29  ..    if( pSrc )
1ea90 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1eaa0 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f  pParent==p );  /
1eab0 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74 68 72  * First time thr
1eac0 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  ough the loop */
1ead0 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  .      jointype 
1eae0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e  = pSubitem->join
1eaf0 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  type;.    }else{
1eb00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1eb10 50 61 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a  Parent!=p );  /*
1eb20 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75   2nd and subsequ
1eb30 65 6e 74 20 74 69 6d 65 73 20 74 68 72 6f 75 67  ent times throug
1eb40 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  h the loop */.  
1eb50 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65      pSrc = pPare
1eb60 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74  nt->pSrc = sqlit
1eb70 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
1eb80 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  db, 0, 0, 0);.  
1eb90 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20      if( pSrc==0 
1eba0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1ebb0 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
1ebc0 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 62  led );.        b
1ebd0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1ebe0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
1ebf0 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61 20  subquery uses a 
1ec00 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74  single slot of t
1ec10 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1ec20 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20 20 20  f the outer.    
1ec30 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20 74 68  ** query.  If th
1ec40 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6d  e subquery has m
1ec50 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65  ore than one ele
1ec60 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52 4f 4d  ment in its FROM
1ec70 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20   clause,.    ** 
1ec80 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68 65 20  then expand the 
1ec90 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f 20 6d  outer query to m
1eca0 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 69 74  ake space for it
1ecb0 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65   to hold all ele
1ecc0 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20  ments.    ** of 
1ecd0 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
1ece0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d    **.    ** Exam
1ecf0 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
1ed00 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
1ed10 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c 45 43  ROM tabA, (SELEC
1ed20 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20 73  T * FROM sub1, s
1ed30 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20 20 20  ub2), tabB;.    
1ed40 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 75  **.    ** The ou
1ed50 74 65 72 20 71 75 65 72 79 20 68 61 73 20 33 20  ter query has 3 
1ed60 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46 52 4f  slots in its FRO
1ed70 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73  M clause.  One s
1ed80 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  lot of the.    *
1ed90 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 28 74  * outer query (t
1eda0 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20  he middle slot) 
1edb0 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73  is used by the s
1edc0 75 62 71 75 65 72 79 2e 20 20 54 68 65 20 6e 65  ubquery.  The ne
1edd0 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20  xt.    ** block 
1ede0 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65 78 70  of code will exp
1edf0 61 6e 64 20 74 68 65 20 6f 75 74 20 71 75 65 72  and the out quer
1ee00 79 20 74 6f 20 34 20 73 6c 6f 74 73 2e 20 20 54  y to 4 slots.  T
1ee10 68 65 20 6d 69 64 64 6c 65 0a 20 20 20 20 2a 2a  he middle.    **
1ee20 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e 64 65   slot is expande
1ee30 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69  d to two slots i
1ee40 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20  n order to make 
1ee50 73 70 61 63 65 20 66 6f 72 20 74 68 65 0a 20 20  space for the.  
1ee60 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74    ** two element
1ee70 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
1ee80 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71  ause of the subq
1ee90 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uery..    */.   
1eea0 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29   if( nSubSrc>1 )
1eeb0 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  {.      pParent-
1eec0 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d 20 73  >pSrc = pSrc = s
1eed0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c  qlite3SrcListEnl
1eee0 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c 20 6e  arge(db, pSrc, n
1eef0 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31  SubSrc-1,iFrom+1
1ef00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  );.      if( db-
1ef10 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
1ef20 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1ef30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1ef40 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74     /* Transfer t
1ef50 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
1ef60 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 73 75  erms from the su
1ef70 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a  bquery into the.
1ef80 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
1ef90 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ry..    */.    f
1efa0 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72  or(i=0; i<nSubSr
1efb0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  c; i++){.      s
1efc0 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
1efd0 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69  te(db, pSrc->a[i
1efe0 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b  +iFrom].pUsing);
1eff0 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69  .      pSrc->a[i
1f000 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72  +iFrom] = pSubSr
1f010 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d  c->a[i];.      m
1f020 65 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e  emset(&pSubSrc->
1f030 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  a[i], 0, sizeof(
1f040 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b  pSubSrc->a[i]));
1f050 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d  .    }.    pSrc-
1f060 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79  >a[iFrom].jointy
1f070 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20  pe = jointype;. 
1f080 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65 67   .    /* Now beg
1f090 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67 20  in substituting 
1f0a0 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 20  subquery result 
1f0b0 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  set expressions 
1f0c0 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65 66 65  for .    ** refe
1f0d0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50  rences to the iP
1f0e0 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74  arent in the out
1f0f0 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a  er query..    **
1f100 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65   .    ** Example
1f110 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
1f120 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a    SELECT a+5, b*
1f130 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  10 FROM (SELECT 
1f140 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41  x*3 AS a, y+10 A
1f150 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45  S b FROM t1) WHE
1f160 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20 20  RE a>b;.    **  
1f170 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   \              
1f180 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f         \________
1f190 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f  _____ subquery _
1f1a0 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20  _________/      
1f1b0 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20 20      /.    **    
1f1c0 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
1f1d0 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65  ______ outer que
1f1e0 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ry _____________
1f1f0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1f200 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  _/.    **.    **
1f210 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72   We look at ever
1f220 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
1f230 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1f240 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20  and every place 
1f250 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20 22 61  we see.    ** "a
1f260 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
1f270 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20  "x*3" and every 
1f280 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62 22  place we see "b"
1f290 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22   we substitute "
1f2a0 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20  y+10"..    */.  
1f2b0 20 20 70 4c 69 73 74 20 3d 20 70 50 61 72 65 6e    pList = pParen
1f2c0 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 66  t->pEList;.    f
1f2d0 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1f2e0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
1f2f0 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61      if( pList->a
1f300 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  [i].zName==0 ){.
1f310 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
1f320 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
1f330 74 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d  trDup(db, pList-
1f340 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20  >a[i].zSpan);.  
1f350 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71        sqlite3Deq
1f360 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  uote(zName);.   
1f370 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d       pList->a[i]
1f380 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  .zName = zName;.
1f390 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1f3a0 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1f3b0 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c  db, pParent->pEL
1f3c0 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ist, iParent, pS
1f3d0 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
1f3e0 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20   if( isAgg ){.  
1f3f0 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
1f400 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  t(db, pParent->p
1f410 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74  GroupBy, iParent
1f420 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
1f430 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1f440 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45  pHaving = substE
1f450 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  xpr(db, pParent-
1f460 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e  >pHaving, iParen
1f470 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1f480 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1f490 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
1f4a0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1f4b0 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42  pParent->pOrderB
1f4c0 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  y==0 );.      pP
1f4d0 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20  arent->pOrderBy 
1f4e0 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  = pSub->pOrderBy
1f4f0 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4f  ;.      pSub->pO
1f500 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
1f510 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72 65 6e  }else if( pParen
1f520 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  t->pOrderBy ){. 
1f530 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69       substExprLi
1f540 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  st(db, pParent->
1f550 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72 65 6e  pOrderBy, iParen
1f560 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1f570 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1f580 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a  pSub->pWhere ){.
1f590 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 73        pWhere = s
1f5a0 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
1f5b0 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65 2c 20  , pSub->pWhere, 
1f5c0 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
1f5d0 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b       pWhere = 0;
1f5e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
1f5f0 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a  ubqueryIsAgg ){.
1f600 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1f610 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d 3d  arent->pHaving==
1f620 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  0 );.      pPare
1f630 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 50  nt->pHaving = pP
1f640 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a 20  arent->pWhere;. 
1f650 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57       pParent->pW
1f660 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20  here = pWhere;. 
1f670 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48       pParent->pH
1f680 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70  aving = substExp
1f690 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  r(db, pParent->p
1f6a0 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c  Having, iParent,
1f6b0 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
1f6c0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1f6d0 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  Having = sqlite3
1f6e0 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72  ExprAnd(db, pPar
1f6f0 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a 20  ent->pHaving, . 
1f700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f720 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
1f730 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69 6e  db, pSub->pHavin
1f740 67 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 61 73  g, 0));.      as
1f750 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
1f760 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20  GroupBy==0 );.  
1f770 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47 72      pParent->pGr
1f780 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
1f790 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
1f7a0 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20 30  Sub->pGroupBy, 0
1f7b0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1f7c0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68      pParent->pWh
1f7d0 65 72 65 20 3d 20 73 75 62 73 74 45 78 70 72 28  ere = substExpr(
1f7e0 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68  db, pParent->pWh
1f7f0 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ere, iParent, pS
1f800 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
1f810 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65     pParent->pWhe
1f820 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
1f830 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  And(db, pParent-
1f840 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65 29  >pWhere, pWhere)
1f850 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
1f860 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20  * The flattened 
1f870 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63  query is distinc
1f880 74 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20  t if either the 
1f890 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20  inner or the.   
1f8a0 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20   ** outer query 
1f8b0 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20  is distinct. .  
1f8c0 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74    */.    pParent
1f8d0 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53  ->selFlags |= pS
1f8e0 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
1f8f0 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20  F_Distinct;.  . 
1f900 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c     /*.    ** SEL
1f910 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45  ECT ... FROM (SE
1f920 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61  LECT ... LIMIT a
1f930 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54   OFFSET b) LIMIT
1f940 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20   x OFFSET y;.   
1f950 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69   **.    ** One i
1f960 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79  s tempted to try
1f970 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20   to add a and b 
1f980 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c  to combine the l
1f990 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69 73  imits.  But this
1f9a0 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  .    ** does not
1f9b0 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20   work if either 
1f9c0 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76  limit is negativ
1f9d0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1f9e0 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29  ( pSub->pLimit )
1f9f0 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  {.      pParent-
1fa00 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e  >pLimit = pSub->
1fa10 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53  pLimit;.      pS
1fa20 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a  ub->pLimit = 0;.
1fa30 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1fa40 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65  Finially, delete
1fa50 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66   what is left of
1fa60 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   the subquery an
1fa70 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75  d return.  ** su
1fa80 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  ccess..  */.  sq
1fa90 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
1faa0 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a 20  e(db, pSub1);.. 
1fab0 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
1fac0 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
1fad0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1fae0 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
1faf0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
1fb00 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 61  EW) */../*.** Ba
1fb10 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  sed on the conte
1fb20 6e 74 73 20 6f 66 20 74 68 65 20 41 67 67 49 6e  nts of the AggIn
1fb30 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e 64  fo structure ind
1fb40 69 63 61 74 65 64 20 62 79 20 74 68 65 20 66 69  icated by the fi
1fb50 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2c  rst.** argument,
1fb60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   this function c
1fb70 68 65 63 6b 73 20 69 66 20 74 68 65 20 66 6f 6c  hecks if the fol
1fb80 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
1fb90 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  .**.**    * the 
1fba0 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 6a  query contains j
1fbb0 75 73 74 20 61 20 73 69 6e 67 6c 65 20 61 67 67  ust a single agg
1fbc0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c  regate function,
1fbd0 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 67 67  .**    * the agg
1fbe0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
1fbf0 69 73 20 65 69 74 68 65 72 20 6d 69 6e 28 29 20  is either min() 
1fc00 6f 72 20 6d 61 78 28 29 2c 20 61 6e 64 0a 2a 2a  or max(), and.**
1fc10 20 20 20 20 2a 20 74 68 65 20 61 72 67 75 6d 65      * the argume
1fc20 6e 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  nt to the aggreg
1fc30 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ate function is 
1fc40 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2e 0a  a column value..
1fc50 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20  **.** If all of 
1fc60 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 74 72  the above are tr
1fc70 75 65 2c 20 74 68 65 6e 20 57 48 45 52 45 5f 4f  ue, then WHERE_O
1fc80 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48  RDERBY_MIN or WH
1fc90 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 0a  ERE_ORDERBY_MAX.
1fca0 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  ** is returned a
1fcb0 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 41  s appropriate. A
1fcc0 6c 73 6f 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69  lso, *ppMinMax i
1fcd0 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
1fce0 6f 20 74 68 65 20 0a 2a 2a 20 6c 69 73 74 20 6f  o the .** list o
1fcf0 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  f arguments pass
1fd00 65 64 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  ed to the aggreg
1fd10 61 74 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ate before retur
1fd20 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  ning..**.** Or, 
1fd30 69 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  if the condition
1fd40 73 20 61 62 6f 76 65 20 61 72 65 20 6e 6f 74 20  s above are not 
1fd50 6d 65 74 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69  met, *ppMinMax i
1fd60 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a  s set to 0 and.*
1fd70 2a 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  * WHERE_ORDERBY_
1fd80 4e 4f 52 4d 41 4c 20 69 73 20 72 65 74 75 72 6e  NORMAL is return
1fd90 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  ed..*/.static u8
1fda0 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 41 67 67   minMaxQuery(Agg
1fdb0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 2c 20  Info *pAggInfo, 
1fdc0 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 4d 69 6e  ExprList **ppMin
1fdd0 4d 61 78 29 7b 0a 20 20 69 6e 74 20 65 52 65 74  Max){.  int eRet
1fde0 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   = WHERE_ORDERBY
1fdf0 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20 20 20 20 20  _NORMAL;        
1fe00 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
1fe10 65 20 2a 2f 0a 0a 20 20 2a 70 70 4d 69 6e 4d 61  e */..  *ppMinMa
1fe20 78 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 41 67  x = 0;.  if( pAg
1fe30 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 31 20  gInfo->nFunc==1 
1fe40 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
1fe50 70 72 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61  pr = pAggInfo->a
1fe60 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72 3b 20 2f  Func[0].pExpr; /
1fe70 2a 20 41 67 67 72 65 67 61 74 65 20 66 75 6e 63  * Aggregate func
1fe80 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78 70 72  tion */.    Expr
1fe90 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
1fea0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 20 20  Expr->x.pList;  
1feb0 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73      /* Arguments
1fec0 20 74 6f 20 61 67 67 20 66 75 6e 63 74 69 6f 6e   to agg function
1fed0 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
1fee0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
1fef0 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
1ff00 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26     if( pEList &&
1ff10 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
1ff20 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30  1 && pEList->a[0
1ff30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ].pExpr->op==TK_
1ff40 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  AGG_COLUMN ){.  
1ff50 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1ff60 7a 46 75 6e 63 20 3d 20 70 45 78 70 72 2d 3e 75  zFunc = pExpr->u
1ff70 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 69  .zToken;.      i
1ff80 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
1ff90 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22 29 3d  p(zFunc, "min")=
1ffa0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 52  =0 ){.        eR
1ffb0 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  et = WHERE_ORDER
1ffc0 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 20 20 20 20  BY_MIN;.        
1ffd0 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69  *ppMinMax = pELi
1ffe0 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  st;.      }else 
1fff0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
20000 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78 22 29  mp(zFunc, "max")
20010 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
20020 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  Ret = WHERE_ORDE
20030 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20 20 20 20  RBY_MAX;.       
20040 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c   *ppMinMax = pEL
20050 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ist;.      }.   
20060 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
20070 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c  ( *ppMinMax==0 |
20080 7c 20 28 2a 70 70 4d 69 6e 4d 61 78 29 2d 3e 6e  | (*ppMinMax)->n
20090 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 72 65 74  Expr==1 );.  ret
200a0 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn eRet;.}../*.
200b0 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73 74  ** The select st
200c0 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
200d0 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
200e0 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65  ment is an aggre
200f0 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54  gate query..** T
20100 68 65 20 73 65 63 6f 6e 64 20 61 72 67 6d 65 6e  he second argmen
20110 74 20 69 73 20 74 68 65 20 61 73 73 6f 63 69 61  t is the associa
20120 74 65 64 20 61 67 67 72 65 67 61 74 65 2d 69 6e  ted aggregate-in
20130 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20  fo object. This 
20140 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65 73  .** function tes
20150 74 73 20 69 66 20 74 68 65 20 53 45 4c 45 43 54  ts if the SELECT
20160 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
20170 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
20180 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74  count(*) FROM <t
20190 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  bl>.**.** where 
201a0 74 61 62 6c 65 20 69 73 20 61 20 64 61 74 61 62  table is a datab
201b0 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61  ase table, not a
201c0 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76   sub-select or v
201d0 69 65 77 2e 20 49 66 20 74 68 65 20 71 75 65 72  iew. If the quer
201e0 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68 20  y.** does match 
201f0 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68  this pattern, th
20200 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  en a pointer to 
20210 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  the Table object
20220 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a   representing.**
20230 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72 6e   <tbl> is return
20240 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30  ed. Otherwise, 0
20250 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
20260 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a 69  .static Table *i
20270 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c  sSimpleCount(Sel
20280 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20  ect *p, AggInfo 
20290 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61  *pAggInfo){.  Ta
202a0 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78 70  ble *pTab;.  Exp
202b0 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73 73  r *pExpr;..  ass
202c0 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70 42  ert( !p->pGroupB
202d0 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  y );..  if( p->p
202e0 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69  Where || p->pELi
202f0 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20  st->nExpr!=1 .  
20300 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72   || p->pSrc->nSr
20310 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d  c!=1 || p->pSrc-
20320 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20  >a[0].pSelect.  
20330 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
20340 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d  .  }.  pTab = p-
20350 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62  >pSrc->a[0].pTab
20360 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70  ;.  pExpr = p->p
20370 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
20380 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  r;.  assert( pTa
20390 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65 6c  b && !pTab->pSel
203a0 65 63 74 20 26 26 20 70 45 78 70 72 20 29 3b 0a  ect && pExpr );.
203b0 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
203c0 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
203d0 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
203e0 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op!=TK_AGG_FUNCT
203f0 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ION ) return 0;.
20400 20 20 69 66 28 20 4e 45 56 45 52 28 70 41 67 67    if( NEVER(pAgg
20410 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20  Info->nFunc==0) 
20420 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
20430 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  ( (pAggInfo->aFu
20440 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e  nc[0].pFunc->fun
20450 63 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 55  cFlags&SQLITE_FU
20460 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72  NC_COUNT)==0 ) r
20470 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
20480 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44  Expr->flags&EP_D
20490 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e  istinct ) return
204a0 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54   0;..  return pT
204b0 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ab;.}../*.** If 
204c0 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20  the source-list 
204d0 69 74 65 6d 20 70 61 73 73 65 64 20 61 73 20 61  item passed as a
204e0 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 61  n argument was a
204f0 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61 6e  ugmented with an
20500 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63  .** INDEXED BY c
20510 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79 20  lause, then try 
20520 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73 70  to locate the sp
20530 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20 49  ecified index. I
20540 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20 73  f there.** was s
20550 75 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e 64  uch a clause and
20560 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78   the named index
20570 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
20580 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  , return .** SQL
20590 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65  ITE_ERROR and le
205a0 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ave an error in 
205b0 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69 73  pParse. Otherwis
205c0 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20  e, populate .** 
205d0 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e  pFrom->pIndex an
205e0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
205f0 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
20600 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75  e3IndexedByLooku
20610 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
20620 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
20630 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  item *pFrom){.  
20640 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20  if( pFrom->pTab 
20650 26 26 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78  && pFrom->zIndex
20660 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
20670 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
20680 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e  b;.    char *zIn
20690 64 65 78 20 3d 20 70 46 72 6f 6d 2d 3e 7a 49 6e  dex = pFrom->zIn
206a0 64 65 78 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  dex;.    Index *
206b0 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49  pIdx;.    for(pI
206c0 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
206d0 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 26   .        pIdx &
206e0 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
206f0 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49  (pIdx->zName, zI
20700 6e 64 65 78 29 3b 20 0a 20 20 20 20 20 20 20 20  ndex); .        
20710 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
20720 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
20730 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 73  !pIdx ){.      s
20740 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
20750 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
20760 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64  index: %s", zInd
20770 65 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  ex, 0);.      pP
20780 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
20790 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  a = 1;.      ret
207a0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
207b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72 6f  ;.    }.    pFro
207c0 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 64 78  m->pIndex = pIdx
207d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
207e0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a  QLITE_OK;.}./*.*
207f0 2a 20 44 65 74 65 63 74 20 63 6f 6d 70 6f 75 6e  * Detect compoun
20800 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
20810 6e 74 73 20 74 68 61 74 20 75 73 65 20 61 6e 20  nts that use an 
20820 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
20830 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61 6c 74 65  with .** an alte
20840 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e  rnative collatin
20850 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a  g sequence..**.*
20860 2a 20 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20  *    SELECT ... 
20870 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53  FROM t1 EXCEPT S
20880 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
20890 32 20 4f 52 44 45 52 20 42 59 20 2e 2e 20 43 4f  2 ORDER BY .. CO
208a0 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  LLATE ....**.** 
208b0 54 68 65 73 65 20 61 72 65 20 72 65 77 72 69 74  These are rewrit
208c0 74 65 6e 20 61 73 20 61 20 73 75 62 71 75 65 72  ten as a subquer
208d0 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  y:.**.**    SELE
208e0 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT * FROM (SELEC
208f0 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58  T ... FROM t1 EX
20900 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20  CEPT SELECT ... 
20910 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20 20 20 20  FROM t2).**     
20920 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20 43 4f 4c  ORDER BY ... COL
20930 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54  LATE ....**.** T
20940 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  his transformati
20950 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  on is necessary 
20960 62 65 63 61 75 73 65 20 74 68 65 20 6d 75 6c 74  because the mult
20970 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29  iSelectOrderBy()
20980 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 62 6f 76   routine.** abov
20990 65 20 74 68 61 74 20 67 65 6e 65 72 61 74 65 73  e that generates
209a0 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20   the code for a 
209b0 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
209c0 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  with an ORDER BY
209d0 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73 65 73 20   clause.** uses 
209e0 61 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68  a merge algorith
209f0 6d 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  m that requires 
20a00 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69  the same collati
20a10 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 6e 20 74  ng sequence on t
20a20 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c  he.** result col
20a30 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68 65 20 4f  umns as on the O
20a40 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
20a50 20 53 65 65 20 74 69 63 6b 65 74 0a 2a 2a 20 68   See ticket.** h
20a60 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65  ttp://www.sqlite
20a70 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 36 37  .org/src/info/67
20a80 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54  09574d2a.**.** T
20a90 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  his transformati
20aa0 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65  on is only neede
20ab0 64 20 66 6f 72 20 45 58 43 45 50 54 2c 20 49 4e  d for EXCEPT, IN
20ac0 54 45 52 53 45 43 54 2c 20 61 6e 64 20 55 4e 49  TERSECT, and UNI
20ad0 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e 49 4f 4e  ON..** The UNION
20ae0 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 77 6f   ALL operator wo
20af0 72 6b 73 20 66 69 6e 65 20 77 69 74 68 20 6d 75  rks fine with mu
20b00 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
20b10 28 29 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20  () even when.** 
20b20 74 68 65 72 65 20 61 72 65 20 43 4f 4c 4c 41 54  there are COLLAT
20b30 45 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  E terms in the O
20b40 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73 74 61 74  RDER BY..*/.stat
20b50 69 63 20 69 6e 74 20 63 6f 6e 76 65 72 74 43 6f  ic int convertCo
20b60 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75  mpoundSelectToSu
20b70 62 71 75 65 72 79 28 57 61 6c 6b 65 72 20 2a 70  bquery(Walker *p
20b80 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
20b90 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53  p){.  int i;.  S
20ba0 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53  elect *pNew;.  S
20bb0 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20 73 71 6c  elect *pX;.  sql
20bc0 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74 72 75  ite3 *db;.  stru
20bd0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
20be0 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a   *a;.  SrcList *
20bf0 70 4e 65 77 53 72 63 3b 0a 20 20 50 61 72 73 65  pNewSrc;.  Parse
20c00 20 2a 70 50 61 72 73 65 3b 0a 20 20 54 6f 6b 65   *pParse;.  Toke
20c10 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69 66 28 20  n dummy;..  if( 
20c20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72  p->pPrior==0 ) r
20c30 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
20c40 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72  ue;.  if( p->pOr
20c50 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72  derBy==0 ) retur
20c60 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
20c70 20 20 66 6f 72 28 70 58 3d 70 3b 20 70 58 20 26    for(pX=p; pX &
20c80 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  & (pX->op==TK_AL
20c90 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  L || pX->op==TK_
20ca0 53 45 4c 45 43 54 29 3b 20 70 58 3d 70 58 2d 3e  SELECT); pX=pX->
20cb0 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69 66 28 20  pPrior){}.  if( 
20cc0 70 58 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  pX==0 ) return W
20cd0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 61  RC_Continue;.  a
20ce0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e   = p->pOrderBy->
20cf0 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 70 4f  a;.  for(i=p->pO
20d00 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 3b  rderBy->nExpr-1;
20d10 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
20d20 20 69 66 28 20 61 5b 69 5d 2e 70 45 78 70 72 2d   if( a[i].pExpr-
20d30 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
20d40 61 74 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ate ) break;.  }
20d50 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74  .  if( i<0 ) ret
20d60 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
20d70 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65  ;..  /* If we re
20d80 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
20d90 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 74  that means the t
20da0 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73  ransformation is
20db0 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 0a 20   required. */.. 
20dc0 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65   pParse = pWalke
20dd0 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20  r->pParse;.  db 
20de0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
20df0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
20e00 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
20e10 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
20e20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
20e30 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
20e40 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d  ;.  memset(&dumm
20e50 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d  y, 0, sizeof(dum
20e60 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53 72 63 20  my));.  pNewSrc 
20e70 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
20e80 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70  AppendFromTerm(p
20e90 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26 64 75 6d  Parse,0,0,0,&dum
20ea0 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a 20 20  my,pNew,0,0);.  
20eb0 69 66 28 20 70 4e 65 77 53 72 63 3d 3d 30 20 29  if( pNewSrc==0 )
20ec0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
20ed0 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70 3b  t;.  *pNew = *p;
20ee0 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 4e 65  .  p->pSrc = pNe
20ef0 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45 4c 69 73  wSrc;.  p->pELis
20f00 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
20f10 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
20f20 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72  , 0, sqlite3Expr
20f30 28 64 62 2c 20 54 4b 5f 41 4c 4c 2c 20 30 29 29  (db, TK_ALL, 0))
20f40 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53  ;.  p->op = TK_S
20f50 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68 65  ELECT;.  p->pWhe
20f60 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  re = 0;.  pNew->
20f70 70 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20  pGroupBy = 0;.  
20f80 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20  pNew->pHaving = 
20f90 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  0;.  pNew->pOrde
20fa0 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 50  rBy = 0;.  p->pP
20fb0 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  rior = 0;.  p->p
20fc0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 73  Next = 0;.  p->s
20fd0 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43  elFlags &= ~SF_C
20fe0 6f 6d 70 6f 75 6e 64 3b 0a 20 20 61 73 73 65 72  ompound;.  asser
20ff0 74 28 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 21  t( pNew->pPrior!
21000 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 50  =0 );.  pNew->pP
21010 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e  rior->pNext = pN
21020 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d  ew;.  pNew->pLim
21030 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  it = 0;.  pNew->
21040 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 72  pOffset = 0;.  r
21050 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
21060 75 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ue;.}..#ifndef S
21070 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f  QLITE_OMIT_CTE./
21080 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 57  *.** Argument pW
21090 69 74 68 20 28 77 68 69 63 68 20 6d 61 79 20 62  ith (which may b
210a0 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73 20 74  e NULL) points t
210b0 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  o a linked list 
210c0 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20 57 49  of nested .** WI
210d0 54 48 20 63 6f 6e 74 65 78 74 73 2c 20 66 72 6f  TH contexts, fro
210e0 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74 65 72  m inner to outer
210f0 6d 6f 73 74 2e 20 49 66 20 74 68 65 20 74 61 62  most. If the tab
21100 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  le identified by
21110 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65   .** FROM clause
21120 20 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d 20 69   element pItem i
21130 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f  s really a commo
21140 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65 73 73 69  n-table-expressi
21150 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74 68 65  on (CTE) .** the
21160 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  n return a point
21170 65 72 20 74 6f 20 74 68 65 20 43 54 45 20 64 65  er to the CTE de
21180 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74 68 61  finition for tha
21190 74 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 77 69  t table. Otherwi
211a0 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e 55 4c  se.** return NUL
211b0 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f  L..**.** If a no
211c0 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20  n-NULL value is 
211d0 72 65 74 75 72 6e 65 64 2c 20 73 65 74 20 2a 70  returned, set *p
211e0 70 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f 69 6e  pContext to poin
211f0 74 20 74 6f 20 74 68 65 20 57 69 74 68 0a 2a 2a  t to the With.**
21200 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68 65   object that the
21210 20 72 65 74 75 72 6e 65 64 20 43 54 45 20 62 65   returned CTE be
21220 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61  longs to..*/.sta
21230 74 69 63 20 73 74 72 75 63 74 20 43 74 65 20 2a  tic struct Cte *
21240 73 65 61 72 63 68 57 69 74 68 28 0a 20 20 57 69  searchWith(.  Wi
21250 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20  th *pWith,      
21260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21270 20 43 75 72 72 65 6e 74 20 6f 75 74 65 72 6d 6f   Current outermo
21280 73 74 20 57 49 54 48 20 63 6c 61 75 73 65 20 2a  st WITH clause *
21290 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
212a0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20  st_item *pItem, 
212b0 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
212c0 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20 72 65  se element to re
212d0 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74 68 20  solve */.  With 
212e0 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20 20 20 20  **ppContext     
212f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
21300 54 3a 20 57 49 54 48 20 63 6c 61 75 73 65 20 72  T: WITH clause r
21310 65 74 75 72 6e 20 76 61 6c 75 65 20 62 65 6c 6f  eturn value belo
21320 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63  ngs to */.){.  c
21330 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
21340 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a  ;.  if( pItem->z
21350 44 61 74 61 62 61 73 65 3d 3d 30 20 26 26 20 28  Database==0 && (
21360 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a  zName = pItem->z
21370 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
21380 57 69 74 68 20 2a 70 3b 0a 20 20 20 20 66 6f 72  With *p;.    for
21390 28 70 3d 70 57 69 74 68 3b 20 70 3b 20 70 3d 70  (p=pWith; p; p=p
213a0 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20 20 20  ->pOuter){.     
213b0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
213c0 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65  r(i=0; i<p->nCte
213d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
213e0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
213f0 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69  mp(zName, p->a[i
21400 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
21410 20 20 20 20 20 20 20 20 20 2a 70 70 43 6f 6e 74           *ppCont
21420 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ext = p;.       
21430 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 5b     return &p->a[
21440 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i];.        }.  
21450 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
21460 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
21470 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
21480 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73 20 61  ator maintains a
21490 20 73 74 61 63 6b 20 6f 66 20 61 63 74 69 76 65   stack of active
214a0 20 57 49 54 48 20 63 6c 61 75 73 65 73 0a 2a 2a   WITH clauses.**
214b0 20 77 69 74 68 20 74 68 65 20 69 6e 6e 65 72 2d   with the inner-
214c0 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65  most WITH clause
214d0 20 62 65 69 6e 67 20 61 74 20 74 68 65 20 74 6f   being at the to
214e0 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a  p of the stack..
214f0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
21500 6e 65 20 70 75 73 68 65 73 20 74 68 65 20 57 49  ne pushes the WI
21510 54 48 20 63 6c 61 75 73 65 20 70 61 73 73 65 64  TH clause passed
21520 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
21530 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20  rgument.** onto 
21540 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
21550 74 61 63 6b 2e 20 49 66 20 61 72 67 75 6d 65 6e  tack. If argumen
21560 74 20 62 46 72 65 65 20 69 73 20 74 72 75 65 2c  t bFree is true,
21570 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 57 49   then this.** WI
21580 54 48 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6e  TH clause will n
21590 65 76 65 72 20 62 65 20 70 6f 70 70 65 64 20 66  ever be popped f
215a0 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20 49  rom the stack. I
215b0 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 0a 2a  n this case it.*
215c0 2a 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65 65  * should be free
215d0 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
215e0 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 20 49   Parse object. I
215f0 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 77  n other cases, w
21600 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d 30 2c  hen.** bFree==0,
21610 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63 74   the With object
21620 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61   will be freed a
21630 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 53 45  long with the SE
21640 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74 65 6d 65  LECT .** stateme
21650 6e 74 20 77 69 74 68 20 77 68 69 63 68 20 69 74  nt with which it
21660 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 2e 0a   is associated..
21670 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
21680 69 74 68 50 75 73 68 28 50 61 72 73 65 20 2a 70  ithPush(Parse *p
21690 50 61 72 73 65 2c 20 57 69 74 68 20 2a 70 57 69  Parse, With *pWi
216a0 74 68 2c 20 75 38 20 62 46 72 65 65 29 7b 0a 20  th, u8 bFree){. 
216b0 20 61 73 73 65 72 74 28 20 62 46 72 65 65 3d 3d   assert( bFree==
216c0 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70 57 69  0 || pParse->pWi
216d0 74 68 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  th==0 );.  if( p
216e0 57 69 74 68 20 29 7b 0a 20 20 20 20 70 57 69 74  With ){.    pWit
216f0 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50 61 72  h->pOuter = pPar
21700 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70  se->pWith;.    p
21710 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
21720 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65  With;.    pParse
21730 2d 3e 62 46 72 65 65 57 69 74 68 20 3d 20 62 46  ->bFreeWith = bF
21740 72 65 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ree;.  }.}../*.*
21750 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
21760 63 68 65 63 6b 73 20 69 66 20 61 72 67 75 6d 65  checks if argume
21770 6e 74 20 70 46 72 6f 6d 20 72 65 66 65 72 73 20  nt pFrom refers 
21780 74 6f 20 61 20 43 54 45 20 64 65 63 6c 61 72 65  to a CTE declare
21790 64 20 62 79 20 0a 2a 2a 20 61 20 57 49 54 48 20  d by .** a WITH 
217a0 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 73 74  clause on the st
217b0 61 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 6d 61  ack currently ma
217c0 69 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65 20  intained by the 
217d0 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20  parser. And,.** 
217e0 69 66 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f  if currently pro
217f0 63 65 73 73 69 6e 67 20 61 20 43 54 45 20 65 78  cessing a CTE ex
21800 70 72 65 73 73 69 6f 6e 2c 20 69 66 20 69 74 20  pression, if it 
21810 69 73 20 61 20 72 65 63 75 72 73 69 76 65 0a 2a  is a recursive.*
21820 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  * reference to t
21830 68 65 20 63 75 72 72 65 6e 74 20 43 54 45 2e 0a  he current CTE..
21840 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 66  **.** If pFrom f
21850 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68 65 72  alls into either
21860 20 6f 66 20 74 68 65 20 74 77 6f 20 63 61 74 65   of the two cate
21870 67 6f 72 69 65 73 20 61 62 6f 76 65 2c 20 70 46  gories above, pF
21880 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e 64  rom->pTab.** and
21890 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72   other fields ar
218a0 65 20 70 6f 70 75 6c 61 74 65 64 20 61 63 63 6f  e populated acco
218b0 72 64 69 6e 67 6c 79 2e 20 54 68 65 20 63 61 6c  rdingly. The cal
218c0 6c 65 72 20 73 68 6f 75 6c 64 20 63 68 65 63 6b  ler should check
218d0 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54 61 62  .** (pFrom->pTab
218e0 21 3d 30 29 20 74 6f 20 64 65 74 65 72 6d 69 6e  !=0) to determin
218f0 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
21900 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 6d 61   a successful ma
21910 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75 6e 64  tch.** was found
21920 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20  ..**.** Whether 
21930 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63 68 20 69  or not a match i
21940 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54 45 5f  s found, SQLITE_
21950 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
21960 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63  f no error.** oc
21970 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f  curs. If an erro
21980 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e  r does occur, an
21990 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
219a0 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 0a  s stored in the.
219b0 2a 2a 20 70 61 72 73 65 72 20 61 6e 64 20 73 6f  ** parser and so
219c0 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  me error code ot
219d0 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
219e0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OK returned..*/.
219f0 73 74 61 74 69 63 20 69 6e 74 20 77 69 74 68 45  static int withE
21a00 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65 72 20  xpand(.  Walker 
21a10 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73 74 72  *pWalker, .  str
21a20 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
21a30 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50 61 72   *pFrom.){.  Par
21a40 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61  se *pParse = pWa
21a50 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
21a60 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
21a70 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74 72 75  arse->db;.  stru
21a80 63 74 20 43 74 65 20 2a 70 43 74 65 3b 20 20 20  ct Cte *pCte;   
21a90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
21aa0 61 74 63 68 65 64 20 43 54 45 20 28 6f 72 20 4e  atched CTE (or N
21ab0 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63 68 29  ULL if no match)
21ac0 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74   */.  With *pWit
21ad0 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
21ae0 20 20 20 20 20 20 2f 2a 20 57 49 54 48 20 63 6c        /* WITH cl
21af0 61 75 73 65 20 74 68 61 74 20 70 43 74 65 20 62  ause that pCte b
21b00 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20  elongs to */..  
21b10 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
21b20 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70 43 74  Tab==0 );..  pCt
21b30 65 20 3d 20 73 65 61 72 63 68 57 69 74 68 28 70  e = searchWith(p
21b40 50 61 72 73 65 2d 3e 70 57 69 74 68 2c 20 70 46  Parse->pWith, pF
21b50 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a 20 20  rom, &pWith);.  
21b60 69 66 28 20 70 43 74 65 20 29 7b 0a 20 20 20 20  if( pCte ){.    
21b70 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
21b80 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
21b90 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  t;.    Select *p
21ba0 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  Sel;.    Select 
21bb0 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20  *pLeft;         
21bc0 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d         /* Left-m
21bd0 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
21be0 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ment */.    int 
21bf0 62 4d 61 79 52 65 63 75 72 73 69 76 65 3b 20 20  bMayRecursive;  
21c00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
21c10 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f  e if compound jo
21c20 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20 5b 41  ined by UNION [A
21c30 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74 68 20  LL] */.    With 
21c40 2a 70 53 61 76 65 64 57 69 74 68 3b 20 20 20 20  *pSavedWith;    
21c50 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
21c60 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 50 61  ial value of pPa
21c70 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a 20  rse->pWith */.. 
21c80 20 20 20 2f 2a 20 49 66 20 70 43 74 65 2d 3e 7a     /* If pCte->z
21c90 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20  Err is non-NULL 
21ca0 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  at this point, t
21cb0 68 65 6e 20 74 68 69 73 20 69 73 20 61 6e 20 69  hen this is an i
21cc0 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20 72 65  llegal.    ** re
21cd0 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
21ce0 65 20 74 6f 20 43 54 45 20 70 43 74 65 2e 20 4c  e to CTE pCte. L
21cf0 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
21d00 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
21d10 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c 79 2e  rn.    ** early.
21d20 20 49 66 20 70 43 74 65 2d 3e 7a 45 72 72 20 69   If pCte->zErr i
21d30 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69  s NULL, then thi
21d40 73 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72  s is not a recur
21d50 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 2e 0a  sive reference..
21d60 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
21d70 61 73 65 2c 20 70 72 6f 63 65 65 64 2e 20 20 2a  ase, proceed.  *
21d80 2f 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e  /.    if( pCte->
21d90 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71  zErr ){.      sq
21da0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
21db0 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a 45 72 72  arse, pCte->zErr
21dc0 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCte->zName);.
21dd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
21de0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
21df0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ..    assert( pF
21e00 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
21e10 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
21e20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33  = pTab = sqlite3
21e30 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
21e40 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b   sizeof(Table));
21e50 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30  .    if( pTab==0
21e60 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
21e70 6f 72 74 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e  ort;.    pTab->n
21e80 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 54 61  Ref = 1;.    pTa
21e90 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  b->zName = sqlit
21ea0 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
21eb0 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Cte->zName);.   
21ec0 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
21ed0 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f  1;.    pTab->nRo
21ee0 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61  wLogEst = 200; a
21ef0 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69  ssert( 200==sqli
21f00 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37  te3LogEst(104857
21f10 36 29 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e  6) );.    pTab->
21f20 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45  tabFlags |= TF_E
21f30 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 70 46  phemeral;.    pF
21f40 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  rom->pSelect = s
21f50 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
21f60 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63  db, pCte->pSelec
21f70 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64  t, 0);.    if( d
21f80 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
21f90 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
21fa0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 61 73 73 65 72  NOMEM;.    asser
21fb0 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  t( pFrom->pSelec
21fc0 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  t );..    /* Che
21fd0 63 6b 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ck if this is a 
21fe0 72 65 63 75 72 73 69 76 65 20 43 54 45 2e 20 2a  recursive CTE. *
21ff0 2f 0a 20 20 20 20 70 53 65 6c 20 3d 20 70 46 72  /.    pSel = pFr
22000 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
22010 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 3d   bMayRecursive =
22020 20 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f   ( pSel->op==TK_
22030 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d  ALL || pSel->op=
22040 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20  =TK_UNION );.   
22050 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69   if( bMayRecursi
22060 76 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ve ){.      int 
22070 69 3b 0a 20 20 20 20 20 20 53 72 63 4c 69 73 74  i;.      SrcList
22080 20 2a 70 53 72 63 20 3d 20 70 46 72 6f 6d 2d 3e   *pSrc = pFrom->
22090 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20  pSelect->pSrc;. 
220a0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
220b0 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  pSrc->nSrc; i++)
220c0 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
220d0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
220e0 49 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b  Item = &pSrc->a[
220f0 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
22100 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
22110 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26  ==0 .         &&
22120 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30   pItem->zName!=0
22130 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 30 3d   .         && 0=
22140 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
22150 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43  pItem->zName, pC
22160 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20 20 20  te->zName).     
22170 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
22180 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20    pItem->pTab = 
22190 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
221a0 70 49 74 65 6d 2d 3e 69 73 52 65 63 75 72 73 69  pItem->isRecursi
221b0 76 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ve = 1;.        
221c0 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a    pTab->nRef++;.
221d0 20 20 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e            pSel->
221e0 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52  selFlags |= SF_R
221f0 65 63 75 72 73 69 76 65 3b 0a 20 20 20 20 20 20  ecursive;.      
22200 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
22210 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f  }..    /* Only o
22220 6e 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66  ne recursive ref
22230 65 72 65 6e 63 65 20 69 73 20 70 65 72 6d 69 74  erence is permit
22240 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69 66 28  ted. */ .    if(
22250 20 70 54 61 62 2d 3e 6e 52 65 66 3e 32 20 29 7b   pTab->nRef>2 ){
22260 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
22270 72 6f 72 4d 73 67 28 0a 20 20 20 20 20 20 20 20  rorMsg(.        
22280 20 20 70 50 61 72 73 65 2c 20 22 6d 75 6c 74 69    pParse, "multi
22290 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ple references t
222a0 6f 20 72 65 63 75 72 73 69 76 65 20 74 61 62 6c  o recursive tabl
222b0 65 3a 20 25 73 22 2c 20 70 43 74 65 2d 3e 7a 4e  e: %s", pCte->zN
222c0 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ame.      );.   
222d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
222e0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
222f0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
22300 6e 52 65 66 3d 3d 31 20 7c 7c 20 28 28 70 53 65  nRef==1 || ((pSe
22310 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 52  l->selFlags&SF_R
22320 65 63 75 72 73 69 76 65 29 20 26 26 20 70 54 61  ecursive) && pTa
22330 62 2d 3e 6e 52 65 66 3d 3d 32 20 29 29 3b 0a 0a  b->nRef==2 ));..
22340 20 20 20 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d      pCte->zErr =
22350 20 22 63 69 72 63 75 6c 61 72 20 72 65 66 65 72   "circular refer
22360 65 6e 63 65 3a 20 25 73 22 3b 0a 20 20 20 20 70  ence: %s";.    p
22370 53 61 76 65 64 57 69 74 68 20 3d 20 70 50 61 72  SavedWith = pPar
22380 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70  se->pWith;.    p
22390 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
223a0 57 69 74 68 3b 0a 20 20 20 20 73 71 6c 69 74 65  With;.    sqlite
223b0 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
223c0 6b 65 72 2c 20 62 4d 61 79 52 65 63 75 72 73 69  ker, bMayRecursi
223d0 76 65 20 3f 20 70 53 65 6c 2d 3e 70 50 72 69 6f  ve ? pSel->pPrio
223e0 72 20 3a 20 70 53 65 6c 29 3b 0a 0a 20 20 20 20  r : pSel);..    
223f0 66 6f 72 28 70 4c 65 66 74 3d 70 53 65 6c 3b 20  for(pLeft=pSel; 
22400 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 3b 20 70  pLeft->pPrior; p
22410 4c 65 66 74 3d 70 4c 65 66 74 2d 3e 70 50 72 69  Left=pLeft->pPri
22420 6f 72 29 3b 0a 20 20 20 20 70 45 4c 69 73 74 20  or);.    pEList 
22430 3d 20 70 4c 65 66 74 2d 3e 70 45 4c 69 73 74 3b  = pLeft->pEList;
22440 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e 70  .    if( pCte->p
22450 43 6f 6c 73 20 29 7b 0a 20 20 20 20 20 20 69 66  Cols ){.      if
22460 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ( pEList->nExpr!
22470 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45  =pCte->pCols->nE
22480 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  xpr ){.        s
22490 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
224a0 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
224b0 20 68 61 73 20 25 64 20 76 61 6c 75 65 73 20 66   has %d values f
224c0 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a  or %d columns",.
224d0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 74 65              pCte
224e0 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73 74 2d  ->zName, pEList-
224f0 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e 70 43  >nExpr, pCte->pC
22500 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20  ols->nExpr.     
22510 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50     );.        pP
22520 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53  arse->pWith = pS
22530 61 76 65 64 57 69 74 68 3b 0a 20 20 20 20 20 20  avedWith;.      
22540 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22550 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
22560 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 43       pEList = pC
22570 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20 20 7d  te->pCols;.    }
22580 0a 0a 20 20 20 20 73 65 6c 65 63 74 43 6f 6c 75  ..    selectColu
22590 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
225a0 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20  pParse, pEList, 
225b0 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54  &pTab->nCol, &pT
225c0 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 69  ab->aCol);.    i
225d0 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65  f( bMayRecursive
225e0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53   ){.      if( pS
225f0 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  el->selFlags & S
22600 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  F_Recursive ){. 
22610 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 45 72         pCte->zEr
22620 72 20 3d 20 22 6d 75 6c 74 69 70 6c 65 20 72 65  r = "multiple re
22630 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
22640 65 73 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d  es: %s";.      }
22650 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
22660 74 65 2d 3e 7a 45 72 72 20 3d 20 22 72 65 63 75  te->zErr = "recu
22670 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20  rsive reference 
22680 69 6e 20 61 20 73 75 62 71 75 65 72 79 3a 20 25  in a subquery: %
22690 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s";.      }.    
226a0 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
226b0 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65  ect(pWalker, pSe
226c0 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  l);.    }.    pC
226d0 74 65 2d 3e 7a 45 72 72 20 3d 20 30 3b 0a 20 20  te->zErr = 0;.  
226e0 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
226f0 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20  = pSavedWith;.  
22700 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
22710 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
22720 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22730 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49  OMIT_CTE./*.** I
22740 66 20 74 68 65 20 53 45 4c 45 43 54 20 70 61 73  f the SELECT pas
22750 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
22760 64 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61  d argument has a
22770 6e 20 61 73 73 6f 63 69 61 74 65 64 20 57 49 54  n associated WIT
22780 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 70 6f  H .** clause, po
22790 70 20 69 74 20 66 72 6f 6d 20 74 68 65 20 73 74  p it from the st
227a0 61 63 6b 20 73 74 6f 72 65 64 20 61 73 20 70 61  ack stored as pa
227b0 72 74 20 6f 66 20 74 68 65 20 50 61 72 73 65 20  rt of the Parse 
227c0 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  object..**.** Th
227d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
227e0 73 65 64 20 61 73 20 74 68 65 20 78 53 65 6c 65  sed as the xSele
227f0 63 74 43 61 6c 6c 62 61 63 6b 32 28 29 20 63 61  ctCallback2() ca
22800 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73 71 6c  llback by.** sql
22810 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
22820 28 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e 67 20  () when walking 
22830 61 20 53 45 4c 45 43 54 20 74 72 65 65 20 74 6f  a SELECT tree to
22840 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65 0a 2a   resolve table.*
22850 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74 68 65  * names and othe
22860 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c  r FROM clause el
22870 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61 74  ements. .*/.stat
22880 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 50 6f  ic void selectPo
22890 70 57 69 74 68 28 57 61 6c 6b 65 72 20 2a 70 57  pWith(Walker *pW
228a0 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
228b0 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
228c0 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
228d0 61 72 73 65 3b 0a 20 20 57 69 74 68 20 2a 70 57  arse;.  With *pW
228e0 69 74 68 20 3d 20 66 69 6e 64 52 69 67 68 74 6d  ith = findRightm
228f0 6f 73 74 28 70 29 2d 3e 70 57 69 74 68 3b 0a 20  ost(p)->pWith;. 
22900 20 69 66 28 20 70 57 69 74 68 21 3d 30 20 29 7b   if( pWith!=0 ){
22910 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
22920 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57 69 74  rse->pWith==pWit
22930 68 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  h );.    pParse-
22940 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 2d 3e  >pWith = pWith->
22950 70 4f 75 74 65 72 3b 0a 20 20 7d 0a 7d 0a 23 65  pOuter;.  }.}.#e
22960 6c 73 65 0a 23 64 65 66 69 6e 65 20 73 65 6c 65  lse.#define sele
22970 63 74 50 6f 70 57 69 74 68 20 30 0a 23 65 6e 64  ctPopWith 0.#end
22980 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
22990 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c 6b  outine is a Walk
229a0 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  er callback for 
229b0 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53 45  "expanding" a SE
229c0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
229d0 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20 6d  ** "Expanding" m
229e0 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20 66  eans to do the f
229f0 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
22a00 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72     (1)  Make sur
22a10 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  e VDBE cursor nu
22a20 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
22a30 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72  assigned to ever
22a40 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65  y.**         ele
22a50 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  ment of the FROM
22a60 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
22a70 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74    (2)  Fill in t
22a80 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d  he pTabList->a[]
22a90 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20  .pTab fields in 
22aa0 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74  the SrcList that
22ab0 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66   .**         def
22ac0 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65  ines FROM clause
22ad0 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70  .  When views ap
22ae0 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
22af0 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20   clause,.**     
22b00 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73      fill pTabLis
22b10 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77  t->a[].pSelect w
22b20 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
22b30 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
22b40 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68  nt.**         th
22b50 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
22b60 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20  e view.  A copy 
22b70 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76  is made of the v
22b80 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20  iew's SELECT.** 
22b90 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e          statemen
22ba0 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  t so that we can
22bb0 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f   freely modify o
22bc0 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74  r delete that st
22bd0 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
22be0 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79     without worry
22bf0 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e  ing about messin
22c00 67 20 75 70 20 74 68 65 20 70 72 65 73 69 73 74  g up the presist
22c10 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ent representati
22c20 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66  on.**         of
22c30 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a   the view..**.**
22c40 20 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72      (3)  Add ter
22c50 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ms to the WHERE 
22c60 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f  clause to accomo
22c70 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c  date the NATURAL
22c80 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20   keyword.**     
22c90 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64      on joins and
22ca0 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e   the ON and USIN
22cb0 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e  G clause of join
22cc0 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20  s..**.**    (4) 
22cd0 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f   Scan the list o
22ce0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
22cf0 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c   result set (pEL
22d00 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20  ist) looking.** 
22d10 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74          for inst
22d20 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22  ances of the "*"
22d30 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65   operator or the
22d40 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f   TABLE.* operato
22d50 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66  r..**         If
22d60 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65   found, expand e
22d70 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76  ach "*" to be ev
22d80 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76  ery column in ev
22d90 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20  ery table.**    
22da0 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a       and TABLE.*
22db0 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
22dc0 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a  umn in TABLE..**
22dd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
22de0 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57 61  electExpander(Wa
22df0 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
22e00 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72  elect *p){.  Par
22e10 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61  se *pParse = pWa
22e20 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
22e30 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53  int i, j, k;.  S
22e40 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
22e50 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
22e60 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
22e70 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
22e80 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  om;.  sqlite3 *d
22e90 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
22ea0 20 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 52 69    Expr *pE, *pRi
22eb0 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75  ght, *pExpr;.  u
22ec0 31 36 20 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d  16 selFlags = p-
22ed0 3e 73 65 6c 46 6c 61 67 73 3b 0a 0a 20 20 70 2d  >selFlags;..  p-
22ee0 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
22ef0 45 78 70 61 6e 64 65 64 3b 0a 20 20 69 66 28 20  Expanded;.  if( 
22f00 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
22f10 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
22f20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20  WRC_Abort;.  }. 
22f30 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 70 53   if( NEVER(p->pS
22f40 72 63 3d 3d 30 29 20 7c 7c 20 28 73 65 6c 46 6c  rc==0) || (selFl
22f50 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65  ags & SF_Expande
22f60 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  d)!=0 ){.    ret
22f70 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
22f80 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20   }.  pTabList = 
22f90 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  p->pSrc;.  pELis
22fa0 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
22fb0 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68   sqlite3WithPush
22fc0 28 70 50 61 72 73 65 2c 20 66 69 6e 64 52 69 67  (pParse, findRig
22fd0 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68  htmost(p)->pWith
22fe0 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  , 0);..  /* Make
22ff0 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d   sure cursor num
23000 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
23010 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65  ssigned to all e
23020 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74  ntries in.  ** t
23030 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
23040 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
23050 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73  tement..  */.  s
23060 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
23070 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
23080 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20  e, pTabList);.. 
23090 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72   /* Look up ever
230a0 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e  y table named in
230b0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
230c0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20   of the select. 
230d0 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72   If.  ** an entr
230e0 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
230f0 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65  ause is a subque
23100 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  ry instead of a 
23110 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20  table or view,. 
23120 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20   ** then create 
23130 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  a transient tabl
23140 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64  e structure to d
23150 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71  escribe the subq
23160 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
23170 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
23180 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
23190 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
231a0 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61  pFrom++){.    Ta
231b0 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 61  ble *pTab;.    a
231c0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73  ssert( pFrom->is
231d0 52 65 63 75 72 73 69 76 65 3d 3d 30 20 7c 7c 20  Recursive==0 || 
231e0 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29 3b 0a 20  pFrom->pTab );. 
231f0 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73     if( pFrom->is
23200 52 65 63 75 72 73 69 76 65 20 29 20 63 6f 6e 74  Recursive ) cont
23210 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 46  inue;.    if( pF
23220 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a  rom->pTab!=0 ){.
23230 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74        /* This st
23240 61 74 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65  atement has alre
23250 61 64 79 20 62 65 65 6e 20 70 72 65 70 61 72 65  ady been prepare
23260 64 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  d.  There is no 
23270 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  need.      ** to
23280 20 67 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a   go further. */.
23290 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d        assert( i=
232a0 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  =0 );.#ifndef SQ
232b0 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
232c0 20 20 20 20 73 65 6c 65 63 74 50 6f 70 57 69 74      selectPopWit
232d0 68 28 70 57 61 6c 6b 65 72 2c 20 70 29 3b 0a 23  h(pWalker, p);.#
232e0 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74 75  endif.      retu
232f0 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
23300 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
23310 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
23320 69 66 28 20 77 69 74 68 45 78 70 61 6e 64 28 70  if( withExpand(p
23330 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 29 20 29  Walker, pFrom) )
23340 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
23350 74 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d  t;.    if( pFrom
23360 2d 3e 70 54 61 62 20 29 20 7b 7d 20 65 6c 73 65  ->pTab ) {} else
23370 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
23380 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20  pFrom->zName==0 
23390 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
233a0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
233b0 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
233c0 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  el = pFrom->pSel
233d0 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20  ect;.      /* A 
233e0 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65  sub-query in the
233f0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
23400 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  a SELECT */.    
23410 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 21 3d    assert( pSel!=
23420 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
23430 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
23440 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
23450 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
23460 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20  lker, pSel);.   
23470 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
23480 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44   pTab = sqlite3D
23490 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
234a0 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a  sizeof(Table));.
234b0 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
234c0 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
234d0 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61 62  bort;.      pTab
234e0 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
234f0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
23500 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
23510 62 2c 20 22 73 71 6c 69 74 65 5f 73 71 5f 25 70  b, "sqlite_sq_%p
23520 22 2c 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b  ", (void*)pTab);
23530 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53  .      while( pS
23540 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53  el->pPrior ){ pS
23550 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f  el = pSel->pPrio
23560 72 3b 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63  r; }.      selec
23570 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  tColumnsFromExpr
23580 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
23590 6c 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62  l->pEList, &pTab
235a0 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61  ->nCol, &pTab->a
235b0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62  Col);.      pTab
235c0 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
235d0 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f      pTab->nRowLo
235e0 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65  gEst = 200; asse
235f0 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33  rt( 200==sqlite3
23600 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20  LogEst(1048576) 
23610 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74  );.      pTab->t
23620 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70  abFlags |= TF_Ep
23630 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a  hemeral;.#endif.
23640 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23650 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20   /* An ordinary 
23660 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61  table or view na
23670 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  me in the FROM c
23680 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61  lause */.      a
23690 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
236a0 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ab==0 );.      p
236b0 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
236c0 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
236d0 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73  eTableItem(pPars
236e0 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20  e, 0, pFrom);.  
236f0 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
23700 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
23710 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  rt;.      if( pT
23720 61 62 2d 3e 6e 52 65 66 3d 3d 30 78 66 66 66 66  ab->nRef==0xffff
23730 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
23740 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
23750 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72 65  se, "too many re
23760 66 65 72 65 6e 63 65 73 20 74 6f 20 5c 22 25 73  ferences to \"%s
23770 5c 22 3a 20 6d 61 78 20 36 35 35 33 35 22 2c 0a  \": max 65535",.
23780 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
23790 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
237a0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 30   pFrom->pTab = 0
237b0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
237c0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
237d0 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e    }.      pTab->
237e0 6e 52 65 66 2b 2b 3b 0a 23 69 66 20 21 64 65 66  nRef++;.#if !def
237f0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
23800 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
23810 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ed (SQLITE_OMIT_
23820 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20  VIRTUALTABLE).  
23830 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53      if( pTab->pS
23840 65 6c 65 63 74 20 7c 7c 20 49 73 56 69 72 74 75  elect || IsVirtu
23850 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
23860 20 20 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20      /* We reach 
23870 68 65 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65  here if the name
23880 64 20 74 61 62 6c 65 20 69 73 20 61 20 72 65 61  d table is a rea
23890 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20  lly a view */.  
238a0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
238b0 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
238c0 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
238d0 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ) ) return WRC_A
238e0 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73  bort;.        as
238f0 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65  sert( pFrom->pSe
23900 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  lect==0 );.     
23910 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63     pFrom->pSelec
23920 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
23930 74 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70  tDup(db, pTab->p
23940 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20  Select, 0);.    
23950 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
23960 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
23970 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  From->pSelect);.
23980 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
23990 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63     }..    /* Loc
239a0 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e 61  ate the index na
239b0 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44 45 58  med by the INDEX
239c0 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69 66  ED BY clause, if
239d0 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28   any. */.    if(
239e0 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42   sqlite3IndexedB
239f0 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20  yLookup(pParse, 
23a00 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20  pFrom) ){.      
23a10 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
23a20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
23a30 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41  * Process NATURA
23a40 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20  L keywords, and 
23a50 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
23a60 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20  uses of joins.. 
23a70 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   */.  if( db->ma
23a80 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73 71  llocFailed || sq
23a90 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28  liteProcessJoin(
23aa0 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20  pParse, p) ){.  
23ab0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
23ac0 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f  rt;.  }..  /* Fo
23ad0 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74  r every "*" that
23ae0 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63   occurs in the c
23af0 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65  olumn list, inse
23b00 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a  rt the names of.
23b10 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73    ** all columns
23b20 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20   in all tables. 
23b30 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54   And for every T
23b40 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68  ABLE.* insert th
23b50 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20  e names.  ** of 
23b60 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54  all columns in T
23b70 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65  ABLE.  The parse
23b80 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65  r inserted a spe
23b90 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a  cial expression.
23ba0 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b    ** with the TK
23bb0 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f  _ALL operator fo
23bc0 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74 20  r each "*" that 
23bd0 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  it found in the 
23be0 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a  column list..  *
23bf0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
23c00 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f  code just has to
23c10 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41   locate the TK_A
23c20 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  LL expressions a
23c30 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65  nd expand.  ** e
23c40 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c  ach one to the l
23c50 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d  ist of all colum
23c60 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73  ns in all tables
23c70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
23c80 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20  first loop just 
23c90 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
23ca0 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22   there are any "
23cb0 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a  *" operators.  *
23cc0 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61  * that need expa
23cd0 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f  nding..  */.  fo
23ce0 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
23cf0 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
23d00 20 20 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61    pE = pEList->a
23d10 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [k].pExpr;.    i
23d20 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  f( pE->op==TK_AL
23d30 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61  L ) break;.    a
23d40 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54  ssert( pE->op!=T
23d50 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69  K_DOT || pE->pRi
23d60 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  ght!=0 );.    as
23d70 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b  sert( pE->op!=TK
23d80 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c 65  _DOT || (pE->pLe
23d90 66 74 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c 65  ft!=0 && pE->pLe
23da0 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20 29  ft->op==TK_ID) )
23db0 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70  ;.    if( pE->op
23dc0 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e  ==TK_DOT && pE->
23dd0 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41  pRight->op==TK_A
23de0 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  LL ) break;.  }.
23df0 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e    if( k<pEList->
23e00 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a  nExpr ){.    /*.
23e10 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74      ** If we get
23e20 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74   here it means t
23e30 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f  he result set co
23e40 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f  ntains one or mo
23e50 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70  re "*".    ** op
23e60 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65  erators that nee
23e70 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64  d to be expanded
23e80 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  .  Loop through 
23e90 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a  each expression.
23ea0 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65      ** in the re
23eb0 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70  sult set and exp
23ec0 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20  and them one by 
23ed0 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  one..    */.    
23ee0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
23ef0 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74  item *a = pEList
23f00 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  ->a;.    ExprLis
23f10 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20  t *pNew = 0;.   
23f20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 50 61   int flags = pPa
23f30 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a  rse->db->flags;.
23f40 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65      int longName
23f50 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c  s = (flags & SQL
23f60 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73  ITE_FullColNames
23f70 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
23f80 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 66             && (f
23f90 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68  lags & SQLITE_Sh
23fa0 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b  ortColNames)==0;
23fb0 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 70 72  ..    /* When pr
23fc0 6f 63 65 73 73 69 6e 67 20 46 52 4f 4d 2d 63 6c  ocessing FROM-cl
23fd0 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73 2c  ause subqueries,
23fe0 20 69 74 20 69 73 20 61 6c 77 61 79 73 20 74 68   it is always th
23ff0 65 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 74 68  e case.    ** th
24000 61 74 20 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e  at full_column_n
24010 61 6d 65 73 3d 4f 46 46 20 61 6e 64 20 73 68 6f  ames=OFF and sho
24020 72 74 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 3d  rt_column_names=
24030 4f 4e 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20  ON.  The.    ** 
24040 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
24050 4f 66 53 65 6c 65 63 74 28 29 20 72 6f 75 74 69  OfSelect() routi
24060 6e 65 20 6d 61 6b 65 73 20 69 74 20 73 6f 2e 20  ne makes it so. 
24070 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
24080 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
24090 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 0a  _NestedFrom)==0.
240a0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 66            || ((f
240b0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
240c0 6c 6c 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 20 26  llColNames)==0 &
240d0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
240e0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
240f0 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d  ShortColNames)!=
24100 30 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6b  0) );..    for(k
24110 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; k<pEList->nE
24120 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  xpr; k++){.     
24130 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72   pE = a[k].pExpr
24140 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d  ;.      pRight =
24150 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20   pE->pRight;.   
24160 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f     assert( pE->o
24170 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69  p!=TK_DOT || pRi
24180 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght!=0 );.      
24190 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41  if( pE->op!=TK_A
241a0 4c 4c 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54  LL && (pE->op!=T
241b0 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d  K_DOT || pRight-
241c0 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a  >op!=TK_ALL) ){.
241d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
241e0 70 61 72 74 69 63 75 6c 61 72 20 65 78 70 72 65  particular expre
241f0 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e  ssion does not n
24200 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64  eed to be expand
24210 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
24220 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
24230 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
24240 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77  end(pParse, pNew
24250 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20  , a[k].pExpr);. 
24260 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20         if( pNew 
24270 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
24280 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
24290 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d  -1].zName = a[k]
242a0 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
242b0 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
242c0 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d  nExpr-1].zSpan =
242d0 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20   a[k].zSpan;.   
242e0 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d         a[k].zNam
242f0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
24300 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b   a[k].zSpan = 0;
24310 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24320 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20     a[k].pExpr = 
24330 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
24340 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
24350 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
24360 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e  "*" or a "TABLE.
24370 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20  *" and needs to 
24380 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78  be.        ** ex
24390 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20  panded. */.     
243a0 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e     int tableSeen
243b0 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65   = 0;      /* Se
243c0 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c  t to 1 when TABL
243d0 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20  E matches */.   
243e0 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d       char *zTNam
243f0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
24400 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20  text of name of 
24410 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20  TABLE */.       
24420 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
24430 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  DOT ){.         
24440 20 61 73 73 65 72 74 28 20 70 45 2d 3e 70 4c 65   assert( pE->pLe
24450 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ft!=0 );.       
24460 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
24470 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2d 3e  HasProperty(pE->
24480 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c  pLeft, EP_IntVal
24490 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ue) );.         
244a0 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c   zTName = pE->pL
244b0 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  eft->u.zToken;. 
244c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
244d0 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
244e0 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
244f0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
24500 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
24510 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
24520 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
24530 62 3b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c  b;.          Sel
24540 65 63 74 20 2a 70 53 75 62 20 3d 20 70 46 72 6f  ect *pSub = pFro
24550 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
24560 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62        char *zTab
24570 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41  Name = pFrom->zA
24580 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lias;.          
24590 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 68  const char *zSch
245a0 65 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  emaName = 0;.   
245b0 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a         int iDb;.
245c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
245d0 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  abName==0 ){.   
245e0 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d           zTabNam
245f0 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  e = pTab->zName;
24600 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
24610 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d         if( db->m
24620 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72  allocFailed ) br
24630 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69  eak;.          i
24640 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20 28 70  f( pSub==0 || (p
24650 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
24660 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d  SF_NestedFrom)==
24670 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
24680 20 70 53 75 62 20 3d 20 30 3b 0a 20 20 20 20 20   pSub = 0;.     
24690 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d         if( zTNam
246a0 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  e && sqlite3StrI
246b0 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62  Cmp(zTName, zTab
246c0 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
246d0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
246e0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
246f0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 44  }.            iD
24700 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
24710 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
24720 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
24730 20 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61           zSchema
24740 4e 61 6d 65 20 3d 20 69 44 62 3e 3d 30 20 3f 20  Name = iDb>=0 ? 
24750 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
24760 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20  me : "*";.      
24770 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
24780 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
24790 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
247a0 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
247b0 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Name = pTab->aCo
247c0 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  l[j].zName;.    
247d0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43          char *zC
247e0 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20  olname;  /* The 
247f0 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20  computed column 
24800 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
24810 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65      char *zToFre
24820 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64  e;   /* Malloced
24830 20 73 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65   string that nee
24840 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a  ds to be freed *
24850 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 6f  /.            To
24860 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f  ken sColname;  /
24870 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d  * Computed colum
24880 6e 20 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65  n name as a toke
24890 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20  n */..          
248a0 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 20    assert( zName 
248b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
248c0 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 70 53 75  f( zTName && pSu
248d0 62 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  b.             &
248e0 26 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70  & sqlite3MatchSp
248f0 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c  anName(pSub->pEL
24900 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c  ist->a[j].zSpan,
24910 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d   0, zTName, 0)==
24920 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b  0.            ){
24930 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
24940 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
24950 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
24960 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75      /* If a colu
24970 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  mn is marked as 
24980 27 68 69 64 64 65 6e 27 20 28 63 75 72 72 65 6e  'hidden' (curren
24990 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c  tly only possibl
249a0 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
249b0 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62   for virtual tab
249c0 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20 69 6e 63  les), do not inc
249d0 6c 75 64 65 20 69 74 20 69 6e 20 74 68 65 20 65  lude it in the e
249e0 78 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20 20  xpanded.        
249f0 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65      ** result-se
24a00 74 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 20 20  t list..        
24a10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
24a20 20 20 20 69 66 28 20 49 73 48 69 64 64 65 6e 43     if( IsHiddenC
24a30 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f  olumn(&pTab->aCo
24a40 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  l[j]) ){.       
24a50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 49 73         assert(Is
24a60 56 69 72 74 75 61 6c 28 70 54 61 62 29 29 3b 0a  Virtual(pTab));.
24a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
24a80 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
24a90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
24aa0 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b    tableSeen = 1;
24ab0 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
24ac0 28 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d  ( i>0 && zTName=
24ad0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
24ae0 20 20 20 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e      if( (pFrom->
24af0 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41  jointype & JT_NA
24b00 54 55 52 41 4c 29 21 3d 30 0a 20 20 20 20 20 20  TURAL)!=0.      
24b10 20 20 20 20 20 20 20 20 20 20 26 26 20 74 61 62            && tab
24b20 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78  leAndColumnIndex
24b30 28 70 54 61 62 4c 69 73 74 2c 20 69 2c 20 7a 4e  (pTabList, i, zN
24b40 61 6d 65 2c 20 30 2c 20 30 29 0a 20 20 20 20 20  ame, 0, 0).     
24b50 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
24b60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
24b70 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e  n a NATURAL join
24b80 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20  , omit the join 
24b90 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65  columns from the
24ba0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
24bb0 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20 74 68    ** table to th
24bc0 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20 6a  e right of the j
24bd0 6f 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  oin */.         
24be0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
24bf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
24c00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
24c10 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  f( sqlite3IdList
24c20 49 6e 64 65 78 28 70 46 72 6f 6d 2d 3e 70 55 73  Index(pFrom->pUs
24c30 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29  ing, zName)>=0 )
24c40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
24c50 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77    /* In a join w
24c60 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75  ith a USING clau
24c70 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73  se, omit columns
24c80 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20   in the.        
24c90 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67          ** using
24ca0 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65   clause from the
24cb0 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69   table on the ri
24cc0 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ght. */.        
24cd0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
24ce0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
24cf0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
24d00 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
24d10 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
24d20 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d  (db, TK_ID, zNam
24d30 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
24d40 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65  zColname = zName
24d50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54  ;.            zT
24d60 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20  oFree = 0;.     
24d70 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e         if( longN
24d80 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74  ames || pTabList
24d90 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20  ->nSrc>1 ){.    
24da0 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
24db0 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20  pLeft;.         
24dc0 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c       pLeft = sql
24dd0 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
24de0 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20  ID, zTabName);. 
24df0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
24e00 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
24e10 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54  r(pParse, TK_DOT
24e20 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
24e30 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
24e40 20 20 20 69 66 28 20 7a 53 63 68 65 6d 61 4e 61     if( zSchemaNa
24e50 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  me ){.          
24e60 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71        pLeft = sq
24e70 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
24e80 5f 49 44 2c 20 7a 53 63 68 65 6d 61 4e 61 6d 65  _ID, zSchemaName
24e90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
24ea0 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74     pExpr = sqlit
24eb0 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
24ec0 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70  TK_DOT, pLeft, p
24ed0 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
24ee0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24ef0 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67          if( long
24f00 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20  Names ){.       
24f10 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d           zColnam
24f20 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
24f30 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20  tf(db, "%s.%s", 
24f40 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  zTabName, zName)
24f50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
24f60 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f 6c    zToFree = zCol
24f70 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  name;.          
24f80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
24f90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
24fa0 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70         pExpr = p
24fb0 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20  Right;.         
24fc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
24fd0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
24fe0 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
24ff0 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70  arse, pNew, pExp
25000 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
25010 73 43 6f 6c 6e 61 6d 65 2e 7a 20 3d 20 7a 43 6f  sColname.z = zCo
25020 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  lname;.         
25030 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 6e 20 3d 20     sColname.n = 
25040 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
25050 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20  zColname);.     
25060 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
25070 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50  prListSetName(pP
25080 61 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f  arse, pNew, &sCo
25090 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  lname, 0);.     
250a0 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20         if( pNew 
250b0 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  && (p->selFlags 
250c0 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29  & SF_NestedFrom)
250d0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
250e0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
250f0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20  List_item *pX = 
25100 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e  &pNew->a[pNew->n
25110 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20  Expr-1];.       
25120 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 20         if( pSub 
25130 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
25140 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73     pX->zSpan = s
25150 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
25160 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d  b, pSub->pEList-
25170 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20  >a[j].zSpan);.  
25180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
25190 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61  stcase( pX->zSpa
251a0 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
251b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
251c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d               pX-
251d0 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33  >zSpan = sqlite3
251e0 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
251f0 25 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20 20  %s.%s",.        
25200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25220 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20     zSchemaName, 
25230 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61  zTabName, zColna
25240 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
25250 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
25260 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20  X->zSpan==0 );. 
25270 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
25280 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d               pX-
25290 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31 3b  >bSpanIsTab = 1;
252a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
252b0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
252c0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f  e3DbFree(db, zTo
252d0 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Free);.         
252e0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
252f0 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53       if( !tableS
25300 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  een ){.         
25310 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20   if( zTName ){. 
25320 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
25330 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
25340 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
25350 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b  e: %s", zTName);
25360 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
25370 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
25380 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
25390 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73  arse, "no tables
253a0 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20   specified");.  
253b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
253c0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
253d0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
253e0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
253f0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e  pEList);.    p->
25400 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20  pEList = pNew;. 
25410 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41   }.#if SQLITE_MA
25420 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70  X_COLUMN.  if( p
25430 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70  ->pEList && p->p
25440 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d  EList->nExpr>db-
25450 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
25460 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a  IMIT_COLUMN] ){.
25470 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
25480 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
25490 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   many columns in
254a0 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20   result set");. 
254b0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
254c0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
254d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20  .}../*.** No-op 
254e0 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20  routine for the 
254f0 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65  parse-tree walke
25500 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  r..**.** When th
25510 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
25520 65 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61  e Walker.xExprCa
25530 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72  llback then expr
25540 65 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20  ession trees.** 
25550 61 72 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f  are walked witho
25560 75 74 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62  ut any actions b
25570 65 69 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61  eing taken at ea
25580 63 68 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d  ch node.  Presum
25590 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68  ably,.** when th
255a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
255b0 65 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45  ed for Walker.xE
255c0 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e  xprCallback then
255d0 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c   .** Walker.xSel
255e0 65 63 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73  ectCallback is s
255f0 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69  et to do somethi
25600 6e 67 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76  ng useful for ev
25610 65 72 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79  ery .** subquery
25620 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 74   in the parser t
25630 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ree..*/.static i
25640 6e 74 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 28  nt exprWalkNoop(
25650 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c  Walker *NotUsed,
25660 20 45 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29   Expr *NotUsed2)
25670 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
25680 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
25690 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
256a0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
256b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
256c0 6f 75 74 69 6e 65 20 22 65 78 70 61 6e 64 73 22  outine "expands"
256d0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
256e0 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69  ent and all of i
256f0 74 73 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  ts subqueries..*
25700 2a 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  * For additional
25710 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
25720 77 68 61 74 20 69 74 20 6d 65 61 6e 73 20 74 6f  what it means to
25730 20 22 65 78 70 61 6e 64 22 20 61 20 53 45 4c 45   "expand" a SELE
25740 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c  CT.** statement,
25750 20 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   see the comment
25760 20 6f 6e 20 74 68 65 20 73 65 6c 65 63 74 45 78   on the selectEx
25770 70 61 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c  pand worker call
25780 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a  back above..**.*
25790 2a 20 45 78 70 61 6e 64 69 6e 67 20 61 20 53 45  * Expanding a SE
257a0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
257b0 73 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70  s the first step
257c0 20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61   in processing a
257d0 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
257e0 6d 65 6e 74 2e 20 20 54 68 65 20 53 45 4c 45 43  ment.  The SELEC
257f0 54 20 73 74 61 74 65 6d 65 6e 74 20 6d 75 73 74  T statement must
25800 20 62 65 20 65 78 70 61 6e 64 65 64 20 62 65 66   be expanded bef
25810 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f  ore.** name reso
25820 6c 75 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72  lution is perfor
25830 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  med..**.** If an
25840 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
25850 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  g, an error mess
25860 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
25870 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54  nto pParse..** T
25880 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
25890 69 6f 6e 20 63 61 6e 20 64 65 74 65 63 74 20 74  ion can detect t
258a0 68 65 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f  he problem by lo
258b0 6f 6b 69 6e 67 20 61 74 20 70 50 61 72 73 65 2d  oking at pParse-
258c0 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20  >nErr.** and/or 
258d0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
258e0 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61  ocFailed..*/.sta
258f0 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
25900 53 65 6c 65 63 74 45 78 70 61 6e 64 28 50 61 72  SelectExpand(Par
25910 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
25920 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
25930 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73  Walker w;.  mems
25940 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&w, 0, sizeof
25950 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43  (w));.  w.xExprC
25960 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57 61  allback = exprWa
25970 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72  lkNoop;.  w.pPar
25980 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69  se = pParse;.  i
25990 66 28 20 70 50 61 72 73 65 2d 3e 68 61 73 43 6f  f( pParse->hasCo
259a0 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 77 2e  mpound ){.    w.
259b0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
259c0 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e  = convertCompoun
259d0 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72  dSelectToSubquer
259e0 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  y;.    sqlite3Wa
259f0 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65  lkSelect(&w, pSe
25a00 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e 78  lect);.  }.  w.x
25a10 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
25a20 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 3b   selectExpander;
25a30 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
25a40 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 50 6f  back2 = selectPo
25a50 70 57 69 74 68 3b 0a 20 20 73 71 6c 69 74 65 33  pWith;.  sqlite3
25a60 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70  WalkSelect(&w, p
25a70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66  Select);.}...#if
25a80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
25a90 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
25aa0 54 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65 72  This is a Walker
25ab0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
25ac0 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68   callback for th
25ad0 65 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  e sqlite3SelectT
25ae0 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74  ypeInfo().** int
25af0 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  erface..**.** Fo
25b00 72 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75  r each FROM-clau
25b10 73 65 20 73 75 62 71 75 65 72 79 2c 20 61 64 64  se subquery, add
25b20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e   Column.zType an
25b30 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a  d Column.zColl.*
25b40 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  * information to
25b50 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
25b60 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73  ture that repres
25b70 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20  ents the result 
25b80 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73  set.** of that s
25b90 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  ubquery..**.** T
25ba0 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
25bb0 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e  re that represen
25bc0 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ts the result se
25bd0 74 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65  t was constructe
25be0 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74 45 78  d.** by selectEx
25bf0 70 61 6e 64 65 72 28 29 20 62 75 74 20 74 68 65  pander() but the
25c00 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74   type and collat
25c10 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ion information 
25c20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61  was omitted.** a
25c30 74 20 74 68 61 74 20 70 6f 69 6e 74 20 62 65 63  t that point bec
25c40 61 75 73 65 20 69 64 65 6e 74 69 66 69 65 72 73  ause identifiers
25c50 20 68 61 64 20 6e 6f 74 20 79 65 74 20 62 65 65   had not yet bee
25c60 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 54 68 69  n resolved.  Thi
25c70 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
25c80 63 61 6c 6c 65 64 20 61 66 74 65 72 20 69 64 65  called after ide
25c90 6e 74 69 66 69 65 72 20 72 65 73 6f 6c 75 74 69  ntifier resoluti
25ca0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
25cb0 69 64 20 73 65 6c 65 63 74 41 64 64 53 75 62 71  id selectAddSubq
25cc0 75 65 72 79 54 79 70 65 49 6e 66 6f 28 57 61 6c  ueryTypeInfo(Wal
25cd0 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
25ce0 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73  lect *p){.  Pars
25cf0 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e 74  e *pParse;.  int
25d00 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   i;.  SrcList *p
25d10 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  TabList;.  struc
25d20 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
25d30 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74  pFrom;..  assert
25d40 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
25d50 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20  SF_Resolved );. 
25d60 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
25d70 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e  s & SF_HasTypeIn
25d80 66 6f 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  fo)==0 ){.    p-
25d90 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
25da0 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 20  HasTypeInfo;.   
25db0 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65   pParse = pWalke
25dc0 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 70  r->pParse;.    p
25dd0 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
25de0 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  c;.    for(i=0, 
25df0 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
25e00 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
25e10 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
25e20 2b 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20  +){.      Table 
25e30 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
25e40 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 41  Tab;.      if( A
25e50 4c 57 41 59 53 28 70 54 61 62 21 3d 30 29 20 26  LWAYS(pTab!=0) &
25e60 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  & (pTab->tabFlag
25e70 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
25e80 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
25e90 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69  /* A sub-query i
25ea0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
25eb0 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f  e of a SELECT */
25ec0 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20  .        Select 
25ed0 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSel = pFrom->p
25ee0 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
25ef0 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20  if( pSel ){.    
25f00 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65        while( pSe
25f10 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c  l->pPrior ) pSel
25f20 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b   = pSel->pPrior;
25f30 0a 20 20 20 20 20 20 20 20 20 20 73 65 6c 65 63  .          selec
25f40 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e  tAddColumnTypeAn
25f50 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73  dCollation(pPars
25f60 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a  e, pTab, pSel);.
25f70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25f80 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  }.    }.  }.}.#e
25f90 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ndif.../*.** Thi
25fa0 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20 64  s routine adds d
25fb0 61 74 61 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c  atatype and coll
25fc0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  ating sequence i
25fd0 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a  nformation to.**
25fe0 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
25ff0 74 75 72 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f  tures of all FRO
26000 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
26010 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45  ies in a.** SELE
26020 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
26030 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 72 6f 75  .** Use this rou
26040 74 69 6e 65 20 61 66 74 65 72 20 6e 61 6d 65 20  tine after name 
26050 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73  resolution..*/.s
26060 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
26070 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49  e3SelectAddTypeI
26080 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73  nfo(Parse *pPars
26090 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  e, Select *pSele
260a0 63 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ct){.#ifndef SQL
260b0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
260c0 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  Y.  Walker w;.  
260d0 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
260e0 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 53  zeof(w));.  w.xS
260f0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d  electCallback2 =
26100 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65   selectAddSubque
26110 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e  ryTypeInfo;.  w.
26120 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
26130 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  exprWalkNoop;.  
26140 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  w.pParse = pPars
26150 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  e;.  sqlite3Walk
26160 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65  Select(&w, pSele
26170 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a  ct);.#endif.}...
26180 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
26190 6e 65 20 73 65 74 73 20 75 70 20 61 20 53 45 4c  ne sets up a SEL
261a0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f  ECT statement fo
261b0 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54  r processing.  T
261c0 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  he.** following 
261d0 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a  is accomplished:
261e0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44  .**.**     *  VD
261f0 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE Cursor number
26200 73 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  s are assigned t
26210 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  o all FROM-claus
26220 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20  e terms..**     
26230 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54 61 62  *  Ephemeral Tab
26240 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63  le objects are c
26250 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 46  reated for all F
26260 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
26270 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20  eries..**     * 
26280 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
26290 61 75 73 65 73 20 61 72 65 20 73 68 69 66 74 65  auses are shifte
262a0 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73 74 61  d into WHERE sta
262b0 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a  tements.**     *
262c0 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a 22 20    Wildcards "*" 
262d0 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e  and "TABLE.*" in
262e0 20 72 65 73 75 6c 74 20 73 65 74 73 20 61 72 65   result sets are
262f0 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20   expanded..**   
26300 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65 72 73    *  Identifiers
26310 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61   in expression a
26320 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20 74 61  re matched to ta
26330 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  bles..**.** This
26340 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 72 65   routine acts re
26350 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c  cursively on all
26360 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68   subqueries with
26370 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a  in the SELECT..*
26380 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
26390 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61 72 73  lectPrep(.  Pars
263a0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
263b0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
263c0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
263d0 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
263e0 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
263f0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
26400 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e  ng coded. */.  N
26410 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74  ameContext *pOut
26420 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  erNC  /* Name co
26430 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74 61 69  ntext for contai
26440 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ner */.){.  sqli
26450 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 4e  te3 *db;.  if( N
26460 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74  EVER(p==0) ) ret
26470 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  urn;.  db = pPar
26480 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62  se->db;.  if( db
26490 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
264a0 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
264b0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
264c0 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72 65  HasTypeInfo ) re
264d0 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53  turn;.  sqlite3S
264e0 65 6c 65 63 74 45 78 70 61 6e 64 28 70 50 61 72  electExpand(pPar
264f0 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 50  se, p);.  if( pP
26500 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
26510 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
26520 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
26530 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e  e3ResolveSelectN
26540 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ames(pParse, p, 
26550 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69 66 28  pOuterNC);.  if(
26560 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
26570 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
26580 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  d ) return;.  sq
26590 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79  lite3SelectAddTy
265a0 70 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  peInfo(pParse, p
265b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65  );.}../*.** Rese
265c0 74 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  t the aggregate 
265d0 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a  accumulator..**.
265e0 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61 74 65  ** The aggregate
265f0 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20   accumulator is 
26600 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20  a set of memory 
26610 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a  cells that hold.
26620 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ** intermediate 
26630 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61  results while ca
26640 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67  lculating an agg
26650 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a  regate.  This.**
26660 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
26670 65 73 20 63 6f 64 65 20 74 68 61 74 20 73 74 6f  es code that sto
26680 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c  res NULLs in all
26690 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79   of those memory
266a0 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74  .** cells..*/.st
266b0 61 74 69 63 20 76 6f 69 64 20 72 65 73 65 74 41  atic void resetA
266c0 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
266d0 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
266e0 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
266f0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
26700 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
26710 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
26720 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a  fo_func *pFunc;.
26730 20 20 69 6e 74 20 6e 52 65 67 20 3d 20 70 41 67    int nReg = pAg
26740 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b 20 70  gInfo->nFunc + p
26750 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
26760 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 30 20  ;.  if( nReg==0 
26770 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 64 65 66  ) return;.#ifdef
26780 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
26790 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 61  /* Verify that a
267a0 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65 67 69 73  ll AggInfo regis
267b0 74 65 72 73 20 61 72 65 20 77 69 74 68 69 6e 20  ters are within 
267c0 74 68 65 20 72 61 6e 67 65 20 73 70 65 63 69 66  the range specif
267d0 69 65 64 20 62 79 0a 20 20 2a 2a 20 41 67 67 49  ied by.  ** AggI
267e0 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67 49 6e  nfo.mnReg..AggIn
267f0 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20 20 61 73  fo.mxReg */.  as
26800 73 65 72 74 28 20 6e 52 65 67 3d 3d 70 41 67 67  sert( nReg==pAgg
26810 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70 41 67 67  Info->mxReg-pAgg
26820 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20 29 3b  Info->mnReg+1 );
26830 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41  .  for(i=0; i<pA
26840 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ggInfo->nColumn;
26850 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
26860 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  t( pAggInfo->aCo
26870 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49  l[i].iMem>=pAggI
26880 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20  nfo->mnReg.     
26890 20 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d      && pAggInfo-
268a0 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d 70  >aCol[i].iMem<=p
268b0 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29  AggInfo->mxReg )
268c0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
268d0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
268e0 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  nc; i++){.    as
268f0 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e  sert( pAggInfo->
26900 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e 3d 70  aFunc[i].iMem>=p
26910 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20  AggInfo->mnReg. 
26920 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67 49          && pAggI
26930 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d  nfo->aFunc[i].iM
26940 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78  em<=pAggInfo->mx
26950 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Reg );.  }.#endi
26960 66 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  f.  sqlite3VdbeA
26970 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp3(v, OP_Null
26980 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d  , 0, pAggInfo->m
26990 6e 52 65 67 2c 20 70 41 67 67 49 6e 66 6f 2d 3e  nReg, pAggInfo->
269a0 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72 28 70 46  mxReg);.  for(pF
269b0 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46  unc=pAggInfo->aF
269c0 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67  unc, i=0; i<pAgg
269d0 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
269e0 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20  , pFunc++){.    
269f0 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74  if( pFunc->iDist
26a00 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  inct>=0 ){.     
26a10 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e   Expr *pE = pFun
26a20 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  c->pExpr;.      
26a30 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
26a40 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f  Property(pE, EP_
26a50 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
26a60 20 20 20 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c      if( pE->x.pL
26a70 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e  ist==0 || pE->x.
26a80 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  pList->nExpr!=1 
26a90 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
26aa0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
26ab0 65 2c 20 22 44 49 53 54 49 4e 43 54 20 61 67 67  e, "DISTINCT agg
26ac0 72 65 67 61 74 65 73 20 6d 75 73 74 20 68 61 76  regates must hav
26ad0 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a  e exactly one ".
26ae0 20 20 20 20 20 20 20 20 20 20 20 22 61 72 67 75             "argu
26af0 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20 20 20 20  ment");.        
26b00 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
26b10 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
26b20 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49  se{.        KeyI
26b30 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
26b40 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
26b50 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e  ist(pParse, pE->
26b60 78 2e 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a  x.pList, 0, 0);.
26b70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
26b80 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
26b90 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
26ba0 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c  Func->iDistinct,
26bb0 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
26bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bd0 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
26be0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
26bf0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
26c00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
26c10 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c   the OP_AggFinal
26c20 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65  ize opcode for e
26c30 76 65 72 79 20 61 67 67 72 65 67 61 74 65 20 66  very aggregate f
26c40 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  unction.** in th
26c50 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74  e AggInfo struct
26c60 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ure..*/.static v
26c70 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46  oid finalizeAggF
26c80 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a  unctions(Parse *
26c90 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
26ca0 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
26cb0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
26cc0 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
26cd0 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
26ce0 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72  _func *pF;.  for
26cf0 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66  (i=0, pF=pAggInf
26d00 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67  o->aFunc; i<pAgg
26d10 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
26d20 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70  , pF++){.    Exp
26d30 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
26d40 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  F->pExpr->x.pLis
26d50 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  t;.    assert( !
26d60 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
26d70 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49  pF->pExpr, EP_xI
26d80 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
26d90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
26da0 34 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c  4(v, OP_AggFinal
26db0 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73  , pF->iMem, pLis
26dc0 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  t ? pList->nExpr
26dd0 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20   : 0, 0,.       
26de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
26df0 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c  void*)pF->pFunc,
26e00 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
26e10 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74  }.}../*.** Updat
26e20 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  e the accumulato
26e30 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66  r memory cells f
26e40 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  or an aggregate 
26e50 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20  based on.** the 
26e60 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
26e70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  osition..*/.stat
26e80 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41 63  ic void updateAc
26e90 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20  cumulator(Parse 
26ea0 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
26eb0 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
26ec0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
26ed0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
26ee0 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20 3d 20  .  int regHit = 
26ef0 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48 69 74  0;.  int addrHit
26f00 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74 72 75  Test = 0;.  stru
26f10 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
26f20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67  *pF;.  struct Ag
26f30 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a  gInfo_col *pC;..
26f40 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65    pAggInfo->dire
26f50 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f  ctMode = 1;.  fo
26f60 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
26f70 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
26f80 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
26f90 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e  +, pF++){.    in
26fa0 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20  t nArg;.    int 
26fb0 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20  addrNext = 0;.  
26fc0 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20    int regAgg;.  
26fd0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
26fe0 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78  t = pF->pExpr->x
26ff0 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65  .pList;.    asse
27000 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
27010 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20  erty(pF->pExpr, 
27020 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
27030 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29  .    if( pList )
27040 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70  {.      nArg = p
27050 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
27060 20 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c 69     regAgg = sqli
27070 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
27080 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20  pParse, nArg);. 
27090 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
270a0 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
270b0 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67 41  rse, pList, regA
270c0 67 67 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  gg, SQLITE_ECEL_
270d0 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  DUP);.    }else{
270e0 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b  .      nArg = 0;
270f0 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20  .      regAgg = 
27100 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
27110 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d   pF->iDistinct>=
27120 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4e  0 ){.      addrN
27130 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ext = sqlite3Vdb
27140 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
27150 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 72       assert( nAr
27160 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 63 6f  g==1 );.      co
27170 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73  deDistinct(pPars
27180 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74  e, pF->iDistinct
27190 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20 72  , addrNext, 1, r
271a0 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20  egAgg);.    }.  
271b0 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d    if( pF->pFunc-
271c0 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
271d0 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c  ITE_FUNC_NEEDCOL
271e0 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  L ){.      CollS
271f0 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20  eq *pColl = 0;. 
27200 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
27210 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
27220 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
27230 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69       assert( pLi
27240 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69  st!=0 );  /* pLi
27250 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75  st!=0 if pF->pFu
27260 6e 63 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20  nc has NEEDCOLL 
27270 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  */.      for(j=0
27280 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
27290 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41  ; !pColl && j<nA
272a0 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rg; j++, pItem++
272b0 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
272c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
272d0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49  llSeq(pParse, pI
272e0 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
272f0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
27300 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
27310 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d   pColl = pParse-
27320 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a  >db->pDfltColl;.
27330 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
27340 28 20 72 65 67 48 69 74 3d 3d 30 20 26 26 20 70  ( regHit==0 && p
27350 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75  AggInfo->nAccumu
27360 6c 61 74 6f 72 20 29 20 72 65 67 48 69 74 20 3d  lator ) regHit =
27370 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
27380 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
27390 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
273a0 6f 6c 6c 53 65 71 2c 20 72 65 67 48 69 74 2c 20  ollSeq, regHit, 
273b0 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43  0, 0, (char *)pC
273c0 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
273d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
273e0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
273f0 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 30 2c 20   OP_AggStep, 0, 
27400 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d  regAgg, pF->iMem
27410 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27420 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
27430 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e  F->pFunc, P4_FUN
27440 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74  CDEF);.    sqlit
27450 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
27460 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20  , (u8)nArg);.   
27470 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
27480 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
27490 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20  pParse, regAgg, 
274a0 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  nArg);.    sqlit
274b0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
274c0 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67  ge(pParse, regAg
274d0 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66  g, nArg);.    if
274e0 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20  ( addrNext ){.  
274f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
27500 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
27510 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20  ddrNext);.      
27520 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
27530 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
27540 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42     }.  }..  /* B
27550 65 66 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e 67  efore populating
27560 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
27570 20 72 65 67 69 73 74 65 72 73 2c 20 63 6c 65 61   registers, clea
27580 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  r the column cac
27590 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69  he..  ** Otherwi
275a0 73 65 2c 20 69 66 20 61 6e 79 20 6f 66 20 74 68  se, if any of th
275b0 65 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75 6d  e required colum
275c0 6e 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c 72  n values are alr
275d0 65 61 64 79 20 70 72 65 73 65 6e 74 20 0a 20 20  eady present .  
275e0 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73 2c  ** in registers,
275f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
27600 28 29 20 6d 61 79 20 75 73 65 20 4f 50 5f 53 43  () may use OP_SC
27610 6f 70 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20  opy to copy the 
27620 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43  value.  ** to pC
27630 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79 20 74  ->iMem. But by t
27640 68 65 20 74 69 6d 65 20 74 68 65 20 76 61 6c 75  he time the valu
27650 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 20 6f  e is used, the o
27660 72 69 67 69 6e 61 6c 20 72 65 67 69 73 74 65 72  riginal register
27670 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 62  .  ** may have b
27680 65 65 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c 69  een used, invali
27690 64 61 74 69 6e 67 20 74 68 65 20 75 6e 64 65 72  dating the under
276a0 6c 79 69 6e 67 20 62 75 66 66 65 72 20 68 6f 6c  lying buffer hol
276b0 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74 65  ding the.  ** te
276c0 78 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65  xt or blob value
276d0 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b 38 38  . See ticket [88
276e0 33 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a  3034dcb5]..  **.
276f0 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c    ** Another sol
27700 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74  ution would be t
27710 6f 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f  o change the OP_
27720 53 43 6f 70 79 20 75 73 65 64 20 74 6f 20 63 6f  SCopy used to co
27730 70 79 20 63 61 63 68 65 64 0a 20 20 2a 2a 20 76  py cached.  ** v
27740 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43  alues to an OP_C
27750 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  opy..  */.  if( 
27760 72 65 67 48 69 74 20 29 7b 0a 20 20 20 20 61 64  regHit ){.    ad
27770 64 72 48 69 74 54 65 73 74 20 3d 20 73 71 6c 69  drHitTest = sqli
27780 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
27790 20 4f 50 5f 49 66 2c 20 72 65 67 48 69 74 29 3b   OP_If, regHit);
277a0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
277b0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
277c0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
277d0 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30  arse);.  for(i=0
277e0 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pC=pAggInfo->a
277f0 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  Col; i<pAggInfo-
27800 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69  >nAccumulator; i
27810 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73  ++, pC++){.    s
27820 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
27830 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72  Parse, pC->pExpr
27840 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d  , pC->iMem);.  }
27850 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
27860 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73  ectMode = 0;.  s
27870 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
27880 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
27890 69 66 28 20 61 64 64 72 48 69 74 54 65 73 74 20  if( addrHitTest 
278a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
278b0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
278c0 64 72 48 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a  drHitTest);.  }.
278d0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73  }../*.** Add a s
278e0 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e  ingle OP_Explain
278f0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
27900 74 68 65 20 56 44 42 45 20 74 6f 20 65 78 70 6c  the VDBE to expl
27910 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20  ain a simple.** 
27920 63 6f 75 6e 74 28 2a 29 20 71 75 65 72 79 20 28  count(*) query (
27930 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
27940 20 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f   FROM pTab")..*/
27950 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
27960 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61  OMIT_EXPLAIN.sta
27970 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
27980 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50  SimpleCount(.  P
27990 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
279a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
279b0 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
279c0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
279d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
279e0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65       /* Table be
279f0 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20  ing queried */. 
27a00 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
27a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20 74   /* Index used t
27a30 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c  o optimize scan,
27a40 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   or NULL */.){. 
27a50 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
27a60 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 69  lain==2 ){.    i
27a70 6e 74 20 62 43 6f 76 65 72 20 3d 20 28 70 49 64  nt bCover = (pId
27a80 78 21 3d 30 20 26 26 20 28 48 61 73 52 6f 77 69  x!=0 && (HasRowi
27a90 64 28 70 54 61 62 29 20 7c 7c 20 21 49 73 50 72  d(pTab) || !IsPr
27aa0 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49  imaryKeyIndex(pI
27ab0 64 78 29 29 29 3b 0a 20 20 20 20 63 68 61 72 20  dx)));.    char 
27ac0 2a 7a 45 71 70 20 3d 20 73 71 6c 69 74 65 33 4d  *zEqp = sqlite3M
27ad0 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64  Printf(pParse->d
27ae0 62 2c 20 22 53 43 41 4e 20 54 41 42 4c 45 20 25  b, "SCAN TABLE %
27af0 73 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20  s%s%s",.        
27b00 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
27b10 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 22 20       bCover ? " 
27b20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49  USING COVERING I
27b30 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a 20 20 20  NDEX " : "",.   
27b40 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 70 49       bCover ? pI
27b50 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20  dx->zName : "". 
27b60 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
27b70 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20  3VdbeAddOp4(.   
27b80 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56 64       pParse->pVd
27b90 62 65 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  be, OP_Explain, 
27ba0 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
27bb0 64 2c 20 30 2c 20 30 2c 20 7a 45 71 70 2c 20 50  d, 0, 0, zEqp, P
27bc0 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20 20 29 3b  4_DYNAMIC.    );
27bd0 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
27be0 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d  efine explainSim
27bf0 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a  pleCount(a,b,c).
27c00 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65  #endif../*.** Ge
27c10 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
27c20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
27c30 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74 68  ment given in th
27c40 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a  e p argument.  .
27c50 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
27c60 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 61  s are returned a
27c70 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
27c80 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63  SelectDest struc
27c90 74 75 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d  ture..** See com
27ca0 6d 65 6e 74 73 20 69 6e 20 73 71 6c 69 74 65 49  ments in sqliteI
27cb0 6e 74 2e 68 20 66 6f 72 20 66 75 72 74 68 65 72  nt.h for further
27cc0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a   information..**
27cd0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
27ce0 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
27cf0 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
27d00 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72  If any errors ar
27d10 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64  e.** encountered
27d20 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70  , then an approp
27d30 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73  riate error mess
27d40 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a  age is left in.*
27d50 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  * pParse->zErrMs
27d60 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  g..**.** This ro
27d70 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66  utine does NOT f
27d80 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73  ree the Select s
27d90 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
27da0 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  in.  The.** call
27db0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65  ing function nee
27dc0 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a  ds to do that..*
27dd0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  /.int sqlite3Sel
27de0 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
27df0 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
27e00 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
27e10 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
27e20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
27e30 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
27e40 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
27e50 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ded. */.  Select
27e60 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
27e70 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
27e80 69 74 68 20 74 68 65 20 71 75 65 72 79 20 72 65  ith the query re
27e90 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
27ea0 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
27eb0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
27ec0 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65  nters */.  Where
27ed0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
27ee0 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d    /* Return from
27ef0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
27f00 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a  in() */.  Vdbe *
27f10 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
27f20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
27f30 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f  machine under co
27f40 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
27f50 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20  int isAgg;      
27f60 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
27f70 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20  or select lists 
27f80 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20  like "count(*)" 
27f90 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
27fa0 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c  EList;      /* L
27fb0 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
27fc0 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20  o extract. */.  
27fd0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
27fe0 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  t;     /* List o
27ff0 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65  f tables to sele
28000 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70  ct from */.  Exp
28010 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
28020 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
28030 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
28040 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
28050 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20  ist *pGroupBy;  
28060 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42    /* The GROUP B
28070 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
28080 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
28090 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20   *pHaving;      
280a0 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47     /* The HAVING
280b0 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
280c0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72   NULL */.  int r
280d0 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  c = 1;          
280e0 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
280f0 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66  turn from this f
28100 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73  unction */.  Dis
28110 74 69 6e 63 74 43 74 78 20 73 44 69 73 74 69 6e  tinctCtx sDistin
28120 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68  ct; /* Info on h
28130 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20 44  ow to code the D
28140 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
28150 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 73 53 6f  */.  SortCtx sSo
28160 72 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  rt;         /* I
28170 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f  nfo on how to co
28180 64 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  de the ORDER BY 
28190 63 6c 61 75 73 65 20 2a 2f 0a 20 20 41 67 67 49  clause */.  AggI
281a0 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20  nfo sAggInfo;   
281b0 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
281c0 6e 20 75 73 65 64 20 62 79 20 61 67 67 72 65 67  n used by aggreg
281d0 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  ate queries */. 
281e0 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20   int iEnd;      
281f0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
28200 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66  ss of the end of
28210 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20   the query */.  
28220 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
28230 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
28240 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
28250 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  n */..#ifndef SQ
28260 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
28270 4e 0a 20 20 69 6e 74 20 69 52 65 73 74 6f 72 65  N.  int iRestore
28280 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73  SelectId = pPars
28290 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b 0a 20 20  e->iSelectId;.  
282a0 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
282b0 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  d = pParse->iNex
282c0 74 53 65 6c 65 63 74 49 64 2b 2b 3b 0a 23 65 6e  tSelectId++;.#en
282d0 64 69 66 0a 0a 20 20 64 62 20 3d 20 70 50 61 72  dif..  db = pPar
282e0 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d  se->db;.  if( p=
282f0 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
28300 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
28310 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65  ->nErr ){.    re
28320 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
28330 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
28340 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
28350 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20  E_SELECT, 0, 0, 
28360 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  0) ) return 1;. 
28370 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66   memset(&sAggInf
28380 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67  o, 0, sizeof(sAg
28390 67 49 6e 66 6f 29 29 3b 0a 0a 20 20 61 73 73 65  gInfo));..  asse
283a0 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
283b0 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  =0 || pDest->eDe
283c0 73 74 21 3d 53 52 54 5f 44 69 73 74 46 69 66 6f  st!=SRT_DistFifo
283d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
283e0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
283f0 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
28400 54 5f 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65  T_Fifo );.  asse
28410 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
28420 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  =0 || pDest->eDe
28430 73 74 21 3d 53 52 54 5f 44 69 73 74 51 75 65 75  st!=SRT_DistQueu
28440 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
28450 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ->pOrderBy==0 ||
28460 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
28470 52 54 5f 51 75 65 75 65 20 29 3b 0a 20 20 69 66  RT_Queue );.  if
28480 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72  ( IgnorableOrder
28490 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20  by(pDest) ){.   
284a0 20 61 73 73 65 72 74 28 70 44 65 73 74 2d 3e 65   assert(pDest->e
284b0 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73 74 73  Dest==SRT_Exists
284c0 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
284d0 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a  ==SRT_Union || .
284e0 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
284f0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 63  ->eDest==SRT_Exc
28500 65 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ept || pDest->eD
28510 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64  est==SRT_Discard
28520 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70   ||.           p
28530 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
28540 5f 51 75 65 75 65 20 20 7c 7c 20 70 44 65 73 74  _Queue  || pDest
28550 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ->eDest==SRT_Dis
28560 74 46 69 66 6f 20 7c 7c 0a 20 20 20 20 20 20 20  tFifo ||.       
28570 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74      pDest->eDest
28580 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20  ==SRT_DistQueue 
28590 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  || pDest->eDest=
285a0 3d 53 52 54 5f 46 69 66 6f 29 3b 0a 20 20 20 20  =SRT_Fifo);.    
285b0 2f 2a 20 49 66 20 4f 52 44 45 52 20 42 59 20 6d  /* If ORDER BY m
285c0 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e  akes no differen
285d0 63 65 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ce in the output
285e0 20 74 68 65 6e 20 6e 65 69 74 68 65 72 20 64 6f   then neither do
285f0 65 73 0a 20 20 20 20 2a 2a 20 44 49 53 54 49 4e  es.    ** DISTIN
28600 43 54 20 73 6f 20 69 74 20 63 61 6e 20 62 65 20  CT so it can be 
28610 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a  removed too. */.
28620 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
28630 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
28640 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
28650 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
28660 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
28670 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74   &= ~SF_Distinct
28680 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
28690 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65  electPrep(pParse
286a0 2c 20 70 2c 20 30 29 3b 0a 20 20 6d 65 6d 73 65  , p, 0);.  memse
286b0 74 28 26 73 53 6f 72 74 2c 20 30 2c 20 73 69 7a  t(&sSort, 0, siz
286c0 65 6f 66 28 73 53 6f 72 74 29 29 3b 0a 20 20 73  eof(sSort));.  s
286d0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
286e0 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70  p->pOrderBy;.  p
286f0 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
28700 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  c;.  pEList = p-
28710 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  >pEList;.  if( p
28720 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
28730 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
28740 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  ){.    goto sele
28750 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 73  ct_end;.  }.  is
28760 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61  Agg = (p->selFla
28770 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
28780 65 29 21 3d 30 3b 0a 20 20 61 73 73 65 72 74 28  e)!=0;.  assert(
28790 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20   pEList!=0 );.. 
287a0 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61   /* Begin genera
287b0 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a  ting code..  */.
287c0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
287d0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
287e0 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20  if( v==0 ) goto 
287f0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f  select_end;..  /
28800 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20  * If writing to 
28810 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61  memory or genera
28820 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20  ting a set.  ** 
28830 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f  only a single co
28840 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70  lumn may be outp
28850 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ut..  */.#ifndef
28860 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
28870 51 55 45 52 59 0a 20 20 69 66 28 20 63 68 65 63  QUERY.  if( chec
28880 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53  kForMultiColumnS
28890 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73  electError(pPars
288a0 65 2c 20 70 44 65 73 74 2c 20 70 45 4c 69 73 74  e, pDest, pEList
288b0 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->nExpr) ){.    
288c0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
288d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
288e0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
288f0 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72  for all sub-quer
28900 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ies in the FROM 
28910 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20  clause.  */.#if 
28920 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
28930 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
28940 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
28950 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66  E_OMIT_VIEW).  f
28960 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69  or(i=0; !p->pPri
28970 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74  or && i<pTabList
28980 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
28990 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
289a0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
289b0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a  pTabList->a[i];.
289c0 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64      SelectDest d
289d0 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  est;.    Select 
289e0 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70  *pSub = pItem->p
289f0 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74 20  Select;.    int 
28a00 69 73 41 67 67 53 75 62 3b 0a 0a 20 20 20 20 69  isAggSub;..    i
28a10 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e  f( pSub==0 ) con
28a20 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53  tinue;..    /* S
28a30 6f 6d 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64  ometimes the cod
28a40 65 20 66 6f 72 20 61 20 73 75 62 71 75 65 72 79  e for a subquery
28a50 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74   will be generat
28a60 65 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20  ed more than.   
28a70 20 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65   ** once, if the
28a80 20 73 75 62 71 75 65 72 79 20 69 73 20 70 61 72   subquery is par
28a90 74 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  t of the WHERE c
28aa0 6c 61 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20  lause in a LEFT 
28ab0 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72  JOIN,.    ** for
28ac0 20 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68   example.  In th
28ad0 61 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20  at case, do not 
28ae0 72 65 67 65 6e 65 72 61 74 65 20 74 68 65 20 63  regenerate the c
28af0 6f 64 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a  ode to manifest.
28b00 20 20 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72      ** a view or
28b10 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20   the co-routine 
28b20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76  to implement a v
28b30 69 65 77 2e 20 20 54 68 65 20 66 69 72 73 74 20  iew.  The first 
28b40 69 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20  instance.    ** 
28b50 69 73 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74  is sufficient, t
28b60 68 6f 75 67 68 20 74 68 65 20 73 75 62 72 6f 75  hough the subrou
28b70 74 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74  tine to manifest
28b80 20 74 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e   the view does n
28b90 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65  eed.    ** to be
28ba0 20 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20   invoked again. 
28bb0 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  */.    if( pItem
28bc0 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b  ->addrFillSub ){
28bd0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
28be0 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 3d 3d  ->viaCoroutine==
28bf0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
28c00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
28c10 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74 65  , OP_Gosub, pIte
28c20 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 49  m->regReturn, pI
28c30 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
28c40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
28c50 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
28c60 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65  ..    /* Increme
28c70 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74  nt Parse.nHeight
28c80 20 62 79 20 74 68 65 20 68 65 69 67 68 74 20 6f   by the height o
28c90 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78  f the largest ex
28ca0 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
28cb0 74 72 65 65 20 72 65 66 65 72 72 65 64 20 74 6f  tree referred to
28cc0 20 62 79 20 74 68 69 73 2c 20 74 68 65 20 70 61   by this, the pa
28cd0 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65  rent select. The
28ce0 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20   child select.  
28cf0 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e    ** may contain
28d00 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
28d10 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20  s of at most.   
28d20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f   ** (SQLITE_MAX_
28d30 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65  EXPR_DEPTH-Parse
28d40 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67 68 74  .nHeight) height
28d50 2e 20 54 68 69 73 20 69 73 20 61 20 62 69 74 0a  . This is a bit.
28d60 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73      ** more cons
28d70 65 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65  ervative than ne
28d80 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63  cessary, but muc
28d90 68 20 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e  h easier than en
28da0 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61  forcing.    ** a
28db0 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20  n exact limit.. 
28dc0 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65     */.    pParse
28dd0 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c  ->nHeight += sql
28de0 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65  ite3SelectExprHe
28df0 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 69 73  ight(p);..    is
28e00 41 67 67 53 75 62 20 3d 20 28 70 53 75 62 2d 3e  AggSub = (pSub->
28e10 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
28e20 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 20  gregate)!=0;.   
28e30 20 69 66 28 20 66 6c 61 74 74 65 6e 53 75 62 71   if( flattenSubq
28e40 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20  uery(pParse, p, 
28e50 69 2c 20 69 73 41 67 67 2c 20 69 73 41 67 67 53  i, isAgg, isAggS
28e60 75 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ub) ){.      /* 
28e70 54 68 69 73 20 73 75 62 71 75 65 72 79 20 63 61  This subquery ca
28e80 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e  n be absorbed in
28e90 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 20 2a  to its parent. *
28ea0 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 41 67  /.      if( isAg
28eb0 67 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  gSub ){.        
28ec0 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20  isAgg = 1;.     
28ed0 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c     p->selFlags |
28ee0 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a  = SF_Aggregate;.
28ef0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20        }.      i 
28f00 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20  = -1;.    }else 
28f10 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  if( pTabList->nS
28f20 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 20  rc==1.          
28f30 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
28f40 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
28f50 54 45 5f 53 75 62 71 43 6f 72 6f 75 74 69 6e 65  TE_SubqCoroutine
28f60 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  ).    ){.      /
28f70 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f  * Implement a co
28f80 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  -routine that wi
28f90 6c 6c 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67  ll return a sing
28fa0 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  le row of the re
28fb0 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65  sult.      ** se
28fc0 74 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61  t on each invoca
28fd0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
28fe0 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70       int addrTop
28ff0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
29000 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a  rrentAddr(v)+1;.
29010 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67        pItem->reg
29020 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
29030 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
29040 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
29050 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
29060 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67  tine, pItem->reg
29070 52 65 74 75 72 6e 2c 20 30 2c 20 61 64 64 72 54  Return, 0, addrT
29080 6f 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  op);.      VdbeC
29090 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
290a0 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
290b0 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 70 49 74  ame));.      pIt
290c0 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
290d0 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20 20 20 20  = addrTop;.     
290e0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
290f0 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
29100 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74  T_Coroutine, pIt
29110 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  em->regReturn);.
29120 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
29130 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69  Integer(pItem->i
29140 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50  SelectId, (u8)pP
29150 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
29160 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tId);.      sqli
29170 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
29180 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a  , pSub, &dest);.
29190 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61        pItem->pTa
291a0 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20  b->nRowLogEst = 
291b0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 53  sqlite3LogEst(pS
291c0 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b  ub->nSelectRow);
291d0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 76 69  .      pItem->vi
291e0 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a  aCoroutine = 1;.
291f0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67        pItem->reg
29200 52 65 73 75 6c 74 20 3d 20 64 65 73 74 2e 69 53  Result = dest.iS
29210 64 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  dst;.      sqlit
29220 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
29230 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c  OP_EndCoroutine,
29240 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
29250 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
29260 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
29270 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20 20 20   addrTop-1);.   
29280 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54     sqlite3ClearT
29290 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72  empRegCache(pPar
292a0 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  se);.    }else{.
292b0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
292c0 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
292d0 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e  hat will fill an
292e0 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
292f0 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 74   with.      ** t
29300 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
29310 69 73 20 73 75 62 71 75 65 72 79 2e 20 20 70 49  is subquery.  pI
29320 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
29330 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20   will point.    
29340 20 20 2a 2a 20 74 6f 20 74 68 65 20 61 64 64 72    ** to the addr
29350 65 73 73 20 6f 66 20 74 68 65 20 67 65 6e 65 72  ess of the gener
29360 61 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 2e  ated subroutine.
29370 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75    pItem->regRetu
29380 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61  rn.      ** is a
29390 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f 63 61   register alloca
293a0 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ted to hold the 
293b0 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72  subroutine retur
293c0 6e 20 61 64 64 72 65 73 73 0a 20 20 20 20 20 20  n address.      
293d0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70  */.      int top
293e0 41 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  Addr;.      int 
293f0 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a 20 20  onceAddr = 0;.  
29400 20 20 20 20 69 6e 74 20 72 65 74 41 64 64 72 3b      int retAddr;
29410 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
29420 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
29430 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49  b==0 );.      pI
29440 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d  tem->regReturn =
29450 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
29460 0a 20 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d  .      topAddr =
29470 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
29480 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
29490 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  , 0, pItem->regR
294a0 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49  eturn);.      pI
294b0 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
294c0 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20   = topAddr+1;.  
294d0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69      if( pItem->i
294e0 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 29  sCorrelated==0 )
294f0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
29500 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
29510 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64 20 61  not correlated a
29520 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  nd if we are not
29530 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20 20   inside of.     
29540 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2c     ** a trigger,
29550 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65   then we only ne
29560 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
29570 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73  e value of the s
29580 75 62 71 75 65 72 79 0a 20 20 20 20 20 20 20 20  ubquery.        
29590 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20  ** once. */.    
295a0 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20 73      onceAddr = s
295b0 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70  qlite3CodeOnce(p
295c0 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65  Parse); VdbeCove
295d0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
295e0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
295f0 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c 22   "materialize \"
29600 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54  %s\"", pItem->pT
29610 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ab->zName));.   
29620 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29630 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
29640 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69  t((v, "materiali
29650 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65  ze \"%s\"", pIte
29660 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
29670 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29680 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
29690 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
296a0 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65 6d  _EphemTab, pItem
296b0 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
296c0 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
296d0 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65  ger(pItem->iSele
296e0 63 74 49 64 2c 20 28 75 38 29 70 50 61 72 73 65  ctId, (u8)pParse
296f0 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
29700 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
29710 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
29720 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20  ub, &dest);.    
29730 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e    pItem->pTab->n
29740 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73 71 6c 69  RowLogEst = sqli
29750 74 65 33 4c 6f 67 45 73 74 28 70 53 75 62 2d 3e  te3LogEst(pSub->
29760 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20  nSelectRow);.   
29770 20 20 20 69 66 28 20 6f 6e 63 65 41 64 64 72 20     if( onceAddr 
29780 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
29790 70 48 65 72 65 28 76 2c 20 6f 6e 63 65 41 64 64  pHere(v, onceAdd
297a0 72 29 3b 0a 20 20 20 20 20 20 72 65 74 41 64 64  r);.      retAdd
297b0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
297c0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
297d0 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  rn, pItem->regRe
297e0 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62  turn);.      Vdb
297f0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e  eComment((v, "en
29800 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54  d %s", pItem->pT
29810 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ab->zName));.   
29820 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
29830 61 6e 67 65 50 31 28 76 2c 20 74 6f 70 41 64 64  angeP1(v, topAdd
29840 72 2c 20 72 65 74 41 64 64 72 29 3b 0a 20 20 20  r, retAddr);.   
29850 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54     sqlite3ClearT
29860 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72  empRegCache(pPar
29870 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  se);.    }.    i
29880 66 28 20 2f 2a 70 50 61 72 73 65 2d 3e 6e 45 72  f( /*pParse->nEr
29890 72 20 7c 7c 2a 2f 20 64 62 2d 3e 6d 61 6c 6c 6f  r ||*/ db->mallo
298a0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
298b0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
298c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
298d0 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73  se->nHeight -= s
298e0 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
298f0 48 65 69 67 68 74 28 70 29 3b 0a 20 20 20 20 70  Height(p);.    p
29900 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
29910 63 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f  c;.    if( !Igno
29920 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65  rableOrderby(pDe
29930 73 74 29 20 29 7b 0a 20 20 20 20 20 20 73 53 6f  st) ){.      sSo
29940 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  rt.pOrderBy = p-
29950 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d  >pOrderBy;.    }
29960 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20  .  }.  pEList = 
29970 70 2d 3e 70 45 4c 69 73 74 3b 0a 23 65 6e 64 69  p->pEList;.#endi
29980 66 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e  f.  pWhere = p->
29990 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70  pWhere;.  pGroup
299a0 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
299b0 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d  ;.  pHaving = p-
299c0 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44 69 73  >pHaving;.  sDis
299d0 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20 28  tinct.isTnct = (
299e0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
299f0 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a  _Distinct)!=0;..
29a00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
29a10 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
29a20 45 43 54 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  ECT.  /* If ther
29a30 65 20 69 73 20 61 72 65 20 61 20 73 65 71 75 65  e is are a seque
29a40 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20  nce of queries, 
29a50 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f  do the earlier o
29a60 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a  nes first..  */.
29a70 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
29a80 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74  ){.    rc = mult
29a90 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  iSelect(pParse, 
29aa0 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 65  p, pDest);.    e
29ab0 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
29ac0 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74  (pParse->iSelect
29ad0 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65  Id, iRestoreSele
29ae0 63 74 49 64 29 3b 0a 20 20 20 20 72 65 74 75 72  ctId);.    retur
29af0 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
29b00 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75  ..  /* If the qu
29b10 65 72 79 20 69 73 20 44 49 53 54 49 4e 43 54 20  ery is DISTINCT 
29b20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  with an ORDER BY
29b30 20 62 75 74 20 69 73 20 6e 6f 74 20 61 6e 20 61   but is not an a
29b40 67 67 72 65 67 61 74 65 2c 20 61 6e 64 20 0a 20  ggregate, and . 
29b50 20 2a 2a 20 69 66 20 74 68 65 20 73 65 6c 65 63   ** if the selec
29b60 74 2d 6c 69 73 74 20 69 73 20 74 68 65 20 73 61  t-list is the sa
29b70 6d 65 20 61 73 20 74 68 65 20 4f 52 44 45 52 20  me as the ORDER 
29b80 42 59 20 6c 69 73 74 2c 20 74 68 65 6e 20 74 68  BY list, then th
29b90 69 73 20 71 75 65 72 79 0a 20 20 2a 2a 20 63 61  is query.  ** ca
29ba0 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e 20 61  n be rewritten a
29bb0 73 20 61 20 47 52 4f 55 50 20 42 59 2e 20 49 6e  s a GROUP BY. In
29bc0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
29bd0 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
29be0 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43    SELECT DISTINC
29bf0 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f  T xyz FROM ... O
29c00 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a  RDER BY xyz.  **
29c10 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f  .  ** is transfo
29c20 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20  rmed to:.  **.  
29c30 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 79  **     SELECT xy
29c40 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50  z FROM ... GROUP
29c50 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a   BY xyz.  **.  *
29c60 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  * The second for
29c70 6d 20 69 73 20 70 72 65 66 65 72 72 65 64 20 61  m is preferred a
29c80 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65 78  s a single index
29c90 20 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c 65 29   (or temp-table)
29ca0 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20 75 73   may be .  ** us
29cb0 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20  ed for both the 
29cc0 4f 52 44 45 52 20 42 59 20 61 6e 64 20 44 49 53  ORDER BY and DIS
29cd0 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69 6e 67  TINCT processing
29ce0 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20  . As originally 
29cf0 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 68  .  ** written th
29d00 65 20 71 75 65 72 79 20 6d 75 73 74 20 75 73 65  e query must use
29d10 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f   a temp-table fo
29d20 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  r at least one o
29d30 66 20 74 68 65 20 4f 52 44 45 52 20 0a 20 20 2a  f the ORDER .  *
29d40 2a 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43  * BY and DISTINC
29d50 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65 78 20  T, and an index 
29d60 6f 72 20 73 65 70 61 72 61 74 65 20 74 65 6d 70  or separate temp
29d70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6f  -table for the o
29d80 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ther..  */.  if(
29d90 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
29da0 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
29db0 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
29dc0 44 69 73 74 69 6e 63 74 20 0a 20 20 20 26 26 20  Distinct .   && 
29dd0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
29de0 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e 70 4f 72  ompare(sSort.pOr
29df0 64 65 72 42 79 2c 20 70 2d 3e 70 45 4c 69 73 74  derBy, p->pEList
29e00 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20  , -1)==0.  ){.  
29e10 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
29e20 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20   ~SF_Distinct;. 
29e30 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d     p->pGroupBy =
29e40 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
29e50 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  Dup(db, p->pELis
29e60 74 2c 20 30 29 3b 0a 20 20 20 20 70 47 72 6f 75  t, 0);.    pGrou
29e70 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
29e80 79 3b 0a 20 20 20 20 73 53 6f 72 74 2e 70 4f 72  y;.    sSort.pOr
29e90 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 2f  derBy = 0;.    /
29ea0 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 65 76  * Notice that ev
29eb0 65 6e 20 74 68 6f 75 67 68 74 20 53 46 5f 44 69  en thought SF_Di
29ec0 73 74 69 6e 63 74 20 68 61 73 20 62 65 65 6e 20  stinct has been 
29ed0 63 6c 65 61 72 65 64 20 66 72 6f 6d 20 70 2d 3e  cleared from p->
29ee0 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20 2a 2a  selFlags,.    **
29ef0 20 74 68 65 20 73 44 69 73 74 69 6e 63 74 2e 69   the sDistinct.i
29f00 73 54 6e 63 74 20 69 73 20 73 74 69 6c 6c 20 73  sTnct is still s
29f10 65 74 2e 20 20 48 65 6e 63 65 2c 20 69 73 54 6e  et.  Hence, isTn
29f20 63 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68  ct represents th
29f30 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 61  e.    ** origina
29f40 6c 20 73 65 74 74 69 6e 67 20 6f 66 20 74 68 65  l setting of the
29f50 20 53 46 5f 44 69 73 74 69 6e 63 74 20 66 6c 61   SF_Distinct fla
29f60 67 2c 20 6e 6f 74 20 74 68 65 20 63 75 72 72 65  g, not the curre
29f70 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20  nt setting */.  
29f80 20 20 61 73 73 65 72 74 28 20 73 44 69 73 74 69    assert( sDisti
29f90 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b 0a 20 20  nct.isTnct );.  
29fa0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
29fb0 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
29fc0 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68 69  clause, then thi
29fd0 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 69  s sorting.  ** i
29fe0 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75  ndex might end u
29ff0 70 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20 69  p being unused i
2a000 66 20 74 68 65 20 64 61 74 61 20 63 61 6e 20 62  f the data can b
2a010 65 20 0a 20 20 2a 2a 20 65 78 74 72 61 63 74 65  e .  ** extracte
2a020 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20  d in pre-sorted 
2a030 6f 72 64 65 72 2e 20 20 49 66 20 74 68 61 74 20  order.  If that 
2a040 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
2a050 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70  n the.  ** OP_Op
2a060 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
2a070 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  ruction will be 
2a080 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50  changed to an OP
2a090 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a 20  _Noop once.  ** 
2a0a0 77 65 20 66 69 67 75 72 65 20 6f 75 74 20 74 68  we figure out th
2a0b0 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  at the sorting i
2a0c0 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e 65 65 64  ndex is not need
2a0d0 65 64 2e 20 20 54 68 65 20 61 64 64 72 53 6f 72  ed.  The addrSor
2a0e0 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61 72 69  tIndex.  ** vari
2a0f0 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20  able is used to 
2a100 66 61 63 69 6c 69 74 61 74 65 20 74 68 61 74 20  facilitate that 
2a110 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  change..  */.  i
2a120 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  f( sSort.pOrderB
2a130 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  y ){.    KeyInfo
2a140 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20   *pKeyInfo;.    
2a150 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
2a160 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
2a170 50 61 72 73 65 2c 20 73 53 6f 72 74 2e 70 4f 72  Parse, sSort.pOr
2a180 64 65 72 42 79 2c 20 30 2c 20 30 29 3b 0a 20 20  derBy, 0, 0);.  
2a190 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73 6f 72    sSort.iECursor
2a1a0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
2a1b0 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64 64  +;.    sSort.add
2a1c0 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20  rSortIndex =.   
2a1d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2a1e0 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
2a1f0 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20  phemeral,.      
2a200 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73      sSort.iECurs
2a210 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  or, sSort.pOrder
2a220 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70 45 4c 69  By->nExpr+1+pELi
2a230 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a 20 20  st->nExpr, 0,.  
2a240 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
2a250 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
2a260 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a 20 20 7d  NFO.      );.  }
2a270 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f 72 74 2e  else{.    sSort.
2a280 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20  addrSortIndex = 
2a290 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  -1;.  }..  /* If
2a2a0 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64   the output is d
2a2b0 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65  estined for a te
2a2c0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f  mporary table, o
2a2d0 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a  pen that table..
2a2e0 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74    */.  if( pDest
2a2f0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ->eDest==SRT_Eph
2a300 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c  emTab ){.    sql
2a310 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2a320 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
2a330 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  al, pDest->iSDPa
2a340 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rm, pEList->nExp
2a350 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  r);.  }..  /* Se
2a360 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20  t the limiter.. 
2a370 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c   */.  iEnd = sql
2a380 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
2a390 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65  l(v);.  p->nSele
2a3a0 63 74 52 6f 77 20 3d 20 4c 41 52 47 45 53 54 5f  ctRow = LARGEST_
2a3b0 49 4e 54 36 34 3b 0a 20 20 63 6f 6d 70 75 74 65  INT64;.  compute
2a3c0 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
2a3d0 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b  Parse, p, iEnd);
2a3e0 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
2a3f0 3d 3d 30 20 26 26 20 73 53 6f 72 74 2e 61 64 64  ==0 && sSort.add
2a400 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b  rSortIndex>=0 ){
2a410 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2a420 47 65 74 4f 70 28 76 2c 20 73 53 6f 72 74 2e 61  GetOp(v, sSort.a
2a430 64 64 72 53 6f 72 74 49 6e 64 65 78 29 2d 3e 6f  ddrSortIndex)->o
2a440 70 63 6f 64 65 20 3d 20 4f 50 5f 53 6f 72 74 65  pcode = OP_Sorte
2a450 72 4f 70 65 6e 3b 0a 20 20 20 20 73 53 6f 72 74  rOpen;.    sSort
2a460 2e 73 6f 72 74 46 6c 61 67 73 20 7c 3d 20 53 4f  .sortFlags |= SO
2a470 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72  RTFLAG_UseSorter
2a480 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  ;.  }..  /* Open
2a490 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78   a virtual index
2a4a0 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
2a4b0 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20  distinct set..  
2a4c0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
2a4d0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
2a4e0 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69  ct ){.    sDisti
2a4f0 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50  nct.tabTnct = pP
2a500 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
2a510 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72    sDistinct.addr
2a520 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Tnct = sqlite3Vd
2a530 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
2a540 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20  penEphemeral,.  
2a550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 44                sD
2a570 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c  istinct.tabTnct,
2a580 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
2a590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5a0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 6b 65         (char*)ke
2a5b0 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
2a5c0 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c  t(pParse, p->pEL
2a5d0 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20 20 20 20  ist,0,0),.      
2a5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5f0 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59            P4_KEY
2a600 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74  INFO);.    sqlit
2a610 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
2a620 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  , BTREE_UNORDERE
2a630 44 29 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63  D);.    sDistinc
2a640 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48  t.eTnctType = WH
2a650 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
2a660 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b  RDERED;.  }else{
2a670 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65  .    sDistinct.e
2a680 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52 45  TnctType = WHERE
2a690 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a  _DISTINCT_NOOP;.
2a6a0 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 41 67    }..  if( !isAg
2a6b0 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30  g && pGroupBy==0
2a6c0 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61 67   ){.    /* No ag
2a6d0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
2a6e0 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42  s and no GROUP B
2a6f0 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  Y clause */.    
2a700 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 3d  u16 wctrlFlags =
2a710 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e   (sDistinct.isTn
2a720 63 74 20 3f 20 57 48 45 52 45 5f 57 41 4e 54 5f  ct ? WHERE_WANT_
2a730 44 49 53 54 49 4e 43 54 20 3a 20 30 29 3b 0a 0a  DISTINCT : 0);..
2a740 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65      /* Begin the
2a750 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 2e 20   database scan. 
2a760 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  */.    pWInfo = 
2a770 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2a780 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
2a790 73 74 2c 20 70 57 68 65 72 65 2c 20 73 53 6f 72  st, pWhere, sSor
2a7a0 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20  t.pOrderBy,.    
2a7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7c0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45             p->pE
2a7d0 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c 61 67 73  List, wctrlFlags
2a7e0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 57  , 0);.    if( pW
2a7f0 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73  Info==0 ) goto s
2a800 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69  elect_end;.    i
2a810 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f  f( sqlite3WhereO
2a820 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57  utputRowCount(pW
2a830 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65  Info) < p->nSele
2a840 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70  ctRow ){.      p
2a850 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
2a860 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75  qlite3WhereOutpu
2a870 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f  tRowCount(pWInfo
2a880 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2a890 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
2a8a0 74 20 26 26 20 73 71 6c 69 74 65 33 57 68 65 72  t && sqlite3Wher
2a8b0 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e  eIsDistinct(pWIn
2a8c0 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 73 44 69  fo) ){.      sDi
2a8d0 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65  stinct.eTnctType
2a8e0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 49   = sqlite3WhereI
2a8f0 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f  sDistinct(pWInfo
2a900 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2a910 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
2a920 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6e  ){.      sSort.n
2a930 4f 42 53 61 74 20 3d 20 73 71 6c 69 74 65 33 57  OBSat = sqlite3W
2a940 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
2a950 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  Info);.      if(
2a960 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d 73   sSort.nOBSat==s
2a970 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e  Sort.pOrderBy->n
2a980 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
2a990 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
2a9a0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
2a9b0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72  }..    /* If sor
2a9c0 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ting index that 
2a9d0 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
2a9e0 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70   prior OP_OpenEp
2a9f0 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20  hemeral .    ** 
2aa00 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65  instruction ende
2aa10 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e  d up not being n
2aa20 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e  eeded, then chan
2aa30 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  ge the OP_OpenEp
2aa40 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69  hemeral.    ** i
2aa50 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a  nto an OP_Noop..
2aa60 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
2aa70 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
2aa80 65 78 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e 70  ex>=0 && sSort.p
2aa90 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
2aaa0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2aab0 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73  hangeToNoop(v, s
2aac0 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
2aad0 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ex);.    }..    
2aae0 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64  /* Use the stand
2aaf0 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20  ard inner loop. 
2ab00 2a 2f 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  */.    selectInn
2ab10 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
2ab20 2c 20 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26 73  , pEList, -1, &s
2ab30 53 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63 74  Sort, &sDistinct
2ab40 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20  , pDest,.       
2ab50 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2ab60 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75  ite3WhereContinu
2ab70 65 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a  eLabel(pWInfo),.
2ab80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab90 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
2aba0 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66  BreakLabel(pWInf
2abb0 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64  o));..    /* End
2abc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
2abd0 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
2abe0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
2abf0 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  End(pWInfo);.  }
2ac00 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69  else{.    /* Thi
2ac10 73 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 72  s case when ther
2ac20 65 20 65 78 69 73 74 20 61 67 67 72 65 67 61 74  e exist aggregat
2ac30 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61  e functions or a
2ac40 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
2ac50 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20  .    ** or both 
2ac60 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  */.    NameConte
2ac70 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61  xt sNC;    /* Na
2ac80 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70  me context for p
2ac90 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67  rocessing aggreg
2aca0 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ate information 
2acb0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d  */.    int iAMem
2acc0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
2acd0 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20  rst Mem address 
2ace0 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72  for storing curr
2acf0 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a  ent GROUP BY */.
2ad00 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20      int iBMem;  
2ad10 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2ad20 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
2ad30 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20   previous GROUP 
2ad40 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55  BY */.    int iU
2ad50 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  seFlag;       /*
2ad60 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c   Mem address hol
2ad70 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61  ding flag indica
2ad80 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61  ting that at lea
2ad90 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  st.             
2ada0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e             ** on
2adb0 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70  e row of the inp
2adc0 75 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  ut to the aggreg
2add0 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20  ator has been.  
2ade0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2adf0 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
2ae00 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41  ed */.    int iA
2ae10 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a  bortFlag;     /*
2ae20 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69   Mem address whi
2ae30 63 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20  ch causes query 
2ae40 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76  abort if positiv
2ae50 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f  e */.    int gro
2ae60 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20  upBySort;    /* 
2ae70 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73  Rows come from s
2ae80 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42  ource in GROUP B
2ae90 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69  Y order */.    i
2aea0 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20  nt addrEnd;     
2aeb0 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f     /* End of pro
2aec0 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73  cessing for this
2aed0 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69   SELECT */.    i
2aee0 6e 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30 3b  nt sortPTab = 0;
2aef0 20 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c     /* Pseudotabl
2af00 65 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64 65  e used to decode
2af10 20 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74 73   sorting results
2af20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74   */.    int sort
2af30 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f  Out = 0;    /* O
2af40 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20 66  utput register f
2af50 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20 2a  rom the sorter *
2af60 2f 0a 20 20 20 20 69 6e 74 20 6f 72 64 65 72 42  /.    int orderB
2af70 79 47 72 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75  yGrp = 0; /* Tru
2af80 65 20 69 66 20 74 68 65 20 47 52 4f 55 50 20 42  e if the GROUP B
2af90 59 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 61  Y and ORDER BY a
2afa0 72 65 20 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a  re the same */..
2afb0 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e      /* Remove an
2afc0 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65  y and all aliase
2afd0 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 72 65  s between the re
2afe0 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65  sult set and the
2aff0 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59  .    ** GROUP BY
2b000 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a   clause..    */.
2b010 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
2b020 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b   ){.      int k;
2b030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b040 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2b050 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
2b060 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
2b070 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f  _item *pItem;  /
2b080 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
2b090 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  er expression in
2b0a0 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20   a list */..    
2b0b0 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73    for(k=p->pELis
2b0c0 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  t->nExpr, pItem=
2b0d0 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e  p->pEList->a; k>
2b0e0 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; k--, pItem++)
2b0f0 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d  {.        pItem-
2b100 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b  >u.x.iAlias = 0;
2b110 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
2b120 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e  or(k=pGroupBy->n
2b130 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f  Expr, pItem=pGro
2b140 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d  upBy->a; k>0; k-
2b150 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
2b160 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e       pItem->u.x.
2b170 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20  iAlias = 0;.    
2b180 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d    }.      if( p-
2b190 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 31 30 30 20  >nSelectRow>100 
2b1a0 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ) p->nSelectRow 
2b1b0 3d 20 31 30 30 3b 0a 20 20 20 20 7d 65 6c 73 65  = 100;.    }else
2b1c0 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65  {.      p->nSele
2b1d0 63 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d  ctRow = 1;.    }
2b1e0 0a 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ...    /* If the
2b1f0 72 65 20 69 73 20 62 6f 74 68 20 61 20 47 52 4f  re is both a GRO
2b200 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52 44  UP BY and an ORD
2b210 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
2b220 20 74 68 65 79 20 61 72 65 0a 20 20 20 20 2a 2a   they are.    **
2b230 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e   identical, then
2b240 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73 69   it may be possi
2b250 62 6c 65 20 74 6f 20 64 69 73 61 62 6c 65 20 74  ble to disable t
2b260 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2b270 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  se .    ** on th
2b280 65 20 67 72 6f 75 6e 64 73 20 74 68 61 74 20 74  e grounds that t
2b290 68 65 20 47 52 4f 55 50 20 42 59 20 77 69 6c 6c  he GROUP BY will
2b2a0 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 20   cause elements 
2b2b0 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20 20 20  to come out .   
2b2c0 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65   ** in the corre
2b2d0 63 74 20 6f 72 64 65 72 2e 20 49 74 20 61 6c 73  ct order. It als
2b2e0 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68 65 20  o may not - the 
2b2f0 47 52 4f 55 50 20 42 59 20 6d 61 79 20 75 73 65  GROUP BY may use
2b300 20 61 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61   a.    ** databa
2b310 73 65 20 69 6e 64 65 78 20 74 68 61 74 20 63 61  se index that ca
2b320 75 73 65 73 20 72 6f 77 73 20 74 6f 20 62 65 20  uses rows to be 
2b330 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72  grouped together
2b340 20 61 73 20 72 65 71 75 69 72 65 64 0a 20 20 20   as required.   
2b350 20 2a 2a 20 62 75 74 20 6e 6f 74 20 61 63 74 75   ** but not actu
2b360 61 6c 6c 79 20 73 6f 72 74 65 64 2e 20 45 69 74  ally sorted. Eit
2b370 68 65 72 20 77 61 79 2c 20 72 65 63 6f 72 64 20  her way, record 
2b380 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68  the fact that th
2b390 65 0a 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42  e.    ** ORDER B
2b3a0 59 20 61 6e 64 20 47 52 4f 55 50 20 42 59 20 63  Y and GROUP BY c
2b3b0 6c 61 75 73 65 73 20 61 72 65 20 74 68 65 20 73  lauses are the s
2b3c0 61 6d 65 20 62 79 20 73 65 74 74 69 6e 67 20 74  ame by setting t
2b3d0 68 65 20 6f 72 64 65 72 42 79 47 72 70 0a 20 20  he orderByGrp.  
2b3e0 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20 20    ** variable.  
2b3f0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
2b400 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
2b410 65 28 70 47 72 6f 75 70 42 79 2c 20 73 53 6f 72  e(pGroupBy, sSor
2b420 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29 3d  t.pOrderBy, -1)=
2b430 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65  =0 ){.      orde
2b440 72 42 79 47 72 70 20 3d 20 31 3b 0a 20 20 20 20  rByGrp = 1;.    
2b450 7d 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  }. .    /* Creat
2b460 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d  e a label to jum
2b470 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e  p to when we wan
2b480 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71  t to abort the q
2b490 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72  uery */.    addr
2b4a0 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
2b4b0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
2b4c0 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54      /* Convert T
2b4d0 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69  K_COLUMN nodes i
2b4e0 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  nto TK_AGG_COLUM
2b4f0 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69  N and make entri
2b500 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67  es in.    ** sAg
2b510 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b  gInfo for all TK
2b520 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f  _AGG_FUNCTION no
2b530 64 65 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f  des in expressio
2b540 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ns of the.    **
2b550 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2b560 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65  t..    */.    me
2b570 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
2b580 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20  zeof(sNC));.    
2b590 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
2b5a0 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72  rse;.    sNC.pSr
2b5b0 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  cList = pTabList
2b5c0 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e  ;.    sNC.pAggIn
2b5d0 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a  fo = &sAggInfo;.
2b5e0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e 52      sAggInfo.mnR
2b5f0 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  eg = pParse->nMe
2b600 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49 6e 66  m+1;.    sAggInf
2b610 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  o.nSortingColumn
2b620 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47   = pGroupBy ? pG
2b630 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 3a 20  roupBy->nExpr : 
2b640 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  0;.    sAggInfo.
2b650 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
2b660 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBy;.    sqlite3
2b670 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
2b680 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29  st(&sNC, pEList)
2b690 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2b6a0 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
2b6b0 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f 72 64  &sNC, sSort.pOrd
2b6c0 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70  erBy);.    if( p
2b6d0 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  Having ){.      
2b6e0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2b6f0 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73 4e  zeAggregates(&sN
2b700 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  C, pHaving);.   
2b710 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e   }.    sAggInfo.
2b720 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73  nAccumulator = s
2b730 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
2b740 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2b750 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20  sAggInfo.nFunc; 
2b760 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
2b770 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2b780 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61 46  erty(sAggInfo.aF
2b790 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50  unc[i].pExpr, EP
2b7a0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
2b7b0 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73       sNC.ncFlags
2b7c0 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63   |= NC_InAggFunc
2b7d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
2b7e0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
2b7f0 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f  t(&sNC, sAggInfo
2b800 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d  .aFunc[i].pExpr-
2b810 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  >x.pList);.     
2b820 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20   sNC.ncFlags &= 
2b830 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20  ~NC_InAggFunc;. 
2b840 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66     }.    sAggInf
2b850 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72 73 65  o.mxReg = pParse
2b860 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20  ->nMem;.    if( 
2b870 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2b880 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
2b890 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63  nd;..    /* Proc
2b8a0 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65  essing for aggre
2b8b0 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55 50  gates with GROUP
2b8c0 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66 66   BY is very diff
2b8d0 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a  erent and.    **
2b8e0 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c   much more compl
2b8f0 65 78 20 74 68 61 6e 20 61 67 67 72 65 67 61 74  ex than aggregat
2b900 65 73 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f  es without a GRO
2b910 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20  UP BY..    */.  
2b920 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
2b930 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  {.      KeyInfo 
2b940 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b  *pKeyInfo;  /* K
2b950 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  eying informatio
2b960 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20  n for the group 
2b970 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  by clause */.   
2b980 20 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20     int j1;      
2b990 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42         /* A-vs-B
2b9a0 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d   comparision jum
2b9b0 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  p */.      int a
2b9c0 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f  ddrOutputRow;  /
2b9d0 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f  * Start of subro
2b9e0 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
2b9f0 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20  ts a result row 
2ba00 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  */.      int reg
2ba10 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20  OutputRow;   /* 
2ba20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72  Return address r
2ba30 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70  egister for outp
2ba40 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ut subroutine */
2ba50 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53  .      int addrS
2ba60 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65  etAbort;   /* Se
2ba70 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67  t the abort flag
2ba80 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20   and return */. 
2ba90 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70       int addrTop
2baa0 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20  OfLoop;  /* Top 
2bab0 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f  of the input loo
2bac0 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  p */.      int a
2bad0 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f  ddrSortingIdx; /
2bae0 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  * The OP_OpenEph
2baf0 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73  emeral for the s
2bb00 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a  orting index */.
2bb10 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 52 65        int addrRe
2bb20 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75 62  set;      /* Sub
2bb30 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65  routine for rese
2bb40 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75  tting the accumu
2bb50 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69  lator */.      i
2bb60 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20 20 20  nt regReset;    
2bb70 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64     /* Return add
2bb80 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
2bb90 72 20 72 65 73 65 74 20 73 75 62 72 6f 75 74 69  r reset subrouti
2bba0 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  ne */..      /* 
2bbb0 49 66 20 74 68 65 72 65 20 69 73 20 61 20 47 52  If there is a GR
2bbc0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 77 65  OUP BY clause we
2bbd0 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f   might need a so
2bbe0 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20  rting index to. 
2bbf0 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e       ** implemen
2bc00 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20  t it.  Allocate 
2bc10 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64  that sorting ind
2bc20 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74  ex now.  If it t
2bc30 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a  urns out.      *
2bc40 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  * that we do not
2bc50 20 6e 65 65 64 20 69 74 20 61 66 74 65 72 20 61   need it after a
2bc60 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74 65  ll, the OP_Sorte
2bc70 72 4f 70 65 6e 20 69 6e 73 74 72 75 63 74 69 6f  rOpen instructio
2bc80 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20  n.      ** will 
2bc90 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
2bca0 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20  o a Noop.  .    
2bcb0 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49    */.      sAggI
2bcc0 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d  nfo.sortingIdx =
2bcd0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
2bce0 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  .      pKeyInfo 
2bcf0 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
2bd00 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47  rList(pParse, pG
2bd10 72 6f 75 70 42 79 2c 20 30 2c 20 30 29 3b 0a 20  roupBy, 0, 0);. 
2bd20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67       addrSorting
2bd30 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Idx = sqlite3Vdb
2bd40 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f  eAddOp4(v, OP_So
2bd50 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20  rterOpen, .     
2bd60 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f       sAggInfo.so
2bd70 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49 6e  rtingIdx, sAggIn
2bd80 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
2bd90 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30 2c  n, .          0,
2bda0 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
2bdb0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a  , P4_KEYINFO);..
2bdc0 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
2bdd0 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  ize memory locat
2bde0 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f  ions used by GRO
2bdf0 55 50 20 42 59 20 61 67 67 72 65 67 61 74 65 20  UP BY aggregate 
2be00 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20  processing.     
2be10 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c   */.      iUseFl
2be20 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ag = ++pParse->n
2be30 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72  Mem;.      iAbor
2be40 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65  tFlag = ++pParse
2be50 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65  ->nMem;.      re
2be60 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70  gOutputRow = ++p
2be70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2be80 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
2be90 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
2bea0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
2beb0 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b 70    regReset = ++p
2bec0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2bed0 20 20 20 61 64 64 72 52 65 73 65 74 20 3d 20 73     addrReset = s
2bee0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
2bef0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 41  bel(v);.      iA
2bf00 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
2bf10 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50  em + 1;.      pP
2bf20 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47  arse->nMem += pG
2bf30 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
2bf40 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61       iBMem = pPa
2bf50 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
2bf60 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
2bf70 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  m += pGroupBy->n
2bf80 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
2bf90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2bfa0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
2bfb0 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20  iAbortFlag);.   
2bfc0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2bfd0 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20  v, "clear abort 
2bfe0 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
2bff0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2c000 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
2c010 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20  0, iUseFlag);.  
2c020 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2c030 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 61 63  (v, "indicate ac
2c040 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22  cumulator empty"
2c050 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
2c060 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2c070 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d  P_Null, 0, iAMem
2c080 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79  , iAMem+pGroupBy
2c090 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20  ->nExpr-1);..   
2c0a0 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f     /* Begin a lo
2c0b0 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74  op that will ext
2c0c0 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20  ract all source 
2c0d0 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59  rows in GROUP BY
2c0e0 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a   order..      **
2c0f0 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f   This might invo
2c100 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74 65  lve two separate
2c110 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f   loops with an O
2c120 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65  P_Sort in betwee
2c130 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69  n, or.      ** i
2c140 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e  t might be a sin
2c150 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73  gle loop that us
2c160 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65  es an index to e
2c170 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69  xtract informati
2c180 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  on.      ** in t
2c190 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20 74  he right order t
2c1a0 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20  o begin with..  
2c1b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
2c1c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2c1d0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52  , OP_Gosub, regR
2c1e0 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29  eset, addrReset)
2c1f0 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d  ;.      pWInfo =
2c200 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2c210 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
2c220 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 47 72  ist, pWhere, pGr
2c230 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20 20 20 20  oupBy, 0,.      
2c240 20 20 20 20 57 48 45 52 45 5f 47 52 4f 55 50 42      WHERE_GROUPB
2c250 59 20 7c 20 28 6f 72 64 65 72 42 79 47 72 70 20  Y | (orderByGrp 
2c260 3f 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52  ? WHERE_SORTBYGR
2c270 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20 20 20 20  OUP : 0), 0.    
2c280 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70    );.      if( p
2c290 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
2c2a0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
2c2b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
2c2c0 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
2c2d0 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79 2d 3e 6e  fo)==pGroupBy->n
2c2e0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
2c2f0 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72  /* The optimizer
2c300 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69   is able to deli
2c310 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75  ver rows in grou
2c320 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20  p by order so.  
2c330 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e        ** we do n
2c340 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e  ot have to sort.
2c350 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68    The OP_OpenEph
2c360 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c  emeral table wil
2c370 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
2c380 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20  cancelled later 
2c390 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c  because we still
2c3a0 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65   need to use the
2c3b0 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20   pKeyInfo.      
2c3c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f    */.        gro
2c3d0 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20  upBySort = 0;.  
2c3e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c3f0 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63     /* Rows are c
2c400 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64  oming out in und
2c410 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e  etermined order.
2c420 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73    We have to pus
2c430 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63  h.        ** eac
2c440 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72  h row into a sor
2c450 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d  ting index, term
2c460 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20  inate the first 
2c470 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a  loop,.        **
2c480 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20   then loop over 
2c490 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
2c4a0 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  x in order to ge
2c4b0 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20  t the output.   
2c4c0 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65       ** in sorte
2c4d0 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20  d order.        
2c4e0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  */.        int r
2c4f0 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20  egBase;.        
2c500 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20  int regRecord;. 
2c510 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b         int nCol;
2c520 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72  .        int nGr
2c530 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20  oupBy;..        
2c540 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
2c550 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
2c560 20 20 20 20 20 20 28 73 44 69 73 74 69 6e 63 74        (sDistinct
2c570 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d 3e 73  .isTnct && (p->s
2c580 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73 74 69  elFlags&SF_Disti
2c590 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20  nct)==0) ?.     
2c5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2c5b0 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47 52 4f  DISTINCT" : "GRO
2c5c0 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20 20 20  UP BY");..      
2c5d0 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20    groupBySort = 
2c5e0 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75  1;.        nGrou
2c5f0 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e  pBy = pGroupBy->
2c600 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e  nExpr;.        n
2c610 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a  Col = nGroupBy;.
2c620 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f          j = nGro
2c630 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f  upBy;.        fo
2c640 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
2c650 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  o.nColumn; i++){
2c660 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
2c670 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e  AggInfo.aCol[i].
2c680 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a  iSorterColumn>=j
2c690 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c6a0 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nCol++;.        
2c6b0 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
2c6c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2c6d0 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d         regBase =
2c6e0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
2c6f0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f  ange(pParse, nCo
2c700 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
2c710 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
2c720 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  r(pParse);.     
2c730 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
2c740 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
2c750 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67  e, pGroupBy, reg
2c760 42 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Base, 0);.      
2c770 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a    j = nGroupBy;.
2c780 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2c790 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   i<sAggInfo.nCol
2c7a0 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
2c7b0 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
2c7c0 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
2c7d0 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69  &sAggInfo.aCol[i
2c7e0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
2c7f0 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
2c800 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20  lumn>=j ){.     
2c810 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
2c820 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20  j + regBase;.   
2c830 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 3b           int r2;
2c840 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 32  ..            r2
2c850 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
2c860 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
2c870 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
2c880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c890 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20      pCol->pTab, 
2c8a0 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70  pCol->iColumn, p
2c8b0 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 2c  Col->iTable, r1,
2c8c0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
2c8d0 20 69 66 28 20 72 31 21 3d 72 32 20 29 7b 0a 20   if( r1!=r2 ){. 
2c8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2c8f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2c900 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c 20  , OP_SCopy, r2, 
2c910 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r1);.           
2c920 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a   }.            j
2c930 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
2c940 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c950 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71    regRecord = sq
2c960 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
2c970 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
2c980 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2c990 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
2c9a0 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  ord, regBase, nC
2c9b0 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  ol, regRecord);.
2c9c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2c9d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2c9e0 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 73 41  SorterInsert, sA
2c9f0 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
2ca00 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  x, regRecord);. 
2ca10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
2ca20 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
2ca30 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  rse, regRecord);
2ca40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2ca50 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
2ca60 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
2ca70 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
2ca80 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
2ca90 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
2caa0 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
2cab0 6e 67 49 64 78 50 54 61 62 20 3d 20 73 6f 72 74  ngIdxPTab = sort
2cac0 50 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  PTab = pParse->n
2cad0 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73  Tab++;.        s
2cae0 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  ortOut = sqlite3
2caf0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
2cb00 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
2cb10 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2cb20 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20   OP_OpenPseudo, 
2cb30 73 6f 72 74 50 54 61 62 2c 20 73 6f 72 74 4f 75  sortPTab, sortOu
2cb40 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  t, nCol);.      
2cb50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2cb60 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
2cb70 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Sort, sAggInfo.s
2cb80 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45  ortingIdx, addrE
2cb90 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  nd);.        Vdb
2cba0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52  eComment((v, "GR
2cbb0 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 20  OUP BY sort")); 
2cbc0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
2cbd0 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66  .        sAggInf
2cbe0 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20  o.useSortingIdx 
2cbf0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 1;.        sql
2cc00 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
2cc10 61 72 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20  ar(pParse);..   
2cc20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
2cc30 66 20 74 68 65 20 69 6e 64 65 78 20 6f 72 20 74  f the index or t
2cc40 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 75  emporary table u
2cc50 73 65 64 20 62 79 20 74 68 65 20 47 52 4f 55 50  sed by the GROUP
2cc60 20 42 59 20 73 6f 72 74 0a 20 20 20 20 20 20 2a   BY sort.      *
2cc70 2a 20 77 69 6c 6c 20 6e 61 74 75 72 61 6c 6c 79  * will naturally
2cc80 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e   deliver rows in
2cc90 20 74 68 65 20 6f 72 64 65 72 20 72 65 71 75 69   the order requi
2cca0 72 65 64 20 62 79 20 74 68 65 20 4f 52 44 45 52  red by the ORDER
2ccb0 20 42 59 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61   BY.      ** cla
2ccc0 75 73 65 2c 20 63 61 6e 63 65 6c 20 74 68 65 20  use, cancel the 
2ccd0 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
2cce0 6f 70 65 6e 20 63 6f 64 65 64 20 65 61 72 6c 69  open coded earli
2ccf0 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  er..      **.   
2cd00 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61 6e     ** This is an
2cd10 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20   optimization - 
2cd20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77  the correct answ
2cd30 65 72 20 73 68 6f 75 6c 64 20 72 65 73 75 6c 74  er should result
2cd40 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20   regardless..   
2cd50 20 20 20 2a 2a 20 55 73 65 20 74 68 65 20 53 51     ** Use the SQ
2cd60 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65  LITE_GroupByOrde
2cd70 72 20 66 6c 61 67 20 77 69 74 68 20 53 51 4c 49  r flag with SQLI
2cd80 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
2cd90 4d 49 5a 45 52 20 74 6f 20 0a 20 20 20 20 20 20  MIZER to .      
2cda0 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 69 73 20  ** disable this 
2cdb0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72  optimization for
2cdc0 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
2cdd0 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  s.  */.      if(
2cde0 20 6f 72 64 65 72 42 79 47 72 70 20 26 26 20 4f   orderByGrp && O
2cdf0 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
2ce00 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 47 72  ed(db, SQLITE_Gr
2ce10 6f 75 70 42 79 4f 72 64 65 72 29 20 0a 20 20 20  oupByOrder) .   
2ce20 20 20 20 20 26 26 20 28 67 72 6f 75 70 42 79 53      && (groupByS
2ce30 6f 72 74 20 7c 7c 20 73 71 6c 69 74 65 33 57 68  ort || sqlite3Wh
2ce40 65 72 65 49 73 53 6f 72 74 65 64 28 70 57 49 6e  ereIsSorted(pWIn
2ce50 66 6f 29 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  fo)).      ){.  
2ce60 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64        sSort.pOrd
2ce70 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
2ce80 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2ce90 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f  ngeToNoop(v, sSo
2cea0 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
2ceb0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
2cec0 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
2ced0 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  e current GROUP 
2cee0 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f  BY terms and sto
2cef0 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32  re in b0, b1, b2
2cf00 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30  ....      ** (b0
2cf10 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74   is memory locat
2cf20 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20  ion iBMem+0, b1 
2cf30 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20  is iBMem+1, and 
2cf40 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20  so forth).      
2cf50 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20  ** Then compare 
2cf60 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
2cf70 50 20 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e  P BY terms again
2cf80 73 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  st the GROUP BY 
2cf90 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66  terms.      ** f
2cfa0 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73  rom the previous
2cfb0 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73   row currently s
2cfc0 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c  tored in a0, a1,
2cfd0 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a   a2....      */.
2cfe0 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c        addrTopOfL
2cff0 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oop = sqlite3Vdb
2d000 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
2d010 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2d020 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
2d030 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rse);.      if( 
2d040 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20  groupBySort ){. 
2d050 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2d060 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
2d070 6f 72 74 65 72 44 61 74 61 2c 20 73 41 67 67 49  orterData, sAggI
2d080 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
2d090 73 6f 72 74 4f 75 74 29 3b 0a 20 20 20 20 20 20  sortOut);.      
2d0a0 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  }.      for(j=0;
2d0b0 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   j<pGroupBy->nEx
2d0c0 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
2d0d0 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72    if( groupBySor
2d0e0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  t ){.          s
2d0f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2d100 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
2d110 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69 42 4d 65  ortPTab, j, iBMe
2d120 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  m+j);.          
2d130 69 66 28 20 6a 3d 3d 30 20 29 20 73 71 6c 69 74  if( j==0 ) sqlit
2d140 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
2d150 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41  , OPFLAG_CLEARCA
2d160 43 48 45 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  CHE);.        }e
2d170 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
2d180 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f  AggInfo.directMo
2d190 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  de = 1;.        
2d1a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
2d1b0 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  e(pParse, pGroup
2d1c0 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20  By->a[j].pExpr, 
2d1d0 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20  iBMem+j);.      
2d1e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2d1f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2d200 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72  Op4(v, OP_Compar
2d210 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c  e, iAMem, iBMem,
2d220 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
2d230 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2d240 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
2d250 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  r*)sqlite3KeyInf
2d260 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20  oRef(pKeyInfo), 
2d270 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
2d280 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56     j1 = sqlite3V
2d290 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2d2a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2d2b0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2d2c0 5f 4a 75 6d 70 2c 20 6a 31 2b 31 2c 20 30 2c 20  _Jump, j1+1, 0, 
2d2d0 6a 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72  j1+1); VdbeCover
2d2e0 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f  age(v);..      /
2d2f0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
2d300 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76  that runs whenev
2d310 65 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  er the GROUP BY 
2d320 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a  changes..      *
2d330 2a 20 43 68 61 6e 67 65 73 20 69 6e 20 74 68 65  * Changes in the
2d340 20 47 52 4f 55 50 20 42 59 20 61 72 65 20 64 65   GROUP BY are de
2d350 74 65 63 74 65 64 20 62 79 20 74 68 65 20 70 72  tected by the pr
2d360 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20  evious code.    
2d370 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20    ** block.  If 
2d380 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68  there were no ch
2d390 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63  anges, this bloc
2d3a0 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20  k is skipped..  
2d3b0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2d3c0 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73  This code copies
2d3d0 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62   current group b
2d3e0 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31  y terms in b0,b1
2d3f0 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  ,b2,....      **
2d400 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61   over to a0,a1,a
2d410 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c  2.  It then call
2d420 73 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62  s the output sub
2d430 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a  routine.      **
2d440 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20   and resets the 
2d450 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
2d460 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 20  lator registers 
2d470 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20  in preparation. 
2d480 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20       ** for the 
2d490 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20 62 61  next GROUP BY ba
2d4a0 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  tch..      */.  
2d4b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2d4c0 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
2d4d0 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70 47  iBMem, iAMem, pG
2d4e0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b 0a  roupBy->nExpr);.
2d4f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2d500 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
2d510 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  sub, regOutputRo
2d520 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  w, addrOutputRow
2d530 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2d540 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74  ment((v, "output
2d550 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20 20   one row"));.   
2d560 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2d570 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp2(v, OP_IfPos
2d580 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64  , iAbortFlag, ad
2d590 64 72 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65  drEnd); VdbeCove
2d5a0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56  rage(v);.      V
2d5b0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2d5c0 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67  check abort flag
2d5d0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
2d5e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2d5f0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73  OP_Gosub, regRes
2d600 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  et, addrReset);.
2d610 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2d620 74 28 28 76 2c 20 22 72 65 73 65 74 20 61 63 63  t((v, "reset acc
2d630 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20  umulator"));..  
2d640 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
2d650 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
2d660 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f  mulators based o
2d670 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
2d680 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75  .      ** the cu
2d690 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20  rrent row.      
2d6a0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2d6b0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2d6c0 6a 31 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74  j1);.      updat
2d6d0 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  eAccumulator(pPa
2d6e0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
2d6f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2d700 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
2d710 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73 65 46  nteger, 1, iUseF
2d720 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
2d730 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64  Comment((v, "ind
2d740 69 63 61 74 65 20 64 61 74 61 20 69 6e 20 61 63  icate data in ac
2d750 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20  cumulator"));.. 
2d760 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74       /* End of t
2d770 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f  he loop.      */
2d780 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70  .      if( group
2d790 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
2d7a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2d7b0 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
2d7c0 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Next, sAggInfo.s
2d7d0 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54  ortingIdx, addrT
2d7e0 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  opOfLoop);.     
2d7f0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
2d800 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  v);.      }else{
2d810 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2d820 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
2d830 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2d840 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
2d850 70 28 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67  p(v, addrSorting
2d860 49 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Idx);.      }.. 
2d870 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74       /* Output t
2d880 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20  he final row of 
2d890 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a  result.      */.
2d8a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2d8b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
2d8c0 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  sub, regOutputRo
2d8d0 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  w, addrOutputRow
2d8e0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2d8f0 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74  ment((v, "output
2d900 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a   final row"));..
2d910 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76        /* Jump ov
2d920 65 72 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  er the subroutin
2d930 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  es.      */.    
2d940 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2d950 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
2d960 30 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20  0, addrEnd);..  
2d970 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
2d980 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
2d990 74 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67  t outputs a sing
2d9a0 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  le row of the re
2d9b0 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65  sult.      ** se
2d9c0 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75 74  t.  This subrout
2d9d0 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20  ine first looks 
2d9e0 61 74 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e  at the iUseFlag.
2d9f0 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20    If iUseFlag.  
2da00 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74      ** is less t
2da10 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
2da20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75  zero, the subrou
2da30 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
2da40 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68    If.      ** th
2da50 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c  e processing cal
2da60 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65 72 79  ls for the query
2da70 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20   to abort, this 
2da80 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20  subroutine.     
2da90 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74   ** increments t
2daa0 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65  he iAbortFlag me
2dab0 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65  mory location be
2dac0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69  fore returning i
2dad0 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72  n.      ** order
2dae0 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63   to signal the c
2daf0 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a  aller to abort..
2db00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
2db10 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71  ddrSetAbort = sq
2db20 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
2db30 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
2db40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2db50 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
2db60 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a  1, iAbortFlag);.
2db70 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2db80 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72 74  t((v, "set abort
2db90 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
2dba0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2dbb0 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
2dbc0 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
2dbd0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2dbe0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
2dbf0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
2dc00 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
2dc10 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
2dc20 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
2dc30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2dc40 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
2dc50 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20  fPos, iUseFlag, 
2dc60 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29  addrOutputRow+2)
2dc70 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
2dc80 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2dc90 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f 75 70 62  ment((v, "Groupb
2dca0 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74  y result generat
2dcb0 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22 29  or entry point")
2dcc0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2dcd0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2dce0 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70  _Return, regOutp
2dcf0 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 66 69  utRow);.      fi
2dd00 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f  nalizeAggFunctio
2dd10 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  ns(pParse, &sAgg
2dd20 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c  Info);.      sql
2dd30 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
2dd40 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c  pParse, pHaving,
2dd50 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31   addrOutputRow+1
2dd60 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
2dd70 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65  ULL);.      sele
2dd80 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
2dd90 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
2dda0 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 0a 20 20  , -1, &sSort,.  
2ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ddc0 20 20 20 20 26 73 44 69 73 74 69 6e 63 74 2c 20      &sDistinct, 
2ddd0 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20  pDest,.         
2dde0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64               add
2ddf0 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64  rOutputRow+1, ad
2de00 64 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20 20  drSetAbort);.   
2de10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2de20 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
2de30 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29  n, regOutputRow)
2de40 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2de50 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f  ent((v, "end gro
2de60 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65  upby result gene
2de70 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20  rator"));..     
2de80 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
2de90 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77  ubroutine that w
2dea0 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67 72  ill reset the gr
2deb0 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74  oup-by accumulat
2dec0 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  or.      */.    
2ded0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
2dee0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
2def0 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72  rReset);.      r
2df00 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
2df10 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
2df20 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
2df30 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2df40 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 73  P_Return, regRes
2df50 65 74 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d  et);.     .    }
2df60 20 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70   /* endif pGroup
2df70 42 79 2e 20 20 42 65 67 69 6e 20 61 67 67 72 65  By.  Begin aggre
2df80 67 61 74 65 20 71 75 65 72 69 65 73 20 77 69 74  gate queries wit
2df90 68 6f 75 74 20 47 52 4f 55 50 20 42 59 3a 20 2a  hout GROUP BY: *
2dfa0 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20  /.    else {.   
2dfb0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 65     ExprList *pDe
2dfc0 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  l = 0;.#ifndef S
2dfd0 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45  QLITE_OMIT_BTREE
2dfe0 43 4f 55 4e 54 0a 20 20 20 20 20 20 54 61 62 6c  COUNT.      Tabl
2dff0 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69  e *pTab;.      i
2e000 66 28 20 28 70 54 61 62 20 3d 20 69 73 53 69 6d  f( (pTab = isSim
2e010 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73 41 67  pleCount(p, &sAg
2e020 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20  gInfo))!=0 ){.  
2e030 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73 53 69        /* If isSi
2e040 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74 75  mpleCount() retu
2e050 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
2e060 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
2e070 72 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20  re, then.       
2e080 20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74   ** the SQL stat
2e090 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20  ement is of the 
2e0a0 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a  form:.        **
2e0b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45  .        **   SE
2e0c0 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
2e0d0 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20  OM <tbl>.       
2e0e0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   **.        ** w
2e0f0 68 65 72 65 20 74 68 65 20 54 61 62 6c 65 20 73  here the Table s
2e100 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65  tructure returne
2e110 64 20 72 65 70 72 65 73 65 6e 74 73 20 74 61 62  d represents tab
2e120 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20  le <tbl>..      
2e130 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2e140 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69  This statement i
2e150 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74  s so common that
2e160 20 69 74 20 69 73 20 6f 70 74 69 6d 69 7a 65 64   it is optimized
2e170 20 73 70 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a   specially. The.
2e180 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f          ** OP_Co
2e190 75 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  unt instruction 
2e1a0 69 73 20 65 78 65 63 75 74 65 64 20 65 69 74 68  is executed eith
2e1b0 65 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79  er on the intkey
2e1c0 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20   table that.    
2e1d0 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
2e1e0 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 61 62  the data for tab
2e1f0 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f  le <tbl> or on o
2e200 6e 65 20 6f 66 20 69 74 73 20 69 6e 64 65 78 65  ne of its indexe
2e210 73 2e 20 49 74 0a 20 20 20 20 20 20 20 20 2a 2a  s. It.        **
2e220 20 69 73 20 62 65 74 74 65 72 20 74 6f 20 65 78   is better to ex
2e230 65 63 75 74 65 20 74 68 65 20 6f 70 20 6f 6e 20  ecute the op on 
2e240 61 6e 20 69 6e 64 65 78 2c 20 61 73 20 69 6e 64  an index, as ind
2e250 65 78 65 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a  exes are almost.
2e260 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79          ** alway
2e270 73 20 73 70 72 65 61 64 20 61 63 72 6f 73 73 20  s spread across 
2e280 6c 65 73 73 20 70 61 67 65 73 20 74 68 61 6e 20  less pages than 
2e290 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e 64  their correspond
2e2a0 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20 20 20  ing tables..    
2e2b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63      */.        c
2e2c0 6f 6e 73 74 20 69 6e 74 20 69 44 62 20 3d 20 73  onst int iDb = s
2e2d0 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
2e2e0 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
2e2f0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
2e300 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e          const in
2e310 74 20 69 43 73 72 20 3d 20 70 50 61 72 73 65 2d  t iCsr = pParse-
2e320 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20  >nTab++;     /* 
2e330 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 62  Cursor to scan b
2e340 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 20  -tree */.       
2e350 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
2e360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e370 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
2e380 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
2e390 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
2e3a0 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20  KeyInfo = 0;    
2e3b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65             /* Ke
2e3c0 79 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65  yinfo for scanne
2e3d0 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  d index */.     
2e3e0 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20     Index *pBest 
2e3f0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2e400 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20          /* Best 
2e410 69 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f 20 66  index found so f
2e420 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  ar */.        in
2e430 74 20 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e  t iRoot = pTab->
2e440 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  tnum;           
2e450 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
2e460 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d 74 72 65  of scanned b-tre
2e470 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73 71  e */..        sq
2e480 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
2e490 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
2e4a0 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
2e4b0 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
2e4c0 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
2e4d0 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
2e4e0 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20 20  Name);..        
2e4f0 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68  /* Search for th
2e500 65 20 69 6e 64 65 78 20 74 68 61 74 20 68 61 73  e index that has
2e510 20 74 68 65 20 6c 6f 77 65 73 74 20 73 63 61 6e   the lowest scan
2e520 20 63 6f 73 74 2e 0a 20 20 20 20 20 20 20 20 2a   cost..        *
2e530 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30  *.        ** (20
2e540 31 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f 74  11-04-15) Do not
2e550 20 64 6f 20 61 20 66 75 6c 6c 20 73 63 61 6e 20   do a full scan 
2e560 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72 65 64 20  of an unordered 
2e570 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a  index..        *
2e580 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30  *.        ** (20
2e590 31 33 2d 31 30 2d 30 33 29 20 44 6f 20 6e 6f 74  13-10-03) Do not
2e5a0 20 63 6f 75 6e 74 20 74 68 65 20 65 6e 74 72 69   count the entri
2e5b0 65 73 20 69 6e 20 61 20 70 61 72 74 69 61 6c 20  es in a partial 
2e5c0 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a  index..        *
2e5d0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  *.        ** In 
2e5e0 70 72 61 63 74 69 63 65 20 74 68 65 20 4b 65 79  practice the Key
2e5f0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 77  Info structure w
2e600 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e  ill not be used.
2e610 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20 20   It is only .   
2e620 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64 20 74       ** passed t
2e630 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52 65  o keep OP_OpenRe
2e640 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20 20 20  ad happy..      
2e650 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
2e660 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
2e670 20 29 20 70 42 65 73 74 20 3d 20 73 71 6c 69 74   ) pBest = sqlit
2e680 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
2e690 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20  x(pTab);.       
2e6a0 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
2e6b0 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
2e6c0 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
2e6d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2e6e0 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d  Idx->bUnordered=
2e6f0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
2e700 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c   pIdx->szIdxRow<
2e710 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 0a 20  pTab->szTabRow. 
2e720 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49 64            && pId
2e730 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  x->pPartIdxWhere
2e740 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  ==0.           &
2e750 26 20 28 21 70 42 65 73 74 20 7c 7c 20 70 49 64  & (!pBest || pId
2e760 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 42 65 73  x->szIdxRow<pBes
2e770 74 2d 3e 73 7a 49 64 78 52 6f 77 29 0a 20 20 20  t->szIdxRow).   
2e780 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2e790 20 20 20 20 20 20 70 42 65 73 74 20 3d 20 70 49        pBest = pI
2e7a0 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  dx;.          }.
2e7b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e7c0 20 20 69 66 28 20 70 42 65 73 74 20 29 7b 0a 20    if( pBest ){. 
2e7d0 20 20 20 20 20 20 20 20 20 69 52 6f 6f 74 20 3d           iRoot =
2e7e0 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20   pBest->tnum;.  
2e7f0 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
2e800 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
2e810 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c  oOfIndex(pParse,
2e820 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 20   pBest);.       
2e830 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   }..        /* O
2e840 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  pen a read-only 
2e850 63 75 72 73 6f 72 2c 20 65 78 65 63 75 74 65 20  cursor, execute 
2e860 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c  the OP_Count, cl
2e870 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e 20  ose the cursor. 
2e880 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
2e890 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
2e8a0 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
2e8b0 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62  iCsr, iRoot, iDb
2e8c0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
2e8d0 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20  ( pKeyInfo ){.  
2e8e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2e8f0 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
2e900 31 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79 49  1, (char *)pKeyI
2e910 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
2e920 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2e930 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2e940 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e  ddOp2(v, OP_Coun
2e950 74 2c 20 69 43 73 72 2c 20 73 41 67 67 49 6e 66  t, iCsr, sAggInf
2e960 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29  o.aFunc[0].iMem)
2e970 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2e980 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2e990 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29 3b 0a  P_Close, iCsr);.
2e9a0 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53          explainS
2e9b0 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61 72 73  impleCount(pPars
2e9c0 65 2c 20 70 54 61 62 2c 20 70 42 65 73 74 29 3b  e, pTab, pBest);
2e9d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
2e9e0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
2e9f0 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f  IT_BTREECOUNT */
2ea00 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
2ea10 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
2ea20 20 71 75 65 72 79 20 69 73 20 6f 66 20 6f 6e 65   query is of one
2ea30 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2ea40 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20 20  g forms:.       
2ea50 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
2ea60 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 46   SELECT min(x) F
2ea70 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20  ROM ....        
2ea80 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28  **   SELECT max(
2ea90 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20  x) FROM ....    
2eaa0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2eab0 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e  * If it is, then
2eac0 20 61 73 6b 20 74 68 65 20 63 6f 64 65 20 69 6e   ask the code in
2ead0 20 77 68 65 72 65 2e 63 20 74 6f 20 61 74 74 65   where.c to atte
2eae0 6d 70 74 20 74 6f 20 73 6f 72 74 20 72 65 73 75  mpt to sort resu
2eaf0 6c 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  lts.        ** a
2eb00 73 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61  s if there was a
2eb10 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f  n "ORDER ON x" o
2eb20 72 20 22 4f 52 44 45 52 20 4f 4e 20 78 20 44 45  r "ORDER ON x DE
2eb30 53 43 22 20 63 6c 61 75 73 65 2e 20 0a 20 20 20  SC" clause. .   
2eb40 20 20 20 20 20 2a 2a 20 49 66 20 77 68 65 72 65       ** If where
2eb50 2e 63 20 69 73 20 61 62 6c 65 20 74 6f 20 70 72  .c is able to pr
2eb60 6f 64 75 63 65 20 72 65 73 75 6c 74 73 20 73 6f  oduce results so
2eb70 72 74 65 64 20 69 6e 20 74 68 69 73 20 6f 72 64  rted in this ord
2eb80 65 72 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20  er, then.       
2eb90 20 2a 2a 20 61 64 64 20 76 64 62 65 20 63 6f 64   ** add vdbe cod
2eba0 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  e to break out o
2ebb0 66 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  f the processing
2ebc0 20 6c 6f 6f 70 20 61 66 74 65 72 20 74 68 65 20   loop after the 
2ebd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73  .        ** firs
2ebe0 74 20 69 74 65 72 61 74 69 6f 6e 20 28 73 69 6e  t iteration (sin
2ebf0 63 65 20 74 68 65 20 66 69 72 73 74 20 69 74 65  ce the first ite
2ec00 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f  ration of the lo
2ec10 6f 70 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a  op is .        *
2ec20 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  * guaranteed to 
2ec30 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 72  operate on the r
2ec40 6f 77 20 77 69 74 68 20 74 68 65 20 6d 69 6e 69  ow with the mini
2ec50 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a  mum or maximum .
2ec60 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65          ** value
2ec70 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20   of x, the only 
2ec80 72 6f 77 20 72 65 71 75 69 72 65 64 29 2e 0a 20  row required).. 
2ec90 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2eca0 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 66    ** A special f
2ecb0 6c 61 67 20 6d 75 73 74 20 62 65 20 70 61 73 73  lag must be pass
2ecc0 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ed to sqlite3Whe
2ecd0 72 65 42 65 67 69 6e 28 29 20 74 6f 20 73 6c 69  reBegin() to sli
2ece0 67 68 74 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a  ghtly.        **
2ecf0 20 6d 6f 64 69 66 79 20 62 65 68 61 76 69 6f 72   modify behavior
2ed00 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
2ed10 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2ed20 2a 2a 20 20 20 2b 20 49 66 20 74 68 65 20 71 75  **   + If the qu
2ed30 65 72 79 20 69 73 20 61 20 22 53 45 4c 45 43 54  ery is a "SELECT
2ed40 20 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e 20 74   min(x)", then t
2ed50 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20 62 79  he loop coded by
2ed60 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
2ed70 77 68 65 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e  where.c should n
2ed80 6f 74 20 69 74 65 72 61 74 65 20 6f 76 65 72 20  ot iterate over 
2ed90 61 6e 79 20 76 61 6c 75 65 73 20 77 69 74 68 20  any values with 
2eda0 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20  a NULL value.   
2edb0 20 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72 20       **     for 
2edc0 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  x..        **.  
2edd0 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68 65        **   + The
2ede0 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65 20   optimizer code 
2edf0 69 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65 20  in where.c (the 
2ee00 74 68 69 6e 67 20 74 68 61 74 20 64 65 63 69 64  thing that decid
2ee10 65 73 20 77 68 69 63 68 0a 20 20 20 20 20 20 20  es which.       
2ee20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 6f 72   **     index or
2ee30 20 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65 29   indices to use)
2ee40 20 73 68 6f 75 6c 64 20 70 6c 61 63 65 20 61 20   should place a 
2ee50 64 69 66 66 65 72 65 6e 74 20 70 72 69 6f 72 69  different priori
2ee60 74 79 20 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a  ty on .        *
2ee70 2a 20 20 20 20 20 73 61 74 69 73 66 79 69 6e 67  *     satisfying
2ee80 20 74 68 65 20 27 4f 52 44 45 52 20 42 59 27 20   the 'ORDER BY' 
2ee90 63 6c 61 75 73 65 20 74 68 61 6e 20 69 74 20 64  clause than it d
2eea0 6f 65 73 20 69 6e 20 6f 74 68 65 72 20 63 61 73  oes in other cas
2eeb0 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  es..        **  
2eec0 20 20 20 52 65 66 65 72 20 74 6f 20 63 6f 64 65     Refer to code
2eed0 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e   and comments in
2eee0 20 77 68 65 72 65 2e 63 20 66 6f 72 20 64 65 74   where.c for det
2eef0 61 69 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ails..        */
2ef00 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
2ef10 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a  t *pMinMax = 0;.
2ef20 20 20 20 20 20 20 20 20 75 38 20 66 6c 61 67 20          u8 flag 
2ef30 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
2ef40 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 20 20  NORMAL;.        
2ef50 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2ef60 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20   p->pGroupBy==0 
2ef70 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2ef80 74 28 20 66 6c 61 67 3d 3d 30 20 29 3b 0a 20 20  t( flag==0 );.  
2ef90 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61        if( p->pHa
2efa0 76 69 6e 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ving==0 ){.     
2efb0 20 20 20 20 20 66 6c 61 67 20 3d 20 6d 69 6e 4d       flag = minM
2efc0 61 78 51 75 65 72 79 28 26 73 41 67 67 49 6e 66  axQuery(&sAggInf
2efd0 6f 2c 20 26 70 4d 69 6e 4d 61 78 29 3b 0a 20 20  o, &pMinMax);.  
2efe0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2eff0 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30 20  assert( flag==0 
2f000 7c 7c 20 28 70 4d 69 6e 4d 61 78 21 3d 30 20 26  || (pMinMax!=0 &
2f010 26 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72  & pMinMax->nExpr
2f020 3d 3d 31 29 20 29 3b 0a 0a 20 20 20 20 20 20 20  ==1) );..       
2f030 20 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20 20   if( flag ){.   
2f040 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d         pMinMax =
2f050 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2f060 44 75 70 28 64 62 2c 20 70 4d 69 6e 4d 61 78 2c  Dup(db, pMinMax,
2f070 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   0);.          p
2f080 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20  Del = pMinMax;. 
2f090 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 69           if( pMi
2f0a0 6e 4d 61 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c  nMax && !db->mal
2f0b0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
2f0c0 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78           pMinMax
2f0d0 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[0].sortOrder
2f0e0 20 3d 20 66 6c 61 67 21 3d 57 48 45 52 45 5f 4f   = flag!=WHERE_O
2f0f0 52 44 45 52 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b  RDERBY_MIN ?1:0;
2f100 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 69  .            pMi
2f110 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  nMax->a[0].pExpr
2f120 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e  ->op = TK_COLUMN
2f130 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2f140 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
2f150 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20     /* This case 
2f160 72 75 6e 73 20 69 66 20 74 68 65 20 61 67 67 72  runs if the aggr
2f170 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f  egate has no GRO
2f180 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54  UP BY clause.  T
2f190 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  he.        ** pr
2f1a0 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68  ocessing is much
2f1b0 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74   simpler since t
2f1c0 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73  here is only a s
2f1d0 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20  ingle row.      
2f1e0 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a    ** of output..
2f1f0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2f200 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61     resetAccumula
2f210 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
2f220 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  gInfo);.        
2f230 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
2f240 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
2f250 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
2f260 65 72 65 2c 20 70 4d 69 6e 4d 61 78 2c 30 2c 66  ere, pMinMax,0,f
2f270 6c 61 67 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  lag,0);.        
2f280 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b  if( pWInfo==0 ){
2f290 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2f2a0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
2f2b0 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20  (db, pDel);.    
2f2c0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
2f2d0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
2f2e0 0a 20 20 20 20 20 20 20 20 75 70 64 61 74 65 41  .        updateA
2f2f0 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
2f300 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
2f310 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2f320 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 70 4d 69  MinMax==0 || pMi
2f330 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  nMax->nExpr==1 )
2f340 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
2f350 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65  lite3WhereIsOrde
2f360 72 65 64 28 70 57 49 6e 66 6f 29 3e 30 20 29 7b  red(pWInfo)>0 ){
2f370 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2f380 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2f390 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 71 6c 69  OP_Goto, 0, sqli
2f3a0 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62  te3WhereBreakLab
2f3b0 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 20 20 20  el(pWInfo));.   
2f3c0 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
2f3d0 6e 74 28 28 76 2c 20 22 25 73 28 29 20 62 79 20  nt((v, "%s() by 
2f3e0 69 6e 64 65 78 22 2c 0a 20 20 20 20 20 20 20 20  index",.        
2f3f0 20 20 20 20 20 20 20 20 28 66 6c 61 67 3d 3d 57          (flag==W
2f400 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
2f410 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b  ?"min":"max")));
2f420 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2f430 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
2f440 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
2f450 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46      finalizeAggF
2f460 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c  unctions(pParse,
2f470 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
2f480 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 53 6f 72     }..      sSor
2f490 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  t.pOrderBy = 0;.
2f4a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2f4b0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
2f4c0 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45 6e   pHaving, addrEn
2f4d0 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  d, SQLITE_JUMPIF
2f4e0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c  NULL);.      sel
2f4f0 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
2f500 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
2f510 74 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 0a 20 20  t, -1, 0, 0, .  
2f520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f530 20 20 20 20 70 44 65 73 74 2c 20 61 64 64 72 45      pDest, addrE
2f540 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  nd, addrEnd);.  
2f550 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
2f560 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  istDelete(db, pD
2f570 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  el);.    }.    s
2f580 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
2f590 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e  eLabel(v, addrEn
2f5a0 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20  d);.    .  } /* 
2f5b0 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65 20  endif aggregate 
2f5c0 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20  query */..  if( 
2f5d0 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
2f5e0 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49  ype==WHERE_DISTI
2f5f0 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 7b  NCT_UNORDERED ){
2f600 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70  .    explainTemp
2f610 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22 44  Table(pParse, "D
2f620 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a  ISTINCT");.  }..
2f630 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
2f640 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
2f650 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65  use, then we nee
2f660 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65  d to sort the re
2f670 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73  sults.  ** and s
2f680 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20  end them to the 
2f690 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20  callback one by 
2f6a0 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  one..  */.  if( 
2f6b0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29  sSort.pOrderBy )
2f6c0 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d  {.    explainTem
2f6d0 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 73  pTable(pParse, s
2f6e0 53 6f 72 74 2e 6e 4f 42 53 61 74 3e 30 20 3f 20  Sort.nOBSat>0 ? 
2f6f0 22 52 49 47 48 54 20 50 41 52 54 20 4f 46 20 4f  "RIGHT PART OF O
2f700 52 44 45 52 20 42 59 22 3a 22 4f 52 44 45 52 20  RDER BY":"ORDER 
2f710 42 59 22 29 3b 0a 20 20 20 20 67 65 6e 65 72 61  BY");.    genera
2f720 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73  teSortTail(pPars
2f730 65 2c 20 70 2c 20 26 73 53 6f 72 74 2c 20 70 45  e, p, &sSort, pE
2f740 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65  List->nExpr, pDe
2f750 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a  st);.  }..  /* J
2f760 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
2f770 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2f   this query.  */
2f780 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
2f790 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 45  solveLabel(v, iE
2f7a0 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53  nd);..  /* The S
2f7b0 45 4c 45 43 54 20 77 61 73 20 73 75 63 63 65 73  ELECT was succes
2f7c0 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20  sfully coded.   
2f7d0 53 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63  Set the return c
2f7e0 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f  ode to 0.  ** to
2f7f0 20 69 6e 64 69 63 61 74 65 20 6e 6f 20 65 72 72   indicate no err
2f800 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ors..  */.  rc =
2f810 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f   0;..  /* Contro
2f820 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20  l jumps to here 
2f830 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  if an error is e
2f840 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65  ncountered above
2f850 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73  , or upon.  ** s
2f860 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67  uccessful coding
2f870 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a   of the SELECT..
2f880 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a    */.select_end:
2f890 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74  .  explainSetInt
2f8a0 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65  eger(pParse->iSe
2f8b0 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65  lectId, iRestore
2f8c0 53 65 6c 65 63 74 49 64 29 3b 0a 0a 20 20 2f 2a  SelectId);..  /*
2f8d0 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e   Identify column
2f8e0 20 6e 61 6d 65 73 20 69 66 20 72 65 73 75 6c 74   names if result
2f8f0 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  s of the SELECT 
2f900 61 72 65 20 74 6f 20 62 65 20 6f 75 74 70 75 74  are to be output
2f910 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
2f920 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44  =SQLITE_OK && pD
2f930 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2f940 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65  Output ){.    ge
2f950 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
2f960 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
2f970 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  st, pEList);.  }
2f980 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ..  sqlite3DbFre
2f990 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61  e(db, sAggInfo.a
2f9a0 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Col);.  sqlite3D
2f9b0 62 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e  bFree(db, sAggIn
2f9c0 66 6f 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65 74  fo.aFunc);.  ret
2f9d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64  urn rc;.}..#if d
2f9e0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
2f9f0 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49  ABLE_TREE_EXPLAI
2fa00 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  N)./*.** Generat
2fa10 65 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  e a human-readab
2fa20 6c 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f  le description o
2fa30 66 20 61 20 74 68 65 20 53 65 6c 65 63 74 20 6f  f a the Select o
2fa40 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
2fa50 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 4f 6e 65   void explainOne
2fa60 53 65 6c 65 63 74 28 56 64 62 65 20 2a 70 56 64  Select(Vdbe *pVd
2fa70 62 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  be, Select *p){.
2fa80 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2fa90 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 53  Printf(pVdbe, "S
2faa0 45 4c 45 43 54 20 22 29 3b 0a 20 20 69 66 28 20  ELECT ");.  if( 
2fab0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  p->selFlags & (S
2fac0 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
2fad0 67 72 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20  gregate) ){.    
2fae0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
2faf0 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 7b  & SF_Distinct ){
2fb00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2fb10 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
2fb20 65 2c 20 22 44 49 53 54 49 4e 43 54 20 22 29 3b  e, "DISTINCT ");
2fb30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2fb40 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2fb50 41 67 67 72 65 67 61 74 65 20 29 7b 0a 20 20 20  Aggregate ){.   
2fb60 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2fb70 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2fb80 61 67 67 5f 66 6c 61 67 20 22 29 3b 0a 20 20 20  agg_flag ");.   
2fb90 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
2fba0 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a  plainNL(pVdbe);.
2fbb0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2fbc0 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
2fbd0 22 20 20 20 22 29 3b 0a 20 20 7d 0a 20 20 73 71  "   ");.  }.  sq
2fbe0 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
2fbf0 4c 69 73 74 28 70 56 64 62 65 2c 20 70 2d 3e 70  List(pVdbe, p->p
2fc00 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  EList);.  sqlite
2fc10 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65  3ExplainNL(pVdbe
2fc20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63  );.  if( p->pSrc
2fc30 20 26 26 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72   && p->pSrc->nSr
2fc40 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  c ){.    int i;.
2fc50 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2fc60 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
2fc70 22 46 52 4f 4d 20 22 29 3b 0a 20 20 20 20 73 71  "FROM ");.    sq
2fc80 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68  lite3ExplainPush
2fc90 28 70 56 64 62 65 29 3b 0a 20 20 20 20 66 6f 72  (pVdbe);.    for
2fca0 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d  (i=0; i<p->pSrc-
2fcb0 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
2fcc0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
2fcd0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
2fce0 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a  &p->pSrc->a[i];.
2fcf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2fd00 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
2fd10 2c 20 22 7b 25 64 2c 2a 7d 20 3d 20 22 2c 20 70  , "{%d,*} = ", p
2fd20 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
2fd30 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
2fd40 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
2fd50 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2fd60 69 6e 53 65 6c 65 63 74 28 70 56 64 62 65 2c 20  inSelect(pVdbe, 
2fd70 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pItem->pSelect);
2fd80 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
2fd90 65 6d 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20 20  em->pTab ){.    
2fda0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2fdb0 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
2fdc0 2c 20 22 20 28 74 61 62 6e 61 6d 65 3d 25 73 29  , " (tabname=%s)
2fdd0 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
2fde0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
2fdf0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
2fe00 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29  ( pItem->zName )
2fe10 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2fe20 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
2fe30 56 64 62 65 2c 20 22 25 73 22 2c 20 70 49 74 65  Vdbe, "%s", pIte
2fe40 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  m->zName);.     
2fe50 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74   }.      if( pIt
2fe60 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20  em->zAlias ){.  
2fe70 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2fe80 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
2fe90 2c 20 22 20 28 41 53 20 25 73 29 22 2c 20 70 49  , " (AS %s)", pI
2fea0 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
2feb0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2fec0 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20  pItem->jointype 
2fed0 26 20 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20  & JT_LEFT ){.   
2fee0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
2fef0 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2ff00 20 22 20 4c 45 46 54 2d 4a 4f 49 4e 22 29 3b 0a   " LEFT-JOIN");.
2ff10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
2ff20 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70  lite3ExplainNL(p
2ff30 56 64 62 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Vdbe);.    }.   
2ff40 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2ff50 6f 70 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20  op(pVdbe);.  }. 
2ff60 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29   if( p->pWhere )
2ff70 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
2ff80 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
2ff90 2c 20 22 57 48 45 52 45 20 22 29 3b 0a 20 20 20  , "WHERE ");.   
2ffa0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
2ffb0 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70 57  xpr(pVdbe, p->pW
2ffc0 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  here);.    sqlit
2ffd0 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62  e3ExplainNL(pVdb
2ffe0 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  e);.  }.  if( p-
2fff0 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20  >pGroupBy ){.   
30000 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
30010 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 47 52  rintf(pVdbe, "GR
30020 4f 55 50 42 59 20 22 29 3b 0a 20 20 20 20 73 71  OUPBY ");.    sq
30030 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
30040 4c 69 73 74 28 70 56 64 62 65 2c 20 70 2d 3e 70  List(pVdbe, p->p
30050 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71  GroupBy);.    sq
30060 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70  lite3ExplainNL(p
30070 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Vdbe);.  }.  if(
30080 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20   p->pHaving ){. 
30090 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
300a0 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
300b0 48 41 56 49 4e 47 20 22 29 3b 0a 20 20 20 20 73  HAVING ");.    s
300c0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
300d0 72 28 70 56 64 62 65 2c 20 70 2d 3e 70 48 61 76  r(pVdbe, p->pHav
300e0 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ing);.    sqlite
300f0 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65  3ExplainNL(pVdbe
30100 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
30110 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
30120 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
30130 69 6e 74 66 28 70 56 64 62 65 2c 20 22 4f 52 44  intf(pVdbe, "ORD
30140 45 52 42 59 20 22 29 3b 0a 20 20 20 20 73 71 6c  ERBY ");.    sql
30150 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c  ite3ExplainExprL
30160 69 73 74 28 70 56 64 62 65 2c 20 70 2d 3e 70 4f  ist(pVdbe, p->pO
30170 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c  rderBy);.    sql
30180 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56  ite3ExplainNL(pV
30190 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  dbe);.  }.  if( 
301a0 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->pLimit ){.   
301b0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
301c0 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 4c 49  rintf(pVdbe, "LI
301d0 4d 49 54 20 22 29 3b 0a 20 20 20 20 73 71 6c 69  MIT ");.    sqli
301e0 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
301f0 56 64 62 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  Vdbe, p->pLimit)
30200 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
30210 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20  lainNL(pVdbe);. 
30220 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66 66   }.  if( p->pOff
30230 73 65 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  set ){.    sqlit
30240 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
30250 70 56 64 62 65 2c 20 22 4f 46 46 53 45 54 20 22  pVdbe, "OFFSET "
30260 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
30270 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62 65 2c  plainExpr(pVdbe,
30280 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20   p->pOffset);.  
30290 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
302a0 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 7d  NL(pVdbe);.  }.}
302b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
302c0 6c 61 69 6e 53 65 6c 65 63 74 28 56 64 62 65 20  lainSelect(Vdbe 
302d0 2a 70 56 64 62 65 2c 20 53 65 6c 65 63 74 20 2a  *pVdbe, Select *
302e0 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  p){.  if( p==0 )
302f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
30300 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
30310 2c 20 22 28 6e 75 6c 6c 2d 73 65 6c 65 63 74 29  , "(null-select)
30320 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ");.    return;.
30330 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
30340 6c 61 69 6e 50 75 73 68 28 70 56 64 62 65 29 3b  lainPush(pVdbe);
30350 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
30360 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 65 6c     explainOneSel
30370 65 63 74 28 70 56 64 62 65 2c 20 70 29 3b 0a 20  ect(pVdbe, p);. 
30380 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b     p = p->pNext;
30390 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20  .    if( p==0 ) 
303a0 62 72 65 61 6b 3b 0a 20 20 20 20 73 71 6c 69 74  break;.    sqlit
303b0 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62  e3ExplainNL(pVdb
303c0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  e);.    sqlite3E
303d0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
303e0 62 65 2c 20 22 25 73 5c 6e 22 2c 20 73 65 6c 65  be, "%s\n", sele
303f0 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
30400 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
30410 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
30420 62 65 2c 20 22 45 4e 44 22 29 3b 0a 20 20 73 71  be, "END");.  sq
30430 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70 28  lite3ExplainPop(
30440 70 56 64 62 65 29 3b 0a 7d 0a 0a 2f 2a 20 45 6e  pVdbe);.}../* En
30450 64 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75  d of the structu
30460 72 65 20 64 65 62 75 67 20 70 72 69 6e 74 69 6e  re debug printin
30470 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g code.*********
30480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
304a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
304b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
304c0 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  ****/.#endif /* 
304d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
304e0 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41  NABLE_TREE_EXPLA
304f0 49 4e 29 20 2a 2f 0a                             IN) */.