/ Hex Artifact Content
Login

Artifact 0cd6706fd52ae5db229e9041094db6ec27195335:


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 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
4390: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 44  ove(pParse, regD
43a0: 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e 45 78  ata, regBase+nEx
43b0: 70 72 2b 62 53 65 71 2c 20 6e 44 61 74 61 29 3b  pr+bSeq, nData);
43c0: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56  .  }..  sqlite3V
43d0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
43e0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42  MakeRecord, regB
43f0: 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73  ase+nOBSat, nBas
4400: 65 2d 6e 4f 42 53 61 74 2c 20 72 65 67 52 65 63  e-nOBSat, regRec
4410: 6f 72 64 29 3b 0a 20 20 69 66 28 20 6e 4f 42 53  ord);.  if( nOBS
4420: 61 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  at>0 ){.    int 
4430: 72 65 67 50 72 65 76 4b 65 79 3b 20 20 20 2f 2a  regPrevKey;   /*
4440: 20 54 68 65 20 66 69 72 73 74 20 6e 4f 42 53 61   The first nOBSa
4450: 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  t columns of the
4460: 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f   previous row */
4470: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 46 69 72  .    int addrFir
4480: 73 74 3b 20 20 20 20 2f 2a 20 41 64 64 72 65 73  st;    /* Addres
4490: 73 20 6f 66 20 74 68 65 20 4f 50 5f 49 66 4e 6f  s of the OP_IfNo
44a0: 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  t opcode */.    
44b0: 69 6e 74 20 61 64 64 72 4a 6d 70 3b 20 20 20 20  int addrJmp;    
44c0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
44d0: 74 68 65 20 4f 50 5f 4a 75 6d 70 20 6f 70 63 6f  the OP_Jump opco
44e0: 64 65 20 2a 2f 0a 20 20 20 20 56 64 62 65 4f 70  de */.    VdbeOp
44f0: 20 2a 70 4f 70 3b 20 20 20 20 20 20 2f 2a 20 4f   *pOp;      /* O
4500: 70 63 6f 64 65 20 74 68 61 74 20 6f 70 65 6e 73  pcode that opens
4510: 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20   the sorter */. 
4520: 20 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20 20     int nKey;    
4530: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4540: 66 20 73 6f 72 74 69 6e 67 20 6b 65 79 20 63 6f  f sorting key co
4550: 6c 75 6d 6e 73 2c 20 69 6e 63 6c 75 64 69 6e 67  lumns, including
4560: 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 2a 2f 0a   OP_Sequence */.
4570: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 49      KeyInfo *pKI
4580: 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
4590: 6c 20 4b 65 79 49 6e 66 6f 20 6f 6e 20 74 68 65  l KeyInfo on the
45a0: 20 73 6f 72 74 65 72 20 74 61 62 6c 65 20 2a 2f   sorter table */
45b0: 0a 0a 20 20 20 20 72 65 67 50 72 65 76 4b 65 79  ..    regPrevKey
45c0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
45d0: 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
45e0: 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e 6e 4f  Mem += pSort->nO
45f0: 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65 79 20 3d  BSat;.    nKey =
4600: 20 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e   nExpr - pSort->
4610: 6e 4f 42 53 61 74 20 2b 20 62 53 65 71 3b 0a 20  nOBSat + bSeq;. 
4620: 20 20 20 69 66 28 20 62 53 65 71 20 29 7b 0a 20     if( bSeq ){. 
4630: 20 20 20 20 20 61 64 64 72 46 69 72 73 74 20 3d       addrFirst =
4640: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4650: 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p1(v, OP_IfNot, 
4660: 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 20  regBase+nExpr); 
4670: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4680: 20 20 61 64 64 72 46 69 72 73 74 20 3d 20 73 71    addrFirst = sq
4690: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
46a0: 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 54 65  v, OP_SequenceTe
46b0: 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  st, pSort->iECur
46c0: 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  sor);.    }.    
46d0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
46e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
46f0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp3(v, OP_Com
4700: 70 61 72 65 2c 20 72 65 67 50 72 65 76 4b 65 79  pare, regPrevKey
4710: 2c 20 72 65 67 42 61 73 65 2c 20 70 53 6f 72 74  , regBase, pSort
4720: 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20 70  ->nOBSat);.    p
4730: 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
4740: 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74 2d 3e  GetOp(v, pSort->
4750: 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a  addrSortIndex);.
4760: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
4770: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
4780: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
4790: 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79 20 2b 20  Op->p2 = nKey + 
47a0: 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b 49 20 3d  nData;.    pKI =
47b0: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
47c0: 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4b  o;.    memset(pK
47d0: 49 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 30  I->aSortOrder, 0
47e0: 2c 20 70 4b 49 2d 3e 6e 46 69 65 6c 64 29 3b 20  , pKI->nField); 
47f0: 2f 2a 20 4d 61 6b 65 73 20 4f 50 5f 4a 75 6d 70  /* Makes OP_Jump
4800: 20 62 65 6c 6f 77 20 74 65 73 74 61 62 6c 65 20   below testable 
4810: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
4820: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
4830: 2c 20 28 63 68 61 72 2a 29 70 4b 49 2c 20 50 34  , (char*)pKI, P4
4840: 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 70  _KEYINFO);.    p
4850: 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20  Op->p4.pKeyInfo 
4860: 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
4870: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  rList(pParse, pS
4880: 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 6e  ort->pOrderBy, n
4890: 4f 42 53 61 74 2c 20 31 29 3b 0a 20 20 20 20 61  OBSat, 1);.    a
48a0: 64 64 72 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33  ddrJmp = sqlite3
48b0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
48c0: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
48d0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
48e0: 4a 75 6d 70 2c 20 61 64 64 72 4a 6d 70 2b 31 2c  Jump, addrJmp+1,
48f0: 20 30 2c 20 61 64 64 72 4a 6d 70 2b 31 29 3b 20   0, addrJmp+1); 
4900: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
4910: 0a 20 20 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65  .    pSort->labe
4920: 6c 42 6b 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  lBkOut = sqlite3
4930: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
4940: 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e 72 65 67  ;.    pSort->reg
4950: 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
4960: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
4970: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
4980: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72  , OP_Gosub, pSor
4990: 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53  t->regReturn, pS
49a0: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29  ort->labelBkOut)
49b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
49c0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
49d0: 73 65 74 53 6f 72 74 65 72 2c 20 70 53 6f 72 74  setSorter, pSort
49e0: 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20  ->iECursor);.   
49f0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
4a00: 48 65 72 65 28 76 2c 20 61 64 64 72 46 69 72 73  Here(v, addrFirs
4a10: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
4a20: 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
4a30: 73 65 2c 20 72 65 67 42 61 73 65 2c 20 72 65 67  se, regBase, reg
4a40: 50 72 65 76 4b 65 79 2c 20 70 53 6f 72 74 2d 3e  PrevKey, pSort->
4a50: 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20 73 71 6c  nOBSat);.    sql
4a60: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
4a70: 28 76 2c 20 61 64 64 72 4a 6d 70 29 3b 0a 20 20  (v, addrJmp);.  
4a80: 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73  }.  if( pSort->s
4a90: 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46  ortFlags & SORTF
4aa0: 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b  LAG_UseSorter ){
4ab0: 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 53 6f 72  .    op = OP_Sor
4ac0: 74 65 72 49 6e 73 65 72 74 3b 0a 20 20 7d 65 6c  terInsert;.  }el
4ad0: 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f  se{.    op = OP_
4ae0: 49 64 78 49 6e 73 65 72 74 3b 0a 20 20 7d 0a 20  IdxInsert;.  }. 
4af0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4b00: 70 32 28 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d  p2(v, op, pSort-
4b10: 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65  >iECursor, regRe
4b20: 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 70 53 65  cord);.  if( pSe
4b30: 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  lect->iLimit ){.
4b40: 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61      int addr1, a
4b50: 64 64 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 4c  ddr2;.    int iL
4b60: 69 6d 69 74 3b 0a 20 20 20 20 69 66 28 20 70 53  imit;.    if( pS
4b70: 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 20 29  elect->iOffset )
4b80: 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d  {.      iLimit =
4b90: 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65   pSelect->iOffse
4ba0: 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  t+1;.    }else{.
4bb0: 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70        iLimit = p
4bc0: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a  Select->iLimit;.
4bd0: 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72 31 20      }.    addr1 
4be0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
4bf0: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f  Op1(v, OP_IfZero
4c00: 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43  , iLimit); VdbeC
4c10: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
4c20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4c30: 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
4c40: 69 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20  iLimit, -1);.   
4c50: 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33   addr2 = sqlite3
4c60: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
4c70: 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 73 71 6c 69  _Goto);.    sqli
4c80: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
4c90: 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73  v, addr1);.    s
4ca0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
4cb0: 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 53 6f  (v, OP_Last, pSo
4cc0: 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20  rt->iECursor);. 
4cd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4ce0: 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74  dOp1(v, OP_Delet
4cf0: 65 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73  e, pSort->iECurs
4d00: 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  or);.    sqlite3
4d10: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
4d20: 61 64 64 72 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  addr2);.  }.}../
4d30: 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f  *.** Add code to
4d40: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f   implement the O
4d50: 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20  FFSET.*/.static 
4d60: 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28  void codeOffset(
4d70: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
4d80: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
4d90: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20   code into this 
4da0: 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66  VM */.  int iOff
4db0: 73 65 74 2c 20 20 20 20 20 20 2f 2a 20 52 65 67  set,      /* Reg
4dc0: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68  ister holding th
4dd0: 65 20 6f 66 66 73 65 74 20 63 6f 75 6e 74 65 72  e offset counter
4de0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69   */.  int iConti
4df0: 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  nue     /* Jump 
4e00: 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65  here to skip the
4e10: 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20   current record 
4e20: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 4f 66 66  */.){.  if( iOff
4e30: 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74  set>0 ){.    int
4e40: 20 61 64 64 72 3b 0a 20 20 20 20 61 64 64 72 20   addr;.    addr 
4e50: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
4e60: 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 65 67 2c  Op3(v, OP_IfNeg,
4e70: 20 69 4f 66 66 73 65 74 2c 20 30 2c 20 2d 31 29   iOffset, 0, -1)
4e80: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
4e90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4ea0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
4eb0: 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75  oto, 0, iContinu
4ec0: 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  e);.    VdbeComm
4ed0: 65 6e 74 28 28 76 2c 20 22 73 6b 69 70 20 4f 46  ent((v, "skip OF
4ee0: 46 53 45 54 20 72 65 63 6f 72 64 73 22 29 29 3b  FSET records"));
4ef0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4f00: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
4f10: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
4f20: 41 64 64 20 63 6f 64 65 20 74 68 61 74 20 77 69  Add code that wi
4f30: 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65  ll check to make
4f40: 20 73 75 72 65 20 74 68 65 20 4e 20 72 65 67 69   sure the N regi
4f50: 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61  sters starting a
4f60: 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61  t iMem.** form a
4f70: 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72 79 2e   distinct entry.
4f80: 20 20 69 54 61 62 20 69 73 20 61 20 73 6f 72 74    iTab is a sort
4f90: 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 68  ing index that h
4fa0: 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c 79 0a  olds previously.
4fb0: 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74  ** seen combinat
4fc0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20 76 61  ions of the N va
4fd0: 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65 6e 74  lues.  A new ent
4fe0: 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20 69 54  ry is made in iT
4ff0: 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72  ab.** if the cur
5000: 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20 61 72  rent N values ar
5010: 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a  e new..**.** A j
5020: 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70 65 61  ump to addrRepea
5030: 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20 74 68  t is made and th
5040: 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61 72 65  e N+1 values are
5050: 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65   popped from the
5060: 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65  .** stack if the
5070: 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20   top N elements 
5080: 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e 63 74  are not distinct
5090: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
50a0: 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 0a 20   codeDistinct(. 
50b0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
50c0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
50d0: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
50e0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
50f0: 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20 20  int iTab,       
5100: 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20     /* A sorting 
5110: 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74 65  index used to te
5120: 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e  st for distinctn
5130: 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ess */.  int add
5140: 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a  rRepeat,    /* J
5150: 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e  ump to here if n
5160: 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20  ot distinct */. 
5170: 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20   int N,         
5180: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5190: 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69   elements */.  i
51a0: 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20 20 20  nt iMem         
51b0: 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d 65    /* First eleme
51c0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  nt */.){.  Vdbe 
51d0: 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20  *v;.  int r1;.. 
51e0: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
51f0: 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74  be;.  r1 = sqlit
5200: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
5210: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  rse);.  sqlite3V
5220: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
5230: 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20  OP_Found, iTab, 
5240: 61 64 64 72 52 65 70 65 61 74 2c 20 69 4d 65 6d  addrRepeat, iMem
5250: 2c 20 4e 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , N); VdbeCovera
5260: 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
5270: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
5280: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65  _MakeRecord, iMe
5290: 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c  m, N, r1);.  sql
52a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
52b0: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
52c0: 69 54 61 62 2c 20 72 31 29 3b 0a 20 20 73 71 6c  iTab, r1);.  sql
52d0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
52e0: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
52f0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
5300: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
5310: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
5320: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
5330: 77 68 65 6e 20 61 20 53 45 4c 45 43 54 20 69 73  when a SELECT is
5340: 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 73   used within a s
5350: 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  ubexpression.** 
5360: 28 65 78 61 6d 70 6c 65 3a 20 20 22 61 20 49 4e  (example:  "a IN
5370: 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
5380: 74 61 62 6c 65 29 22 29 20 62 75 74 20 69 74 20  table)") but it 
5390: 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 31 20  has more than 1 
53a0: 72 65 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e  result.** column
53b0: 2e 20 20 57 65 20 64 6f 20 74 68 69 73 20 69 6e  .  We do this in
53c0: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 62 65   a subroutine be
53d0: 63 61 75 73 65 20 74 68 65 20 65 72 72 6f 72 20  cause the error 
53e0: 75 73 65 64 20 74 6f 20 6f 63 63 75 72 0a 2a 2a  used to occur.**
53f0: 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61   in multiple pla
5400: 63 65 73 2e 20 20 28 54 68 65 20 65 72 72 6f 72  ces.  (The error
5410: 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 69 6e 20   only occurs in 
5420: 6f 6e 65 20 70 6c 61 63 65 20 6e 6f 77 2c 20 62  one place now, b
5430: 75 74 20 77 65 0a 2a 2a 20 72 65 74 61 69 6e 20  ut we.** retain 
5440: 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74  the subroutine t
5450: 6f 20 6d 69 6e 69 6d 69 7a 65 20 63 6f 64 65 20  o minimize code 
5460: 64 69 73 72 75 70 74 69 6f 6e 2e 29 0a 2a 2f 0a  disruption.).*/.
5470: 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b  static int check
5480: 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65  ForMultiColumnSe
5490: 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 50 61 72  lectError(.  Par
54a0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
54b0: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
54c0: 78 74 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  xt. */.  SelectD
54d0: 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 2f 2a  est *pDest,   /*
54e0: 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 6f 66 20   Destination of 
54f0: 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 2a  SELECT results *
5500: 2f 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 20 20  /.  int nExpr   
5510: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5520: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
5530: 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79  umns returned by
5540: 20 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20 20   SELECT */.){.  
5550: 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73  int eDest = pDes
5560: 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 66 28 20  t->eDest;.  if( 
5570: 6e 45 78 70 72 3e 31 20 26 26 20 28 65 44 65 73  nExpr>1 && (eDes
5580: 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44  t==SRT_Mem || eD
5590: 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 29 7b  est==SRT_Set) ){
55a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
55b0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e  rMsg(pParse, "on
55c0: 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75  ly a single resu
55d0: 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22  lt allowed for "
55e0: 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45 43  .       "a SELEC
55f0: 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  T that is part o
5600: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22  f an expression"
5610: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
5620: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
5630: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65  turn 0;.  }.}.#e
5640: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
5650: 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
5660: 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20  es the code for 
5670: 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68  the inside of th
5680: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20  e inner loop.** 
5690: 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a  of a SELECT..**.
56a0: 2a 2a 20 49 66 20 73 72 63 54 61 62 20 69 73 20  ** If srcTab is 
56b0: 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74  negative, then t
56c0: 68 65 20 70 45 4c 69 73 74 20 65 78 70 72 65 73  he pEList expres
56d0: 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61  sions.** are eva
56e0: 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20  luated in order 
56f0: 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20  to get the data 
5700: 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49  for this row.  I
5710: 66 20 73 72 63 54 61 62 20 69 73 0a 2a 2a 20 7a  f srcTab is.** z
5720: 65 72 6f 20 6f 72 20 6d 6f 72 65 2c 20 74 68 65  ero or more, the
5730: 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64  n data is pulled
5740: 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64   from srcTab and
5750: 20 70 45 4c 69 73 74 20 69 73 20 75 73 65 64 20   pEList is used 
5760: 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20 67 65 74 20  only .** to get 
5770: 6e 75 6d 62 65 72 20 63 6f 6c 75 6d 6e 73 20 61  number columns a
5780: 6e 64 20 74 68 65 20 64 61 74 61 74 79 70 65 20  nd the datatype 
5790: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e  for each column.
57a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
57b0: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
57c0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
57d0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
57e0: 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
57f0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
5800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5810: 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65   The complete se
5820: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62  lect statement b
5830: 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
5840: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
5850: 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ,       /* List 
5860: 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20  of values being 
5870: 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69  extracted */.  i
5880: 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20 20 20  nt srcTab,      
5890: 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64         /* Pull d
58a0: 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61  ata from this ta
58b0: 62 6c 65 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78  ble */.  SortCtx
58c0: 20 2a 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20   *pSort,        
58d0: 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c   /* If not NULL,
58e0: 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20   info on how to 
58f0: 70 72 6f 63 65 73 73 20 4f 52 44 45 52 20 42 59  process ORDER BY
5900: 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74   */.  DistinctCt
5910: 78 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a  x *pDistinct, /*
5920: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e   If not NULL, in
5930: 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f  fo on how to pro
5940: 63 65 73 73 20 44 49 53 54 49 4e 43 54 20 2a 2f  cess DISTINCT */
5950: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
5960: 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f  Dest,      /* Ho
5970: 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20  w to dispose of 
5980: 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  the results */. 
5990: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20   int iContinue, 
59a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
59b0: 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75   here to continu
59c0: 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20  e with next row 
59d0: 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20  */.  int iBreak 
59e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
59f0: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65  Jump here to bre
5a00: 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e  ak out of the in
5a10: 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20  ner loop */.){. 
5a20: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
5a30: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
5a40: 69 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74  i;.  int hasDist
5a50: 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  inct;        /* 
5a60: 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  True if the DIST
5a70: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20  INCT keyword is 
5a80: 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
5a90: 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20 20   regResult;     
5aa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72           /* Star
5ab0: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64  t of memory hold
5ac0: 69 6e 67 20 72 65 73 75 6c 74 20 73 65 74 20 2a  ing result set *
5ad0: 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20  /.  int eDest = 
5ae0: 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20 20  pDest->eDest;   
5af0: 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73  /* How to dispos
5b00: 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a  e of results */.
5b10: 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44    int iParm = pD
5b20: 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20 2f 2a  est->iSDParm; /*
5b30: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
5b40: 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68  to disposal meth
5b50: 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73  od */.  int nRes
5b60: 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  ultCol;         
5b70: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5b80: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
5b90: 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78  */.  int nPrefix
5ba0: 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Reg = 0;        
5bb0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78   /* Number of ex
5bc0: 74 72 61 20 72 65 67 69 73 74 65 72 73 20 62 65  tra registers be
5bd0: 66 6f 72 65 20 72 65 67 52 65 73 75 6c 74 20 2a  fore regResult *
5be0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76 20 29  /..  assert( v )
5bf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69  ;.  assert( pELi
5c00: 73 74 21 3d 30 20 29 3b 0a 20 20 68 61 73 44 69  st!=0 );.  hasDi
5c10: 73 74 69 6e 63 74 20 3d 20 70 44 69 73 74 69 6e  stinct = pDistin
5c20: 63 74 20 3f 20 70 44 69 73 74 69 6e 63 74 2d 3e  ct ? pDistinct->
5c30: 65 54 6e 63 74 54 79 70 65 20 3a 20 57 48 45 52  eTnctType : WHER
5c40: 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b  E_DISTINCT_NOOP;
5c50: 0a 20 20 69 66 28 20 70 53 6f 72 74 20 26 26 20  .  if( pSort && 
5c60: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 3d  pSort->pOrderBy=
5c70: 3d 30 20 29 20 70 53 6f 72 74 20 3d 20 30 3b 0a  =0 ) pSort = 0;.
5c80: 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 26    if( pSort==0 &
5c90: 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20 29  & !hasDistinct )
5ca0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 43  {.    assert( iC
5cb0: 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20  ontinue!=0 );.  
5cc0: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
5cd0: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e  p->iOffset, iCon
5ce0: 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  tinue);.  }..  /
5cf0: 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65  * Pull the reque
5d00: 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20  sted columns..  
5d10: 2a 2f 0a 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20  */.  nResultCol 
5d20: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
5d30: 0a 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69  ..  if( pDest->i
5d40: 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Sdst==0 ){.    i
5d50: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
5d60: 20 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20 70    nPrefixReg = p
5d70: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Sort->pOrderBy->
5d80: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  nExpr;.      if(
5d90: 20 21 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c   !(pSort->sortFl
5da0: 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55  ags & SORTFLAG_U
5db0: 73 65 53 6f 72 74 65 72 29 20 29 20 6e 50 72 65  seSorter) ) nPre
5dc0: 66 69 78 52 65 67 2b 2b 3b 0a 20 20 20 20 20 20  fixReg++;.      
5dd0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
5de0: 6e 50 72 65 66 69 78 52 65 67 3b 0a 20 20 20 20  nPrefixReg;.    
5df0: 7d 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64  }.    pDest->iSd
5e00: 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  st = pParse->nMe
5e10: 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
5e20: 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74  >nMem += nResult
5e30: 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  Col;.  }else if(
5e40: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 6e 52   pDest->iSdst+nR
5e50: 65 73 75 6c 74 43 6f 6c 20 3e 20 70 50 61 72 73  esultCol > pPars
5e60: 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 2f  e->nMem ){.    /
5e70: 2a 20 54 68 69 73 20 69 73 20 61 6e 20 65 72 72  * This is an err
5e80: 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 74 68 61  or condition tha
5e90: 74 20 63 61 6e 20 72 65 73 75 6c 74 2c 20 66 6f  t can result, fo
5ea0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
5eb0: 61 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20  a SELECT.    ** 
5ec0: 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  on the right-han
5ed0: 64 20 73 69 64 65 20 6f 66 20 61 6e 20 49 4e 53  d side of an INS
5ee0: 45 52 54 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72  ERT contains mor
5ef0: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  e result columns
5f00: 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65   than.    ** the
5f10: 72 65 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20 69  re are columns i
5f20: 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74  n the table on t
5f30: 68 65 20 6c 65 66 74 2e 20 20 54 68 65 20 65 72  he left.  The er
5f40: 72 6f 72 20 77 69 6c 6c 20 62 65 20 63 61 75 67  ror will be caug
5f50: 68 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  ht.    ** and re
5f60: 70 6f 72 74 65 64 20 6c 61 74 65 72 2e 20 20 42  ported later.  B
5f70: 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61  ut we need to ma
5f80: 6b 65 20 73 75 72 65 20 65 6e 6f 75 67 68 20 6d  ke sure enough m
5f90: 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74  emory is allocat
5fa0: 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f  ed.    ** to avo
5fb0: 69 64 20 6f 74 68 65 72 20 73 70 75 72 69 6f 75  id other spuriou
5fc0: 73 20 65 72 72 6f 72 73 20 69 6e 20 74 68 65 20  s errors in the 
5fd0: 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20 20  meantime. */.   
5fe0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
5ff0: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d   nResultCol;.  }
6000: 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20  .  pDest->nSdst 
6010: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
6020: 72 65 67 52 65 73 75 6c 74 20 3d 20 70 44 65 73  regResult = pDes
6030: 74 2d 3e 69 53 64 73 74 3b 0a 20 20 69 66 28 20  t->iSdst;.  if( 
6040: 73 72 63 54 61 62 3e 3d 30 20 29 7b 0a 20 20 20  srcTab>=0 ){.   
6050: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73   for(i=0; i<nRes
6060: 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ultCol; i++){.  
6070: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6080: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
6090: 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c 20 72  mn, srcTab, i, r
60a0: 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20 20 20  egResult+i);.   
60b0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
60c0: 76 2c 20 22 25 73 22 2c 20 70 45 4c 69 73 74 2d  v, "%s", pEList-
60d0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20  >a[i].zName));. 
60e0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
60f0: 20 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73   eDest!=SRT_Exis
6100: 74 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  ts ){.    /* If 
6110: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
6120: 69 73 20 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e  is an EXISTS(...
6130: 29 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  ) expression, th
6140: 65 20 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20  e actual.    ** 
6150: 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20  values returned 
6160: 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 61 72  by the SELECT ar
6170: 65 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a  e not required..
6180: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
6190: 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
61a0: 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  st(pParse, pELis
61b0: 74 2c 20 72 65 67 52 65 73 75 6c 74 2c 0a 20 20  t, regResult,.  
61c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61d0: 28 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  (eDest==SRT_Outp
61e0: 75 74 7c 7c 65 44 65 73 74 3d 3d 53 52 54 5f 43  ut||eDest==SRT_C
61f0: 6f 72 6f 75 74 69 6e 65 29 3f 53 51 4c 49 54 45  oroutine)?SQLITE
6200: 5f 45 43 45 4c 5f 44 55 50 3a 30 29 3b 0a 20 20  _ECEL_DUP:0);.  
6210: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44  }..  /* If the D
6220: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
6230: 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74  was present on t
6240: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
6250: 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69  ent.  ** and thi
6260: 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73  s row has been s
6270: 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e  een before, then
6280: 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69   do not make thi
6290: 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20  s row.  ** part 
62a0: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20  of the result.. 
62b0: 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73   */.  if( hasDis
62c0: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 77 69  tinct ){.    swi
62d0: 74 63 68 28 20 70 44 69 73 74 69 6e 63 74 2d 3e  tch( pDistinct->
62e0: 65 54 6e 63 74 54 79 70 65 20 29 7b 0a 20 20 20  eTnctType ){.   
62f0: 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49     case WHERE_DI
6300: 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20  STINCT_ORDERED: 
6310: 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70  {.        VdbeOp
6320: 20 2a 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20   *pOp;          
6330: 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72    /* No longer r
6340: 65 71 75 69 72 65 64 20 4f 70 65 6e 45 70 68 65  equired OpenEphe
6350: 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a  meral instr. */.
6360: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a 75 6d          int iJum
6370: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
6380: 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74  /* Jump destinat
6390: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ion */.        i
63a0: 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20  nt regPrev;     
63b0: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f         /* Previo
63c0: 75 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20 2a  us row content *
63d0: 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  /..        /* Al
63e0: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
63f0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f   the previous ro
6400: 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67  w */.        reg
6410: 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Prev = pParse->n
6420: 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 70  Mem+1;.        p
6430: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
6440: 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20  ResultCol;..    
6450: 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68      /* Change th
6460: 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
6470: 61 6c 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72  al coded earlier
6480: 20 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20   to an OP_Null. 
6490: 20 20 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74         ** sets t
64a0: 68 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62  he MEM_Cleared b
64b0: 69 74 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20  it on the first 
64c0: 72 65 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a  register of the.
64d0: 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69          ** previ
64e0: 6f 75 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73  ous value.  This
64f0: 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20   will cause the 
6500: 4f 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61  OP_Ne below to a
6510: 6c 77 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a  lways.        **
6520: 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72   fail on the fir
6530: 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  st iteration of 
6540: 74 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66  the loop even if
6550: 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20   the first.     
6560: 20 20 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c     ** row is all
6570: 20 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20   NULLs..        
6580: 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
6590: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
65a0: 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d  op(v, pDistinct-
65b0: 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20  >addrTnct);.    
65c0: 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65      pOp = sqlite
65d0: 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44  3VdbeGetOp(v, pD
65e0: 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63  istinct->addrTnc
65f0: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  t);.        pOp-
6600: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c  >opcode = OP_Nul
6610: 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  l;.        pOp->
6620: 70 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  p1 = 1;.        
6630: 70 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65  pOp->p2 = regPre
6640: 76 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d  v;..        iJum
6650: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
6660: 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
6670: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20  nResultCol;.    
6680: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
6690: 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b  ResultCol; i++){
66a0: 0a 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  .          CollS
66b0: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *pColl = sqli
66c0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
66d0: 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61  Parse, pEList->a
66e0: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
66f0: 20 20 20 20 20 20 69 66 28 20 69 3c 6e 52 65 73        if( i<nRes
6700: 75 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20  ultCol-1 ){.    
6710: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
6720: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6730: 4e 65 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c  Ne, regResult+i,
6740: 20 69 4a 75 6d 70 2c 20 72 65 67 50 72 65 76 2b   iJump, regPrev+
6750: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
6760: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
6770: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
6780: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
6790: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
67a0: 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67 52 65 73  v, OP_Eq, regRes
67b0: 75 6c 74 2b 69 2c 20 69 43 6f 6e 74 69 6e 75 65  ult+i, iContinue
67c0: 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20  , regPrev+i);.  
67d0: 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
67e0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
67f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6800: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
6810: 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f  ngeP4(v, -1, (co
6820: 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c 6c  nst char *)pColl
6830: 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
6840: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6850: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
6860: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
6870: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6880: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6890: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
68a0: 28 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c 20 70 50  (v)==iJump || pP
68b0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
68c0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
68d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
68e0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op3(v, OP_Copy, 
68f0: 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50 72  regResult, regPr
6900: 65 76 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2d 31  ev, nResultCol-1
6910: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
6920: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
6930: 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
6940: 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20  INCT_UNIQUE: {. 
6950: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6960: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
6970: 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64  , pDistinct->add
6980: 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20  rTnct);.        
6990: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
69a0: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b        default: {
69b0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
69c0: 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63   pDistinct->eTnc
69d0: 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53  tType==WHERE_DIS
69e0: 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20  TINCT_UNORDERED 
69f0: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 44  );.        codeD
6a00: 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20  istinct(pParse, 
6a10: 70 44 69 73 74 69 6e 63 74 2d 3e 74 61 62 54 6e  pDistinct->tabTn
6a20: 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e  ct, iContinue, n
6a30: 52 65 73 75 6c 74 43 6f 6c 2c 20 72 65 67 52 65  ResultCol, regRe
6a40: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 62  sult);.        b
6a50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
6a60: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 6f 72    }.    if( pSor
6a70: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  t==0 ){.      co
6a80: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69  deOffset(v, p->i
6a90: 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75  Offset, iContinu
6aa0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
6ab0: 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
6ac0: 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73  {.    /* In this
6ad0: 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63   mode, write eac
6ae0: 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 20 74  h query result t
6af0: 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  o the key of the
6b00: 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a   temporary.    *
6b10: 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  * table iParm.. 
6b20: 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
6b30: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
6b40: 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 63 61  ND_SELECT.    ca
6b50: 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a  se SRT_Union: {.
6b60: 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20        int r1;.  
6b70: 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
6b80: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
6b90: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
6ba0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6bb0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
6bc0: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
6bd0: 43 6f 6c 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  Col, r1);.      
6be0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6bf0: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
6c00: 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20  t, iParm, r1);. 
6c10: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
6c20: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
6c30: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
6c40: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
6c50: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72  /* Construct a r
6c60: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71  ecord from the q
6c70: 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74  uery result, but
6c80: 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20   instead of.    
6c90: 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72  ** saving that r
6ca0: 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73  ecord, use it as
6cb0: 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65   a key to delete
6cc0: 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20   elements from. 
6cd0: 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72     ** the tempor
6ce0: 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e  ary table iParm.
6cf0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
6d00: 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20   SRT_Except: {. 
6d10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6d20: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78  AddOp3(v, OP_Idx
6d30: 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72  Delete, iParm, r
6d40: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
6d50: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  tCol);.      bre
6d60: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
6d70: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
6d80: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
6d90: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65  */..    /* Store
6da0: 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64   the result as d
6db0: 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71  ata using a uniq
6dc0: 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20  ue key..    */. 
6dd0: 20 20 20 63 61 73 65 20 53 52 54 5f 46 69 66 6f     case SRT_Fifo
6de0: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 44  :.    case SRT_D
6df0: 69 73 74 46 69 66 6f 3a 0a 20 20 20 20 63 61 73  istFifo:.    cas
6e00: 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
6e10: 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
6e20: 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ab: {.      int 
6e30: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
6e40: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
6e50: 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a   nPrefixReg+1);.
6e60: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
6e70: 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65  eDest==SRT_Table
6e80: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
6e90: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45  se( eDest==SRT_E
6ea0: 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20  phemTab );.     
6eb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6ec0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
6ed0: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
6ee0: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 2b 6e  nResultCol, r1+n
6ef0: 50 72 65 66 69 78 52 65 67 29 3b 0a 23 69 66 6e  PrefixReg);.#ifn
6f00: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6f10: 43 54 45 0a 20 20 20 20 20 20 69 66 28 20 65 44  CTE.      if( eD
6f20: 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66  est==SRT_DistFif
6f30: 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  o ){.        /* 
6f40: 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  If the destinati
6f50: 6f 6e 20 69 73 20 44 69 73 74 46 69 66 6f 2c 20  on is DistFifo, 
6f60: 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50 61  then cursor (iPa
6f70: 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20 20  rm+1) is open.  
6f80: 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 6e 20 65        ** on an e
6f90: 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 2e 20  phemeral index. 
6fa0: 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  If the current r
6fb0: 6f 77 20 69 73 20 61 6c 72 65 61 64 79 20 70 72  ow is already pr
6fc0: 65 73 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a  esent.        **
6fd0: 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20 64   in the index, d
6fe0: 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74 20 74  o not write it t
6ff0: 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 49 66  o the output. If
7000: 20 6e 6f 74 2c 20 61 64 64 20 74 68 65 0a 20 20   not, add the.  
7010: 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74        ** current
7020: 20 72 6f 77 20 74 6f 20 74 68 65 20 69 6e 64 65   row to the inde
7030: 78 20 61 6e 64 20 70 72 6f 63 65 65 64 20 77 69  x and proceed wi
7040: 74 68 20 77 72 69 74 69 6e 67 20 69 74 20 74 6f  th writing it to
7050: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
7060: 6f 75 74 70 75 74 20 74 61 62 6c 65 20 61 73 20  output table as 
7070: 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20  well.  */.      
7080: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
7090: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
70a0: 64 64 72 28 76 29 20 2b 20 34 3b 0a 20 20 20 20  ddr(v) + 4;.    
70b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
70c0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
70d0: 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 61  ound, iParm+1, a
70e0: 64 64 72 2c 20 72 31 2c 20 30 29 3b 20 56 64 62  ddr, r1, 0); Vdb
70f0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
7100: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7110: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
7120: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31  xInsert, iParm+1
7130: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 61  , r1);.        a
7140: 73 73 65 72 74 28 20 70 53 6f 72 74 3d 3d 30 20  ssert( pSort==0 
7150: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
7160: 66 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72  f.      if( pSor
7170: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  t ){.        pus
7180: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
7190: 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 31  se, pSort, p, r1
71a0: 2b 6e 50 72 65 66 69 78 52 65 67 2c 20 31 2c 20  +nPrefixReg, 1, 
71b0: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20  nPrefixReg);.   
71c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
71d0: 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74    int r2 = sqlit
71e0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
71f0: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
7200: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7210: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
7220: 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  iParm, r2);.    
7230: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7240: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
7250: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72  rt, iParm, r1, r
7260: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
7270: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
7280: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
7290: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
72a0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
72b0: 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
72c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
72d0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
72e0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20  nge(pParse, r1, 
72f0: 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20  nPrefixReg+1);. 
7300: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7310: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
7320: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
7330: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
7340: 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
7350: 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20  for an "expr IN 
7360: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f  (SELECT ...)" co
7370: 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20  nstruct,.    ** 
7380: 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c  then there shoul
7390: 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74  d be a single it
73a0: 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  em on the stack.
73b0: 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20    Write this.   
73c0: 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68   ** item into th
73d0: 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68  e set table with
73e0: 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20   bogus data..   
73f0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
7400: 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Set: {.      as
7410: 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c  sert( nResultCol
7420: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 44 65  ==1 );.      pDe
7430: 73 74 2d 3e 61 66 66 53 64 73 74 20 3d 0a 20 20  st->affSdst =.  
7440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7450: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
7460: 66 69 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e 61  finity(pEList->a
7470: 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74  [0].pExpr, pDest
7480: 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20 20 20 20  ->affSdst);.    
7490: 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20    if( pSort ){. 
74a0: 20 20 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72         /* At fir
74b0: 73 74 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f  st glance you wo
74c0: 75 6c 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75  uld think we cou
74d0: 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20  ld optimize out 
74e0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  the.        ** O
74f0: 52 44 45 52 20 42 59 20 69 6e 20 74 68 69 73 20  RDER BY in this 
7500: 63 61 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f  case since the o
7510: 72 64 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  rder of entries 
7520: 69 6e 20 74 68 65 20 73 65 74 0a 20 20 20 20 20  in the set.     
7530: 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d     ** does not m
7540: 61 74 74 65 72 2e 20 20 42 75 74 20 74 68 65 72  atter.  But ther
7550: 65 20 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d  e might be a LIM
7560: 49 54 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68  IT clause, in wh
7570: 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  ich.        ** c
7580: 61 73 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f  ase the order do
7590: 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20  es matter */.   
75a0: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
75b0: 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ter(pParse, pSor
75c0: 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 2c  t, p, regResult,
75d0: 20 31 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b   1, nPrefixReg);
75e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
75f0: 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
7600: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
7610: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
7620: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7630: 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
7640: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
7650: 31 2c 72 31 2c 20 26 70 44 65 73 74 2d 3e 61 66  1,r1, &pDest->af
7660: 66 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20  fSdst, 1);.     
7670: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
7680: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
7690: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73  e(pParse, regRes
76a0: 75 6c 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ult, 1);.       
76b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
76c0: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
76d0: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a  rt, iParm, r1);.
76e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
76f0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
7700: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
7710: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
7720: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
7730: 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69   any row exist i
7740: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
7750: 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61  , record that fa
7760: 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20  ct and abort..  
7770: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
7780: 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20  T_Exists: {.    
7790: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
77a0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
77b0: 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20  r, 1, iParm);.  
77c0: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
77d0: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72   clause will ter
77e0: 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20  minate the loop 
77f0: 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
7800: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
7810: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
7820: 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20  a scalar select 
7830: 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
7840: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  an expression, t
7850: 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65  hen.    ** store
7860: 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
7870: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
7880: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
7890: 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a  break out.    **
78a0: 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f   of the scan loo
78b0: 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  p..    */.    ca
78c0: 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
78d0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
78e0: 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20  ultCol==1 );.   
78f0: 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a     if( pSort ){.
7900: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
7910: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70  Sorter(pParse, p
7920: 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75  Sort, p, regResu
7930: 6c 74 2c 20 31 2c 20 6e 50 72 65 66 69 78 52 65  lt, 1, nPrefixRe
7940: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
7950: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7960: 20 72 65 67 52 65 73 75 6c 74 3d 3d 69 50 61 72   regResult==iPar
7970: 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  m );.        /* 
7980: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
7990: 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f   will jump out o
79a0: 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  f the loop for u
79b0: 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  s */.      }.   
79c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
79d0: 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
79e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
79f0: 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 63  BQUERY */..    c
7a00: 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  ase SRT_Coroutin
7a10: 65 3a 20 20 20 20 20 20 20 2f 2a 20 53 65 6e 64  e:       /* Send
7a20: 20 64 61 74 61 20 74 6f 20 61 20 63 6f 2d 72 6f   data to a co-ro
7a30: 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 63 61 73  utine */.    cas
7a40: 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b 20  e SRT_Output: { 
7a50: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
7a60: 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a   the results */.
7a70: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7a80: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
7a90: 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74 65  tine );.      te
7aa0: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
7ab0: 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
7ac0: 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a     if( pSort ){.
7ad0: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
7ae0: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70  Sorter(pParse, p
7af0: 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75  Sort, p, regResu
7b00: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20  lt, nResultCol, 
7b10: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20  nPrefixReg);.   
7b20: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65     }else if( eDe
7b30: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
7b40: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
7b50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
7b60: 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73  , OP_Yield, pDes
7b70: 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  t->iSDParm);.   
7b80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7b90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7ba0: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
7bb0: 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  Row, regResult, 
7bc0: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
7bd0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
7be0: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
7bf0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
7c00: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
7c10: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
7c20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
7c30: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7c40: 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20 57  MIT_CTE.    /* W
7c50: 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73  rite the results
7c60: 20 69 6e 74 6f 20 61 20 70 72 69 6f 72 69 74 79   into a priority
7c70: 20 71 75 65 75 65 20 74 68 61 74 20 69 73 20 6f   queue that is o
7c80: 72 64 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74  rder according t
7c90: 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73 74 2d 3e  o.    ** pDest->
7ca0: 70 4f 72 64 65 72 42 79 20 28 69 6e 20 70 53 4f  pOrderBy (in pSO
7cb0: 29 2e 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ).  pDest->iSDPa
7cc0: 72 6d 20 28 69 6e 20 69 50 61 72 6d 29 20 69 73  rm (in iParm) is
7cd0: 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20   the cursor for 
7ce0: 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20  an.    ** index 
7cf0: 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72 2b  with pSO->nExpr+
7d00: 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69 6c  2 columns.  Buil
7d10: 64 20 61 20 6b 65 79 20 75 73 69 6e 67 20 70 53  d a key using pS
7d20: 4f 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 0a  O for the first.
7d30: 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78 70      ** pSO->nExp
7d40: 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  r columns, then 
7d50: 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b 65  make sure all ke
7d60: 79 73 20 61 72 65 20 75 6e 69 71 75 65 20 62 79  ys are unique by
7d70: 20 61 64 64 69 6e 67 20 61 0a 20 20 20 20 2a 2a   adding a.    **
7d80: 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65 6e   final OP_Sequen
7d90: 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20  ce column.  The 
7da0: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 74  last column is t
7db0: 68 65 20 72 65 63 6f 72 64 20 61 73 20 61 20 62  he record as a b
7dc0: 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lob..    */.    
7dd0: 63 61 73 65 20 53 52 54 5f 44 69 73 74 51 75 65  case SRT_DistQue
7de0: 75 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ue:.    case SRT
7df0: 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20 20 20 20  _Queue: {.      
7e00: 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20  int nKey;.      
7e10: 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a  int r1, r2, r3;.
7e20: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 65        int addrTe
7e30: 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78  st = 0;.      Ex
7e40: 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20 20  prList *pSO;.   
7e50: 20 20 20 70 53 4f 20 3d 20 70 44 65 73 74 2d 3e     pSO = pDest->
7e60: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
7e70: 61 73 73 65 72 74 28 20 70 53 4f 20 29 3b 0a 20  assert( pSO );. 
7e80: 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f 2d       nKey = pSO-
7e90: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 31  >nExpr;.      r1
7ea0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7eb0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
7ec0: 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
7ed0: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
7ee0: 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20  rse, nKey+2);.  
7ef0: 20 20 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65 79      r3 = r2+nKey
7f00: 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44  +1;.      if( eD
7f10: 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65  est==SRT_DistQue
7f20: 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ue ){.        /*
7f30: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
7f40: 69 6f 6e 20 69 73 20 44 69 73 74 51 75 65 75 65  ion is DistQueue
7f50: 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69  , then cursor (i
7f60: 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a  Parm+1) is open.
7f70: 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 20          ** on a 
7f80: 73 65 63 6f 6e 64 20 65 70 68 65 6d 65 72 61 6c  second ephemeral
7f90: 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64   index that hold
7fa0: 73 20 61 6c 6c 20 76 61 6c 75 65 73 20 65 76 65  s all values eve
7fb0: 72 79 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20  ry previously.  
7fc0: 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74        ** added t
7fd0: 6f 20 74 68 65 20 71 75 65 75 65 2e 20 2a 2f 0a  o the queue. */.
7fe0: 20 20 20 20 20 20 20 20 61 64 64 72 54 65 73 74          addrTest
7ff0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
8000: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
8010: 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30 2c  und, iParm+1, 0,
8020: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
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 72 65 67 52 65 73            regRes
8050: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  ult, nResultCol)
8060: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
8070: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
8080: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
8090: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
80a0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
80b0: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
80c0: 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 69  ol, r3);.      i
80d0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  f( eDest==SRT_Di
80e0: 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20  stQueue ){.     
80f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8100: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
8110: 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72  sert, iParm+1, r
8120: 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  3);.        sqli
8130: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
8140: 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
8150: 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20 20  KRESULT);.      
8160: 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
8170: 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20   i<nKey; i++){. 
8180: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8190: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
81a0: 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20 20  Copy,.          
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81c0: 72 65 67 52 65 73 75 6c 74 20 2b 20 70 53 4f 2d  regResult + pSO-
81d0: 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  >a[i].u.x.iOrder
81e0: 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20 20  ByCol - 1,.     
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8200: 20 20 20 20 20 72 32 2b 69 29 3b 0a 20 20 20 20       r2+i);.    
8210: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
8220: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8230: 50 5f 53 65 71 75 65 6e 63 65 2c 20 69 50 61 72  P_Sequence, iPar
8240: 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20 20  m, r2+nKey);.   
8250: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8260: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
8270: 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79 2b  ecord, r2, nKey+
8280: 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  2, r1);.      sq
8290: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
82a0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
82b0: 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20   iParm, r1);.   
82c0: 20 20 20 69 66 28 20 61 64 64 72 54 65 73 74 20     if( addrTest 
82d0: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
82e0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 65 73  pHere(v, addrTes
82f0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
8300: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
8310: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
8320: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
8330: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
8340: 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a  e, r2, nKey+2);.
8350: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8360: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
8370: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a  ITE_OMIT_CTE */.
8380: 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ...#if !defined(
8390: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
83a0: 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63  GER).    /* Disc
83b0: 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e  ard the results.
83c0: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
83d0: 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  or SELECT statem
83e0: 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20  ents inside.    
83f0: 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  ** the body of a
8400: 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70   TRIGGER.  The p
8410: 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73  urpose of such s
8420: 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c  elects is to cal
8430: 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65  l.    ** user-de
8440: 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
8450: 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65  that have side e
8460: 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e  ffects.  We do n
8470: 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61  ot care.    ** a
8480: 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20  bout the actual 
8490: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
84a0: 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  elect..    */.  
84b0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
84c0: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
84d0: 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b  ==SRT_Discard );
84e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
84f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
8500: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
8510: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
8520: 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
8530: 20 72 65 61 63 68 65 64 2e 20 20 45 78 63 65 70   reached.  Excep
8540: 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65  t, if.  ** there
8550: 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e   is a sorter, in
8560: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20   which case the 
8570: 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65 61  sorter has alrea
8580: 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20  dy limited.  ** 
8590: 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75  the output for u
85a0: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  s..  */.  if( pS
85b0: 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69  ort==0 && p->iLi
85c0: 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
85d0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
85e0: 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c  OP_IfZero, p->iL
85f0: 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c 20 2d 31  imit, iBreak, -1
8600: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
8610: 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  v);.  }.}../*.**
8620: 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49   Allocate a KeyI
8630: 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66 66 69  nfo object suffi
8640: 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e 64  cient for an ind
8650: 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f 6c 75  ex of N key colu
8660: 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65 78 74  mns and.** X ext
8670: 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b  ra columns..*/.K
8680: 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b  eyInfo *sqlite3K
8690: 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71 6c 69  eyInfoAlloc(sqli
86a0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 2c 20  te3 *db, int N, 
86b0: 69 6e 74 20 58 29 7b 0a 20 20 4b 65 79 49 6e 66  int X){.  KeyInf
86c0: 6f 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 44 62  o *p = sqlite3Db
86d0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 30 2c 20 0a 20  MallocZero(0, . 
86e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86f0: 20 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f    sizeof(KeyInfo
8700: 29 20 2b 20 28 4e 2b 58 29 2a 28 73 69 7a 65 6f  ) + (N+X)*(sizeo
8710: 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 29 3b  f(CollSeq*)+1));
8720: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
8730: 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  p->aSortOrder = 
8740: 28 75 38 2a 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e  (u8*)&p->aColl[N
8750: 2b 58 5d 3b 0a 20 20 20 20 70 2d 3e 6e 46 69 65  +X];.    p->nFie
8760: 6c 64 20 3d 20 28 75 31 36 29 4e 3b 0a 20 20 20  ld = (u16)N;.   
8770: 20 70 2d 3e 6e 58 46 69 65 6c 64 20 3d 20 28 75   p->nXField = (u
8780: 31 36 29 58 3b 0a 20 20 20 20 70 2d 3e 65 6e 63  16)X;.    p->enc
8790: 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20   = ENC(db);.    
87a0: 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  p->db = db;.    
87b0: 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 7d  p->nRef = 1;.  }
87c0: 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  else{.    db->ma
87d0: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
87e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
87f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
8800: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62  ate a KeyInfo ob
8810: 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ject.*/.void sql
8820: 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
8830: 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20  (KeyInfo *p){.  
8840: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73  if( p ){.    ass
8850: 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29  ert( p->nRef>0 )
8860: 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b  ;.    p->nRef--;
8870: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66  .    if( p->nRef
8880: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 44 62 46  ==0 ) sqlite3DbF
8890: 72 65 65 28 30 2c 20 70 29 3b 0a 20 20 7d 0a 7d  ree(0, p);.  }.}
88a0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 6e  ../*.** Make a n
88b0: 65 77 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20  ew pointer to a 
88c0: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a  KeyInfo object.*
88d0: 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74  /.KeyInfo *sqlit
88e0: 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 4b 65 79  e3KeyInfoRef(Key
88f0: 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20  Info *p){.  if( 
8900: 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
8910: 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20   p->nRef>0 );.  
8920: 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d    p->nRef++;.  }
8930: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
8940: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
8950: 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  BUG./*.** Return
8960: 20 54 52 55 45 20 69 66 20 61 20 4b 65 79 49 6e   TRUE if a KeyIn
8970: 66 6f 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65  fo object can be
8980: 20 63 68 61 6e 67 65 2e 20 20 54 68 65 20 4b 65   change.  The Ke
8990: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20  yInfo object.** 
89a0: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 63 68 61 6e  can only be chan
89b0: 67 65 64 20 69 66 20 74 68 69 73 20 69 73 20 6a  ged if this is j
89c0: 75 73 74 20 61 20 73 69 6e 67 6c 65 20 72 65 66  ust a single ref
89d0: 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6f 62  erence to the ob
89e0: 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ject..**.** This
89f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
8a00: 20 6f 6e 6c 79 20 69 6e 73 69 64 65 20 6f 66 20   only inside of 
8a10: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
8a20: 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nts..*/.int sqli
8a30: 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
8a40: 65 61 62 6c 65 28 4b 65 79 49 6e 66 6f 20 2a 70  eable(KeyInfo *p
8a50: 29 7b 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65  ){ return p->nRe
8a60: 66 3d 3d 31 3b 20 7d 0a 23 65 6e 64 69 66 20 2f  f==1; }.#endif /
8a70: 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  * SQLITE_DEBUG *
8a80: 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  /../*.** Given a
8a90: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
8aa0: 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65  t, generate a Ke
8ab0: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
8ac0: 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20  that records.** 
8ad0: 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
8ae0: 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20  quence for each 
8af0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
8b00: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  at expression li
8b10: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  st..**.** If the
8b20: 20 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20   ExprList is an 
8b30: 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
8b40: 50 20 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e  P BY clause then
8b50: 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a   the resulting.*
8b60: 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  * KeyInfo struct
8b70: 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ure is appropria
8b80: 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a  te for initializ
8b90: 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e  ing a virtual in
8ba0: 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d  dex to.** implem
8bb0: 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e  ent that clause.
8bc0: 20 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73    If the ExprLis
8bd0: 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20  t is the result 
8be0: 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a  set of a SELECT.
8bf0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49  ** then the KeyI
8c00: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
8c10: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
8c20: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20   initializing a 
8c30: 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78  virtual.** index
8c40: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20   to implement a 
8c50: 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a  DISTINCT test..*
8c60: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
8c70: 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ld the KeyInfo s
8c80: 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61  tructure is obta
8c90: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
8ca0: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  .  The calling.*
8cb0: 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  * function is re
8cc0: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65  sponsible for se
8cd0: 65 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73  eing that this s
8ce0: 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e  tructure is even
8cf0: 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e  tually.** freed.
8d00: 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e  .*/.static KeyIn
8d10: 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  fo *keyInfoFromE
8d20: 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65  xprList(.  Parse
8d30: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
8d40: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
8d50: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
8d60: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20   *pList,     /* 
8d70: 46 6f 72 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f  Form the KeyInfo
8d80: 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74 68 69   object from thi
8d90: 73 20 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20  s ExprList */.  
8da0: 69 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20  int iStart,     
8db0: 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 77 69       /* Begin wi
8dc0: 74 68 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f  th this column o
8dd0: 66 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  f pList */.  int
8de0: 20 6e 45 78 74 72 61 20 20 20 20 20 20 20 20 20   nExtra         
8df0: 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61    /* Add this ma
8e00: 6e 79 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73  ny extra columns
8e10: 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29   to the end */.)
8e20: 7b 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20  {.  int nExpr;. 
8e30: 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b   KeyInfo *pInfo;
8e40: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
8e50: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
8e60: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8e70: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
8e80: 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20  t i;..  nExpr = 
8e90: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
8ea0: 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  pInfo = sqlite3K
8eb0: 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20  eyInfoAlloc(db, 
8ec0: 6e 45 78 70 72 2b 6e 45 78 74 72 61 2d 69 53 74  nExpr+nExtra-iSt
8ed0: 61 72 74 2c 20 31 29 3b 0a 20 20 69 66 28 20 70  art, 1);.  if( p
8ee0: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 61 73 73 65  Info ){.    asse
8ef0: 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
8f00: 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 49  foIsWriteable(pI
8f10: 6e 66 6f 29 20 29 3b 0a 20 20 20 20 66 6f 72 28  nfo) );.    for(
8f20: 69 3d 69 53 74 61 72 74 2c 20 70 49 74 65 6d 3d  i=iStart, pItem=
8f30: 70 4c 69 73 74 2d 3e 61 2b 69 53 74 61 72 74 3b  pList->a+iStart;
8f40: 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70   i<nExpr; i++, p
8f50: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 43  Item++){.      C
8f60: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
8f70: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
8f80: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
8f90: 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
8fa0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Expr);.      if(
8fb0: 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
8fc0: 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
8fd0: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43  .      pInfo->aC
8fe0: 6f 6c 6c 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20  oll[i-iStart] = 
8ff0: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e  pColl;.      pIn
9000: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  fo->aSortOrder[i
9010: 2d 69 53 74 61 72 74 5d 20 3d 20 70 49 74 65 6d  -iStart] = pItem
9020: 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ->sortOrder;.   
9030: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
9040: 70 49 6e 66 6f 3b 0a 7d 0a 0a 23 69 66 6e 64 65  pInfo;.}..#ifnde
9050: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
9060: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a  MPOUND_SELECT./*
9070: 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20  .** Name of the 
9080: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61  connection opera
9090: 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72  tor, used for er
90a0: 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f  ror messages..*/
90b0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
90c0: 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65  ar *selectOpName
90d0: 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72  (int id){.  char
90e0: 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69   *z;.  switch( i
90f0: 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  d ){.    case TK
9100: 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20  _ALL:       z = 
9110: 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62  "UNION ALL";   b
9120: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
9130: 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d  K_INTERSECT: z =
9140: 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20   "INTERSECT";   
9150: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9160: 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20  TK_EXCEPT:    z 
9170: 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20 20 20  = "EXCEPT";     
9180: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
9190: 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a  ult:           z
91a0: 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20   = "UNION";     
91b0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72    break;.  }.  r
91c0: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69  eturn z;.}.#endi
91d0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
91e0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
91f0: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
9200: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
9210: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e  ./*.** Unless an
9220: 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20   "EXPLAIN QUERY 
9230: 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73  PLAN" command is
9240: 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64   being processed
9250: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
9260: 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f  ** is a no-op. O
9270: 74 68 65 72 77 69 73 65 2c 20 69 74 20 61 64 64  therwise, it add
9280: 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  s a single row o
9290: 66 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20  f output to the 
92a0: 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77  EQP result,.** w
92b0: 68 65 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e  here the caption
92c0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
92d0: 0a 2a 2a 0a 2a 2a 20 20 20 22 55 53 45 20 54 45  .**.**   "USE TE
92e0: 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 78 78  MP B-TREE FOR xx
92f0: 78 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 78  x".**.** where x
9300: 78 78 20 69 73 20 6f 6e 65 20 6f 66 20 22 44 49  xx is one of "DI
9310: 53 54 49 4e 43 54 22 2c 20 22 4f 52 44 45 52 20  STINCT", "ORDER 
9320: 42 59 22 20 6f 72 20 22 47 52 4f 55 50 20 42 59  BY" or "GROUP BY
9330: 22 2e 20 45 78 61 63 74 6c 79 20 77 68 69 63 68  ". Exactly which
9340: 0a 2a 2a 20 69 73 20 64 65 74 65 72 6d 69 6e 65  .** is determine
9350: 64 20 62 79 20 74 68 65 20 7a 55 73 61 67 65 20  d by the zUsage 
9360: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
9370: 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
9380: 54 65 6d 70 54 61 62 6c 65 28 50 61 72 73 65 20  TempTable(Parse 
9390: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
93a0: 68 61 72 20 2a 7a 55 73 61 67 65 29 7b 0a 20 20  har *zUsage){.  
93b0: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
93c0: 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64  ain==2 ){.    Vd
93d0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
93e0: 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20  pVdbe;.    char 
93f0: 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d  *zMsg = sqlite3M
9400: 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64  Printf(pParse->d
9410: 62 2c 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54  b, "USE TEMP B-T
9420: 52 45 45 20 46 4f 52 20 25 73 22 2c 20 7a 55 73  REE FOR %s", zUs
9430: 61 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  age);.    sqlite
9440: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
9450: 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73  P_Explain, pPars
9460: 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c  e->iSelectId, 0,
9470: 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e   0, zMsg, P4_DYN
9480: 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  AMIC);.  }.}../*
9490: 0a 2a 2a 20 41 73 73 69 67 6e 20 65 78 70 72 65  .** Assign expre
94a0: 73 73 69 6f 6e 20 62 20 74 6f 20 6c 76 61 6c 75  ssion b to lvalu
94b0: 65 20 61 2e 20 41 20 73 65 63 6f 6e 64 2c 20 6e  e a. A second, n
94c0: 6f 2d 6f 70 2c 20 76 65 72 73 69 6f 6e 20 6f 66  o-op, version of
94d0: 20 74 68 69 73 20 6d 61 63 72 6f 0a 2a 2a 20 69   this macro.** i
94e0: 73 20 70 72 6f 76 69 64 65 64 20 77 68 65 6e 20  s provided when 
94f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
9500: 41 49 4e 20 69 73 20 64 65 66 69 6e 65 64 2e 20  AIN is defined. 
9510: 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20  This allows the 
9520: 63 6f 64 65 0a 2a 2a 20 69 6e 20 73 71 6c 69 74  code.** in sqlit
9530: 65 33 53 65 6c 65 63 74 28 29 20 74 6f 20 61 73  e3Select() to as
9540: 73 69 67 6e 20 76 61 6c 75 65 73 20 74 6f 20 73  sign values to s
9550: 74 72 75 63 74 75 72 65 20 6d 65 6d 62 65 72 20  tructure member 
9560: 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 0a 2a  variables that.*
9570: 2a 20 6f 6e 6c 79 20 65 78 69 73 74 20 69 66 20  * only exist if 
9580: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
9590: 41 49 4e 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  AIN is not defin
95a0: 65 64 20 77 69 74 68 6f 75 74 20 70 6f 6c 6c 75  ed without pollu
95b0: 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 64 65  ting the.** code
95c0: 20 77 69 74 68 20 23 69 66 6e 64 65 66 20 64 69   with #ifndef di
95d0: 72 65 63 74 69 76 65 73 2e 0a 2a 2f 0a 23 20 64  rectives..*/.# d
95e0: 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74  efine explainSet
95f0: 49 6e 74 65 67 65 72 28 61 2c 20 62 29 20 61 20  Integer(a, b) a 
9600: 3d 20 62 0a 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f  = b..#else./* No
9610: 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  -op versions of 
9620: 74 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28 29  the explainXXX()
9630: 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d   functions and m
9640: 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69  acros. */.# defi
9650: 6e 65 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61  ne explainTempTa
9660: 62 6c 65 28 79 2c 7a 29 0a 23 20 64 65 66 69 6e  ble(y,z).# defin
9670: 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65  e explainSetInte
9680: 67 65 72 28 79 2c 7a 29 0a 23 65 6e 64 69 66 0a  ger(y,z).#endif.
9690: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
96a0: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
96b0: 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  N) && !defined(S
96c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
96d0: 55 4e 44 5f 53 45 4c 45 43 54 29 0a 2f 2a 0a 2a  UND_SELECT)./*.*
96e0: 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50  * Unless an "EXP
96f0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22  LAIN QUERY PLAN"
9700: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e   command is bein
9710: 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69  g processed, thi
9720: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  s function.** is
9730: 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77   a no-op. Otherw
9740: 69 73 65 2c 20 69 74 20 61 64 64 73 20 61 20 73  ise, it adds a s
9750: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74  ingle row of out
9760: 70 75 74 20 74 6f 20 74 68 65 20 45 51 50 20 72  put to the EQP r
9770: 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20  esult,.** where 
9780: 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f  the caption is o
9790: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f  f one of the two
97a0: 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   forms:.**.**   
97b0: 22 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55  "COMPOSITE SUBQU
97c0: 45 52 49 45 53 20 69 53 75 62 31 20 61 6e 64 20  ERIES iSub1 and 
97d0: 69 53 75 62 32 20 28 6f 70 29 22 0a 2a 2a 20 20  iSub2 (op)".**  
97e0: 20 22 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51   "COMPOSITE SUBQ
97f0: 55 45 52 49 45 53 20 69 53 75 62 31 20 61 6e 64  UERIES iSub1 and
9800: 20 69 53 75 62 32 20 55 53 49 4e 47 20 54 45 4d   iSub2 USING TEM
9810: 50 20 42 2d 54 52 45 45 20 28 6f 70 29 22 0a 2a  P B-TREE (op)".*
9820: 2a 0a 2a 2a 20 77 68 65 72 65 20 69 53 75 62 31  *.** where iSub1
9830: 20 61 6e 64 20 69 53 75 62 32 20 61 72 65 20 74   and iSub2 are t
9840: 68 65 20 69 6e 74 65 67 65 72 73 20 70 61 73 73  he integers pass
9850: 65 64 20 61 73 20 74 68 65 20 63 6f 72 72 65 73  ed as the corres
9860: 70 6f 6e 64 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  ponding.** funct
9870: 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 73 2c 20  ion parameters, 
9880: 61 6e 64 20 6f 70 20 69 73 20 74 68 65 20 74 65  and op is the te
9890: 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  xt representatio
98a0: 6e 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74  n of the paramet
98b0: 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d  er.** of the sam
98c0: 65 20 6e 61 6d 65 2e 20 54 68 65 20 70 61 72 61  e name. The para
98d0: 6d 65 74 65 72 20 22 6f 70 22 20 6d 75 73 74 20  meter "op" must 
98e0: 62 65 20 6f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49  be one of TK_UNI
98f0: 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 0a 2a  ON, TK_EXCEPT,.*
9900: 2a 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 6f  * TK_INTERSECT o
9910: 72 20 54 4b 5f 41 4c 4c 2e 20 54 68 65 20 66 69  r TK_ALL. The fi
9920: 72 73 74 20 66 6f 72 6d 20 69 73 20 75 73 65 64  rst form is used
9930: 20 69 66 20 61 72 67 75 6d 65 6e 74 20 62 55 73   if argument bUs
9940: 65 54 6d 70 20 69 73 20 0a 2a 2a 20 66 61 6c 73  eTmp is .** fals
9950: 65 2c 20 6f 72 20 74 68 65 20 73 65 63 6f 6e 64  e, or the second
9960: 20 66 6f 72 6d 20 69 66 20 69 74 20 69 73 20 74   form if it is t
9970: 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rue..*/.static v
9980: 6f 69 64 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f  oid explainCompo
9990: 73 69 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70  site(.  Parse *p
99a0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
99b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
99c0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
99d0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
99f0: 20 4f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e   One of TK_UNION
9a00: 2c 20 54 4b 5f 45 58 43 45 50 54 20 65 74 63 2e  , TK_EXCEPT etc.
9a10: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 31 2c   */.  int iSub1,
9a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a30: 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72        /* Subquer
9a40: 79 20 69 64 20 31 20 2a 2f 0a 20 20 69 6e 74 20  y id 1 */.  int 
9a50: 69 53 75 62 32 2c 20 20 20 20 20 20 20 20 20 20  iSub2,          
9a60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
9a70: 75 62 71 75 65 72 79 20 69 64 20 32 20 2a 2f 0a  ubquery id 2 */.
9a80: 20 20 69 6e 74 20 62 55 73 65 54 6d 70 20 20 20    int bUseTmp   
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9aa0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 74    /* True if a t
9ab0: 65 6d 70 20 74 61 62 6c 65 20 77 61 73 20 75 73  emp table was us
9ac0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  ed */.){.  asser
9ad0: 74 28 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  t( op==TK_UNION 
9ae0: 7c 7c 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  || op==TK_EXCEPT
9af0: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52   || op==TK_INTER
9b00: 53 45 43 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 41  SECT || op==TK_A
9b10: 4c 4c 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72  LL );.  if( pPar
9b20: 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
9b30: 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  {.    Vdbe *v = 
9b40: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
9b50: 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20     char *zMsg = 
9b60: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 0a  sqlite3MPrintf(.
9b70: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
9b80: 64 62 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 53 55  db, "COMPOUND SU
9b90: 42 51 55 45 52 49 45 53 20 25 64 20 41 4e 44 20  BQUERIES %d AND 
9ba0: 25 64 20 25 73 28 25 73 29 22 2c 20 69 53 75 62  %d %s(%s)", iSub
9bb0: 31 2c 20 69 53 75 62 32 2c 0a 20 20 20 20 20 20  1, iSub2,.      
9bc0: 20 20 62 55 73 65 54 6d 70 3f 22 55 53 49 4e 47    bUseTmp?"USING
9bd0: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 22 3a 22   TEMP B-TREE ":"
9be0: 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  ", selectOpName(
9bf0: 6f 70 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  op).    );.    s
9c00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
9c10: 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
9c20: 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
9c30: 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50  d, 0, 0, zMsg, P
9c40: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
9c50: 7d 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70  }.#else./* No-op
9c60: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
9c70: 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75   explainXXX() fu
9c80: 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72  nctions and macr
9c90: 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  os. */.# define 
9ca0: 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65  explainComposite
9cb0: 28 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64  (v,w,x,y,z).#end
9cc0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
9cd0: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20   inner loop was 
9ce0: 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20  generated using 
9cf0: 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65  a non-null pOrde
9d00: 72 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  rBy argument,.**
9d10: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
9d20: 73 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e  s were placed in
9d30: 20 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65   a sorter.  Afte
9d40: 72 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65  r the loop is te
9d50: 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e  rminated.** we n
9d60: 65 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73  eed to run the s
9d70: 6f 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74  orter and output
9d80: 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54   the results.  T
9d90: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
9da0: 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
9db0: 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65  s the code neede
9dc0: 64 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f  d to do that..*/
9dd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
9de0: 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20  erateSortTail(. 
9df0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9e00: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
9e10: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
9e20: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  t *p,        /* 
9e30: 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
9e40: 6d 65 6e 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74  ment */.  SortCt
9e50: 78 20 2a 70 53 6f 72 74 2c 20 20 20 2f 2a 20 49  x *pSort,   /* I
9e60: 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 74 68  nformation on th
9e70: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
9e80: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  e */.  int nColu
9e90: 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  mn,      /* Numb
9ea0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66  er of columns of
9eb0: 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63   data */.  Selec
9ec0: 74 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20  tDest *pDest /* 
9ed0: 57 72 69 74 65 20 74 68 65 20 73 6f 72 74 65 64  Write the sorted
9ee0: 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
9ef0: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
9f00: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
9f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f20: 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72     /* The prepar
9f30: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ed statement */.
9f40: 20 20 69 6e 74 20 61 64 64 72 42 72 65 61 6b 20    int addrBreak 
9f50: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
9f60: 65 4c 61 62 65 6c 28 76 29 3b 20 20 20 20 20 2f  eLabel(v);     /
9f70: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 65  * Jump here to e
9f80: 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  xit loop */.  in
9f90: 74 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d  t addrContinue =
9fa0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
9fb0: 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 4a 75  Label(v);  /* Ju
9fc0: 6d 70 20 68 65 72 65 20 66 6f 72 20 6e 65 78 74  mp here for next
9fd0: 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   cycle */.  int 
9fe0: 61 64 64 72 3b 0a 20 20 69 6e 74 20 61 64 64 72  addr;.  int addr
9ff0: 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Once = 0;.  int 
a000: 69 54 61 62 3b 0a 20 20 45 78 70 72 4c 69 73 74  iTab;.  ExprList
a010: 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53 6f   *pOrderBy = pSo
a020: 72 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  rt->pOrderBy;.  
a030: 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73  int eDest = pDes
a040: 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74 20  t->eDest;.  int 
a050: 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69  iParm = pDest->i
a060: 53 44 50 61 72 6d 3b 0a 20 20 69 6e 74 20 72 65  SDParm;.  int re
a070: 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52  gRow;.  int regR
a080: 6f 77 69 64 3b 0a 20 20 69 6e 74 20 6e 4b 65 79  owid;.  int nKey
a090: 3b 0a 20 20 69 6e 74 20 69 53 6f 72 74 54 61 62  ;.  int iSortTab
a0a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a0b0: 20 20 20 20 2f 2a 20 53 6f 72 74 65 72 20 63 75      /* Sorter cu
a0c0: 72 73 6f 72 20 74 6f 20 72 65 61 64 20 66 72 6f  rsor to read fro
a0d0: 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6f 72 74  m */.  int nSort
a0e0: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
a0f0: 20 20 20 20 20 20 20 2f 2a 20 54 72 61 69 6c 69         /* Traili
a100: 6e 67 20 76 61 6c 75 65 73 20 74 6f 20 72 65 61  ng values to rea
a110: 64 20 66 72 6f 6d 20 73 6f 72 74 65 72 20 2a 2f  d from sorter */
a120: 0a 20 20 75 38 20 70 35 3b 20 20 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 2f 2a 20 70 35 20 70 61 72 61 6d 65 74     /* p5 paramet
a150: 65 72 20 66 6f 72 20 31 73 74 20 4f 50 5f 43 6f  er for 1st OP_Co
a160: 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  lumn */.  int i;
a170: 0a 20 20 69 6e 74 20 62 53 65 71 3b 20 20 20 20  .  int bSeq;    
a180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a190: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f     /* True if so
a1a0: 72 74 65 72 20 72 65 63 6f 72 64 20 69 6e 63 6c  rter record incl
a1b0: 75 64 65 73 20 73 65 71 2e 20 6e 6f 2e 20 2a 2f  udes seq. no. */
a1c0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
a1d0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
a1e0: 4d 4d 45 4e 54 53 0a 20 20 73 74 72 75 63 74 20  MMENTS.  struct 
a1f0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
a200: 4f 75 74 45 78 20 3d 20 70 2d 3e 70 45 4c 69 73  OutEx = p->pELis
a210: 74 2d 3e 61 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  t->a;.#endif..  
a220: 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  if( pSort->label
a230: 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c  BkOut ){.    sql
a240: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a250: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72  , OP_Gosub, pSor
a260: 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53  t->regReturn, pS
a270: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29  ort->labelBkOut)
a280: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a290: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
a2a0: 74 6f 2c 20 30 2c 20 61 64 64 72 42 72 65 61 6b  to, 0, addrBreak
a2b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a2c0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
a2d0: 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  , pSort->labelBk
a2e0: 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 54 61 62  Out);.  }.  iTab
a2f0: 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73   = pSort->iECurs
a300: 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d  or;.  if( eDest=
a310: 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65  =SRT_Output || e
a320: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
a330: 69 6e 65 20 29 7b 0a 20 20 20 20 72 65 67 52 6f  ine ){.    regRo
a340: 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 67  wid = 0;.    reg
a350: 52 6f 77 20 3d 20 70 44 65 73 74 2d 3e 69 53 64  Row = pDest->iSd
a360: 73 74 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61 74  st;.    nSortDat
a370: 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d  a = nColumn;.  }
a380: 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77  else{.    regRow
a390: 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  id = sqlite3GetT
a3a0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
a3b0: 20 20 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c      regRow = sql
a3c0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
a3d0: 50 61 72 73 65 29 3b 0a 20 20 20 20 6e 53 6f 72  Parse);.    nSor
a3e0: 74 44 61 74 61 20 3d 20 31 3b 0a 20 20 7d 0a 20  tData = 1;.  }. 
a3f0: 20 6e 4b 65 79 20 3d 20 70 4f 72 64 65 72 42 79   nKey = pOrderBy
a400: 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d  ->nExpr - pSort-
a410: 3e 6e 4f 42 53 61 74 3b 0a 20 20 69 66 28 20 70  >nOBSat;.  if( p
a420: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
a430: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
a440: 72 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  rter ){.    int 
a450: 72 65 67 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70  regSortOut = ++p
a460: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
a470: 20 69 53 6f 72 74 54 61 62 20 3d 20 70 50 61 72   iSortTab = pPar
a480: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
a490: 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  if( pSort->label
a4a0: 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 61  BkOut ){.      a
a4b0: 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65  ddrOnce = sqlite
a4c0: 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65  3CodeOnce(pParse
a4d0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
a4e0: 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  v);.    }.    sq
a4f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
a500: 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
a510: 2c 20 69 53 6f 72 74 54 61 62 2c 20 72 65 67 53  , iSortTab, regS
a520: 6f 72 74 4f 75 74 2c 20 6e 4b 65 79 2b 31 2b 6e  ortOut, nKey+1+n
a530: 53 6f 72 74 44 61 74 61 29 3b 0a 20 20 20 20 69  SortData);.    i
a540: 66 28 20 61 64 64 72 4f 6e 63 65 20 29 20 73 71  f( addrOnce ) sq
a550: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
a560: 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a  e(v, addrOnce);.
a570: 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73      addr = 1 + s
a580: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a590: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72  (v, OP_SorterSor
a5a0: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65  t, iTab, addrBre
a5b0: 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ak);.    VdbeCov
a5c0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f  erage(v);.    co
a5d0: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69  deOffset(v, p->i
a5e0: 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74  Offset, addrCont
a5f0: 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  inue);.    sqlit
a600: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a610: 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69  OP_SorterData, i
a620: 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 29  Tab, regSortOut)
a630: 3b 0a 20 20 20 20 70 35 20 3d 20 4f 50 46 4c 41  ;.    p5 = OPFLA
a640: 47 5f 43 4c 45 41 52 43 41 43 48 45 3b 0a 20 20  G_CLEARCACHE;.  
a650: 20 20 62 53 65 71 20 3d 20 30 3b 0a 20 20 7d 65    bSeq = 0;.  }e
a660: 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 20 3d 20  lse{.    addr = 
a670: 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 + sqlite3VdbeA
a680: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
a690: 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65 61  , iTab, addrBrea
a6a0: 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
a6b0: 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66  (v);.    codeOff
a6c0: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
a6d0: 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  t, addrContinue)
a6e0: 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d  ;.    iSortTab =
a6f0: 20 69 54 61 62 3b 0a 20 20 20 20 70 35 20 3d 20   iTab;.    p5 = 
a700: 30 3b 0a 20 20 20 20 62 53 65 71 20 3d 20 31 3b  0;.    bSeq = 1;
a710: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
a720: 69 3c 6e 53 6f 72 74 44 61 74 61 3b 20 69 2b 2b  i<nSortData; i++
a730: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
a740: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
a750: 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62 2c  olumn, iSortTab,
a760: 20 6e 4b 65 79 2b 62 53 65 71 2b 69 2c 20 72 65   nKey+bSeq+i, re
a770: 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20 69 66 28  gRow+i);.    if(
a780: 20 69 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56   i==0 ) sqlite3V
a790: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70  dbeChangeP5(v, p
a7a0: 35 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  5);.    VdbeComm
a7b0: 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 61 4f  ent((v, "%s", aO
a7c0: 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3f 20  utEx[i].zName ? 
a7d0: 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20  aOutEx[i].zName 
a7e0: 3a 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 53 70 61  : aOutEx[i].zSpa
a7f0: 6e 29 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  n));.  }.  switc
a800: 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20  h( eDest ){.    
a810: 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a  case SRT_Table:.
a820: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68      case SRT_Eph
a830: 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 74  emTab: {.      t
a840: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
a850: 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20  SRT_Table );.   
a860: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
a870: 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
a880: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
a890: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a8a0: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72  P_NewRowid, iPar
a8b0: 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  m, regRowid);.  
a8c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a8d0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
a8e0: 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f  rt, iParm, regRo
a8f0: 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  w, regRowid);.  
a900: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
a910: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
a920: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
a930: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
a940: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a950: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
a960: 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
a970: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
a980: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
a990: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a9a0: 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
a9b0: 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 31 2c 20  ord, regRow, 1, 
a9c0: 72 65 67 52 6f 77 69 64 2c 0a 20 20 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 26 70 44 65 73 74 2d 3e 61 66 66 53 64 73    &pDest->affSds
a9f0: 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  t, 1);.      sql
aa00: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
aa10: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
aa20: 73 65 2c 20 72 65 67 52 6f 77 2c 20 31 29 3b 0a  se, regRow, 1);.
aa30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
aa40: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
aa50: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  xInsert, iParm, 
aa60: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
aa70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
aa80: 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
aa90: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
aaa0: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
aab0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
aac0: 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
aad0: 72 65 67 52 6f 77 2c 20 69 50 61 72 6d 2c 20 31  regRow, iParm, 1
aae0: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
aaf0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
ab00: 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  l terminate the 
ab10: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
ab20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ab30: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66  }.#endif.    def
ab40: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
ab50: 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54  sert( eDest==SRT
ab60: 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74  _Output || eDest
ab70: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
ab80: 29 3b 20 0a 20 20 20 20 20 20 74 65 73 74 63 61  ); .      testca
ab90: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  se( eDest==SRT_O
aba0: 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 74  utput );.      t
abb0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
abc0: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b  SRT_Coroutine );
abd0: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
abe0: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
abf0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ac00: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
ac10: 52 65 73 75 6c 74 52 6f 77 2c 20 70 44 65 73 74  ResultRow, pDest
ac20: 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e  ->iSdst, nColumn
ac30: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
ac40: 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
ac50: 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
ac60: 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20  , pDest->iSdst, 
ac70: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
ac80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
ac90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
aca0: 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44  (v, OP_Yield, pD
acb0: 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20  est->iSDParm);. 
acc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
acd0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
ace0: 69 66 28 20 72 65 67 52 6f 77 69 64 20 29 7b 0a  if( regRowid ){.
acf0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
ad00: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
ad10: 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20 73  , regRow);.    s
ad20: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
ad30: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
ad40: 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20 2f 2a  Rowid);.  }.  /*
ad50: 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74   The bottom of t
ad60: 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73  he loop.  */.  s
ad70: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
ad80: 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f  eLabel(v, addrCo
ad90: 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28 20 70  ntinue);.  if( p
ada0: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
adb0: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
adc0: 72 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rter ){.    sqli
add0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ade0: 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20   OP_SorterNext, 
adf0: 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62  iTab, addr); Vdb
ae00: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
ae10: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
ae20: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ae30: 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61  OP_Next, iTab, a
ae40: 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ddr); VdbeCovera
ae50: 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ge(v);.  }.  if(
ae60: 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72   pSort->regRetur
ae70: 6e 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41  n ) sqlite3VdbeA
ae80: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
ae90: 72 6e 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65  rn, pSort->regRe
aea0: 74 75 72 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33  turn);.  sqlite3
aeb0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
aec0: 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  (v, addrBreak);.
aed0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
aee0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
aef0: 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67  tring containing
af00: 20 74 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f   the 'declaratio
af10: 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a  n type' of the.*
af20: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  * expression pEx
af30: 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d  pr. The string m
af40: 61 79 20 62 65 20 74 72 65 61 74 65 64 20 61 73  ay be treated as
af50: 20 73 74 61 74 69 63 20 62 79 20 74 68 65 20 63   static by the c
af60: 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  aller..**.** Als
af70: 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74  o try to estimat
af80: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
af90: 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
afa0: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61 74   and return that
afb0: 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 2a 70  .** result in *p
afc0: 45 73 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a 2a 20  EstWidth..**.** 
afd0: 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  The declaration 
afe0: 74 79 70 65 20 69 73 20 74 68 65 20 65 78 61 63  type is the exac
aff0: 74 20 64 61 74 61 74 79 70 65 20 64 65 66 69 6e  t datatype defin
b000: 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20  ition extracted 
b010: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67  from the.** orig
b020: 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c  inal CREATE TABL
b030: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74  E statement if t
b040: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
b050: 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a   a column. The.*
b060: 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  * declaration ty
b070: 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66  pe for a ROWID f
b080: 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e  ield is INTEGER.
b090: 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20 61 6e   Exactly when an
b0a0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
b0b0: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63  s considered a c
b0c0: 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d  olumn can be com
b0d0: 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72 65 73  plex in the pres
b0e0: 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65 72 69  ence of subqueri
b0f0: 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c  es. The.** resul
b100: 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t-set expression
b110: 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   in all of the f
b120: 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54 20  ollowing SELECT 
b130: 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a  statements is .*
b140: 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63  * considered a c
b150: 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20 66 75  olumn by this fu
b160: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  nction..**.**   
b170: 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20  SELECT col FROM 
b180: 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  tbl;.**   SELECT
b190: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f   (SELECT col FRO
b1a0: 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45  M tbl;.**   SELE
b1b0: 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46  CT (SELECT col F
b1c0: 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53  ROM tbl);.**   S
b1d0: 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d 20 28  ELECT abc FROM (
b1e0: 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20 61 62  SELECT col AS ab
b1f0: 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20  c FROM tbl);.** 
b200: 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74  .** The declarat
b210: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 79  ion type for any
b220: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74 68 65   expression othe
b230: 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20  r than a column 
b240: 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  is NULL..**.** T
b250: 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20  his routine has 
b260: 65 69 74 68 65 72 20 33 20 6f 72 20 36 20 70 61  either 3 or 6 pa
b270: 72 61 6d 65 74 65 72 73 20 64 65 70 65 6e 64 69  rameters dependi
b280: 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ng on whether or
b290: 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 53 51 4c 49   not.** the SQLI
b2a0: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
b2b0: 5f 4d 45 54 41 44 41 54 41 20 63 6f 6d 70 69 6c  _METADATA compil
b2c0: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
b2d0: 20 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66   used..*/.#ifdef
b2e0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
b2f0: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 23  OLUMN_METADATA.#
b300: 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79   define columnTy
b310: 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20  pe(A,B,C,D,E,F) 
b320: 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41  columnTypeImpl(A
b330: 2c 42 2c 43 2c 44 2c 45 2c 46 29 0a 73 74 61 74  ,B,C,D,E,F).stat
b340: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  ic const char *c
b350: 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20  olumnTypeImpl(. 
b360: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
b370: 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70  C, .  Expr *pExp
b380: 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  r,.  const char 
b390: 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20 20 63 6f  **pzOrigDb,.  co
b3a0: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
b3b0: 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  gTab,.  const ch
b3c0: 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c 2c 0a  ar **pzOrigCol,.
b3d0: 20 20 75 38 20 2a 70 45 73 74 57 69 64 74 68 0a    u8 *pEstWidth.
b3e0: 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  ){.  char const 
b3f0: 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20  *zOrigDb = 0;.  
b400: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
b410: 67 54 61 62 20 3d 20 30 3b 0a 20 20 63 68 61 72  gTab = 0;.  char
b420: 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 43 6f 6c   const *zOrigCol
b430: 20 3d 20 30 3b 0a 23 65 6c 73 65 20 2f 2a 20 69   = 0;.#else /* i
b440: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
b450: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
b460: 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a 23 20 64  METADATA) */.# d
b470: 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65  efine columnType
b480: 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f  (A,B,C,D,E,F) co
b490: 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42  lumnTypeImpl(A,B
b4a0: 2c 46 29 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  ,F).static const
b4b0: 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70   char *columnTyp
b4c0: 65 49 6d 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e  eImpl(.  NameCon
b4d0: 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78  text *pNC, .  Ex
b4e0: 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 75 38 20  pr *pExpr,.  u8 
b4f0: 2a 70 45 73 74 57 69 64 74 68 0a 29 7b 0a 23 65  *pEstWidth.){.#e
b500: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
b510: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43  (SQLITE_ENABLE_C
b520: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20  OLUMN_METADATA) 
b530: 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  */.  char const 
b540: 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e  *zType = 0;.  in
b550: 74 20 6a 3b 0a 20 20 75 38 20 65 73 74 57 69 64  t j;.  u8 estWid
b560: 74 68 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 4e  th = 1;..  if( N
b570: 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20 7c  EVER(pExpr==0) |
b580: 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d  | pNC->pSrcList=
b590: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
b5a0: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
b5b0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
b5c0: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
b5d0: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
b5e0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
b5f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
b600: 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20   column. Locate 
b610: 74 68 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f  the table the co
b620: 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20  lumn is being.  
b630: 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64      ** extracted
b640: 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e   from in NameCon
b650: 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54  text.pSrcList. T
b660: 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65  his table may be
b670: 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64   real.      ** d
b680: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72  atabase table or
b690: 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20   a subquery..   
b6a0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c     */.      Tabl
b6b0: 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20  e *pTab = 0;    
b6c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
b6d0: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d   structure colum
b6e0: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
b6f0: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c  rom */.      Sel
b700: 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20  ect *pS = 0;    
b710: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
b720: 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  ct the column is
b730: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
b740: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  */.      int iCo
b750: 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  l = pExpr->iColu
b760: 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66  mn;  /* Index of
b770: 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20   column in pTab 
b780: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
b790: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
b7a0: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
b7b0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
b7c0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
b7d0: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 77 68 69  UMN );.      whi
b7e0: 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62  le( pNC && !pTab
b7f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c   ){.        SrcL
b800: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
b810: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
b820: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a         for(j=0;j
b830: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
b840: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a  && pTabList->a[j
b850: 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72  ].iCursor!=pExpr
b860: 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20  ->iTable;j++);. 
b870: 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61         if( j<pTa
b880: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20  bList->nSrc ){. 
b890: 20 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20           pTab = 
b8a0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
b8b0: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Tab;.          p
b8c0: 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  S = pTabList->a[
b8d0: 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  j].pSelect;.    
b8e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b8f0: 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e       pNC = pNC->
b900: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d  pNext;.        }
b910: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
b920: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
b930: 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65         /* At one
b940: 20 74 69 6d 65 2c 20 63 6f 64 65 20 73 75 63 68   time, code such
b950: 20 61 73 20 22 53 45 4c 45 43 54 20 6e 65 77 2e   as "SELECT new.
b960: 78 22 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  x" within a trig
b970: 67 65 72 20 77 6f 75 6c 64 0a 20 20 20 20 20 20  ger would.      
b980: 20 20 2a 2a 20 63 61 75 73 65 20 74 68 69 73 20    ** cause this 
b990: 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e  condition to run
b9a0: 2e 20 20 53 69 6e 63 65 20 74 68 65 6e 2c 20 77  .  Since then, w
b9b0: 65 20 68 61 76 65 20 72 65 73 74 72 75 63 74 75  e have restructu
b9c0: 72 65 64 20 68 6f 77 0a 20 20 20 20 20 20 20 20  red how.        
b9d0: 2a 2a 20 74 72 69 67 67 65 72 20 63 6f 64 65 20  ** trigger code 
b9e0: 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e 64  is generated and
b9f0: 20 73 6f 20 74 68 69 73 20 63 6f 6e 64 69 74 69   so this conditi
ba00: 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  on is no longer 
ba10: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73  .        ** poss
ba20: 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69  ible. However, i
ba30: 74 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 74  t can still be t
ba40: 72 75 65 20 66 6f 72 20 73 74 61 74 65 6d 65 6e  rue for statemen
ba50: 74 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20  ts like.        
ba60: 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
ba70: 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
ba80: 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45       **   CREATE
ba90: 20 54 41 42 4c 45 20 74 31 28 63 6f 6c 20 49 4e   TABLE t1(col IN
baa0: 54 45 47 45 52 29 3b 0a 20 20 20 20 20 20 20 20  TEGER);.        
bab0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
bac0: 45 43 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f 4d  ECT t1.col) FROM
bad0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
bae0: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
baf0: 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28  when columnType(
bb00: 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
bb10: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 74  he expression "t
bb20: 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a 20  1.col" in the . 
bb30: 20 20 20 20 20 20 20 2a 2a 20 73 75 62 2d 73 65         ** sub-se
bb40: 6c 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63 61  lect. In this ca
bb50: 73 65 2c 20 73 65 74 20 74 68 65 20 63 6f 6c 75  se, set the colu
bb60: 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c 2c  mn type to NULL,
bb70: 20 65 76 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   even.        **
bb80: 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c   though it shoul
bb90: 64 20 72 65 61 6c 6c 79 20 62 65 20 22 49 4e 54  d really be "INT
bba0: 45 47 45 52 22 2e 0a 20 20 20 20 20 20 20 20 2a  EGER"..        *
bbb0: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
bbc0: 73 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c  s is not a probl
bbd0: 65 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c 75 6d  em, as the colum
bbe0: 6e 20 74 79 70 65 20 6f 66 20 22 74 31 2e 63 6f  n type of "t1.co
bbf0: 6c 22 20 69 73 20 6e 65 76 65 72 0a 20 20 20 20  l" is never.    
bc00: 20 20 20 20 2a 2a 20 75 73 65 64 2e 20 57 68 65      ** used. Whe
bc10: 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69  n columnType() i
bc20: 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  s called on the 
bc30: 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 20 20  expression .    
bc40: 20 20 20 20 2a 2a 20 22 28 53 45 4c 45 43 54 20      ** "(SELECT 
bc50: 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63 6f  t1.col)", the co
bc60: 72 72 65 63 74 20 74 79 70 65 20 69 73 20 72 65  rrect type is re
bc70: 74 75 72 6e 65 64 20 28 73 65 65 20 74 68 65 20  turned (see the 
bc80: 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 20 20  TK_SELECT.      
bc90: 20 20 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c 6f    ** branch belo
bca0: 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  w.  */.        b
bcb0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
bcc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
bcd0: 62 20 26 26 20 70 45 78 70 72 2d 3e 70 54 61 62  b && pExpr->pTab
bce0: 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20  ==pTab );.      
bcf0: 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20 20 20  if( pS ){.      
bd00: 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c 65 22    /* The "table"
bd10: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73   is actually a s
bd20: 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61 20 76  ub-select or a v
bd30: 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  iew in the FROM 
bd40: 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a  clause.        *
bd50: 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  * of the SELECT 
bd60: 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74 75 72  statement. Retur
bd70: 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  n the declaratio
bd80: 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69 67 69  n type and origi
bd90: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  n.        ** dat
bda0: 61 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74  a for the result
bdb0: 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  -set column of t
bdc0: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20  he sub-select.. 
bdd0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
bde0: 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26    if( iCol>=0 &&
bdf0: 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70 53 2d   ALWAYS(iCol<pS-
be00: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20  >pEList->nExpr) 
be10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
be20: 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20  If iCol is less 
be30: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
be40: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72  the expression r
be50: 65 71 75 65 73 74 73 20 74 68 65 0a 20 20 20 20  equests the.    
be60: 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f        ** rowid o
be70: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
be80: 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20 65   or view. This e
be90: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67  xpression is leg
bea0: 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20 20  al (see .       
beb0: 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20     ** test case 
bec0: 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20  misc2.2.2) - it 
bed0: 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65 73  always evaluates
bee0: 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20   to NULL..      
bef0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
bf00: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
bf10: 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  ;.          Expr
bf20: 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74   *p = pS->pEList
bf30: 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b  ->a[iCol].pExpr;
bf40: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
bf50: 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53  SrcList = pS->pS
bf60: 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  rc;.          sN
bf70: 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20  C.pNext = pNC;. 
bf80: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61           sNC.pPa
bf90: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
bfa0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  e;.          zTy
bfb0: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
bfc0: 26 73 4e 43 2c 20 70 2c 26 7a 4f 72 69 67 44 62  &sNC, p,&zOrigDb
bfd0: 2c 26 7a 4f 72 69 67 54 61 62 2c 26 7a 4f 72 69  ,&zOrigTab,&zOri
bfe0: 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68 29  gCol, &estWidth)
bff0: 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ; .        }.   
c000: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61     }else if( pTa
c010: 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  b->pSchema ){.  
c020: 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20        /* A real 
c030: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
c040: 20 61 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a   assert( !pS );.
c050: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
c060: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
c070: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20  ->iPKey;.       
c080: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d   assert( iCol==-
c090: 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26  1 || (iCol>=0 &&
c0a0: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
c0b0: 29 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ) );.#ifdef SQLI
c0c0: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
c0d0: 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20 20  _METADATA.      
c0e0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
c0f0: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
c100: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
c110: 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20         zOrigCol 
c120: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
c130: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c140: 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62      zType = pTab
c150: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79  ->aCol[iCol].zTy
c160: 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  pe;.          zO
c170: 72 69 67 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61  rigCol = pTab->a
c180: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b  Col[iCol].zName;
c190: 0a 20 20 20 20 20 20 20 20 20 20 65 73 74 57 69  .          estWi
c1a0: 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  dth = pTab->aCol
c1b0: 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20  [iCol].szEst;.  
c1c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c1d0: 7a 4f 72 69 67 54 61 62 20 3d 20 70 54 61 62 2d  zOrigTab = pTab-
c1e0: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
c1f0: 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20  if( pNC->pParse 
c200: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
c210: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
c220: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d  hemaToIndex(pNC-
c230: 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  >pParse->db, pTa
c240: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
c250: 20 20 20 20 20 20 20 7a 4f 72 69 67 44 62 20 3d         zOrigDb =
c260: 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62   pNC->pParse->db
c270: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
c280: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6c 73  ;.        }.#els
c290: 65 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  e.        if( iC
c2a0: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
c2b0: 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47    zType = "INTEG
c2c0: 45 52 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ER";.        }el
c2d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  se{.          zT
c2e0: 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ype = pTab->aCol
c2f0: 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20  [iCol].zType;.  
c300: 20 20 20 20 20 20 20 20 65 73 74 57 69 64 74 68          estWidth
c310: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
c320: 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20 20 20 20  ol].szEst;.     
c330: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
c340: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
c350: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
c360: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
c370: 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
c380: 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  SELECT: {.      
c390: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
c3a0: 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63  n is a sub-selec
c3b0: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  t. Return the de
c3c0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61  claration type a
c3d0: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69 67  nd.      ** orig
c3e0: 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68 65 20  in info for the 
c3f0: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e  single column in
c400: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
c410: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20  of the SELECT.  
c420: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
c430: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
c440: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
c450: 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  ;.      Select *
c460: 70 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53  pS = pExpr->x.pS
c470: 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70  elect;.      Exp
c480: 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73  r *p = pS->pELis
c490: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
c4a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70       assert( Exp
c4b0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
c4c0: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
c4d0: 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70  ) );.      sNC.p
c4e0: 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53  SrcList = pS->pS
c4f0: 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e  rc;.      sNC.pN
c500: 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20  ext = pNC;.     
c510: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e   sNC.pParse = pN
c520: 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20  C->pParse;.     
c530: 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
c540: 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f  ype(&sNC, p, &zO
c550: 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62  rigDb, &zOrigTab
c560: 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65 73  , &zOrigCol, &es
c570: 74 57 69 64 74 68 29 3b 20 0a 20 20 20 20 20 20  tWidth); .      
c580: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
c590: 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  dif.  }..#ifdef 
c5a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
c5b0: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 20 0a  LUMN_METADATA  .
c5c0: 20 20 69 66 28 20 70 7a 4f 72 69 67 44 62 20 29    if( pzOrigDb )
c5d0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 7a  {.    assert( pz
c5e0: 4f 72 69 67 54 61 62 20 26 26 20 70 7a 4f 72 69  OrigTab && pzOri
c5f0: 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a 4f  gCol );.    *pzO
c600: 72 69 67 44 62 20 3d 20 7a 4f 72 69 67 44 62 3b  rigDb = zOrigDb;
c610: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54 61 62 20  .    *pzOrigTab 
c620: 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20 20 20 20  = zOrigTab;.    
c630: 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a 4f 72  *pzOrigCol = zOr
c640: 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e 64 69  igCol;.  }.#endi
c650: 66 0a 20 20 69 66 28 20 70 45 73 74 57 69 64 74  f.  if( pEstWidt
c660: 68 20 29 20 2a 70 45 73 74 57 69 64 74 68 20 3d  h ) *pEstWidth =
c670: 20 65 73 74 57 69 64 74 68 3b 0a 20 20 72 65 74   estWidth;.  ret
c680: 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a  urn zType;.}../*
c690: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
c6a0: 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c  e that will tell
c6b0: 20 74 68 65 20 56 44 42 45 20 74 68 65 20 64 65   the VDBE the de
c6c0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 73 20  claration types 
c6d0: 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e  of columns.** in
c6e0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
c6f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c700: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79  generateColumnTy
c710: 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  pes(.  Parse *pP
c720: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
c730: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
c740: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
c750: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
c760: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70   tables */.  Exp
c770: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
c780: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
c790: 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73  defining the res
c7a0: 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 23 69  ult set */.){.#i
c7b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c7c0: 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 56 64 62  T_DECLTYPE.  Vdb
c7d0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
c7e0: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
c7f0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
c800: 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74  ;.  sNC.pSrcList
c810: 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 73   = pTabList;.  s
c820: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  NC.pParse = pPar
c830: 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  se;.  for(i=0; i
c840: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
c850: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
c860: 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  p = pEList->a[i]
c870: 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73  .pExpr;.    cons
c880: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 23  t char *zType;.#
c890: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
c8a0: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
c8b0: 41 54 41 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ATA.    const ch
c8c0: 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b  ar *zOrigDb = 0;
c8d0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
c8e0: 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20  *zOrigTab = 0;. 
c8f0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
c900: 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  OrigCol = 0;.   
c910: 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
c920: 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f  ype(&sNC, p, &zO
c930: 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62  rigDb, &zOrigTab
c940: 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 30 29 3b  , &zOrigCol, 0);
c950: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62  ..    /* The vdb
c960: 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73 20  e must make its 
c970: 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20  own copy of the 
c980: 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20  column-type and 
c990: 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f  other .    ** co
c9a0: 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73 74  lumn specific st
c9b0: 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20 74  rings, in case t
c9c0: 68 65 20 73 63 68 65 6d 61 20 69 73 20 72 65 73  he schema is res
c9d0: 65 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a 20  et before this. 
c9e0: 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61     ** virtual ma
c9f0: 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64  chine is deleted
ca00: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
ca10: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
ca20: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
ca30: 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69 67  _DATABASE, zOrig
ca40: 44 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  Db, SQLITE_TRANS
ca50: 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
ca60: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
ca70: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54  (v, i, COLNAME_T
ca80: 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c 20  ABLE, zOrigTab, 
ca90: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
caa0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
cab0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
cac0: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d  i, COLNAME_COLUM
cad0: 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53 51 4c  N, zOrigCol, SQL
cae0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
caf0: 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70 65 20  #else.    zType 
cb00: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
cb10: 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 2c 20 30  C, p, 0, 0, 0, 0
cb20: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
cb30: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
cb40: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
cb50: 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70  E_DECLTYPE, zTyp
cb60: 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  e, SQLITE_TRANSI
cb70: 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ENT);.  }.#endif
cb80: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
cb90: 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50  ITE_OMIT_DECLTYP
cba0: 45 29 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  E) */.}../*.** G
cbb0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
cbc0: 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20  t will tell the 
cbd0: 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f  VDBE the names o
cbe0: 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  f columns.** in 
cbf0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
cc00: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
cc10: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f  n is used to pro
cc20: 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f  vide the.** azCo
cc30: 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68  l[] values in th
cc40: 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73  e callback..*/.s
cc50: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
cc60: 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a  ateColumnNames(.
cc70: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
cc80: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
cc90: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
cca0: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
ccb0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
ccc0: 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  es */.  ExprList
ccd0: 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45   *pEList    /* E
cce0: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e  xpressions defin
ccf0: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73  ing the result s
cd00: 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  et */.){.  Vdbe 
cd10: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
cd20: 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  be;.  int i, j;.
cd30: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
cd40: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
cd50: 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f  t fullNames, sho
cd60: 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65  rtNames;..#ifnde
cd70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
cd80: 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68  PLAIN.  /* If th
cd90: 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e  is is an EXPLAIN
cda0: 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74 65 70  , skip this step
cdb0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
cdc0: 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
cdd0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
cde0: 64 69 66 0a 0a 20 20 69 66 28 20 70 50 61 72 73  dif..  if( pPars
cdf0: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c  e->colNamesSet |
ce00: 7c 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 7c 7c  | NEVER(v==0) ||
ce10: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
ce20: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50  d ) return;.  pP
ce30: 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
ce40: 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d  t = 1;.  fullNam
ce50: 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  es = (db->flags 
ce60: 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c  & SQLITE_FullCol
ce70: 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f  Names)!=0;.  sho
ce80: 72 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66  rtNames = (db->f
ce90: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68  lags & SQLITE_Sh
cea0: 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b  ortColNames)!=0;
ceb0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  .  sqlite3VdbeSe
cec0: 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69  tNumCols(v, pELi
ced0: 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f  st->nExpr);.  fo
cee0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
cef0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
cf00: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 70    Expr *p;.    p
cf10: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
cf20: 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 4e  pExpr;.    if( N
cf30: 45 56 45 52 28 70 3d 3d 30 29 20 29 20 63 6f 6e  EVER(p==0) ) con
cf40: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
cf50: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
cf60: 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  e ){.      char 
cf70: 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d  *zName = pEList-
cf80: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[i].zName;.   
cf90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
cfa0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
cfb0: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61  OLNAME_NAME, zNa
cfc0: 6d 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  me, SQLITE_TRANS
cfd0: 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65  IENT);.    }else
cfe0: 20 69 66 28 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f   if( (p->op==TK_
cff0: 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 6f 70 3d  COLUMN || p->op=
d000: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20  =TK_AGG_COLUMN) 
d010: 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20  && pTabList ){. 
d020: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
d030: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43  ;.      char *zC
d040: 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  ol;.      int iC
d050: 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b  ol = p->iColumn;
d060: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
d070: 41 4c 57 41 59 53 28 6a 3c 70 54 61 62 4c 69 73  ALWAYS(j<pTabLis
d080: 74 2d 3e 6e 53 72 63 29 3b 20 6a 2b 2b 29 7b 0a  t->nSrc); j++){.
d090: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62          if( pTab
d0a0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73  List->a[j].iCurs
d0b0: 6f 72 3d 3d 70 2d 3e 69 54 61 62 6c 65 20 29 20  or==p->iTable ) 
d0c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
d0d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70       assert( j<p
d0e0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b  TabList->nSrc );
d0f0: 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54  .      pTab = pT
d100: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61  abList->a[j].pTa
d110: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  b;.      if( iCo
d120: 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61  l<0 ) iCol = pTa
d130: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
d140: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31  assert( iCol==-1
d150: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
d160: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
d170: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43   );.      if( iC
d180: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
d190: 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a  zCol = "rowid";.
d1a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d1b0: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62       zCol = pTab
d1c0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
d1d0: 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  me;.      }.    
d1e0: 20 20 69 66 28 20 21 73 68 6f 72 74 4e 61 6d 65    if( !shortName
d1f0: 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20  s && !fullNames 
d200: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
d210: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
d220: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
d230: 41 4d 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  AME, .          
d240: 20 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75    sqlite3DbStrDu
d250: 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  p(db, pEList->a[
d260: 69 5d 2e 7a 53 70 61 6e 29 2c 20 53 51 4c 49 54  i].zSpan), SQLIT
d270: 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  E_DYNAMIC);.    
d280: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 75 6c 6c    }else if( full
d290: 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20  Names ){.       
d2a0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
d2b0: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
d2c0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
d2d0: 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54  (db, "%s.%s", pT
d2e0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  ab->zName, zCol)
d2f0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
d300: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
d310: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
d320: 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54  ME, zName, SQLIT
d330: 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  E_DYNAMIC);.    
d340: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d350: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
d360: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
d370: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c  NAME_NAME, zCol,
d380: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
d390: 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T);.      }.    
d3a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e  }else{.      con
d3b0: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 4c  st char *z = pEL
d3c0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b  ist->a[i].zSpan;
d3d0: 0a 20 20 20 20 20 20 7a 20 3d 20 7a 3d 3d 30 20  .      z = z==0 
d3e0: 3f 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  ? sqlite3MPrintf
d3f0: 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c  (db, "column%d",
d400: 20 69 2b 31 29 20 3a 20 73 71 6c 69 74 65 33 44   i+1) : sqlite3D
d410: 62 53 74 72 44 75 70 28 64 62 2c 20 7a 29 3b 0a  bStrDup(db, z);.
d420: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d430: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
d440: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
d450: 7a 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  z, SQLITE_DYNAMI
d460: 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  C);.    }.  }.  
d470: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79  generateColumnTy
d480: 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  pes(pParse, pTab
d490: 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d  List, pEList);.}
d4a0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e  ../*.** Given an
d4b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
d4c0: 20 28 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c   (which is reall
d4d0: 79 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78  y the list of ex
d4e0: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61  pressions.** tha
d4f0: 74 20 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c  t form the resul
d500: 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43  t set of a SELEC
d510: 54 20 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d  T statement) com
d520: 70 75 74 65 20 61 70 70 72 6f 70 72 69 61 74 65  pute appropriate
d530: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  .** column names
d540: 20 66 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61   for a table tha
d550: 74 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65  t would hold the
d560: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
d570: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75  ..**.** All colu
d580: 6d 6e 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65  mn names will be
d590: 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f   unique..**.** O
d5a0: 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  nly the column n
d5b0: 61 6d 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65  ames are compute
d5c0: 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65  d.  Column.zType
d5d0: 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a  , Column.zColl,.
d5e0: 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65  ** and other fie
d5f0: 6c 64 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72  lds of Column ar
d600: 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20  e zeroed..**.** 
d610: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
d620: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
d630: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
d640: 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
d650: 73 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c  s,.** store NULL
d660: 20 69 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30   in *paCol and 0
d670: 20 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72   in *pnCol and r
d680: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
d690: 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EM..*/.static in
d6a0: 74 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46  t selectColumnsF
d6b0: 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50  romExprList(.  P
d6c0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
d6d0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
d6e0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
d6f0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
d700: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 6c         /* Expr l
d710: 69 73 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74  ist from which t
d720: 6f 20 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20  o derive column 
d730: 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 31 36 20 2a  names */.  i16 *
d740: 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  pnCol,          
d750: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
d760: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
d770: 73 20 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75  s here */.  Colu
d780: 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20  mn **paCol      
d790: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
d7a0: 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   new column list
d7b0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71   here */.){.  sq
d7c0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
d7d0: 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61 74  se->db;   /* Dat
d7e0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
d7f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20   */.  int i, j; 
d800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d810: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
d820: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b  rs */.  int cnt;
d830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d840: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 61 64 64      /* Index add
d850: 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e  ed to make the n
d860: 61 6d 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20  ame unique */.  
d870: 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70  Column *aCol, *p
d880: 43 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  Col;        /* F
d890: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
d8a0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a  result columns *
d8b0: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20  /.  int nCol;   
d8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
d8e0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
d8f0: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72  lt set */.  Expr
d900: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
d910: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
d920: 73 73 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67  ssion for a sing
d930: 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  le result column
d940: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
d950: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
d960: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65    /* Column name
d970: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
d980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d990: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d    /* Size of nam
d9a0: 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a  e in zName[] */.
d9b0: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20 29 7b  .  if( pEList ){
d9c0: 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 45 4c 69  .    nCol = pELi
d9d0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61  st->nExpr;.    a
d9e0: 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Col = sqlite3DbM
d9f0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
da00: 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43  zeof(aCol[0])*nC
da10: 6f 6c 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ol);.    testcas
da20: 65 28 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20  e( aCol==0 );.  
da30: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20  }else{.    nCol 
da40: 3d 20 30 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20  = 0;.    aCol = 
da50: 30 3b 0a 20 20 7d 0a 20 20 2a 70 6e 43 6f 6c 20  0;.  }.  *pnCol 
da60: 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43 6f 6c  = nCol;.  *paCol
da70: 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f 72 28   = aCol;..  for(
da80: 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20  i=0, pCol=aCol; 
da90: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  i<nCol; i++, pCo
daa0: 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74  l++){.    /* Get
dab0: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
dac0: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c  name for the col
dad0: 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  umn.    */.    p
dae0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
daf0: 69 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69 73 74  ipCollate(pEList
db00: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
db10: 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20     if( (zName = 
db20: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
db30: 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
db40: 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  /* If the column
db50: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53   contains an "AS
db60: 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c   <name>" phrase,
db70: 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74   use <name> as t
db80: 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  he name */.     
db90: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
dba0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61  DbStrDup(db, zNa
dbb0: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
dbc0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c        Expr *pCol
dbd0: 45 78 70 72 20 3d 20 70 3b 20 20 2f 2a 20 54 68  Expr = p;  /* Th
dbe0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
dbf0: 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20  t is the result 
dc00: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  column name */. 
dc10: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
dc20: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ;         /* Tab
dc30: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
dc40: 74 68 20 74 68 69 73 20 65 78 70 72 65 73 73 69  th this expressi
dc50: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c  on */.      whil
dc60: 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d  e( pColExpr->op=
dc70: 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20  =TK_DOT ){.     
dc80: 20 20 20 70 43 6f 6c 45 78 70 72 20 3d 20 70 43     pColExpr = pC
dc90: 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  olExpr->pRight;.
dca0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
dcb0: 70 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a 20  pColExpr!=0 );. 
dcc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
dcd0: 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54   pColExpr->op==T
dce0: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41 4c 57 41  K_COLUMN && ALWA
dcf0: 59 53 28 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61  YS(pColExpr->pTa
dd00: 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  b!=0) ){.       
dd10: 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20   /* For columns 
dd20: 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  use the column n
dd30: 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ame name */.    
dd40: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
dd50: 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ColExpr->iColumn
dd60: 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d  ;.        pTab =
dd70: 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62 3b   pColExpr->pTab;
dd80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
dd90: 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61  l<0 ) iCol = pTa
dda0: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
ddb0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
ddc0: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
ddd0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
dde0: 20 20 20 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54      iCol>=0 ? pT
ddf0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
de00: 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22 29 3b  Name : "rowid");
de10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
de20: 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54   pColExpr->op==T
de30: 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20  K_ID ){.        
de40: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
de50: 50 72 6f 70 65 72 74 79 28 70 43 6f 6c 45 78 70  Property(pColExp
de60: 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
de70: 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  );.        zName
de80: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
de90: 66 28 64 62 2c 20 22 25 73 22 2c 20 70 43 6f 6c  f(db, "%s", pCol
dea0: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
deb0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
dec0: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65        /* Use the
ded0: 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f   original text o
dee0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70  f the column exp
def0: 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e  ression as its n
df00: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a  ame */.        z
df10: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
df20: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20  rintf(db, "%s", 
df30: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70  pEList->a[i].zSp
df40: 61 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  an);.      }.   
df50: 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d   }.    if( db->m
df60: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
df70: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
df80: 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ee(db, zName);. 
df90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
dfa0: 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  }..    /* Make s
dfb0: 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ure the column n
dfc0: 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20  ame is unique.  
dfd0: 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e  If the name is n
dfe0: 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a  ot unique,.    *
dff0: 2a 20 61 70 70 65 6e 64 20 61 6e 20 69 6e 74 65  * append an inte
e000: 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20  ger to the name 
e010: 73 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d  so that it becom
e020: 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a  es unique..    *
e030: 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71  /.    nName = sq
e040: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
e050: 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  ame);.    for(j=
e060: 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29  cnt=0; j<i; j++)
e070: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
e080: 74 65 33 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b  te3StrICmp(aCol[
e090: 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  j].zName, zName)
e0a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
e0b0: 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65 3b 0a 20  har *zNewName;. 
e0c0: 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20         int k;.  
e0d0: 20 20 20 20 20 20 66 6f 72 28 6b 3d 6e 4e 61 6d        for(k=nNam
e0e0: 65 2d 31 3b 20 6b 3e 31 20 26 26 20 73 71 6c 69  e-1; k>1 && sqli
e0f0: 74 65 33 49 73 64 69 67 69 74 28 7a 4e 61 6d 65  te3Isdigit(zName
e100: 5b 6b 5d 29 3b 20 6b 2d 2d 29 7b 7d 0a 20 20 20  [k]); k--){}.   
e110: 20 20 20 20 20 69 66 28 20 6b 3e 3d 30 20 26 26       if( k>=0 &&
e120: 20 7a 4e 61 6d 65 5b 6b 5d 3d 3d 27 3a 27 20 29   zName[k]==':' )
e130: 20 6e 4e 61 6d 65 20 3d 20 6b 3b 0a 20 20 20 20   nName = k;.    
e140: 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d      zName[nName]
e150: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e   = 0;.        zN
e160: 65 77 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  ewName = sqlite3
e170: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 3a  MPrintf(db, "%s:
e180: 25 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e  %d", zName, ++cn
e190: 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
e1a0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
e1b0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e  ame);.        zN
e1c0: 61 6d 65 20 3d 20 7a 4e 65 77 4e 61 6d 65 3b 0a  ame = zNewName;.
e1d0: 20 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a          j = -1;.
e1e0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d          if( zNam
e1f0: 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  e==0 ) break;.  
e200: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
e210: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e  pCol->zName = zN
e220: 61 6d 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  ame;.  }.  if( d
e230: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
e240: 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ){.    for(j=0; 
e250: 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<i; j++){.     
e260: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
e270: 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b, aCol[j].zName
e280: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
e290: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61  ite3DbFree(db, a
e2a0: 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c  Col);.    *paCol
e2b0: 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c   = 0;.    *pnCol
e2c0: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
e2d0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
e2e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
e2f0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
e300: 41 64 64 20 74 79 70 65 20 61 6e 64 20 63 6f 6c  Add type and col
e310: 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  lation informati
e320: 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c  on to a column l
e330: 69 73 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ist based on.** 
e340: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
e350: 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 63  nt..** .** The c
e360: 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72 65 73 75  olumn list presu
e370: 6d 61 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d 20  mably came from 
e380: 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65  selectColumnName
e390: 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 29 2e  sFromExprList().
e3a0: 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c  .** The column l
e3b0: 69 73 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61 6d  ist has only nam
e3c0: 65 73 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f 72  es, not types or
e3d0: 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54 68   collations.  Th
e3e0: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 6f  is.** routine go
e3f0: 65 73 20 74 68 72 6f 75 67 68 20 61 6e 64 20 61  es through and a
e400: 64 64 73 20 74 68 65 20 74 79 70 65 73 20 61 6e  dds the types an
e410: 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a  d collations..**
e420: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
e430: 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20 61   requires that a
e440: 6c 6c 20 69 64 65 6e 74 69 66 69 65 72 73 20 69  ll identifiers i
e450: 6e 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20  n the SELECT.** 
e460: 73 74 61 74 65 6d 65 6e 74 20 62 65 20 72 65 73  statement be res
e470: 6f 6c 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  olved..*/.static
e480: 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64 43   void selectAddC
e490: 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c  olumnTypeAndColl
e4a0: 61 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a  ation(.  Parse *
e4b0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
e4c0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
e4d0: 74 73 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  ts */.  Table *p
e4e0: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Tab,          /*
e4f0: 20 41 64 64 20 63 6f 6c 75 6d 6e 20 74 79 70 65   Add column type
e500: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
e510: 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
e520: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
e530: 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20        /* SELECT 
e540: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
e550: 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c  e types and coll
e560: 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73  ations */.){.  s
e570: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
e580: 72 73 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65 43  rse->db;.  NameC
e590: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 43 6f  ontext sNC;.  Co
e5a0: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f  lumn *pCol;.  Co
e5b0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
e5c0: 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70  int i;.  Expr *p
e5d0: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
e5e0: 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 75  ist_item *a;.  u
e5f0: 36 34 20 73 7a 41 6c 6c 20 3d 20 30 3b 0a 0a 20  64 szAll = 0;.. 
e600: 20 61 73 73 65 72 74 28 20 70 53 65 6c 65 63 74   assert( pSelect
e610: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
e620: 20 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c   (pSelect->selFl
e630: 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65  ags & SF_Resolve
e640: 64 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  d)!=0 );.  asser
e650: 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 70  t( pTab->nCol==p
e660: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
e670: 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  nExpr || db->mal
e680: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
e690: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
e6a0: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
e6b0: 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
e6c0: 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
e6d0: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
e6e0: 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20  Select->pSrc;.  
e6f0: 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  a = pSelect->pEL
e700: 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d  ist->a;.  for(i=
e710: 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43  0, pCol=pTab->aC
e720: 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  ol; i<pTab->nCol
e730: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
e740: 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70 45 78      p = a[i].pEx
e750: 70 72 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 54  pr;.    pCol->zT
e760: 79 70 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ype = sqlite3DbS
e770: 74 72 44 75 70 28 64 62 2c 20 63 6f 6c 75 6d 6e  trDup(db, column
e780: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 30 2c 30  Type(&sNC, p,0,0
e790: 2c 30 2c 20 26 70 43 6f 6c 2d 3e 73 7a 45 73 74  ,0, &pCol->szEst
e7a0: 29 29 3b 0a 20 20 20 20 73 7a 41 6c 6c 20 2b 3d  ));.    szAll +=
e7b0: 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20   pCol->szEst;.  
e7c0: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
e7d0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
e7e0: 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20 20 69  finity(p);.    i
e7f0: 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  f( pCol->affinit
e800: 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e 61 66 66  y==0 ) pCol->aff
e810: 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
e820: 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 70 43 6f  FF_NONE;.    pCo
e830: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
e840: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
e850: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  p);.    if( pCol
e860: 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  l ){.      pCol-
e870: 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  >zColl = sqlite3
e880: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 6f  DbStrDup(db, pCo
e890: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
e8a0: 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 73 7a  }.  }.  pTab->sz
e8b0: 54 61 62 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  TabRow = sqlite3
e8c0: 4c 6f 67 45 73 74 28 73 7a 41 6c 6c 2a 34 29 3b  LogEst(szAll*4);
e8d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
e8e0: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
e8f0: 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54  nt, generate a T
e900: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
e910: 68 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a  hat describes.**
e920: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
e930: 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a  of that SELECT..
e940: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
e950: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
e960: 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ct(Parse *pParse
e970: 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
e980: 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  t){.  Table *pTa
e990: 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  b;.  sqlite3 *db
e9a0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
e9b0: 20 69 6e 74 20 73 61 76 65 64 46 6c 61 67 73 3b   int savedFlags;
e9c0: 0a 0a 20 20 73 61 76 65 64 46 6c 61 67 73 20 3d  ..  savedFlags =
e9d0: 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62   db->flags;.  db
e9e0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
e9f0: 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b  TE_FullColNames;
ea00: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20  .  db->flags |= 
ea10: 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
ea20: 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 53  ames;.  sqlite3S
ea30: 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65  electPrep(pParse
ea40: 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  , pSelect, 0);. 
ea50: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
ea60: 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
ea70: 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e  while( pSelect->
ea80: 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74  pPrior ) pSelect
ea90: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69   = pSelect->pPri
eaa0: 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  or;.  db->flags 
eab0: 3d 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 20 20  = savedFlags;.  
eac0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pTab = sqlite3Db
ead0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
eae0: 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a  izeof(Table) );.
eaf0: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
eb00: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
eb10: 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69   }.  /* The sqli
eb20: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
eb30: 6c 65 63 74 28 29 20 69 73 20 6f 6e 6c 79 20 75  lect() is only u
eb40: 73 65 64 20 6e 20 63 6f 6e 74 65 78 74 73 20 77  sed n contexts w
eb50: 68 65 72 65 20 6c 6f 6f 6b 61 73 69 64 65 0a 20  here lookaside. 
eb60: 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 20   ** is disabled 
eb70: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  */.  assert( db-
eb80: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
eb90: 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 70 54 61 62  led==0 );.  pTab
eba0: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54  ->nRef = 1;.  pT
ebb0: 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  ab->zName = 0;. 
ebc0: 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
ebd0: 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28  t = 200; assert(
ebe0: 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67   200==sqlite3Log
ebf0: 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a  Est(1048576) );.
ec00: 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46    selectColumnsF
ec10: 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
ec20: 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  se, pSelect->pEL
ec30: 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c  ist, &pTab->nCol
ec40: 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  , &pTab->aCol);.
ec50: 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d    selectAddColum
ec60: 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
ec70: 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  n(pParse, pTab, 
ec80: 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62  pSelect);.  pTab
ec90: 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
eca0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
ecb0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
ecc0: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
ecd0: 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 72 65  b, pTab);.    re
ece0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
ecf0: 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
ed00: 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66  .** Get a VDBE f
ed10: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72  or the given par
ed20: 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72  ser context.  Cr
ed30: 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
ed40: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
ed50: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
ed60: 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  rs, return NULL 
ed70: 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73  and leave a mess
ed80: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  age in pParse..*
ed90: 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47  /.Vdbe *sqlite3G
eda0: 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50  etVdbe(Parse *pP
edb0: 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
edc0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
edd0: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a  ;.  if( v==0 ){.
ede0: 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e      v = pParse->
edf0: 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56  pVdbe = sqlite3V
ee00: 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65  dbeCreate(pParse
ee10: 29 3b 0a 20 20 20 20 69 66 28 20 76 20 29 20 73  );.    if( v ) s
ee20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
ee30: 28 76 2c 20 4f 50 5f 49 6e 69 74 29 3b 0a 20 20  (v, OP_Init);.  
ee40: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 54    if( pParse->pT
ee50: 6f 70 6c 65 76 65 6c 3d 3d 30 0a 20 20 20 20 20  oplevel==0.     
ee60: 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
ee70: 6e 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64  nabled(pParse->d
ee80: 62 2c 53 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f  b,SQLITE_FactorO
ee90: 75 74 43 6f 6e 73 74 29 0a 20 20 20 20 29 7b 0a  utConst).    ){.
eea0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6f 6b        pParse->ok
eeb0: 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d 20 31 3b  ConstFactor = 1;
eec0: 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a 20 20 72 65  .    }..  }.  re
eed0: 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn v;.}.../*.*
eee0: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c  * Compute the iL
eef0: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
ef00: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53   fields of the S
ef10: 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74  ELECT based on t
ef20: 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64  he.** pLimit and
ef30: 20 70 4f 66 66 73 65 74 20 65 78 70 72 65 73 73   pOffset express
ef40: 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e  ions.  pLimit an
ef50: 64 20 70 4f 66 66 73 65 74 20 68 6f 6c 64 20 74  d pOffset hold t
ef60: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  he expressions.*
ef70: 2a 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  * that appear in
ef80: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
ef90: 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65  L statement afte
efa0: 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20  r the LIMIT and 
efb0: 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72  OFFSET.** keywor
efc0: 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20  ds.  Or NULL if 
efd0: 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61  those keywords a
efe0: 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d  re omitted. iLim
eff0: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a  it and iOffset .
f000: 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65 67  ** are the integ
f010: 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74  er memory regist
f020: 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63  er numbers for c
f030: 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20  ounters used to 
f040: 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20  compute .** the 
f050: 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74  limit and offset
f060: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
f070: 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f  o limit and/or o
f080: 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20  ffset, then .** 
f090: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
f0a0: 65 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e  et are negative.
f0b0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
f0c0: 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65 20  ine changes the 
f0d0: 76 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69 74  values of iLimit
f0e0: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c   and iOffset onl
f0f0: 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20  y if.** a limit 
f100: 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64 65 66  or offset is def
f110: 69 6e 65 64 20 62 79 20 70 4c 69 6d 69 74 20 61  ined by pLimit a
f120: 6e 64 20 70 4f 66 66 73 65 74 2e 20 20 69 4c 69  nd pOffset.  iLi
f130: 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73  mit and.** iOffs
f140: 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  et should have b
f150: 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70  een preset to ap
f160: 70 72 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c  propriate defaul
f170: 74 20 76 61 6c 75 65 73 20 28 7a 65 72 6f 29 0a  t values (zero).
f180: 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ** prior to call
f190: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
f1a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 4f 66 66  ..**.** The iOff
f1b0: 73 65 74 20 72 65 67 69 73 74 65 72 20 28 69 66  set register (if
f1c0: 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20 69   it exists) is i
f1d0: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68  nitialized to th
f1e0: 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68  e value.** of th
f1f0: 65 20 4f 46 46 53 45 54 2e 20 20 54 68 65 20 69  e OFFSET.  The i
f200: 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 69  Limit register i
f210: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
f220: 20 4c 49 4d 49 54 2e 20 20 52 65 67 69 73 74 65   LIMIT.  Registe
f230: 72 0a 2a 2a 20 69 4f 66 66 73 65 74 2b 31 20 69  r.** iOffset+1 i
f240: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
f250: 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e 0a 2a   LIMIT+OFFSET..*
f260: 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69  *.** Only if pLi
f270: 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65  mit!=0 or pOffse
f280: 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69  t!=0 do the limi
f290: 74 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a  t registers get.
f2a0: 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54  ** redefined.  T
f2b0: 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
f2c0: 72 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20  rator uses this 
f2d0: 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63  property to forc
f2e0: 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f  e.** the reuse o
f2f0: 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74  f the same limit
f300: 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69   and offset regi
f310: 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c  sters across mul
f320: 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20  tiple.** SELECT 
f330: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73  statements..*/.s
f340: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75  tatic void compu
f350: 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
f360: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
f370: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
f380: 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a  Break){.  Vdbe *
f390: 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69  v = 0;.  int iLi
f3a0: 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  mit = 0;.  int i
f3b0: 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64  Offset;.  int ad
f3c0: 64 72 31 2c 20 6e 3b 0a 20 20 69 66 28 20 70 2d  dr1, n;.  if( p-
f3d0: 3e 69 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >iLimit ) return
f3e0: 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c  ;..  /* .  ** "L
f3f0: 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20  IMIT -1" always 
f400: 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20  shows all rows. 
f410: 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20   There is some. 
f420: 20 2a 2a 20 63 6f 6e 74 72 6f 76 65 72 73 79 20   ** controversy 
f430: 61 62 6f 75 74 20 77 68 61 74 20 74 68 65 20 63  about what the c
f440: 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20  orrect behavior 
f450: 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20  should be..  ** 
f460: 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  The current impl
f470: 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72  ementation inter
f480: 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20  prets "LIMIT 0" 
f490: 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20  to mean.  ** no 
f4a0: 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  rows..  */.  sql
f4b0: 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
f4c0: 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  ar(pParse);.  as
f4d0: 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74  sert( p->pOffset
f4e0: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74  ==0 || p->pLimit
f4f0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  !=0 );.  if( p->
f500: 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d  pLimit ){.    p-
f510: 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74  >iLimit = iLimit
f520: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
f530: 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  m;.    v = sqlit
f540: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
f550: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76  );.    assert( v
f560: 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 73  !=0 );.    if( s
f570: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
f580: 67 65 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 26  ger(p->pLimit, &
f590: 6e 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  n) ){.      sqli
f5a0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f5b0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20   OP_Integer, n, 
f5c0: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56  iLimit);.      V
f5d0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
f5e0: 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29  LIMIT counter"))
f5f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30  ;.      if( n==0
f600: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
f610: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f620: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72   OP_Goto, 0, iBr
f630: 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  eak);.      }els
f640: 65 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d  e if( n>=0 && p-
f650: 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 28 75 36 34  >nSelectRow>(u64
f660: 29 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  )n ){.        p-
f670: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 3b  >nSelectRow = n;
f680: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
f690: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
f6a0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
f6b0: 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c 69  , p->pLimit, iLi
f6c0: 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  mit);.      sqli
f6d0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
f6e0: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69   OP_MustBeInt, i
f6f0: 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65  Limit); VdbeCove
f700: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56  rage(v);.      V
f710: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
f720: 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29  LIMIT counter"))
f730: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f740: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f750: 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20  IfZero, iLimit, 
f760: 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  iBreak); VdbeCov
f770: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
f780: 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73      if( p->pOffs
f790: 65 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  et ){.      p->i
f7a0: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74  Offset = iOffset
f7b0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
f7c0: 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  m;.      pParse-
f7d0: 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c  >nMem++;   /* Al
f7e0: 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61 20  locate an extra 
f7f0: 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d  register for lim
f800: 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20  it+offset */.   
f810: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
f820: 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f  de(pParse, p->pO
f830: 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 29 3b  ffset, iOffset);
f840: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f850: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d  beAddOp1(v, OP_M
f860: 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73 65  ustBeInt, iOffse
f870: 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
f880: 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  (v);.      VdbeC
f890: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53  omment((v, "OFFS
f8a0: 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  ET counter"));. 
f8b0: 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c       addr1 = sql
f8c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
f8d0: 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66  , OP_IfPos, iOff
f8e0: 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  set); VdbeCovera
f8f0: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
f900: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f910: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
f920: 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20   iOffset);.     
f930: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
f940: 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
f950: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f960: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64  eAddOp3(v, OP_Ad
f970: 64 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73  d, iLimit, iOffs
f980: 65 74 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a  et, iOffset+1);.
f990: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
f9a0: 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46  t((v, "LIMIT+OFF
f9b0: 53 45 54 22 29 29 3b 0a 20 20 20 20 20 20 61 64  SET"));.      ad
f9c0: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
f9d0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
f9e0: 50 6f 73 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64  Pos, iLimit); Vd
f9f0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
fa00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fa10: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
fa20: 65 67 65 72 2c 20 2d 31 2c 20 69 4f 66 66 73 65  eger, -1, iOffse
fa30: 74 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t+1);.      sqli
fa40: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
fa50: 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 7d  v, addr1);.    }
fa60: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
fa70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
fa80: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a  OUND_SELECT./*.*
fa90: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70  * Return the app
faa0: 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69  ropriate collati
fab0: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
fac0: 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  the iCol-th colu
fad0: 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73  mn of.** the res
fae0: 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65 20  ult set for the 
faf0: 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20  compound-select 
fb00: 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20  statement "p".  
fb10: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a  Return NULL if.*
fb20: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73  * the column has
fb30: 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c   no default coll
fb40: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a  ating sequence..
fb50: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74  **.** The collat
fb60: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
fb70: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
fb80: 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72  lect is taken fr
fb90: 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d  om the.** left-m
fba0: 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ost term of the 
fbb0: 73 65 6c 65 63 74 20 74 68 61 74 20 68 61 73 20  select that has 
fbc0: 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
fbd0: 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ence..*/.static 
fbe0: 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65  CollSeq *multiSe
fbf0: 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73  lectCollSeq(Pars
fc00: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
fc10: 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b  t *p, int iCol){
fc20: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74  .  CollSeq *pRet
fc30: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  ;.  if( p->pPrio
fc40: 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  r ){.    pRet = 
fc50: 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
fc60: 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50  eq(pParse, p->pP
fc70: 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d  rior, iCol);.  }
fc80: 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d  else{.    pRet =
fc90: 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
fca0: 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 69  ( iCol>=0 );.  i
fcb0: 66 28 20 70 52 65 74 3d 3d 30 20 26 26 20 69 43  f( pRet==0 && iC
fcc0: 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  ol<p->pEList->nE
fcd0: 78 70 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20  xpr ){.    pRet 
fce0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
fcf0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
fd00: 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
fd10: 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65  pExpr);.  }.  re
fd20: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
fd30: 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73  .** The select s
fd40: 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
fd50: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  as the second pa
fd60: 72 61 6d 65 74 65 72 20 69 73 20 61 20 63 6f 6d  rameter is a com
fd70: 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a 2a 2a 20  pound SELECT.** 
fd80: 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  with an ORDER BY
fd90: 20 63 6c 61 75 73 65 2e 20 54 68 69 73 20 66 75   clause. This fu
fda0: 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73  nction allocates
fdb0: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 4b   and returns a K
fdc0: 65 79 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74  eyInfo.** struct
fdd0: 75 72 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ure suitable for
fde0: 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
fdf0: 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2a 0a 2a  e ORDER BY..**.*
fe00: 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
fe10: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
fe20: 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e 65  cture is obtaine
fe30: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 54  d from malloc. T
fe40: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
fe50: 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e  nction is respon
fe60: 73 69 62 6c 65 20 66 6f 72 20 65 6e 73 75 72 69  sible for ensuri
fe70: 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72  ng that this str
fe80: 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75  ucture is eventu
fe90: 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a  ally.** freed..*
fea0: 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f  /.static KeyInfo
feb0: 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64   *multiSelectOrd
fec0: 65 72 42 79 4b 65 79 49 6e 66 6f 28 50 61 72 73  erByKeyInfo(Pars
fed0: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
fee0: 74 20 2a 70 2c 20 69 6e 74 20 6e 45 78 74 72 61  t *p, int nExtra
fef0: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
ff00: 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
ff10: 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e 4f 72  derBy;.  int nOr
ff20: 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
ff30: 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 71  rBy->nExpr;.  sq
ff40: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
ff50: 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79 49 6e 66  se->db;.  KeyInf
ff60: 6f 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65  o *pRet = sqlite
ff70: 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
ff80: 2c 20 6e 4f 72 64 65 72 42 79 2b 6e 45 78 74 72  , nOrderBy+nExtr
ff90: 61 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 52 65  a, 1);.  if( pRe
ffa0: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ){.    int i;.
ffb0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
ffc0: 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
ffd0: 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
ffe0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
fff0: 20 3d 20 26 70 4f 72 64 65 72 42 79 2d 3e 61 5b   = &pOrderBy->a[
10000 69 5d 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  i];.      Expr *
10010 70 54 65 72 6d 20 3d 20 70 49 74 65 6d 2d 3e 70  pTerm = pItem->p
10020 45 78 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c 6c  Expr;.      Coll
10030 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 20  Seq *pColl;..   
10040 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c     if( pTerm->fl
10050 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
10060 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
10070 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
10080 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
10090 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Term);.      }el
100a0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  se{.        pCol
100b0 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  l = multiSelectC
100c0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
100d0 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  , pItem->u.x.iOr
100e0 64 65 72 42 79 43 6f 6c 2d 31 29 3b 0a 20 20 20  derByCol-1);.   
100f0 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d       if( pColl==
10100 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  0 ) pColl = db->
10110 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
10120 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69     pOrderBy->a[i
10130 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20 20 20 20  ].pExpr =.      
10140 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
10150 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28  ddCollateString(
10160 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
10170 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
10180 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
10190 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
101a0 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 52  foIsWriteable(pR
101b0 65 74 29 20 29 3b 0a 20 20 20 20 20 20 70 52 65  et) );.      pRe
101c0 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43  t->aColl[i] = pC
101d0 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 52 65 74 2d  oll;.      pRet-
101e0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
101f0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
10200 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d  sortOrder;.    }
10210 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
10220 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  Ret;.}..#ifndef 
10230 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
10240 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
10250 6e 65 20 67 65 6e 65 72 61 74 65 73 20 56 44 42  ne generates VDB
10260 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74  E code to comput
10270 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
10280 20 61 20 57 49 54 48 20 52 45 43 55 52 53 49 56   a WITH RECURSIV
10290 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74 68  E.** query of th
102a0 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
102b0 3c 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65  <recursive-table
102c0 3e 20 41 53 20 28 3c 73 65 74 75 70 2d 71 75 65  > AS (<setup-que
102d0 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20  ry> UNION [ALL] 
102e0 3c 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79  <recursive-query
102f0 3e 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  >).**           
10300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f                \_
10310 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
10320 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
10330 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 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 70 2d 3e 70 50 72 69 6f 72         p->pPrior
10360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10370 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a        p.**.**.**
10380 20 54 68 65 72 65 20 69 73 20 65 78 61 63 74 6c   There is exactl
10390 79 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20  y one reference 
103a0 74 6f 20 74 68 65 20 72 65 63 75 72 73 69 76 65  to the recursive
103b0 2d 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52  -table in the FR
103c0 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 6f 66 20  OM clause.** of 
103d0 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 2c  recursive-query,
103e0 20 6d 61 72 6b 65 64 20 77 69 74 68 20 74 68 65   marked with the
103f0 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d 2e 69 73   SrcList->a[].is
10400 52 65 63 75 72 73 69 76 65 20 66 6c 61 67 2e 0a  Recursive flag..
10410 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 74 75 70 2d  **.** The setup-
10420 71 75 65 72 79 20 72 75 6e 73 20 6f 6e 63 65 20  query runs once 
10430 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20 69  to generate an i
10440 6e 69 74 69 61 6c 20 73 65 74 20 6f 66 20 72 6f  nitial set of ro
10450 77 73 20 74 68 61 74 20 67 6f 0a 2a 2a 20 69 6e  ws that go.** in
10460 74 6f 20 61 20 51 75 65 75 65 20 74 61 62 6c 65  to a Queue table
10470 2e 20 20 52 6f 77 73 20 61 72 65 20 65 78 74 72  .  Rows are extr
10480 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 51  acted from the Q
10490 75 65 75 65 20 74 61 62 6c 65 20 6f 6e 65 20 62  ueue table one b
104a0 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45 61 63 68 20  y.** one.  Each 
104b0 72 6f 77 20 65 78 74 72 61 63 74 65 64 20 66 72  row extracted fr
104c0 6f 6d 20 51 75 65 75 65 20 69 73 20 6f 75 74 70  om Queue is outp
104d0 75 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68  ut to pDest.  Th
104e0 65 6e 20 74 68 65 20 73 69 6e 67 6c 65 0a 2a 2a  en the single.**
104f0 20 65 78 74 72 61 63 74 65 64 20 72 6f 77 20 28   extracted row (
10500 6e 6f 77 20 69 6e 20 74 68 65 20 69 43 75 72 72  now in the iCurr
10510 65 6e 74 20 74 61 62 6c 65 29 20 62 65 63 6f 6d  ent table) becom
10520 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  es the content o
10530 66 20 74 68 65 0a 2a 2a 20 72 65 63 75 72 73 69  f the.** recursi
10540 76 65 2d 74 61 62 6c 65 20 66 6f 72 20 61 20 72  ve-table for a r
10550 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 20 72  ecursive-query r
10560 75 6e 2e 20 20 54 68 65 20 6f 75 74 70 75 74 20  un.  The output 
10570 6f 66 20 74 68 65 20 72 65 63 75 72 73 69 76 65  of the recursive
10580 2d 71 75 65 72 79 0a 2a 2a 20 69 73 20 61 64 64  -query.** is add
10590 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ed back into the
105a0 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54   Queue table.  T
105b0 68 65 6e 20 61 6e 6f 74 68 65 72 20 72 6f 77 20  hen another row 
105c0 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
105d0 6d 20 51 75 65 75 65 0a 2a 2a 20 61 6e 64 20 74  m Queue.** and t
105e0 68 65 20 69 74 65 72 61 74 69 6f 6e 20 63 6f 6e  he iteration con
105f0 74 69 6e 75 65 73 20 75 6e 74 69 6c 20 74 68 65  tinues until the
10600 20 51 75 65 75 65 20 74 61 62 6c 65 20 69 73 20   Queue table is 
10610 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  empty..**.** If 
10620 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
10630 72 79 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55  ry operator is U
10640 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f 20 64 75 70  NION then no dup
10650 6c 69 63 61 74 65 20 72 6f 77 73 20 61 72 65 20  licate rows are 
10660 65 76 65 72 0a 2a 2a 20 69 6e 73 65 72 74 65 64  ever.** inserted
10670 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20   into the Queue 
10680 74 61 62 6c 65 2e 20 20 54 68 65 20 69 44 69 73  table.  The iDis
10690 74 69 6e 63 74 20 74 61 62 6c 65 20 6b 65 65 70  tinct table keep
106a0 73 20 61 20 63 6f 70 79 20 6f 66 20 61 6c 6c 20  s a copy of all 
106b0 72 6f 77 73 0a 2a 2a 20 74 68 61 74 20 68 61 76  rows.** that hav
106c0 65 20 65 76 65 72 20 62 65 65 6e 20 69 6e 73 65  e ever been inse
106d0 72 74 65 64 20 69 6e 74 6f 20 51 75 65 75 65 20  rted into Queue 
106e0 61 6e 64 20 63 61 75 73 65 73 20 64 75 70 6c 69  and causes dupli
106f0 63 61 74 65 73 20 74 6f 20 62 65 0a 2a 2a 20 64  cates to be.** d
10700 69 73 63 61 72 64 65 64 2e 20 20 49 66 20 74 68  iscarded.  If th
10710 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e  e operator is UN
10720 49 4f 4e 20 41 4c 4c 2c 20 74 68 65 6e 20 64 75  ION ALL, then du
10730 70 6c 69 63 61 74 65 73 20 61 72 65 20 61 6c 6c  plicates are all
10740 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  owed..** .** If 
10750 74 68 65 20 71 75 65 72 79 20 68 61 73 20 61 6e  the query has an
10760 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 6e 20   ORDER BY, then 
10770 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 51  entries in the Q
10780 75 65 75 65 20 74 61 62 6c 65 20 61 72 65 20 6b  ueue table are k
10790 65 70 74 20 69 6e 0a 2a 2a 20 4f 52 44 45 52 20  ept in.** ORDER 
107a0 42 59 20 6f 72 64 65 72 20 61 6e 64 20 74 68 65  BY order and the
107b0 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 73 20   first entry is 
107c0 65 78 74 72 61 63 74 65 64 20 66 6f 72 20 65 61  extracted for ea
107d0 63 68 20 63 79 63 6c 65 2e 20 20 57 69 74 68 6f  ch cycle.  Witho
107e0 75 74 0a 2a 2a 20 61 6e 20 4f 52 44 45 52 20 42  ut.** an ORDER B
107f0 59 2c 20 74 68 65 20 51 75 65 75 65 20 74 61 62  Y, the Queue tab
10800 6c 65 20 69 73 20 6a 75 73 74 20 61 20 46 49 46  le is just a FIF
10810 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4c 49  O..**.** If a LI
10820 4d 49 54 20 63 6c 61 75 73 65 20 69 73 20 70 72  MIT clause is pr
10830 6f 76 69 64 65 64 2c 20 74 68 65 6e 20 74 68 65  ovided, then the
10840 20 69 74 65 72 61 74 69 6f 6e 20 73 74 6f 70 73   iteration stops
10850 20 61 66 74 65 72 20 4c 49 4d 49 54 20 72 6f 77   after LIMIT row
10860 73 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 6f  s.** have been o
10870 75 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20  utput to pDest. 
10880 20 41 20 4c 49 4d 49 54 20 6f 66 20 7a 65 72 6f   A LIMIT of zero
10890 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70 75 74   means to output
108a0 20 6e 6f 20 72 6f 77 73 20 61 6e 64 20 61 0a 2a   no rows and a.*
108b0 2a 20 6e 65 67 61 74 69 76 65 20 4c 49 4d 49 54  * negative LIMIT
108c0 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70 75 74   means to output
108d0 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49 66 20 74   all rows.  If t
108e0 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 6e 20  here is also an 
108f0 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a 2a 2a  OFFSET clause.**
10900 20 77 69 74 68 20 61 20 70 6f 73 69 74 69 76 65   with a positive
10910 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65   value, then the
10920 20 66 69 72 73 74 20 4f 46 46 53 45 54 20 6f 75   first OFFSET ou
10930 74 70 75 74 73 20 61 72 65 20 64 69 73 63 61 72  tputs are discar
10940 64 65 64 20 72 61 74 68 65 72 0a 2a 2a 20 74 68  ded rather.** th
10950 61 6e 20 62 65 69 6e 67 20 73 65 6e 74 20 74 6f  an being sent to
10960 20 70 44 65 73 74 2e 20 20 54 68 65 20 4c 49 4d   pDest.  The LIM
10970 49 54 20 63 6f 75 6e 74 20 64 6f 65 73 20 6e 6f  IT count does no
10980 74 20 62 65 67 69 6e 20 75 6e 74 69 6c 20 61 66  t begin until af
10990 74 65 72 20 4f 46 46 53 45 54 0a 2a 2a 20 72 6f  ter OFFSET.** ro
109a0 77 73 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69  ws have been ski
109b0 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pped..*/.static 
109c0 76 6f 69 64 20 67 65 6e 65 72 61 74 65 57 69 74  void generateWit
109d0 68 52 65 63 75 72 73 69 76 65 51 75 65 72 79 28  hRecursiveQuery(
109e0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
109f0 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
10a00 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
10a10 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
10a20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
10a30 63 75 72 73 69 76 65 20 53 45 4c 45 43 54 20 74  cursive SELECT t
10a40 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
10a50 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
10a60 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
10a70 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
10a80 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53  esults */.){.  S
10a90 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70  rcList *pSrc = p
10aa0 2d 3e 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20  ->pSrc;      /* 
10ab0 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
10ac0 6f 66 20 74 68 65 20 72 65 63 75 72 73 69 76 65  of the recursive
10ad0 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
10ae0 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74  nCol = p->pEList
10af0 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a 20 4e 75 6d  ->nExpr;  /* Num
10b00 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
10b10 6e 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  n the recursive 
10b20 74 61 62 6c 65 20 2a 2f 0a 20 20 56 64 62 65 20  table */.  Vdbe 
10b30 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
10b40 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  be;      /* The 
10b50 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
10b60 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  nt under constru
10b70 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63  ction */.  Selec
10b80 74 20 2a 70 53 65 74 75 70 20 3d 20 70 2d 3e 70  t *pSetup = p->p
10b90 50 72 69 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20  Prior;   /* The 
10ba0 73 65 74 75 70 20 71 75 65 72 79 20 2a 2f 0a 20  setup query */. 
10bb0 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20   int addrTop;   
10bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10bd0 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  * Top of the loo
10be0 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
10bf0 6f 6e 74 2c 20 61 64 64 72 42 72 65 61 6b 3b 20  ont, addrBreak; 
10c00 20 20 20 20 20 2f 2a 20 43 4f 4e 54 49 4e 55 45       /* CONTINUE
10c10 20 61 6e 64 20 42 52 45 41 4b 20 61 64 64 72 65   and BREAK addre
10c20 73 73 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  sses */.  int iC
10c30 75 72 72 65 6e 74 20 3d 20 30 3b 20 20 20 20 20  urrent = 0;     
10c40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 43          /* The C
10c50 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a  urrent table */.
10c60 20 20 69 6e 74 20 72 65 67 43 75 72 72 65 6e 74    int regCurrent
10c70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10c80 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
10c90 69 6e 67 20 43 75 72 72 65 6e 74 20 74 61 62 6c  ing Current tabl
10ca0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 51 75 65 75  e */.  int iQueu
10cb0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
10cc0 20 20 20 20 20 2f 2a 20 54 68 65 20 51 75 65 75       /* The Queu
10cd0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
10ce0 20 69 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 20   iDistinct = 0; 
10cf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
10d00 20 65 6e 73 75 72 65 20 75 6e 69 71 75 65 20 72   ensure unique r
10d10 65 73 75 6c 74 73 20 69 66 20 55 4e 49 4f 4e 20  esults if UNION 
10d20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  */.  int eDest =
10d30 20 53 52 54 5f 46 69 66 6f 3b 20 20 20 20 20 20   SRT_Fifo;      
10d40 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 77 72 69     /* How to wri
10d50 74 65 20 74 6f 20 51 75 65 75 65 20 2a 2f 0a 20  te to Queue */. 
10d60 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
10d70 51 75 65 75 65 3b 20 20 20 20 20 20 20 20 20 2f  Queue;         /
10d80 2a 20 53 65 6c 65 63 74 44 65 73 74 20 74 61 72  * SelectDest tar
10d90 67 65 74 74 69 6e 67 20 74 68 65 20 51 75 65 75  getting the Queu
10da0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
10db0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
10dc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
10dd0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
10de0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
10df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10e00 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
10e10 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
10e20 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 20 20  erBy;           
10e30 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
10e40 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
10e50 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73   *pLimit, *pOffs
10e60 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76  et;       /* Sav
10e70 65 64 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  ed LIMIT and OFF
10e80 53 45 54 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  SET */.  int reg
10e90 4c 69 6d 69 74 2c 20 72 65 67 4f 66 66 73 65 74  Limit, regOffset
10ea0 3b 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74  ;      /* Regist
10eb0 65 72 73 20 75 73 65 64 20 62 79 20 4c 49 4d 49  ers used by LIMI
10ec0 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a  T and OFFSET */.
10ed0 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 75 74  .  /* Obtain aut
10ee0 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 64 6f  horization to do
10ef0 20 61 20 72 65 63 75 72 73 69 76 65 20 71 75 65   a recursive que
10f00 72 79 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  ry */.  if( sqli
10f10 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
10f20 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 43 55  rse, SQLITE_RECU
10f30 52 53 49 56 45 2c 20 30 2c 20 30 2c 20 30 29 20  RSIVE, 0, 0, 0) 
10f40 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
10f50 50 72 6f 63 65 73 73 20 74 68 65 20 4c 49 4d 49  Process the LIMI
10f60 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
10f70 75 73 65 73 2c 20 69 66 20 74 68 65 79 20 65 78  uses, if they ex
10f80 69 73 74 20 2a 2f 0a 20 20 61 64 64 72 42 72 65  ist */.  addrBre
10f90 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
10fa0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
10fb0 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
10fc0 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
10fd0 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 70   addrBreak);.  p
10fe0 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
10ff0 74 3b 0a 20 20 70 4f 66 66 73 65 74 20 3d 20 70  t;.  pOffset = p
11000 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 72 65 67  ->pOffset;.  reg
11010 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69  Limit = p->iLimi
11020 74 3b 0a 20 20 72 65 67 4f 66 66 73 65 74 20 3d  t;.  regOffset =
11030 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70   p->iOffset;.  p
11040 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4f  ->pLimit = p->pO
11050 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  ffset = 0;.  p->
11060 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66  iLimit = p->iOff
11070 73 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65  set = 0;.  pOrde
11080 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
11090 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20  y;..  /* Locate 
110a0 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
110b0 72 20 6f 66 20 74 68 65 20 43 75 72 72 65 6e 74  r of the Current
110c0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28   table */.  for(
110d0 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 53  i=0; ALWAYS(i<pS
110e0 72 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b  rc->nSrc); i++){
110f0 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61  .    if( pSrc->a
11100 5b 69 5d 2e 69 73 52 65 63 75 72 73 69 76 65 20  [i].isRecursive 
11110 29 7b 0a 20 20 20 20 20 20 69 43 75 72 72 65 6e  ){.      iCurren
11120 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69  t = pSrc->a[i].i
11130 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 62 72  Cursor;.      br
11140 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
11150 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75    /* Allocate cu
11160 72 73 6f 72 73 20 6e 75 6d 62 65 72 73 20 66 6f  rsors numbers fo
11170 72 20 51 75 65 75 65 20 61 6e 64 20 44 69 73 74  r Queue and Dist
11180 69 6e 63 74 2e 20 20 54 68 65 20 63 75 72 73 6f  inct.  The curso
11190 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20 20 2a  r number for.  *
111a0 2a 20 74 68 65 20 44 69 73 74 69 6e 63 74 20 74  * the Distinct t
111b0 61 62 6c 65 20 6d 75 73 74 20 62 65 20 65 78 61  able must be exa
111c0 63 74 6c 79 20 6f 6e 65 20 67 72 65 61 74 65 72  ctly one greater
111d0 20 74 68 61 6e 20 51 75 65 75 65 20 69 6e 20 6f   than Queue in o
111e0 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68  rder.  ** for th
111f0 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 20 61  e SRT_DistFifo a
11200 6e 64 20 53 52 54 5f 44 69 73 74 51 75 65 75 65  nd SRT_DistQueue
11210 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 20 74 6f   destinations to
11220 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51 75 65   work. */.  iQue
11230 75 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ue = pParse->nTa
11240 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70  b++;.  if( p->op
11250 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
11260 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72    eDest = pOrder
11270 42 79 20 3f 20 53 52 54 5f 44 69 73 74 51 75 65  By ? SRT_DistQue
11280 75 65 20 3a 20 53 52 54 5f 44 69 73 74 46 69 66  ue : SRT_DistFif
11290 6f 3b 0a 20 20 20 20 69 44 69 73 74 69 6e 63 74  o;.    iDistinct
112a0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
112b0 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
112c0 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79  eDest = pOrderBy
112d0 20 3f 20 53 52 54 5f 51 75 65 75 65 20 3a 20 53   ? SRT_Queue : S
112e0 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20 20 73  RT_Fifo;.  }.  s
112f0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
11300 49 6e 69 74 28 26 64 65 73 74 51 75 65 75 65 2c  Init(&destQueue,
11310 20 65 44 65 73 74 2c 20 69 51 75 65 75 65 29 3b   eDest, iQueue);
11320 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
11330 63 75 72 73 6f 72 73 20 66 6f 72 20 43 75 72 72  cursors for Curr
11340 65 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e 64 20  ent, Queue, and 
11350 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20 20 72  Distinct. */.  r
11360 65 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b 70 50  egCurrent = ++pP
11370 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71  arse->nMem;.  sq
11380 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
11390 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
113a0 2c 20 69 43 75 72 72 65 6e 74 2c 20 72 65 67 43  , iCurrent, regC
113b0 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b 0a 20  urrent, nCol);. 
113c0 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
113d0 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
113e0 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74 69 53 65  eyInfo = multiSe
113f0 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
11400 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29  fo(pParse, p, 1)
11410 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
11420 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
11430 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75  enEphemeral, iQu
11440 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  eue, pOrderBy->n
11450 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20  Expr+2, 0,.     
11460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11470 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
11480 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
11490 20 20 20 64 65 73 74 51 75 65 75 65 2e 70 4f 72     destQueue.pOr
114a0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
114b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
114c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
114d0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
114e0 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 6e 43  eral, iQueue, nC
114f0 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62 65 43  ol);.  }.  VdbeC
11500 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75 65 75  omment((v, "Queu
11510 65 20 74 61 62 6c 65 22 29 29 3b 0a 20 20 69 66  e table"));.  if
11520 28 20 69 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  ( iDistinct ){. 
11530 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
11540 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 56  hm[0] = sqlite3V
11550 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11560 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
11570 44 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20  Distinct, 0);.  
11580 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
11590 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
115a0 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74  l;.  }..  /* Det
115b0 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ach the ORDER BY
115c0 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65   clause from the
115d0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
115e0 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42   */.  p->pOrderB
115f0 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 74 6f  y = 0;..  /* Sto
11600 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  re the results o
11610 66 20 74 68 65 20 73 65 74 75 70 2d 71 75 65 72  f the setup-quer
11620 79 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f 0a 20  y in Queue. */. 
11630 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d   pSetup->pNext =
11640 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   0;.  rc = sqlit
11650 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
11660 20 70 53 65 74 75 70 2c 20 26 64 65 73 74 51 75   pSetup, &destQu
11670 65 75 65 29 3b 0a 20 20 70 53 65 74 75 70 2d 3e  eue);.  pSetup->
11680 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 69 66 28  pNext = p;.  if(
11690 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f   rc ) goto end_o
116a0 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65 72  f_recursive_quer
116b0 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68  y;..  /* Find th
116c0 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 74 68  e next row in th
116d0 65 20 51 75 65 75 65 20 61 6e 64 20 6f 75 74 70  e Queue and outp
116e0 75 74 20 74 68 61 74 20 72 6f 77 20 2a 2f 0a 20  ut that row */. 
116f0 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
11700 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11710 4f 50 5f 52 65 77 69 6e 64 2c 20 69 51 75 65 75  OP_Rewind, iQueu
11720 65 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56  e, addrBreak); V
11730 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
11740 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74  .  /* Transfer t
11750 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 51  he next row in Q
11760 75 65 75 65 20 6f 76 65 72 20 74 6f 20 43 75 72  ueue over to Cur
11770 72 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rent */.  sqlite
11780 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
11790 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 75 72 72  P_NullRow, iCurr
117a0 65 6e 74 29 3b 20 2f 2a 20 54 6f 20 72 65 73 65  ent); /* To rese
117b0 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 2a  t column cache *
117c0 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
117d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
117e0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
117f0 43 6f 6c 75 6d 6e 2c 20 69 51 75 65 75 65 2c 20  Column, iQueue, 
11800 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b  pOrderBy->nExpr+
11810 31 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a  1, regCurrent);.
11820 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
11830 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11840 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 69 51  , OP_RowData, iQ
11850 75 65 75 65 2c 20 72 65 67 43 75 72 72 65 6e 74  ueue, regCurrent
11860 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
11870 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
11880 5f 44 65 6c 65 74 65 2c 20 69 51 75 65 75 65 29  _Delete, iQueue)
11890 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74  ;..  /* Output t
118a0 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e  he single row in
118b0 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 61 64   Current */.  ad
118c0 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33  drCont = sqlite3
118d0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
118e0 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76  ;.  codeOffset(v
118f0 2c 20 72 65 67 4f 66 66 73 65 74 2c 20 61 64 64  , regOffset, add
11900 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c 65 63 74  rCont);.  select
11910 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
11920 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
11930 69 43 75 72 72 65 6e 74 2c 0a 20 20 20 20 20 20  iCurrent,.      
11940 30 2c 20 30 2c 20 70 44 65 73 74 2c 20 61 64 64  0, 0, pDest, add
11950 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61 6b  rCont, addrBreak
11960 29 3b 0a 20 20 69 66 28 20 72 65 67 4c 69 6d 69  );.  if( regLimi
11970 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
11980 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
11990 5f 49 66 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69  _IfZero, regLimi
119a0 74 2c 20 61 64 64 72 42 72 65 61 6b 2c 20 2d 31  t, addrBreak, -1
119b0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
119c0 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71  age(v);.  }.  sq
119d0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
119e0 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e  Label(v, addrCon
119f0 74 29 3b 0a 0a 20 20 2f 2a 20 45 78 65 63 75 74  t);..  /* Execut
11a00 65 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  e the recursive 
11a10 53 45 4c 45 43 54 20 74 61 6b 69 6e 67 20 74 68  SELECT taking th
11a20 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20  e single row in 
11a30 43 75 72 72 65 6e 74 20 61 73 0a 20 20 2a 2a 20  Current as.  ** 
11a40 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68  the value for th
11a50 65 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c  e recursive-tabl
11a60 65 2e 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  e. Store the res
11a70 75 6c 74 73 20 69 6e 20 74 68 65 20 51 75 65 75  ults in the Queu
11a80 65 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72  e..  */.  p->pPr
11a90 69 6f 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ior = 0;.  sqlit
11aa0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
11ab0 20 70 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b   p, &destQueue);
11ac0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
11ad0 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e  rior==0 );.  p->
11ae0 70 50 72 69 6f 72 20 3d 20 70 53 65 74 75 70 3b  pPrior = pSetup;
11af0 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 72 75 6e 6e  ..  /* Keep runn
11b00 69 6e 67 20 74 68 65 20 6c 6f 6f 70 20 75 6e 74  ing the loop unt
11b10 69 6c 20 74 68 65 20 51 75 65 75 65 20 69 73 20  il the Queue is 
11b20 65 6d 70 74 79 20 2a 2f 0a 20 20 73 71 6c 69 74  empty */.  sqlit
11b30 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11b40 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
11b50 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Top);.  sqlite3V
11b60 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
11b70 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a  v, addrBreak);..
11b80 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65  end_of_recursive
11b90 5f 71 75 65 72 79 3a 0a 20 20 73 71 6c 69 74 65  _query:.  sqlite
11ba0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
11bb0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
11bc0 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70  OrderBy);.  p->p
11bd0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
11be0 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20  By;.  p->pLimit 
11bf0 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 70  = pLimit;.  p->p
11c00 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
11c10 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65  ;.  return;.}.#e
11c20 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
11c30 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 2f 2a 20 46  MIT_CTE */../* F
11c40 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
11c50 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
11c60 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
11c70 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  By(.  Parse *pPa
11c80 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
11c90 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
11ca0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
11cb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11cc0 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
11cd0 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
11ce0 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
11cf0 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
11d00 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
11d10 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
11d20 2f 0a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  /.);.../*.** Thi
11d30 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
11d40 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61  led to process a
11d50 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
11d60 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f  form from.** two
11d70 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74   or more separat
11d80 65 20 71 75 65 72 69 65 73 20 75 73 69 6e 67 20  e queries using 
11d90 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c  UNION, UNION ALL
11da0 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20  , EXCEPT, or.** 
11db0 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20  INTERSECT.**.** 
11dc0 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  "p" points to th
11dd0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
11de0 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e  the two queries.
11df0 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74    the query on t
11e00 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d  he.** left is p-
11e10 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65  >pPrior.  The le
11e20 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61  ft query could a
11e30 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e  lso be a compoun
11e40 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68  d query.** in wh
11e50 69 63 68 20 63 61 73 65 20 74 68 69 73 20 72 6f  ich case this ro
11e60 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61  utine will be ca
11e70 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
11e80 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  . .**.** The res
11e90 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61  ults of the tota
11ea0 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f 20 62  l query are to b
11eb0 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61  e written into a
11ec0 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20   destination.** 
11ed0 6f 66 20 74 79 70 65 20 65 44 65 73 74 20 77 69  of type eDest wi
11ee0 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 50 61  th parameter iPa
11ef0 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  rm..**.** Exampl
11f00 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61  e 1:  Consider a
11f10 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f   three-way compo
11f20 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  und SQL statemen
11f30 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  t..**.**     SEL
11f40 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e  ECT a FROM t1 UN
11f50 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ION SELECT b FRO
11f60 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t2 UNION SELEC
11f70 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a  T c FROM t3.**.*
11f80 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
11f90 20 69 73 20 70 61 72 73 65 64 20 75 70 20 61 73   is parsed up as
11fa0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
11fb0 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f      SELECT c FRO
11fc0 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a  M t3.**      |.*
11fd0 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20  *      `----->  
11fe0 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
11ff0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
12000 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
12010 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20         `------> 
12020 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
12030 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f  1.**.** The arro
12040 77 73 20 69 6e 20 74 68 65 20 64 69 61 67 72 61  ws in the diagra
12050 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e  m above represen
12060 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72  t the Select.pPr
12070 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20  ior pointer..** 
12080 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
12090 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74  ne is called wit
120a0 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65  h p equal to the
120b0 20 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a   t3 query, then.
120c0 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62  ** pPrior will b
120d0 65 20 74 68 65 20 74 32 20 71 75 65 72 79 2e 20  e the t2 query. 
120e0 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54   p->op will be T
120f0 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20  K_UNION in this 
12100 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69  case..**.** Noti
12110 63 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20  ce that because 
12120 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c 69 74  of the way SQLit
12130 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e  e parses compoun
12140 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a  d SELECTs, the.*
12150 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c  * individual sel
12160 65 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75  ects always grou
12170 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  p from left to r
12180 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ight..*/.static 
12190 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  int multiSelect(
121a0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
121b0 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
121c0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
121d0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
121e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
121f0 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
12200 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
12210 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
12220 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
12230 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
12240 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
12250 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
12260 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63  ITE_OK;   /* Suc
12270 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61  cess code from a
12280 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
12290 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b   Select *pPrior;
122a0 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65         /* Anothe
122b0 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61  r SELECT immedia
122c0 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74  tely to our left
122d0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
122e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
122f0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
12300 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53  this VDBE */.  S
12310 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20  electDest dest; 
12320 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74       /* Alternat
12330 69 76 65 20 64 61 74 61 20 64 65 73 74 69 6e 61  ive data destina
12340 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tion */.  Select
12350 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b 20 20   *pDelete = 0;  
12360 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73 69 6d 70  /* Chain of simp
12370 6c 65 20 73 65 6c 65 63 74 73 20 74 6f 20 64 65  le selects to de
12380 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lete */.  sqlite
12390 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
123a0 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
123b0 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66 6e 64 65  ection */.#ifnde
123c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
123d0 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62  PLAIN.  int iSub
123e0 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  1 = 0;        /*
123f0 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d   EQP id of left-
12400 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20  hand query */.  
12410 69 6e 74 20 69 53 75 62 32 20 3d 20 30 3b 20 20  int iSub2 = 0;  
12420 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20        /* EQP id 
12430 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75  of right-hand qu
12440 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ery */.#endif.. 
12450 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
12460 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
12470 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75  BY or LIMIT clau
12480 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45  se on prior SELE
12490 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20  CTs.  Only.  ** 
124a0 74 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d  the last (right-
124b0 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20  most) SELECT in 
124c0 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68  the series may h
124d0 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ave an ORDER BY 
124e0 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20  or LIMIT..  */. 
124f0 20 61 73 73 65 72 74 28 20 70 20 26 26 20 70 2d   assert( p && p-
12500 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43  >pPrior );  /* C
12510 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
12520 67 75 61 72 61 6e 74 65 65 73 20 74 68 69 73 20  guarantees this 
12530 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73 65 72 74  much */.  assert
12540 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
12550 20 53 46 5f 52 65 63 75 72 73 69 76 65 29 3d 3d   SF_Recursive)==
12560 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41  0 || p->op==TK_A
12570 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  LL || p->op==TK_
12580 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62 20 3d 20  UNION );.  db = 
12590 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50  pParse->db;.  pP
125a0 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
125b0 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73  ;.  dest = *pDes
125c0 74 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d  t;.  if( pPrior-
125d0 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
125e0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
125f0 28 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42  (pParse,"ORDER B
12600 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  Y clause should 
12610 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f  come after %s no
12620 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20  t before",.     
12630 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
12640 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
12650 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
12660 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
12670 7d 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  }.  if( pPrior->
12680 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  pLimit ){.    sq
12690 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
126a0 61 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75  arse,"LIMIT clau
126b0 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61  se should come a
126c0 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f  fter %s not befo
126d0 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63  re",.      selec
126e0 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
126f0 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
12700 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
12710 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76  ct_end;.  }..  v
12720 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
12730 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  e(pParse);.  ass
12740 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a  ert( v!=0 );  /*
12750 20 54 68 65 20 56 44 42 45 20 61 6c 72 65 61 64   The VDBE alread
12760 79 20 63 72 65 61 74 65 64 20 62 79 20 63 61 6c  y created by cal
12770 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ling function */
12780 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68  ..  /* Create th
12790 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65  e destination te
127a0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66  mporary table if
127b0 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a   necessary.  */.
127c0 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
127d0 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
127e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
127f0 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73  >pEList );.    s
12800 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12810 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
12820 65 72 61 6c 2c 20 64 65 73 74 2e 69 53 44 50 61  eral, dest.iSDPa
12830 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  rm, p->pEList->n
12840 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
12850 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
12860 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  , BTREE_UNORDERE
12870 44 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65  D);.    dest.eDe
12880 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a  st = SRT_Table;.
12890 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
128a0 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20  ure all SELECTs 
128b0 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
128c0 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
128d0 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
128e0 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20  s.  ** in their 
128f0 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a  result sets..  *
12900 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  /.  assert( p->p
12910 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d  EList && pPrior-
12920 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28  >pEList );.  if(
12930 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
12940 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  r!=pPrior->pELis
12950 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
12960 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
12970 26 20 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20  & SF_Values ){. 
12980 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
12990 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 6c  rMsg(pParse, "al
129a0 6c 20 56 41 4c 55 45 53 20 6d 75 73 74 20 68 61  l VALUES must ha
129b0 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
129c0 65 72 20 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20  er of terms");. 
129d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
129e0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
129f0 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73  pParse, "SELECTs
12a00 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64   to the left and
12a10 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20   right of %s".  
12a20 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68        " do not h
12a30 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
12a40 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
12a50 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70  lumns", selectOp
12a60 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
12a70 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a    }.    rc = 1;.
12a80 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
12a90 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
12aa0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12ab0 4d 49 54 5f 43 54 45 0a 20 20 69 66 28 20 70 2d  MIT_CTE.  if( p-
12ac0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
12ad0 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
12ae0 67 65 6e 65 72 61 74 65 57 69 74 68 52 65 63 75  generateWithRecu
12af0 72 73 69 76 65 51 75 65 72 79 28 70 50 61 72 73  rsiveQuery(pPars
12b00 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20  e, p, &dest);.  
12b10 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
12b20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  /* Compound SELE
12b30 43 54 73 20 74 68 61 74 20 68 61 76 65 20 61 6e  CTs that have an
12b40 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
12b50 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70   are handled sep
12b60 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  arately..  */.  
12b70 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
12b80 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75  ){.    return mu
12b90 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
12ba0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73  (pParse, p, pDes
12bb0 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f  t);.  }else..  /
12bc0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
12bd0 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64  for the left and
12be0 20 72 69 67 68 74 20 53 45 4c 45 43 54 20 73 74   right SELECT st
12bf0 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  atements..  */. 
12c00 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
12c10 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c  {.    case TK_AL
12c20 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  L: {.      int a
12c30 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ddr = 0;.      i
12c40 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20  nt nLimit;.     
12c50 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72   assert( !pPrior
12c60 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20  ->pLimit );.    
12c70 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74    pPrior->iLimit
12c80 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20   = p->iLimit;.  
12c90 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66      pPrior->iOff
12ca0 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74  set = p->iOffset
12cb0 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
12cc0 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
12cd0 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  it;.      pPrior
12ce0 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70  ->pOffset = p->p
12cf0 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 65 78  Offset;.      ex
12d00 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
12d10 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69  iSub1, pParse->i
12d20 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
12d30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12d40 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
12d50 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a  pPrior, &dest);.
12d60 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
12d70 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  = 0;.      p->pO
12d80 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
12d90 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
12da0 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
12db0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
12dc0 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  }.      p->pPrio
12dd0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  r = 0;.      p->
12de0 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d  iLimit = pPrior-
12df0 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >iLimit;.      p
12e00 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69  ->iOffset = pPri
12e10 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20  or->iOffset;.   
12e20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74     if( p->iLimit
12e30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72   ){.        addr
12e40 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
12e50 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72  dOp1(v, OP_IfZer
12e60 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 20 56  o, p->iLimit); V
12e70 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
12e80 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
12e90 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61 68  ent((v, "Jump ah
12ea0 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61  ead if LIMIT rea
12eb0 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20 7d  ched"));.      }
12ec0 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
12ed0 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20  tInteger(iSub2, 
12ee0 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
12ef0 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
12f00 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
12f10 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
12f20 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
12f30 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
12f40 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65  K );.      pDele
12f50 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  te = p->pPrior;.
12f60 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
12f70 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
12f80 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d  p->nSelectRow +=
12f90 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
12fa0 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Row;.      if( p
12fb0 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a 20 20  Prior->pLimit.  
12fc0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45       && sqlite3E
12fd0 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 50 72  xprIsInteger(pPr
12fe0 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 4c  ior->pLimit, &nL
12ff0 69 6d 69 74 29 0a 20 20 20 20 20 20 20 26 26 20  imit).       && 
13000 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e  nLimit>0 && p->n
13010 53 65 6c 65 63 74 52 6f 77 20 3e 20 28 75 36 34  SelectRow > (u64
13020 29 6e 4c 69 6d 69 74 20 0a 20 20 20 20 20 20 29  )nLimit .      )
13030 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65  {.        p->nSe
13040 6c 65 63 74 52 6f 77 20 3d 20 6e 4c 69 6d 69 74  lectRow = nLimit
13050 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13060 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20  if( addr ){.    
13070 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
13080 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
13090 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
130a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
130b0 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
130c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49  .    case TK_UNI
130d0 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ON: {.      int 
130e0 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20  unionTab;    /* 
130f0 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  Cursor number of
13100 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
13110 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73  able holding res
13120 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ult */.      u8 
13130 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  op = 0;       /*
13140 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f   One of the SRT_
13150 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61   operations to a
13160 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a  pply to self */.
13170 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f        int priorO
13180 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52  p;     /* The SR
13190 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  T_ operation to 
131a0 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73  apply to prior s
131b0 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20  elects */.      
131c0 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70  Expr *pLimit, *p
131d0 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64  Offset; /* Saved
131e0 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c   values of p->nL
131f0 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66  imit and p->nOff
13200 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  set */.      int
13210 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c   addr;.      Sel
13220 65 63 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73  ectDest uniondes
13230 74 3b 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61  t;..      testca
13240 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  se( p->op==TK_EX
13250 43 45 50 54 20 29 3b 0a 20 20 20 20 20 20 74 65  CEPT );.      te
13260 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
13270 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20  K_UNION );.     
13280 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55   priorOp = SRT_U
13290 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  nion;.      if( 
132a0 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f  dest.eDest==prio
132b0 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  rOp ){.        /
132c0 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61  * We can reuse a
132d0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
132e0 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20   generated by a 
132f0 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20  SELECT to our.  
13300 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a        ** right..
13310 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
13320 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c     assert( p->pL
13330 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20 20 20  imit==0 );      
13340 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f  /* Not allowed o
13350 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65  n leftward eleme
13360 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  nts */.        a
13370 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65  ssert( p->pOffse
13380 74 3d 3d 30 20 29 3b 20 20 20 20 20 2f 2a 20 4e  t==0 );     /* N
13390 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65  ot allowed on le
133a0 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20  ftward elements 
133b0 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  */.        union
133c0 54 61 62 20 3d 20 64 65 73 74 2e 69 53 44 50 61  Tab = dest.iSDPa
133d0 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  rm;.      }else{
133e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77  .        /* We w
133f0 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61  ill need to crea
13400 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f  te our own tempo
13410 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f  rary table to ho
13420 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ld the.        *
13430 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  * intermediate r
13440 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20  esults..        
13450 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  */.        union
13460 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
13470 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ab++;.        as
13480 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
13490 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  y==0 );.        
134a0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
134b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
134c0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e  penEphemeral, un
134d0 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  ionTab, 0);.    
134e0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
134f0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
13500 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  = -1 );.        
13510 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
13520 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  0] = addr;.     
13530 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74     findRightmost
13540 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  (p)->selFlags |=
13550 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
13560 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  l;.        asser
13570 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
13580 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
13590 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43  * Code the SELEC
135a0 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
135b0 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a  our left.      *
135c0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
135d0 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42  !pPrior->pOrderB
135e0 79 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  y );.      sqlit
135f0 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
13600 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69  (&uniondest, pri
13610 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b  orOp, unionTab);
13620 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
13630 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20  tInteger(iSub1, 
13640 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
13650 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
13660 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
13670 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
13680 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20   &uniondest);.  
13690 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
136a0 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
136b0 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
136c0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
136d0 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ode the current 
136e0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
136f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13700 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  if( p->op==TK_EX
13710 43 45 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20  CEPT ){.        
13720 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b  op = SRT_Except;
13730 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13740 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
13750 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
13760 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52  .        op = SR
13770 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d  T_Union;.      }
13780 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
13790 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d   = 0;.      pLim
137a0 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
137b0 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
137c0 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73  = 0;.      pOffs
137d0 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
137e0 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
137f0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e 69  t = 0;.      uni
13800 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d 20 6f  ondest.eDest = o
13810 70 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  p;.      explain
13820 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32  SetInteger(iSub2
13830 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
13840 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
13850 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
13860 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75  ct(pParse, p, &u
13870 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20  niondest);.     
13880 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
13890 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
138a0 20 20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74    /* Query flatt
138b0 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33  ening in sqlite3
138c0 53 65 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72  Select() might r
138d0 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42  efill p->pOrderB
138e0 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 20 73  y..      ** Be s
138f0 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d  ure to delete p-
13900 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65  >pOrderBy, there
13910 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61  fore, to avoid a
13920 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f   memory leak. */
13930 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
13940 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
13950 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
13960 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
13970 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
13980 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
13990 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72  or;.      p->pOr
139a0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
139b0 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55   if( p->op==TK_U
139c0 4e 49 4f 4e 20 29 20 70 2d 3e 6e 53 65 6c 65 63  NION ) p->nSelec
139d0 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e  tRow += pPrior->
139e0 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
139f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
13a00 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
13a10 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
13a20 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
13a30 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
13a40 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20   pOffset;.      
13a50 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->iLimit = 0;. 
13a60 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20       p->iOffset 
13a70 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  = 0;..      /* C
13a80 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20  onvert the data 
13a90 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
13aa0 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74   table into what
13ab0 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20  ever form.      
13ac0 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20 77 65  ** it is that we
13ad0 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e   currently need.
13ae0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13af0 61 73 73 65 72 74 28 20 75 6e 69 6f 6e 54 61 62  assert( unionTab
13b00 3d 3d 64 65 73 74 2e 69 53 44 50 61 72 6d 20 7c  ==dest.iSDParm |
13b10 7c 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72  | dest.eDest!=pr
13b20 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20 20 69  iorOp );.      i
13b30 66 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70  f( dest.eDest!=p
13b40 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20  riorOp ){.      
13b50 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
13b60 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
13b70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
13b80 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
13b90 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
13ba0 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
13bb0 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74            Select
13bc0 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20   *pFirst = p;.  
13bd0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
13be0 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20  First->pPrior ) 
13bf0 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
13c00 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
13c10 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
13c20 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30  nNames(pParse, 0
13c30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74  , pFirst->pEList
13c40 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
13c50 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
13c60 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
13c70 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69  el(v);.        i
13c80 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
13c90 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
13ca0 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c          computeL
13cb0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
13cc0 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29  arse, p, iBreak)
13cd0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
13ce0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13cf0 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54  P_Rewind, unionT
13d00 61 62 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  ab, iBreak); Vdb
13d10 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
13d20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
13d30 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
13d40 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
13d50 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
13d60 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
13d70 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62  pEList, unionTab
13d80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13d90 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
13da0 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42  &dest, iCont, iB
13db0 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
13dc0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
13dd0 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
13de0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
13df0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13e00 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62  P_Next, unionTab
13e10 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62 65 43  , iStart); VdbeC
13e20 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
13e30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
13e40 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
13e50 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
13e60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13e70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75  2(v, OP_Close, u
13e80 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
13e90 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
13ea0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
13eb0 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70 2d 3e  ult: assert( p->
13ec0 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
13ed0 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20   ); {.      int 
13ee0 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20  tab1, tab2;.    
13ef0 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
13f00 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
13f10 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c     Expr *pLimit,
13f20 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20   *pOffset;.     
13f30 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
13f40 20 53 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65   SelectDest inte
13f50 72 73 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20  rsectdest;.     
13f60 20 69 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20 20   int r1;..      
13f70 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20  /* INTERSECT is 
13f80 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
13f90 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20  he others since 
13fa0 69 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  it requires.    
13fb0 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61    ** two tempora
13fc0 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63  ry tables.  Henc
13fd0 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e  e it has its own
13fe0 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20   case.  Begin.  
13ff0 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61      ** by alloca
14000 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20  ting the tables 
14010 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20  we will need..  
14020 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62      */.      tab
14030 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  1 = pParse->nTab
14040 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d  ++;.      tab2 =
14050 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
14060 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14070 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
14080 0a 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ..      addr = s
14090 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
140a0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
140b0 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a  eral, tab1, 0);.
140c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
140d0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
140e0 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
140f0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
14100 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  0] = addr;.     
14110 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70   findRightmost(p
14120 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  )->selFlags |= S
14130 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
14140 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14150 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20  ->pEList );..   
14160 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53     /* Code the S
14170 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65  ELECTs to our le
14180 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72  ft into temporar
14190 79 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a  y table "tab1"..
141a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
141b0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
141c0 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63 74 64  Init(&intersectd
141d0 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20  est, SRT_Union, 
141e0 74 61 62 31 29 3b 0a 20 20 20 20 20 20 65 78 70  tab1);.      exp
141f0 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
14200 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub1, pParse->iN
14210 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
14220 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14230 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
14240 50 72 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63  Prior, &intersec
14250 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66  tdest);.      if
14260 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
14270 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
14280 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
14290 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
142a0 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
142b0 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
142c0 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20  table "tab2".   
142d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
142e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
142f0 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
14300 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20  phemeral, tab2, 
14310 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
14320 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
14330 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[1] == -1 );.  
14340 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
14350 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[1] = addr;. 
14360 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
14370 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74   0;.      pLimit
14380 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
14390 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
143a0 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74  0;.      pOffset
143b0 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
143c0 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
143d0 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 65 72  = 0;.      inter
143e0 73 65 63 74 64 65 73 74 2e 69 53 44 50 61 72 6d  sectdest.iSDParm
143f0 20 3d 20 74 61 62 32 3b 0a 20 20 20 20 20 20 65   = tab2;.      e
14400 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
14410 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e  (iSub2, pParse->
14420 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
14430 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14440 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
14450 20 70 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65   p, &intersectde
14460 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
14470 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
14480 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c  OK );.      pDel
14490 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ete = p->pPrior;
144a0 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
144b0 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
144c0 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52   if( p->nSelectR
144d0 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  ow>pPrior->nSele
144e0 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65  ctRow ) p->nSele
144f0 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e  ctRow = pPrior->
14500 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
14510 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
14520 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
14530 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
14540 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
14550 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
14560 20 70 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20   pOffset;..     
14570 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
14580 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e  e to take the in
14590 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68  tersection of th
145a0 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a  e two temporary.
145b0 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e        ** tables.
145c0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
145d0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
145e0 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  t );.      if( d
145f0 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  est.eDest==SRT_O
14600 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20  utput ){.       
14610 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20   Select *pFirst 
14620 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 77 68 69  = p;.        whi
14630 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
14640 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
14650 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
14660 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f        generateCo
14670 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
14680 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c  , 0, pFirst->pEL
14690 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
146a0 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
146b0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
146c0 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e  l(v);.      iCon
146d0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
146e0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
146f0 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
14700 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
14710 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
14720 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14730 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
14740 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29  d, tab1, iBreak)
14750 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
14760 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
14770 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
14780 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
14790 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
147a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
147b0 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20 72 31  RowKey, tab1, r1
147c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
147d0 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
147e0 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61   OP_NotFound, ta
147f0 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30  b2, iCont, r1, 0
14800 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
14810 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
14820 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
14830 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
14840 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
14850 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
14860 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 0a 20  >pEList, tab1,. 
14870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14880 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74       0, 0, &dest
14890 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29  , iCont, iBreak)
148a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
148b0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
148c0 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
148d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
148e0 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74  p2(v, OP_Next, t
148f0 61 62 31 2c 20 69 53 74 61 72 74 29 3b 20 56 64  ab1, iStart); Vd
14900 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
14910 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14920 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
14930 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
14940 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14950 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
14960 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  b2, 0);.      sq
14970 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14980 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
14990 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  1, 0);.      bre
149a0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
149b0 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74   explainComposit
149c0 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c  e(pParse, p->op,
149d0 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20 70   iSub1, iSub2, p
149e0 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a  ->op!=TK_ALL);..
149f0 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c    /* Compute col
14a00 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
14a10 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74   used by .  ** t
14a20 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20  emporary tables 
14a30 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d  needed to implem
14a40 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  ent the compound
14a50 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74   select..  ** At
14a60 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f  tach the KeyInfo
14a70 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c   structure to al
14a80 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  l temporary tabl
14a90 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
14aa0 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75  is section is ru
14ab0 6e 20 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d  n by the right-m
14ac0 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
14ad0 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20  ment only..  ** 
14ae0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
14af0 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c  s to the left al
14b00 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20 70  ways skip this p
14b10 61 72 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d  art.  The right-
14b20 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54  most.  ** SELECT
14b30 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70   might also skip
14b40 20 74 68 69 73 20 70 61 72 74 20 69 66 20 69 74   this part if it
14b50 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59   has no ORDER BY
14b60 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a   clause and.  **
14b70 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20   no temp tables 
14b80 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20  are required..  
14b90 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
14ba0 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73 45 70  lags & SF_UsesEp
14bb0 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69  hemeral ){.    i
14bc0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
14bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14be0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
14bf0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
14c00 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  yInfo;          
14c10 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
14c20 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
14c30 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
14c40 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b    Select *pLoop;
14c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c60 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  /* For looping t
14c70 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74  hrough SELECT st
14c80 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  atements */.    
14c90 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c  CollSeq **apColl
14ca0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
14cb0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
14cc0 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ough pKeyInfo->a
14cd0 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e  Coll[] */.    in
14ce0 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
14cf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
14d00 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
14d10 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a   in result set *
14d20 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  /..    assert( p
14d30 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20  ->pNext==0 );.  
14d40 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69    nCol = p->pELi
14d50 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70  st->nExpr;.    p
14d60 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
14d70 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
14d80 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20  , nCol, 1);.    
14d90 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b  if( !pKeyInfo ){
14da0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
14db0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
14dc0 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
14dd0 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
14de0 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c   for(i=0, apColl
14df0 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  =pKeyInfo->aColl
14e00 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61  ; i<nCol; i++, a
14e10 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20  pColl++){.      
14e20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53  *apColl = multiS
14e30 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
14e40 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20  rse, p, i);.    
14e50 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c    if( 0==*apColl
14e60 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43   ){.        *apC
14e70 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
14e80 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
14e90 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f   }..    for(pLoo
14ea0 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  p=p; pLoop; pLoo
14eb0 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29  p=pLoop->pPrior)
14ec0 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
14ed0 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<2; i++){.    
14ee0 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70      int addr = p
14ef0 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
14f00 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  hm[i];.        i
14f10 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20  f( addr<0 ){.   
14f20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d         /* If [0]
14f30 20 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20   is unused then 
14f40 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73  [1] is also unus
14f50 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20  ed.  So we can. 
14f60 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61           ** alwa
14f70 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20  ys safely abort 
14f80 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66  as soon as the f
14f90 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74  irst unused slot
14fa0 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20   is found */.   
14fb0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
14fc0 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
14fd0 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20  hm[1]<0 );.     
14fe0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14ff0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
15000 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
15010 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29  2(v, addr, nCol)
15020 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15030 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
15040 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 73 71   addr, (char*)sq
15050 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28  lite3KeyInfoRef(
15060 70 4b 65 79 49 6e 66 6f 29 2c 0a 20 20 20 20 20  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 50 34 5f 4b 45 59 49 4e 46         P4_KEYINF
15090 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f  O);.        pLoo
150a0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
150b0 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  i] = -1;.      }
150c0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
150d0 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
150e0 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d  KeyInfo);.  }..m
150f0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a  ulti_select_end:
15100 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20  .  pDest->iSdst 
15110 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20  = dest.iSdst;.  
15120 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64  pDest->nSdst = d
15130 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c  est.nSdst;.  sql
15140 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
15150 28 64 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20  (db, pDelete);. 
15160 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
15170 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
15180 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
15190 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ECT */../*.** Co
151a0 64 65 20 61 6e 20 6f 75 74 70 75 74 20 73 75 62  de an output sub
151b0 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20 63 6f  routine for a co
151c0 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
151d0 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53  tation of a.** S
151e0 45 4c 45 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a  ELECT statment..
151f0 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 20 74  **.** The data t
15200 6f 20 62 65 20 6f 75 74 70 75 74 20 69 73 20 63  o be output is c
15210 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d  ontained in pIn-
15220 3e 69 53 64 73 74 2e 20 20 54 68 65 72 65 20 61  >iSdst.  There a
15230 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74  re.** pIn->nSdst
15240 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f   columns to be o
15250 75 74 70 75 74 2e 20 20 70 44 65 73 74 20 69 73  utput.  pDest is
15260 20 77 68 65 72 65 20 74 68 65 20 6f 75 74 70 75   where the outpu
15270 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73  t should.** be s
15280 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65  ent..**.** regRe
15290 74 75 72 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  turn is the numb
152a0 65 72 20 6f 66 20 74 68 65 20 72 65 67 69 73 74  er of the regist
152b0 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  er holding the s
152c0 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  ubroutine.** ret
152d0 75 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a  urn address..**.
152e0 2a 2a 20 49 66 20 72 65 67 50 72 65 76 3e 30 20  ** If regPrev>0 
152f0 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 66  then it is the f
15300 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e  irst register in
15310 20 61 20 76 65 63 74 6f 72 20 74 68 61 74 0a 2a   a vector that.*
15320 2a 20 72 65 63 6f 72 64 73 20 74 68 65 20 70 72  * records the pr
15330 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20  evious output.  
15340 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20 69 73 20  mem[regPrev] is 
15350 61 20 66 6c 61 67 20 74 68 61 74 20 69 73 20 66  a flag that is f
15360 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65 72 65  alse.** if there
15370 20 68 61 73 20 62 65 65 6e 20 6e 6f 20 70 72 65   has been no pre
15380 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 49  vious output.  I
15390 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e  f regPrev>0 then
153a0 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65   code is.** gene
153b0 72 61 74 65 64 20 74 6f 20 73 75 70 70 72 65 73  rated to suppres
153c0 73 20 64 75 70 6c 69 63 61 74 65 73 2e 20 20 70  s duplicates.  p
153d0 4b 65 79 49 6e 66 6f 20 69 73 20 75 73 65 64 20  KeyInfo is used 
153e0 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a  for comparing.**
153f0 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   keys..**.** If 
15400 74 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20  the LIMIT found 
15410 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20  in p->iLimit is 
15420 72 65 61 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d  reached, jump im
15430 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20  mediately to.** 
15440 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69  iBreak..*/.stati
15450 63 20 69 6e 74 20 67 65 6e 65 72 61 74 65 4f 75  c int generateOu
15460 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 0a  tputSubroutine(.
15470 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
15480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
15490 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
154a0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
154b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
154c0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
154d0 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  t */.  SelectDes
154e0 74 20 2a 70 49 6e 2c 20 20 20 20 20 20 20 20 2f  t *pIn,        /
154f0 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73 75 70 70  * Coroutine supp
15500 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20  lying data */.  
15510 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
15520 74 2c 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65  t,      /* Where
15530 20 74 6f 20 73 65 6e 64 20 74 68 65 20 64 61 74   to send the dat
15540 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  a */.  int regRe
15550 74 75 72 6e 2c 20 20 20 20 20 20 20 20 20 20 2f  turn,          /
15560 2a 20 54 68 65 20 72 65 74 75 72 6e 20 61 64 64  * The return add
15570 72 65 73 73 20 72 65 67 69 73 74 65 72 20 2a 2f  ress register */
15580 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 2c 20  .  int regPrev, 
15590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
155a0 65 76 69 6f 75 73 20 72 65 73 75 6c 74 20 72 65  evious result re
155b0 67 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71  gister.  No uniq
155c0 75 65 6e 65 73 73 20 69 66 20 30 20 2a 2f 0a 20  ueness if 0 */. 
155d0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
155e0 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  fo,      /* For 
155f0 63 6f 6d 70 61 72 69 6e 67 20 77 69 74 68 20 70  comparing with p
15600 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f  revious entry */
15610 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20  .  int iBreak   
15620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
15630 6d 70 20 68 65 72 65 20 69 66 20 77 65 20 68 69  mp here if we hi
15640 74 20 74 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29  t the LIMIT */.)
15650 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
15660 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
15670 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  nt iContinue;.  
15680 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 61 64 64  int addr;..  add
15690 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
156a0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
156b0 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c   iContinue = sql
156c0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
156d0 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70  l(v);..  /* Supp
156e0 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 20  ress duplicates 
156f0 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  for UNION, EXCEP
15700 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54  T, and INTERSECT
15710 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67   .  */.  if( reg
15720 50 72 65 76 20 29 7b 0a 20 20 20 20 69 6e 74 20  Prev ){.    int 
15730 6a 31 2c 20 6a 32 3b 0a 20 20 20 20 6a 31 20 3d  j1, j2;.    j1 =
15740 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15750 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p1(v, OP_IfNot, 
15760 72 65 67 50 72 65 76 29 3b 20 56 64 62 65 43 6f  regPrev); VdbeCo
15770 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 6a  verage(v);.    j
15780 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
15790 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
157a0 61 72 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  are, pIn->iSdst,
157b0 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d   regPrev+1, pIn-
157c0 3e 6e 53 64 73 74 2c 0a 20 20 20 20 20 20 20 20  >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 28 63 68 61 72 2a 29 73 71 6c        (char*)sql
157f0 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70  ite3KeyInfoRef(p
15800 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59  KeyInfo), P4_KEY
15810 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74  INFO);.    sqlit
15820 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
15830 4f 50 5f 4a 75 6d 70 2c 20 6a 32 2b 32 2c 20 69  OP_Jump, j2+2, i
15840 43 6f 6e 74 69 6e 75 65 2c 20 6a 32 2b 32 29 3b  Continue, j2+2);
15850 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
15860 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15870 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
15880 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15890 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
158a0 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  py, pIn->iSdst, 
158b0 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e  regPrev+1, pIn->
158c0 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20 20 73 71  nSdst-1);.    sq
158d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
158e0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
158f0 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a  , regPrev);.  }.
15900 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
15910 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
15920 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
15930 20 53 75 70 70 72 65 73 73 20 74 68 65 20 66 69   Suppress the fi
15940 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74 72 69  rst OFFSET entri
15950 65 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  es if there is a
15960 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a  n OFFSET clause.
15970 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65    */.  codeOffse
15980 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
15990 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20   iContinue);..  
159a0 73 77 69 74 63 68 28 20 70 44 65 73 74 2d 3e 65  switch( pDest->e
159b0 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53  Dest ){.    /* S
159c0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
159d0 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20  as data using a 
159e0 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20  unique key..    
159f0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
15a00 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Table:.    case 
15a10 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
15a20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
15a30 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
15a40 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
15a50 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33  int r2 = sqlite3
15a60 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
15a70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
15a80 73 65 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  se( pDest->eDest
15a90 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20  ==SRT_Table );. 
15aa0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
15ab0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
15ac0 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20  _EphemTab );.   
15ad0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15ae0 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
15af0 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73  ecord, pIn->iSds
15b00 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72  t, pIn->nSdst, r
15b10 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
15b20 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15b30 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73  P_NewRowid, pDes
15b40 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 32 29 3b  t->iSDParm, r2);
15b50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15b60 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
15b70 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53  nsert, pDest->iS
15b80 44 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a  DParm, r1, r2);.
15b90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15ba0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
15bb0 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
15bc0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
15bd0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
15be0 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r2);.      sqli
15bf0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
15c00 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
15c10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15c20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
15c30 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
15c40 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
15c50 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
15c60 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20  for an "expr IN 
15c70 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f  (SELECT ...)" co
15c80 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20  nstruct,.    ** 
15c90 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c  then there shoul
15ca0 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74  d be a single it
15cb0 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  em on the stack.
15cc0 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20    Write this.   
15cd0 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68   ** item into th
15ce0 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68  e set table with
15cf0 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20   bogus data..   
15d00 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
15d10 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _Set: {.      in
15d20 74 20 72 31 3b 0a 20 20 20 20 20 20 61 73 73 65  t r1;.      asse
15d30 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d  rt( pIn->nSdst==
15d40 31 20 29 3b 0a 20 20 20 20 20 20 70 44 65 73 74  1 );.      pDest
15d50 2d 3e 61 66 66 53 64 73 74 20 3d 20 0a 20 20 20  ->affSdst = .   
15d60 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d        sqlite3Com
15d70 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 2d 3e  pareAffinity(p->
15d80 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
15d90 70 72 2c 20 70 44 65 73 74 2d 3e 61 66 66 53 64  pr, pDest->affSd
15da0 73 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  st);.      r1 = 
15db0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
15dc0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
15dd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15de0 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
15df0 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  ord, pIn->iSdst,
15e00 20 31 2c 20 72 31 2c 20 26 70 44 65 73 74 2d 3e   1, r1, &pDest->
15e10 61 66 66 53 64 73 74 2c 31 29 3b 0a 20 20 20 20  affSdst,1);.    
15e20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
15e30 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
15e40 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
15e50 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  dst, 1);.      s
15e60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15e70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
15e80 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
15e90 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
15ea0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
15eb0 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
15ec0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15ed0 20 7d 0a 0a 23 69 66 20 30 20 20 2f 2a 20 4e 65   }..#if 0  /* Ne
15ee0 76 65 72 20 6f 63 63 75 72 73 20 6f 6e 20 61 6e  ver occurs on an
15ef0 20 4f 52 44 45 52 20 42 59 20 71 75 65 72 79 20   ORDER BY query 
15f00 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79  */.    /* If any
15f10 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68   row exist in th
15f20 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65  e result set, re
15f30 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20 61  cord that fact a
15f40 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f  nd abort..    */
15f50 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78  .    case SRT_Ex
15f60 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71  ists: {.      sq
15f70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15f80 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
15f90 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
15fa0 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
15fb0 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
15fc0 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  l terminate the 
15fd0 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
15fe0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15ff0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
16000 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63   If this is a sc
16010 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74  alar select that
16020 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
16030 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a  xpression, then.
16040 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65      ** store the
16050 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
16060 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f  appropriate memo
16070 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61  ry cell and brea
16080 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20  k out.    ** of 
16090 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  the scan loop.. 
160a0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
160b0 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
160c0 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64  assert( pIn->nSd
160d0 73 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  st==1 );.      s
160e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
160f0 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ve(pParse, pIn->
16100 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53  iSdst, pDest->iS
16110 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20  DParm, 1);.     
16120 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
16130 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f  ause will jump o
16140 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66  ut of the loop f
16150 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
16160 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
16170 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
16180 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
16190 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68  RY */..    /* Th
161a0 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74  e results are st
161b0 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e  ored in a sequen
161c0 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a  ce of registers.
161d0 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20      ** starting 
161e0 61 74 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2e  at pDest->iSdst.
161f0 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f    Then the co-ro
16200 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20  utine yields..  
16210 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
16220 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20  T_Coroutine: {. 
16230 20 20 20 20 20 69 66 28 20 70 44 65 73 74 2d 3e       if( pDest->
16240 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  iSdst==0 ){.    
16250 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74      pDest->iSdst
16260 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
16270 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  pRange(pParse, p
16280 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20  In->nSdst);.    
16290 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74      pDest->nSdst
162a0 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20   = pIn->nSdst;. 
162b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
162c0 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
162d0 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
162e0 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 64 73  dst, pDest->iSds
162f0 74 2c 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 29  t, pDest->nSdst)
16300 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16310 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
16320 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53  Yield, pDest->iS
16330 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72  DParm);.      br
16340 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
16350 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68  /* If none of th
16360 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68  e above, then th
16370 65 20 72 65 73 75 6c 74 20 64 65 73 74 69 6e 61  e result destina
16380 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20 20  tion must be.   
16390 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e 20   ** SRT_Output. 
163a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
163b0 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69   never called wi
163c0 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 20  th any other.   
163d0 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20   ** destination 
163e0 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f  other than the o
163f0 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62 6f 76  nes handled abov
16400 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2e  e or SRT_Output.
16410 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
16420 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c 20 72  or SRT_Output, r
16430 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
16440 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20  d in a sequence 
16450 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20 20 0a  of registers.  .
16460 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20      ** Then the 
16470 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63  OP_ResultRow opc
16480 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f 20 63  ode is used to c
16490 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65  ause sqlite3_ste
164a0 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65  p() to.    ** re
164b0 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20 72 6f  turn the next ro
164c0 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20  w of result..   
164d0 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
164e0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
164f0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
16500 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
16510 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16520 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
16530 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74  tRow, pIn->iSdst
16540 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
16550 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
16560 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
16570 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  nge(pParse, pIn-
16580 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
16590 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
165a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
165b0 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  * Jump to the en
165c0 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66  d of the loop if
165d0 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65   the LIMIT is re
165e0 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ached..  */.  if
165f0 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ( p->iLimit ){. 
16600 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16610 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a 65 72  dOp3(v, OP_IfZer
16620 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42  o, p->iLimit, iB
16630 72 65 61 6b 2c 20 2d 31 29 3b 20 56 64 62 65 43  reak, -1); VdbeC
16640 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
16650 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74  .  /* Generate t
16660 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65  he subroutine re
16670 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  turn.  */.  sqli
16680 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
16690 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65  bel(v, iContinue
166a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
166b0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
166c0 75 72 6e 2c 20 72 65 67 52 65 74 75 72 6e 29 3b  urn, regReturn);
166d0 0a 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ..  return addr;
166e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e  .}../*.** Altern
166f0 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73  ative compound s
16700 65 6c 65 63 74 20 63 6f 64 65 20 67 65 6e 65 72  elect code gener
16710 61 74 6f 72 20 66 6f 72 20 63 61 73 65 73 20 77  ator for cases w
16720 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73 20  hen there.** is 
16730 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
16740 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73  se..**.** We ass
16750 75 6d 65 20 61 20 71 75 65 72 79 20 6f 66 20 74  ume a query of t
16760 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72  he following for
16770 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73  m:.**.**      <s
16780 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72 61 74  electA>  <operat
16790 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20 20  or>  <selectB>  
167a0 4f 52 44 45 52 20 42 59 20 3c 6f 72 64 65 72 62  ORDER BY <orderb
167b0 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70  ylist>.**.** <op
167c0 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f  erator> is one o
167d0 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49  f UNION ALL, UNI
167e0 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49  ON, EXCEPT, or I
167f0 4e 54 45 52 53 45 43 54 2e 20 20 54 68 65 20 69  NTERSECT.  The i
16800 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64  dea.** is to cod
16810 65 20 62 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e  e both <selectA>
16820 20 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20 77   and <selectB> w
16830 69 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ith the ORDER BY
16840 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f   clause as.** co
16850 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54 68 65 6e  -routines.  Then
16860 20 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74   run the co-rout
16870 69 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c  ines in parallel
16880 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72   and merge the r
16890 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74  esults.** into t
168a0 68 65 20 6f 75 74 70 75 74 2e 20 20 49 6e 20 61  he output.  In a
168b0 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74  ddition to the t
168c0 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 28 63  wo coroutines (c
168d0 61 6c 6c 65 64 20 73 65 6c 65 63 74 41 20 61 6e  alled selectA an
168e0 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20 74 68  d.** selectB) th
168f0 65 72 65 20 61 72 65 20 37 20 73 75 62 72 6f 75  ere are 7 subrou
16900 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tines:.**.**    
16910 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65 20 74 68  outA:    Move th
16920 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20  e output of the 
16930 73 65 6c 65 63 74 41 20 63 6f 72 6f 75 74 69 6e  selectA coroutin
16940 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  e into the outpu
16950 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
16960 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
16970 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20   query..**.**   
16980 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65 20 74   outB:    Move t
16990 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65  he output of the
169a0 20 73 65 6c 65 63 74 42 20 63 6f 72 6f 75 74 69   selectB corouti
169b0 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  ne into the outp
169c0 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
169d0 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e    of the compoun
169e0 64 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20  d query.  (Only 
169f0 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 55 4e  generated for UN
16a00 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ION and.**      
16a10 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
16a20 2e 20 20 45 58 43 45 50 54 20 61 6e 64 20 49 4e  .  EXCEPT and IN
16a30 53 45 52 54 53 45 43 54 20 6e 65 76 65 72 20 6f  SERTSECT never o
16a40 75 74 70 75 74 20 61 20 72 6f 77 20 74 68 61 74  utput a row that
16a50 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
16a60 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20  appears only in 
16a70 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74  B.).**.**    Alt
16a80 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
16a90 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
16aa0 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
16ab0 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a  ines and A<B..**
16ac0 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 20 20 20  .**    AeqB:    
16ad0 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
16ae0 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
16af0 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
16b00 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20  nd A==B..**.**  
16b10 20 20 41 67 74 42 3a 20 20 20 20 43 61 6c 6c 65    AgtB:    Calle
16b20 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
16b30 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
16b40 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3e  oroutines and A>
16b50 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41  B..**.**    EofA
16b60 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
16b70 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
16b80 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e  ed from selectA.
16b90 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20  .**.**    EofB: 
16ba0 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64     Called when d
16bb0 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64  ata is exhausted
16bc0 20 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a   from selectB..*
16bd0 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
16be0 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  ntation of the l
16bf0 61 74 74 65 72 20 66 69 76 65 20 73 75 62 72 6f  atter five subro
16c00 75 74 69 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e  utines depend on
16c10 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72   which .** <oper
16c20 61 74 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a  ator> is used:.*
16c30 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  *.**.**         
16c40 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20      UNION ALL   
16c50 20 20 20 20 20 20 55 4e 49 4f 4e 20 20 20 20 20        UNION     
16c60 20 20 20 20 20 20 20 45 58 43 45 50 54 20 20 20         EXCEPT   
16c70 20 20 20 20 20 20 20 49 4e 54 45 52 53 45 43 54         INTERSECT
16c80 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d 2d 2d  .**          ---
16c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ----------  ----
16ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
16cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
16cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16cd0 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f 75  .**   AltB:   ou
16ce0 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f  tA, nextA      o
16cf0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
16d00 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
16d10 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a       nextA.**.**
16d20 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74 41 2c     AeqB:   outA,
16d30 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e   nextA         n
16d40 65 78 74 41 20 20 20 20 20 20 20 20 20 20 20 20  extA            
16d50 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6f   nextA         o
16d60 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a  utA, nextA.**.**
16d70 20 20 20 41 67 74 42 3a 20 20 20 6f 75 74 42 2c     AgtB:   outB,
16d80 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42   nextB      outB
16d90 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20  , nextB         
16da0 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
16db0 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20    nextB.**.**   
16dc0 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65  EofA:   outB, ne
16dd0 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e  xtB      outB, n
16de0 65 78 74 42 20 20 20 20 20 20 20 20 20 20 68 61  extB          ha
16df0 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20 68  lt             h
16e00 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42  alt.**.**   EofB
16e10 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20  :   outA, nextA 
16e20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
16e30 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
16e40 74 41 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a  tA         halt.
16e50 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74  **.** In the Alt
16e60 42 2c 20 41 65 71 42 2c 20 61 6e 64 20 41 67 74  B, AeqB, and Agt
16e70 42 20 73 75 62 72 6f 75 74 69 6e 65 73 2c 20 61  B subroutines, a
16e80 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f  n EOF on A follo
16e90 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61  wing nextA.** ca
16ea0 75 73 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74  uses an immediat
16eb0 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20 61  e jump to EofA a
16ec0 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66  nd an EOF on B f
16ed0 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20 63  ollowing nextB c
16ee0 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65  auses.** an imme
16ef0 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f  diate jump to Eo
16f00 66 42 2e 20 20 57 69 74 68 69 6e 20 45 6f 66 41  fB.  Within EofA
16f10 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20 45   and EofB, and E
16f20 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a  OF on entry or.*
16f30 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  * following next
16f40 58 20 63 61 75 73 65 73 20 61 20 6a 75 6d 70 20  X causes a jump 
16f50 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
16f60 65 20 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73  e select process
16f70 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69  ing..**.** Dupli
16f80 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20  cate removal in 
16f90 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  the UNION, EXCEP
16fa0 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54  T, and INTERSECT
16fb0 20 63 61 73 65 73 20 69 73 20 68 61 6e 64 6c 65   cases is handle
16fc0 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  d.** within the 
16fd0 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
16fe0 65 2e 20 20 54 68 65 20 72 65 67 50 72 65 76 20  e.  The regPrev 
16ff0 72 65 67 69 73 74 65 72 20 73 65 74 20 68 6f 6c  register set hol
17000 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c  ds the previousl
17010 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c 75  y.** output valu
17020 65 2e 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e  e.  A comparison
17030 20 69 73 20 6d 61 64 65 20 61 67 61 69 6e 73 74   is made against
17040 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e 64 20   this value and 
17050 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73  the output.** is
17060 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
17070 6e 65 78 74 20 72 65 73 75 6c 74 73 20 77 6f 75  next results wou
17080 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ld be the same a
17090 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 0a  s the previous..
170a0 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  **.** The implem
170b0 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73  entation plan is
170c0 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
170d0 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73  e two coroutines
170e0 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75   and seven.** su
170f0 62 72 6f 75 74 69 6e 65 73 20 66 69 72 73 74 2c  broutines first,
17100 20 74 68 65 6e 20 70 75 74 20 74 68 65 20 63 6f   then put the co
17110 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74  ntrol logic at t
17120 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65  he bottom.  Like
17130 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
17140 20 20 20 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a        goto Init.
17150 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f  **     coA: coro
17160 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 71  utine for left q
17170 75 65 72 79 20 28 41 29 0a 2a 2a 20 20 20 20 20  uery (A).**     
17180 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66  coB: coroutine f
17190 6f 72 20 72 69 67 68 74 20 71 75 65 72 79 20 28  or right query (
171a0 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f  B).**    outA: o
171b0 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66  utput one row of
171c0 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f   A.**    outB: o
171d0 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66  utput one row of
171e0 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e   B (UNION and UN
171f0 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a  ION ALL only).**
17200 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a      EofA: ....**
17210 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a      EofB: ....**
17220 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a      AltB: ....**
17230 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a      AeqB: ....**
17240 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a      AgtB: ....**
17250 20 20 20 20 49 6e 69 74 3a 20 69 6e 69 74 69 61      Init: initia
17260 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20 72  lize coroutine r
17270 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20  egisters.**     
17280 20 20 20 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a       yield coA.*
17290 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f  *          if eo
172a0 66 28 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a  f(A) goto EofA.*
172b0 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64  *          yield
172c0 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20 20   coB.**         
172d0 20 69 66 20 65 6f 66 28 42 29 20 67 6f 74 6f 20   if eof(B) goto 
172e0 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a  EofB.**    Cmpr:
172f0 20 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a   Compare A, B.**
17300 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20 41            Jump A
17310 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 0a  ltB, AeqB, AgtB.
17320 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a  **     End: ....
17330 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c  **.** We call Al
17340 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 2c 20  tB, AeqB, AgtB, 
17350 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42 20 22  EofA, and EofB "
17360 73 75 62 72 6f 75 74 69 6e 65 73 22 20 62 75 74  subroutines" but
17370 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a   they are not.**
17380 20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64   actually called
17390 20 75 73 69 6e 67 20 47 6f 73 75 62 20 61 6e 64   using Gosub and
173a0 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 52 65 74   they do not Ret
173b0 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20 45  urn.  EofA and E
173c0 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69  ofB loop.** unti
173d0 6c 20 61 6c 6c 20 64 61 74 61 20 69 73 20 65 78  l all data is ex
173e0 68 61 75 73 74 65 64 20 74 68 65 6e 20 6a 75 6d  hausted then jum
173f0 70 20 74 6f 20 74 68 65 20 22 65 6e 64 22 20 6c  p to the "end" l
17400 61 62 65 2e 20 20 41 6c 74 42 2c 20 41 65 71 42  abe.  AltB, AeqB
17410 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a 75  ,.** and AgtB ju
17420 6d 70 20 74 6f 20 65 69 74 68 65 72 20 4c 32 20  mp to either L2 
17430 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66  or to one of Eof
17440 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69  A or EofB..*/.#i
17450 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17460 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
17470 54 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  T.static int mul
17480 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
17490 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
174a0 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
174b0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
174c0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
174d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
174e0 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
174f0 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
17500 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
17510 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
17520 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
17530 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
17540 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
17550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
17560 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
17570 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20  Select *pPrior; 
17580 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72        /* Another
17590 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74   SELECT immediat
175a0 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  ely to our left 
175b0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
175c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
175d0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
175e0 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65  his VDBE */.  Se
175f0 6c 65 63 74 44 65 73 74 20 64 65 73 74 41 3b 20  lectDest destA; 
17600 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69      /* Destinati
17610 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65  on for coroutine
17620 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65   A */.  SelectDe
17630 73 74 20 64 65 73 74 42 3b 20 20 20 20 20 2f 2a  st destB;     /*
17640 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72   Destination for
17650 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a   coroutine B */.
17660 20 20 69 6e 74 20 72 65 67 41 64 64 72 41 3b 20    int regAddrA; 
17670 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
17680 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
17690 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69  select-A corouti
176a0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41  ne */.  int regA
176b0 64 64 72 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  ddrB;         /*
176c0 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
176d0 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 42 20 63  r for select-B c
176e0 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
176f0 74 20 61 64 64 72 53 65 6c 65 63 74 41 3b 20 20  t addrSelectA;  
17700 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
17710 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 20 63  f the select-A c
17720 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
17730 74 20 61 64 64 72 53 65 6c 65 63 74 42 3b 20 20  t addrSelectB;  
17740 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
17750 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 20 63  f the select-B c
17760 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
17770 74 20 72 65 67 4f 75 74 41 3b 20 20 20 20 20 20  t regOutA;      
17780 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
17790 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20  egister for the 
177a0 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74  output-A subrout
177b0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
177c0 4f 75 74 42 3b 20 20 20 20 20 20 20 20 20 20 2f  OutB;          /
177d0 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
177e0 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75  er for the outpu
177f0 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-B subroutine *
17800 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 41  /.  int addrOutA
17810 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
17820 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70  ress of the outp
17830 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-A subroutine 
17840 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74  */.  int addrOut
17850 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41 64  B = 0;     /* Ad
17860 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74  dress of the out
17870 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  put-B subroutine
17880 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f   */.  int addrEo
17890 66 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  fA;         /* A
178a0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
178b0 6c 65 63 74 2d 41 2d 65 78 68 61 75 73 74 65 64  lect-A-exhausted
178c0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
178d0 20 69 6e 74 20 61 64 64 72 45 6f 66 41 5f 6e 6f   int addrEofA_no
178e0 42 3b 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e  B;     /* Altern
178f0 61 74 65 20 61 64 64 72 45 6f 66 41 20 69 66 20  ate addrEofA if 
17900 42 20 69 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a  B is uninitializ
17910 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ed */.  int addr
17920 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  EofB;         /*
17930 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
17940 73 65 6c 65 63 74 2d 42 2d 65 78 68 61 75 73 74  select-B-exhaust
17950 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ed subroutine */
17960 0a 20 20 69 6e 74 20 61 64 64 72 41 6c 74 42 3b  .  int addrAltB;
17970 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
17980 65 73 73 20 6f 66 20 74 68 65 20 41 3c 42 20 73  ess of the A<B s
17990 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
179a0 6e 74 20 61 64 64 72 41 65 71 42 3b 20 20 20 20  nt addrAeqB;    
179b0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
179c0 6f 66 20 74 68 65 20 41 3d 3d 42 20 73 75 62 72  of the A==B subr
179d0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
179e0 61 64 64 72 41 67 74 42 3b 20 20 20 20 20 20 20  addrAgtB;       
179f0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
17a00 74 68 65 20 41 3e 42 20 73 75 62 72 6f 75 74 69  the A>B subrouti
17a10 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c  ne */.  int regL
17a20 69 6d 69 74 41 3b 20 20 20 20 20 20 20 20 2f 2a  imitA;        /*
17a30 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20   Limit register 
17a40 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a  for select-A */.
17a50 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b    int regLimitB;
17a60 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74          /* Limit
17a70 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
17a80 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20  lect-A */.  int 
17a90 72 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20  regPrev;        
17aa0 20 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66 20    /* A range of 
17ab0 72 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c  registers to hol
17ac0 64 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  d previous outpu
17ad0 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64  t */.  int saved
17ae0 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20  Limit;       /* 
17af0 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70  Saved value of p
17b00 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e  ->iLimit */.  in
17b10 74 20 73 61 76 65 64 4f 66 66 73 65 74 3b 20 20  t savedOffset;  
17b20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c      /* Saved val
17b30 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74  ue of p->iOffset
17b40 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43   */.  int labelC
17b50 6d 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  mpr;        /* L
17b60 61 62 65 6c 20 66 6f 72 20 74 68 65 20 73 74 61  abel for the sta
17b70 72 74 20 6f 66 20 74 68 65 20 6d 65 72 67 65 20  rt of the merge 
17b80 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69  algorithm */.  i
17b90 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20  nt labelEnd;    
17ba0 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f       /* Label fo
17bb0 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
17bc0 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43 54 20   overall SELECT 
17bd0 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 31  stmt */.  int j1
17be0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17bf0 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75 63 74  /* Jump instruct
17c00 69 6f 6e 73 20 74 68 61 74 20 67 65 74 20 72 65  ions that get re
17c10 74 61 72 67 65 74 74 65 64 20 2a 2f 0a 20 20 69  targetted */.  i
17c20 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
17c30 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54       /* One of T
17c40 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c  K_ALL, TK_UNION,
17c50 20 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49   TK_EXCEPT, TK_I
17c60 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65  NTERSECT */.  Ke
17c70 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d  yInfo *pKeyDup =
17c80 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f   0; /* Compariso
17c90 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  n information fo
17ca0 72 20 64 75 70 6c 69 63 61 74 65 20 72 65 6d 6f  r duplicate remo
17cb0 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  val */.  KeyInfo
17cc0 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f   *pKeyMerge;   /
17cd0 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66  * Comparison inf
17ce0 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72  ormation for mer
17cf0 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73  ging rows */.  s
17d00 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
17d10 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
17d20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
17d30 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
17d40 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52  rBy;   /* The OR
17d50 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
17d60 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b  .  int nOrderBy;
17d70 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
17d80 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74  er of terms in t
17d90 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
17da0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65  se */.  int *aPe
17db0 72 6d 75 74 65 3b 20 20 20 20 20 20 20 20 2f 2a  rmute;        /*
17dc0 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52   Mapping from OR
17dd0 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20  DER BY terms to 
17de0 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d  result set colum
17df0 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  ns */.#ifndef SQ
17e00 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
17e10 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 3b 20 20  N.  int iSub1;  
17e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50            /* EQP
17e30 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64   id of left-hand
17e40 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
17e50 69 53 75 62 32 3b 20 20 20 20 20 20 20 20 20 20  iSub2;          
17e60 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72    /* EQP id of r
17e70 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20  ight-hand query 
17e80 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  */.#endif..  ass
17e90 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
17ea0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
17eb0 20 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b 20 2f   pKeyDup==0 ); /
17ec0 2a 20 22 4d 61 6e 61 67 65 64 22 20 63 6f 64 65  * "Managed" code
17ed0 20 6e 65 65 64 73 20 74 68 69 73 2e 20 20 54 69   needs this.  Ti
17ee0 63 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f 0a 20  cket #3382. */. 
17ef0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
17f00 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  v = pParse->
17f10 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
17f20 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f   v!=0 );       /
17f30 2a 20 41 6c 72 65 61 64 79 20 74 68 72 6f 77 6e  * Already thrown
17f40 20 74 68 65 20 65 72 72 6f 72 20 69 66 20 56 44   the error if VD
17f50 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20  BE alloc failed 
17f60 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20  */.  labelEnd = 
17f70 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
17f80 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c  abel(v);.  label
17f90 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Cmpr = sqlite3Vd
17fa0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
17fb0 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75 70 20  ..  /* Patch up 
17fc0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
17fd0 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20  use.  */.  op = 
17fe0 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f  p->op;  .  pPrio
17ff0 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
18000 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d   assert( pPrior-
18010 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
18020 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
18030 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73 65  pOrderBy;.  asse
18040 72 74 28 20 70 4f 72 64 65 72 42 79 20 29 3b 0a  rt( pOrderBy );.
18050 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72    nOrderBy = pOr
18060 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20  derBy->nExpr;.. 
18070 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f 72   /* For operator
18080 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49  s other than UNI
18090 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20 74  ON ALL we have t
180a0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
180b0 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20  .  ** the ORDER 
180c0 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72 73  BY clause covers
180d0 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74   every term of t
180e0 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
180f0 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74  Add.  ** terms t
18100 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
18110 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73 73 61  lause as necessa
18120 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ry..  */.  if( o
18130 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p!=TK_ALL ){.   
18140 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61   for(i=1; db->ma
18150 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26  llocFailed==0 &&
18160 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   i<=p->pEList->n
18170 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
18180 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
18190 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
181a0 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49       for(j=0, pI
181b0 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b  tem=pOrderBy->a;
181c0 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b   j<nOrderBy; j++
181d0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
181e0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
181f0 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
18200 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ol>0 );.        
18210 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  if( pItem->u.x.i
18220 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 69 20 29 20  OrderByCol==i ) 
18230 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
18240 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64       if( j==nOrd
18250 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
18260 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
18270 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
18280 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20 20 20  INTEGER, 0);.   
18290 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30       if( pNew==0
182a0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
182b0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
182c0 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
182d0 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20  P_IntValue;.    
182e0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c      pNew->u.iVal
182f0 75 65 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  ue = i;.        
18300 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
18310 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
18320 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
18330 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  y, pNew);.      
18340 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
18350 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 4f 72   pOrderBy->a[nOr
18360 64 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69 4f 72  derBy++].u.x.iOr
18370 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31 36 29  derByCol = (u16)
18380 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  i;.      }.    }
18390 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
183a0 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  te the compariso
183b0 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 61 6e  n permutation an
183c0 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74 20 69  d keyinfo that i
183d0 73 20 75 73 65 64 20 77 69 74 68 0a 20 20 2a 2a  s used with.  **
183e0 20 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e   the permutation
183f0 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
18400 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74 0a 20  ne if the next. 
18410 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73 75 6c   ** row of resul
18420 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73 65  ts comes from se
18430 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63 74 42  lectA or selectB
18440 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78 70 6c  .  Also add expl
18450 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74  icit.  ** collat
18460 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52 44 45  ions to the ORDE
18470 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d  R BY clause term
18480 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74  s so that when t
18490 68 65 20 73 75 62 71 75 65 72 69 65 73 0a 20 20  he subqueries.  
184a0 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  ** to the right 
184b0 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61 72 65  and the left are
184c0 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68 65 79   evaluated, they
184d0 20 75 73 65 20 74 68 65 20 63 6f 72 72 65 63 74   use the correct
184e0 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e  .  ** collation.
184f0 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74 65  .  */.  aPermute
18500 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
18510 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
18520 28 69 6e 74 29 2a 6e 4f 72 64 65 72 42 79 29 3b  (int)*nOrderBy);
18530 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74 65 20  .  if( aPermute 
18540 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
18550 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
18560 65 6d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  em;.    for(i=0,
18570 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d   pItem=pOrderBy-
18580 3e 61 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  >a; i<nOrderBy; 
18590 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
185a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
185b0 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
185c0 43 6f 6c 3e 30 0a 20 20 20 20 20 20 20 20 20 20  Col>0.          
185d0 26 26 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  && pItem->u.x.iO
185e0 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45  rderByCol<=p->pE
185f0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
18600 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b 69 5d       aPermute[i]
18610 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f   = pItem->u.x.iO
18620 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b 0a 20  rderByCol - 1;. 
18630 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72     }.    pKeyMer
18640 67 65 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ge = multiSelect
18650 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 70  OrderByKeyInfo(p
18660 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20  Parse, p, 1);.  
18670 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d  }else{.    pKeyM
18680 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  erge = 0;.  }.. 
18690 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68 65   /* Reattach the
186a0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
186b0 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a 20   to the query.. 
186c0 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42   */.  p->pOrderB
186d0 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
186e0 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
186f0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
18700 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  stDup(pParse->db
18710 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a  , pOrderBy, 0);.
18720 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
18730 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72   range of tempor
18740 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61 6e  ary registers an
18750 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65  d the KeyInfo ne
18760 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68  eded.  ** for th
18770 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65 6d  e logic that rem
18780 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65 20 72  oves duplicate r
18790 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e 20  esult rows when 
187a0 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f  the.  ** operato
187b0 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45  r is UNION, EXCE
187c0 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
187d0 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20   (but not UNION 
187e0 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ALL)..  */.  if(
187f0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
18800 20 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b 0a     regPrev = 0;.
18810 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
18820 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   nExpr = p->pELi
18830 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61  st->nExpr;.    a
18840 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e  ssert( nOrderBy>
18850 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61  =nExpr || db->ma
18860 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
18870 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72    regPrev = pPar
18880 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
18890 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
188a0 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 73 71 6c  nExpr+1;.    sql
188b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
188c0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
188d0 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20 70   regPrev);.    p
188e0 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65 33  KeyDup = sqlite3
188f0 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c  KeyInfoAlloc(db,
18900 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20 20   nExpr, 1);.    
18910 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a 20  if( pKeyDup ){. 
18920 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
18930 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
18940 74 65 61 62 6c 65 28 70 4b 65 79 44 75 70 29 20  teable(pKeyDup) 
18950 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
18960 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ; i<nExpr; i++){
18970 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70  .        pKeyDup
18980 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c  ->aColl[i] = mul
18990 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
189a0 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
189b0 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e         pKeyDup->
189c0 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
189d0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
189e0 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61  .  }. .  /* Sepa
189f0 72 61 74 65 20 74 68 65 20 6c 65 66 74 20 61 6e  rate the left an
18a00 64 20 74 68 65 20 72 69 67 68 74 20 71 75 65 72  d the right quer
18a10 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68  y from one anoth
18a20 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72  er.  */.  p->pPr
18a30 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f  ior = 0;.  pPrio
18a40 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  r->pNext = 0;.  
18a50 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
18a60 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
18a70 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e, p, p->pOrderB
18a80 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 69  y, "ORDER");.  i
18a90 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f  f( pPrior->pPrio
18aa0 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
18ab0 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47  te3ResolveOrderG
18ac0 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
18ad0 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70  Prior, pPrior->p
18ae0 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22  OrderBy, "ORDER"
18af0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d  );.  }..  /* Com
18b00 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20 72  pute the limit r
18b10 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f  egisters */.  co
18b20 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
18b30 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 6c  ers(pParse, p, l
18b40 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20  abelEnd);.  if( 
18b50 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d  p->iLimit && op=
18b60 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72  =TK_ALL ){.    r
18b70 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61  egLimitA = ++pPa
18b80 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
18b90 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61  egLimitB = ++pPa
18ba0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
18bb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18bc0 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e  (v, OP_Copy, p->
18bd0 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66  iOffset ? p->iOf
18be0 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d  fset+1 : p->iLim
18bf0 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  it,.            
18c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c10 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74 41 29        regLimitA)
18c20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
18c30 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
18c40 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20 72  py, regLimitA, r
18c50 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c  egLimitB);.  }el
18c60 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74  se{.    regLimit
18c70 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d 20  A = regLimitB = 
18c80 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
18c90 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
18ca0 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e  ->pLimit);.  p->
18cb0 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71  pLimit = 0;.  sq
18cc0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
18cd0 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
18ce0 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20  .  p->pOffset = 
18cf0 30 3b 0a 0a 20 20 72 65 67 41 64 64 72 41 20 3d  0;..  regAddrA =
18d00 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
18d10 0a 20 20 72 65 67 41 64 64 72 42 20 3d 20 2b 2b  .  regAddrB = ++
18d20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
18d30 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72  regOutA = ++pPar
18d40 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f  se->nMem;.  regO
18d50 75 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  utB = ++pParse->
18d60 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53  nMem;.  sqlite3S
18d70 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
18d80 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74  estA, SRT_Corout
18d90 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29 3b 0a  ine, regAddrA);.
18da0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
18db0 65 73 74 49 6e 69 74 28 26 64 65 73 74 42 2c 20  estInit(&destB, 
18dc0 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72  SRT_Coroutine, r
18dd0 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20  egAddrB);..  /* 
18de0 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75  Generate a corou
18df0 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65  tine to evaluate
18e00 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
18e10 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a  ement to the.  *
18e20 2a 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63 6f  * left of the co
18e30 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 20  mpound operator 
18e40 2d 20 74 68 65 20 22 41 22 20 73 65 6c 65 63 74  - the "A" select
18e50 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c  ..  */.  addrSel
18e60 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33 56 64  ectA = sqlite3Vd
18e70 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
18e80 20 2b 20 31 3b 0a 20 20 6a 31 20 3d 20 73 71 6c   + 1;.  j1 = sql
18e90 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
18ea0 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
18eb0 6e 65 2c 20 72 65 67 41 64 64 72 41 2c 20 30 2c  ne, regAddrA, 0,
18ec0 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20   addrSelectA);. 
18ed0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
18ee0 20 22 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29   "left SELECT"))
18ef0 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d  ;.  pPrior->iLim
18f00 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a  it = regLimitA;.
18f10 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
18f20 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
18f30 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
18f40 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
18f50 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
18f60 72 2c 20 26 64 65 73 74 41 29 3b 0a 20 20 73 71  r, &destA);.  sq
18f70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
18f80 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69  v, OP_EndCorouti
18f90 6e 65 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20  ne, regAddrA);. 
18fa0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
18fb0 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20  Here(v, j1);..  
18fc0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f  /* Generate a co
18fd0 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75  routine to evalu
18fe0 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ate the SELECT s
18ff0 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a  tatement on .  *
19000 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20 74 68  * the right - th
19010 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20 20 2a  e "B" select.  *
19020 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74 42 20  /.  addrSelectB 
19030 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
19040 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b  rentAddr(v) + 1;
19050 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56  .  j1 = sqlite3V
19060 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
19070 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72  InitCoroutine, r
19080 65 67 41 64 64 72 42 2c 20 30 2c 20 61 64 64 72  egAddrB, 0, addr
19090 53 65 6c 65 63 74 42 29 3b 0a 20 20 56 64 62 65  SelectB);.  Vdbe
190a0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 69 67  Comment((v, "rig
190b0 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20  ht SELECT"));.  
190c0 73 61 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e  savedLimit = p->
190d0 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f  iLimit;.  savedO
190e0 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73  ffset = p->iOffs
190f0 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20  et;.  p->iLimit 
19100 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70  = regLimitB;.  p
19110 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 20 20  ->iOffset = 0;  
19120 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74  .  explainSetInt
19130 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72  eger(iSub2, pPar
19140 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
19150 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  d);.  sqlite3Sel
19160 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
19170 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69  destB);.  p->iLi
19180 6d 69 74 20 3d 20 73 61 76 65 64 4c 69 6d 69 74  mit = savedLimit
19190 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  ;.  p->iOffset =
191a0 20 73 61 76 65 64 4f 66 66 73 65 74 3b 0a 20 20   savedOffset;.  
191b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
191c0 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75  1(v, OP_EndCorou
191d0 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b  tine, regAddrB);
191e0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
191f0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
19200 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75  t outputs the cu
19210 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65  rrent row of the
19220 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61   A.  ** select a
19230 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75  s the next outpu
19240 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d  t row of the com
19250 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
19260 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
19270 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74  ment((v, "Output
19280 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29   routine for A")
19290 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20  );.  addrOutA = 
192a0 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75  generateOutputSu
192b0 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c  broutine(pParse,
192c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
192d0 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65    p, &destA, pDe
192e0 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20  st, regOutA,.   
192f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
19300 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20  gPrev, pKeyDup, 
19310 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20  labelEnd);.  .  
19320 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
19330 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
19340 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e  tputs the curren
19350 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a 20  t row of the B. 
19360 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68   ** select as th
19370 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f  e next output ro
19380 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  w of the compoun
19390 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20  d select..  */. 
193a0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
193b0 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  || op==TK_UNION 
193c0 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43  ){.    VdbeNoopC
193d0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70  omment((v, "Outp
193e0 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42  ut routine for B
193f0 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75 74  "));.    addrOut
19400 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70  B = generateOutp
19410 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61  utSubroutine(pPa
19420 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
19430 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 42 2c        p, &destB,
19440 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42 2c   pDest, regOutB,
19450 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19460 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44    regPrev, pKeyD
19470 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  up, labelEnd);. 
19480 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65 79 49   }.  sqlite3KeyI
19490 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 44 75 70  nfoUnref(pKeyDup
194a0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
194b0 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
194c0 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72  o run when the r
194d0 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65  esults from sele
194e0 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78  ct A.  ** are ex
194f0 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79  hausted and only
19500 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20   data in select 
19510 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a  B remains..  */.
19520 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43    if( op==TK_EXC
19530 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e  EPT || op==TK_IN
19540 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
19550 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 61 64  ddrEofA_noB = ad
19560 64 72 45 6f 66 41 20 3d 20 6c 61 62 65 6c 45 6e  drEofA = labelEn
19570 64 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20  d;.  }else{  .  
19580 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
19590 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62  t((v, "eof-A sub
195a0 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20  routine"));.    
195b0 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74  addrEofA = sqlit
195c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
195d0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
195e0 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20  B, addrOutB);.  
195f0 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d    addrEofA_noB =
19600 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19610 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
19620 72 65 67 41 64 64 72 42 2c 20 6c 61 62 65 6c 45  regAddrB, labelE
19630 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nd);.           
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 56 64 62 65 43 6f            VdbeCo
19660 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
19670 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19680 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
19690 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 70  addrEofA);.    p
196a0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20  ->nSelectRow += 
196b0 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
196c0 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  ow;.  }..  /* Ge
196d0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
196e0 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20  ine to run when 
196f0 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  the results from
19700 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61   select B.  ** a
19710 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64  re exhausted and
19720 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65   only data in se
19730 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a  lect A remains..
19740 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
19750 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
19760 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 61 64     addrEofB = ad
19770 64 72 45 6f 66 41 3b 0a 20 20 20 20 69 66 28 20  drEofA;.    if( 
19780 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20  p->nSelectRow > 
19790 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
197a0 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ow ) p->nSelectR
197b0 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  ow = pPrior->nSe
197c0 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65  lectRow;.  }else
197d0 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70  {  .    VdbeNoop
197e0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66  Comment((v, "eof
197f0 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
19800 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d  ;.    addrEofB =
19810 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19820 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
19830 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74  regOutA, addrOut
19840 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
19850 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19860 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c  Yield, regAddrA,
19870 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56 64 62 65   labelEnd); Vdbe
19880 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
19890 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
198a0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
198b0 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d  , addrEofB);.  }
198c0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
198d0 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74  code to handle t
198e0 68 65 20 63 61 73 65 20 6f 66 20 41 3c 42 0a 20  he case of A<B. 
198f0 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
19900 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d  mment((v, "A-lt-
19910 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
19920 0a 20 20 61 64 64 72 41 6c 74 42 20 3d 20 73 71  .  addrAltB = sq
19930 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19940 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
19950 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b  OutA, addrOutA);
19960 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
19970 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
19980 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72  , regAddrA, addr
19990 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72  EofA); VdbeCover
199a0 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
199b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
199c0 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c  P_Goto, 0, label
199d0 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  Cmpr);..  /* Gen
199e0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
199f0 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
19a00 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28   A==B.  */.  if(
19a10 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
19a20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64     addrAeqB = ad
19a30 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20  drAltB;.  }else 
19a40 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52  if( op==TK_INTER
19a50 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
19a60 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b  AeqB = addrAltB;
19a70 0a 20 20 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b  .    addrAltB++;
19a80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64  .  }else{.    Vd
19a90 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
19aa0 2c 20 22 41 2d 65 71 2d 42 20 73 75 62 72 6f 75  , "A-eq-B subrou
19ab0 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64  tine"));.    add
19ac0 72 41 65 71 42 20 3d 0a 20 20 20 20 73 71 6c 69  rAeqB =.    sqli
19ad0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19ae0 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
19af0 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20  drA, addrEofA); 
19b00 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
19b10 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19b20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
19b30 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29  o, 0, labelCmpr)
19b40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
19b50 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e  rate code to han
19b60 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20  dle the case of 
19b70 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  A>B.  */.  VdbeN
19b80 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
19b90 41 2d 67 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-gt-B subroutin
19ba0 65 22 29 29 3b 0a 20 20 61 64 64 72 41 67 74 42  e"));.  addrAgtB
19bb0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
19bc0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
19bd0 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  if( op==TK_ALL |
19be0 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  | op==TK_UNION )
19bf0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
19c00 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
19c10 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64  sub, regOutB, ad
19c20 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73  drOutB);.  }.  s
19c30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19c40 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
19c50 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42  gAddrB, addrEofB
19c60 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
19c70 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
19c80 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
19c90 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72  to, 0, labelCmpr
19ca0 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f  );..  /* This co
19cb0 64 65 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20  de runs once to 
19cc0 69 6e 69 74 69 61 6c 69 7a 65 20 65 76 65 72 79  initialize every
19cd0 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71  thing..  */.  sq
19ce0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
19cf0 65 28 76 2c 20 6a 31 29 3b 0a 20 20 73 71 6c 69  e(v, j1);.  sqli
19d00 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19d10 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
19d20 64 72 41 2c 20 61 64 64 72 45 6f 66 41 5f 6e 6f  drA, addrEofA_no
19d30 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  B); VdbeCoverage
19d40 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
19d50 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
19d60 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20  ield, regAddrB, 
19d70 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43  addrEofB); VdbeC
19d80 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f  overage(v);..  /
19d90 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  * Implement the 
19da0 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a  main merge loop.
19db0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
19dc0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
19dd0 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20  , labelCmpr);.  
19de0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19df0 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74  4(v, OP_Permutat
19e00 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63  ion, 0, 0, 0, (c
19e10 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50  har*)aPermute, P
19e20 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73  4_INTARRAY);.  s
19e30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
19e40 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
19e50 64 65 73 74 41 2e 69 53 64 73 74 2c 20 64 65 73  destA.iSdst, des
19e60 74 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65 72  tB.iSdst, nOrder
19e70 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  By,.            
19e80 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
19e90 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50  ar*)pKeyMerge, P
19ea0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71  4_KEYINFO);.  sq
19eb0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
19ec0 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d  5(v, OPFLAG_PERM
19ed0 55 54 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  UTE);.  sqlite3V
19ee0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
19ef0 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20  Jump, addrAltB, 
19f00 61 64 64 72 41 65 71 42 2c 20 61 64 64 72 41 67  addrAeqB, addrAg
19f10 74 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  tB); VdbeCoverag
19f20 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  e(v);..  /* Jump
19f30 20 74 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69   to the this poi
19f40 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74  nt in order to t
19f50 65 72 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65  erminate the que
19f60 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ry..  */.  sqlit
19f70 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
19f80 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  el(v, labelEnd);
19f90 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e  ..  /* Set the n
19fa0 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
19fb0 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69  columns.  */.  i
19fc0 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  f( pDest->eDest=
19fd0 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20  =SRT_Output ){. 
19fe0 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73     Select *pFirs
19ff0 74 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  t = pPrior;.    
1a000 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70  while( pFirst->p
1a010 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d  Prior ) pFirst =
1a020 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b   pFirst->pPrior;
1a030 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c  .    generateCol
1a040 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
1a050 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69   0, pFirst->pELi
1a060 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  st);.  }..  /* R
1a070 65 61 73 73 65 6d 62 6c 79 20 74 68 65 20 63 6f  eassembly the co
1a080 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 73 6f 20  mpound query so 
1a090 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20  that it will be 
1a0a0 66 72 65 65 64 20 63 6f 72 72 65 63 74 6c 79 0a  freed correctly.
1a0b0 20 20 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c    ** by the call
1a0c0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ing function */.
1a0d0 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
1a0e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
1a0f0 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
1a100 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20  ->pPrior);.  }. 
1a110 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
1a120 69 6f 72 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70  ior;.  pPrior->p
1a130 4e 65 78 74 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a  Next = p;..  /**
1a140 2a 20 54 42 44 3a 20 20 49 6e 73 65 72 74 20 73  * TBD:  Insert s
1a150 75 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20  ubroutine calls 
1a160 74 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73  to close cursors
1a170 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20   on incomplete. 
1a180 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69 65 73   **** subqueries
1a190 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61 69 6e   ****/.  explain
1a1a0 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65  Composite(pParse
1a1b0 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20  , p->op, iSub1, 
1a1c0 69 53 75 62 32 2c 20 30 29 3b 0a 20 20 72 65 74  iSub2, 0);.  ret
1a1d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1a1e0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
1a1f0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1a200 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
1a210 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1a220 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 20 46 6f 72  MIT_VIEW)./* For
1a230 77 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e  ward Declaration
1a240 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s */.static void
1a250 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 73   substExprList(s
1a260 71 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c 69 73  qlite3*, ExprLis
1a270 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73  t*, int, ExprLis
1a280 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  t*);.static void
1a290 20 73 75 62 73 74 53 65 6c 65 63 74 28 73 71 6c   substSelect(sql
1a2a0 69 74 65 33 2a 2c 20 53 65 6c 65 63 74 20 2a 2c  ite3*, Select *,
1a2b0 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 20 2a   int, ExprList *
1a2c0 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74  );../*.** Scan t
1a2d0 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72 65  hrough the expre
1a2e0 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65  ssion pExpr.  Re
1a2f0 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66 65  place every refe
1a300 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f  rence to.** a co
1a310 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75  lumn in table nu
1a320 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74 68  mber iTable with
1a330 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69   a copy of the i
1a340 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74  Column-th.** ent
1a350 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28  ry in pEList.  (
1a360 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72 65  But leave refere
1a370 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49  nces to the ROWI
1a380 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63  D column .** unc
1a390 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54  hanged.).**.** T
1a3a0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70  his routine is p
1a3b0 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74  art of the flatt
1a3c0 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e  ening procedure.
1a3d0 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20    A subquery.** 
1a3e0 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74  whose result set
1a3f0 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
1a400 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61 73  EList appears as
1a410 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a   entry in the.**
1a420 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1a430 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74 68  a SELECT such th
1a440 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72 73  at the VDBE curs
1a450 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  or assigned to t
1a460 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75  hat.** FORM clau
1a470 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61 62  se entry is iTab
1a480 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  le.  This routin
1a490 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73  e make the neces
1a4a0 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73  sary .** changes
1a4b0 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61   to pExpr so tha
1a4c0 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72 65  t it refers dire
1a4d0 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72  ctly to the sour
1a4e0 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74  ce table.** of t
1a4f0 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74 68  he subquery rath
1a500 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  er the result se
1a510 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
1a520 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70  y..*/.static Exp
1a530 72 20 2a 73 75 62 73 74 45 78 70 72 28 0a 20 20  r *substExpr(.  
1a540 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
1a550 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61      /* Report ma
1a560 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74 6f 20 74  lloc errors to t
1a570 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  his connection *
1a580 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
1a590 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20          /* Expr 
1a5a0 69 6e 20 77 68 69 63 68 20 73 75 62 73 74 69 74  in which substit
1a5b0 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a  ution occurs */.
1a5c0 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1a5d0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
1a5e0 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64  o be substituted
1a5f0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1a600 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 53 75 62  pEList    /* Sub
1a610 73 74 69 74 75 74 65 20 65 78 70 72 65 73 73 69  stitute expressi
1a620 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ons */.){.  if( 
1a630 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
1a640 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  n 0;.  if( pExpr
1a650 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
1a660 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  && pExpr->iTable
1a670 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ==iTable ){.    
1a680 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
1a690 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45  mn<0 ){.      pE
1a6a0 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c  xpr->op = TK_NUL
1a6b0 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  L;.    }else{.  
1a6c0 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a      Expr *pNew;.
1a6d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1a6e0 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70 72  List!=0 && pExpr
1a6f0 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74  ->iColumn<pEList
1a700 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->nExpr );.     
1a710 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1a720 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70  pLeft==0 && pExp
1a730 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
1a740 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
1a750 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
1a760 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d  pEList->a[pExpr-
1a770 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 2c  >iColumn].pExpr,
1a780 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
1a790 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
1a7a0 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 70   pExpr);.      p
1a7b0 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Expr = pNew;.   
1a7c0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1a7d0 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73  pExpr->pLeft = s
1a7e0 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 45 78  ubstExpr(db, pEx
1a7f0 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c  pr->pLeft, iTabl
1a800 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
1a810 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20  pExpr->pRight = 
1a820 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 45  substExpr(db, pE
1a830 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61  xpr->pRight, iTa
1a840 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1a850 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1a860 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1a870 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
1a880 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28      substSelect(
1a890 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  db, pExpr->x.pSe
1a8a0 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  lect, iTable, pE
1a8b0 4c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  List);.    }else
1a8c0 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70  {.      substExp
1a8d0 72 4c 69 73 74 28 64 62 2c 20 70 45 78 70 72 2d  rList(db, pExpr-
1a8e0 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62 6c 65  >x.pList, iTable
1a8f0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  , pEList);.    }
1a900 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45  .  }.  return pE
1a910 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  xpr;.}.static vo
1a920 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
1a930 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1a940 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f           /* Repo
1a950 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  rt malloc errors
1a960 20 68 65 72 65 20 2a 2f 0a 20 20 45 78 70 72 4c   here */.  ExprL
1a970 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
1a980 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63 61 6e 20  /* List to scan 
1a990 61 6e 64 20 69 6e 20 77 68 69 63 68 20 74 6f 20  and in which to 
1a9a0 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 65 73  make substitutes
1a9b0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
1a9c0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  ,          /* Ta
1a9d0 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74 69  ble to be substi
1a9e0 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  tuted */.  ExprL
1a9f0 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20  ist *pEList     
1aa00 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61  /* Substitute va
1aa10 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  lues */.){.  int
1aa20 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
1aa30 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
1aa40 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1aa50 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
1aa60 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45    pList->a[i].pE
1aa70 78 70 72 20 3d 20 73 75 62 73 74 45 78 70 72 28  xpr = substExpr(
1aa80 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  db, pList->a[i].
1aa90 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70  pExpr, iTable, p
1aaa0 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74  EList);.  }.}.st
1aab0 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53  atic void substS
1aac0 65 6c 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33  elect(.  sqlite3
1aad0 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a   *db,         /*
1aae0 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65   Report malloc e
1aaf0 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20  rrors here */.  
1ab00 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
1ab10 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73       /* SELECT s
1ab20 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63  tatement in whic
1ab30 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69  h to make substi
1ab40 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  tutions */.  int
1ab50 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
1ab60 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65    /* Table to be
1ab70 20 72 65 70 6c 61 63 65 64 20 2a 2f 0a 20 20 45   replaced */.  E
1ab80 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
1ab90 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
1aba0 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20  e values */.){. 
1abb0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a   SrcList *pSrc;.
1abc0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1abd0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1abe0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 70 20  int i;.  if( !p 
1abf0 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 75 62 73  ) return;.  subs
1ac00 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d  tExprList(db, p-
1ac10 3e 70 45 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c  >pEList, iTable,
1ac20 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
1ac30 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d  tExprList(db, p-
1ac40 3e 70 47 72 6f 75 70 42 79 2c 20 69 54 61 62 6c  >pGroupBy, iTabl
1ac50 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
1ac60 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
1ac70 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 54 61  p->pOrderBy, iTa
1ac80 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1ac90 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62  p->pHaving = sub
1aca0 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 48  stExpr(db, p->pH
1acb0 61 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20 70  aving, iTable, p
1acc0 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70 57 68  EList);.  p->pWh
1acd0 65 72 65 20 3d 20 73 75 62 73 74 45 78 70 72 28  ere = substExpr(
1ace0 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 69  db, p->pWhere, i
1acf0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1ad00 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62    substSelect(db
1ad10 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 54 61  , p->pPrior, iTa
1ad20 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1ad30 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
1ad40 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29    assert( pSrc )
1ad50 3b 20 20 2f 2a 20 45 76 65 6e 20 66 6f 72 20 28  ;  /* Even for (
1ad60 53 45 4c 45 43 54 20 31 29 20 77 65 20 68 61 76  SELECT 1) we hav
1ad70 65 3a 20 70 53 72 63 21 3d 30 20 62 75 74 20 70  e: pSrc!=0 but p
1ad80 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 2a 2f 0a  Src->nSrc==0 */.
1ad90 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 72    if( ALWAYS(pSr
1ada0 63 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  c) ){.    for(i=
1adb0 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74 65  pSrc->nSrc, pIte
1adc0 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b 20  m=pSrc->a; i>0; 
1add0 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i--, pItem++){. 
1ade0 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74       substSelect
1adf0 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c  (db, pItem->pSel
1ae00 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ect, iTable, pEL
1ae10 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ist);.    }.  }.
1ae20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
1ae30 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1ae40 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1ae50 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1ae60 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66  IT_VIEW) */..#if
1ae70 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1ae80 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
1ae90 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
1aea0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a  TE_OMIT_VIEW)./*
1aeb0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1aec0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61   attempts to fla
1aed0 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20  tten subqueries 
1aee0 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  as a performance
1aef0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
1af00 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
1af10 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d  eturns 1 if it m
1af20 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64  akes changes and
1af30 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e   0 if no flatten
1af40 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ing occurs..**.*
1af50 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20  * To understand 
1af60 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66  the concept of f
1af70 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69  lattening, consi
1af80 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  der the followin
1af90 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a  g.** query:.**.*
1afa0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  *     SELECT a F
1afb0 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20  ROM (SELECT x+y 
1afc0 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
1afd0 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20  RE z<100) WHERE 
1afe0 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  a>5.**.** The de
1aff0 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70  fault way of imp
1b000 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71  lementing this q
1b010 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63 75  uery is to execu
1b020 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65  te the.** subque
1b030 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f  ry first and sto
1b040 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
1b050 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
1b060 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e  ble, then.** run
1b070 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1b080 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61   on that tempora
1b090 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  ry table.  This 
1b0a0 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20  requires two.** 
1b0b0 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65 20  passes over the 
1b0c0 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f  data.  Furthermo
1b0d0 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20  re, because the 
1b0e0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a  temporary table.
1b0f0 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65  ** has no indice
1b100 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  s, the WHERE cla
1b110 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72  use on the outer
1b120 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65   query cannot be
1b130 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a  .** optimized..*
1b140 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1b150 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  e attempts to re
1b160 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73 75  write queries su
1b170 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65 20  ch as the above 
1b180 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  into.** a single
1b190 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69   flat select, li
1b1a0 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
1b1b0 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53     SELECT x+y AS
1b1c0 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
1b1d0 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a   z<100 AND a>5.*
1b1e0 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65  *.** The code ge
1b1f0 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69 73  nerated for this
1b200 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20   simplification 
1b210 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20 72  gives the same r
1b220 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c  esult.** but onl
1b230 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68  y has to scan th
1b240 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e  e data once.  An
1b250 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63 65  d because indice
1b260 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73  s might .** exis
1b270 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74  t on the table t
1b280 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63  1, a complete sc
1b290 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d  an of the data m
1b2a0 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64  ight be.** avoid
1b2b0 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65  ed..**.** Flatte
1b2c0 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74 74  ning is only att
1b2d0 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f 66  empted if all of
1b2e0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
1b2f0 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
1b300 20 28 31 29 20 20 54 68 65 20 73 75 62 71 75 65   (1)  The subque
1b310 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
1b320 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
1b330 74 68 20 75 73 65 20 61 67 67 72 65 67 61 74 65  th use aggregate
1b340 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20  s..**.**   (2)  
1b350 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
1b360 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
1b370 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
1b380 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
1b390 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20  n..**.**   (3)  
1b3a0 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
1b3b0 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 70  not the right op
1b3c0 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20  erand of a left 
1b3d0 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a 20 20 20  outer join.**   
1b3e0 20 20 20 20 20 28 4f 72 69 67 69 6e 61 6c 6c 79       (Originally
1b3f0 20 74 69 63 6b 65 74 20 23 33 30 36 2e 20 20 53   ticket #306.  S
1b400 74 72 65 6e 67 74 68 65 6e 65 64 20 62 79 20 74  trengthened by t
1b410 69 63 6b 65 74 20 23 33 33 30 30 29 0a 2a 2a 0a  icket #3300).**.
1b420 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73 75  **   (4)  The su
1b430 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49  bquery is not DI
1b440 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28  STINCT..**.**  (
1b450 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f 69 6e  **)  At one poin
1b460 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28  t restrictions (
1b470 34 29 20 61 6e 64 20 28 35 29 20 64 65 66 69 6e  4) and (5) defin
1b480 65 64 20 61 20 73 75 62 73 65 74 20 6f 66 20 44  ed a subset of D
1b490 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20 20  ISTINCT.**      
1b4a0 20 20 73 75 62 2d 71 75 65 72 69 65 73 20 74 68    sub-queries th
1b4b0 61 74 20 77 65 72 65 20 65 78 63 6c 75 64 65 64  at were excluded
1b4c0 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74 69 6d   from this optim
1b4d0 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72 69 63  ization. Restric
1b4e0 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20  tion .**        
1b4f0 28 34 29 20 68 61 73 20 73 69 6e 63 65 20 62 65  (4) has since be
1b500 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f 20 65  en expanded to e
1b510 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53 54 49  xclude all DISTI
1b520 4e 43 54 20 73 75 62 71 75 65 72 69 65 73 2e 0a  NCT subqueries..
1b530 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65  **.**   (6)  The
1b540 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
1b550 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65  ot use aggregate
1b560 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  s or the outer q
1b570 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20  uery is not.**  
1b580 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a        DISTINCT..
1b590 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65  **.**   (7)  The
1b5a0 20 73 75 62 71 75 65 72 79 20 68 61 73 20 61 20   subquery has a 
1b5b0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 4f  FROM clause.  TO
1b5c0 44 4f 3a 20 20 46 6f 72 20 73 75 62 71 75 65 72  DO:  For subquer
1b5d0 69 65 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 20  ies without.**  
1b5e0 20 20 20 20 20 20 41 20 46 52 4f 4d 20 63 6c 61        A FROM cla
1b5f0 75 73 65 2c 20 63 6f 6e 73 69 64 65 72 20 61 64  use, consider ad
1b600 64 69 6e 67 20 61 20 46 52 4f 4d 20 63 6c 6f 73  ding a FROM clos
1b610 65 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  e with the speci
1b620 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74 61 62  al.**        tab
1b630 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65 20 74  le sqlite_once t
1b640 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  hat consists of 
1b650 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 63 6f 6e  a single row con
1b660 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20 20 20  taining a.**    
1b670 20 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e      single NULL.
1b680 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54 68  .**.**   (8)  Th
1b690 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
1b6a0 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
1b6b0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1b6c0 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a   is not a join..
1b6d0 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68 65  **.**   (9)  The
1b6e0 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
1b6f0 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
1b700 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1b710 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  does not use.** 
1b720 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65         aggregate
1b730 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  s..**.**  (**)  
1b740 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 30 29  Restriction (10)
1b750 20 77 61 73 20 72 65 6d 6f 76 65 64 20 66 72 6f   was removed fro
1b760 6d 20 74 68 65 20 63 6f 64 65 20 6f 6e 20 32 30  m the code on 20
1b770 30 35 2d 30 32 2d 30 35 20 62 75 74 20 77 65 0a  05-02-05 but we.
1b780 2a 2a 20 20 20 20 20 20 20 20 61 63 63 69 64 65  **        accide
1b790 6e 74 6c 79 20 63 61 72 72 69 65 64 20 74 68 65  ntly carried the
1b7a0 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 77 61 72 64   comment forward
1b7b0 20 75 6e 74 69 6c 20 32 30 31 34 2d 30 39 2d 31   until 2014-09-1
1b7c0 35 2e 20 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20  5.  Original.** 
1b7d0 20 20 20 20 20 20 20 74 65 78 74 3a 20 22 54 68         text: "Th
1b7e0 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
1b7f0 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74  not use aggregat
1b800 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  es or the outer 
1b810 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a  query does not.*
1b820 2a 20 20 20 20 20 20 20 20 75 73 65 20 4c 49 4d  *        use LIM
1b830 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29  IT.".**.**  (11)
1b840 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
1b850 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
1b860 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68  ry do not both h
1b870 61 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  ave ORDER BY cla
1b880 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  uses..**.**  (**
1b890 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74  )  Not implement
1b8a0 65 64 2e 20 20 53 75 62 73 75 6d 65 64 20 69 6e  ed.  Subsumed in
1b8b0 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28  to restriction (
1b8c0 33 29 2e 20 20 57 61 73 20 70 72 65 76 69 6f 75  3).  Was previou
1b8d0 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 61 20  sly.**        a 
1b8e0 73 65 70 61 72 61 74 65 20 72 65 73 74 72 69 63  separate restric
1b8f0 74 69 6f 6e 20 64 65 72 69 76 69 6e 67 20 66 72  tion deriving fr
1b900 6f 6d 20 74 69 63 6b 65 74 20 23 33 35 30 2e 0a  om ticket #350..
1b910 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65  **.**  (13)  The
1b920 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75   subquery and ou
1b930 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
1b940 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 2e   both use LIMIT.
1b950 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68  .**.**  (14)  Th
1b960 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
1b970 6e 6f 74 20 75 73 65 20 4f 46 46 53 45 54 2e 0a  not use OFFSET..
1b980 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20 54 68 65  **.**  (15)  The
1b990 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
1b9a0 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f  not part of a co
1b9b0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 6f 72  mpound select or
1b9c0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73   the.**        s
1b9d0 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1b9e0 20 68 61 76 65 20 61 20 4c 49 4d 49 54 20 63 6c   have a LIMIT cl
1b9f0 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ause..**        
1ba00 28 53 65 65 20 74 69 63 6b 65 74 20 23 32 33 33  (See ticket #233
1ba10 39 20 61 6e 64 20 74 69 63 6b 65 74 20 5b 30 32  9 and ticket [02
1ba20 61 38 65 38 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a  a8e81d44])..**.*
1ba30 2a 20 20 28 31 36 29 20 20 54 68 65 20 6f 75 74  *  (16)  The out
1ba40 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
1ba50 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  an aggregate or 
1ba60 74 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  the subquery doe
1ba70 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e 6f 74 20  s.**        not 
1ba80 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59  contain ORDER BY
1ba90 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39 34 32  .  (Ticket #2942
1baa0 29 20 20 54 68 69 73 20 75 73 65 64 20 74 6f 20  )  This used to 
1bab0 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20  not matter.**   
1bac0 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e       until we in
1bad0 74 72 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f  troduced the gro
1bae0 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63  up_concat() func
1baf0 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28  tion.  .**.**  (
1bb00 31 37 29 20 20 54 68 65 20 73 75 62 2d 71 75 65  17)  The sub-que
1bb10 72 79 20 69 73 20 6e 6f 74 20 61 20 63 6f 6d 70  ry is not a comp
1bb20 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 6f 72 20  ound select, or 
1bb30 69 74 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c  it is a UNION AL
1bb40 4c 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d  L .**        com
1bb50 70 6f 75 6e 64 20 63 6c 61 75 73 65 20 6d 61 64  pound clause mad
1bb60 65 20 75 70 20 65 6e 74 69 72 65 6c 79 20 6f 66  e up entirely of
1bb70 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71   non-aggregate q
1bb80 75 65 72 69 65 73 2c 20 61 6e 64 20 0a 2a 2a 20  ueries, and .** 
1bb90 20 20 20 20 20 20 20 74 68 65 20 70 61 72 65 6e         the paren
1bba0 74 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  t query:.**.**  
1bbb0 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74          * is not
1bbc0 20 69 74 73 65 6c 66 20 70 61 72 74 20 6f 66 20   itself part of 
1bbd0 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
1bbe0 74 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a  t,.**          *
1bbf0 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
1bc00 67 61 74 65 20 6f 72 20 44 49 53 54 49 4e 43 54  gate or DISTINCT
1bc10 20 71 75 65 72 79 2c 20 61 6e 64 0a 2a 2a 20 20   query, and.**  
1bc20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74          * is not
1bc30 20 61 20 6a 6f 69 6e 0a 2a 2a 0a 2a 2a 20 20 20   a join.**.**   
1bc40 20 20 20 20 20 54 68 65 20 70 61 72 65 6e 74 20       The parent 
1bc50 61 6e 64 20 73 75 62 2d 71 75 65 72 79 20 6d 61  and sub-query ma
1bc60 79 20 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 20  y contain WHERE 
1bc70 63 6c 61 75 73 65 73 2e 20 53 75 62 6a 65 63 74  clauses. Subject
1bc80 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 72 75   to.**        ru
1bc90 6c 65 73 20 28 31 31 29 2c 20 28 31 33 29 20 61  les (11), (13) a
1bca0 6e 64 20 28 31 34 29 2c 20 74 68 65 79 20 6d 61  nd (14), they ma
1bcb0 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 4f  y also contain O
1bcc0 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20 20 20  RDER BY,.**     
1bcd0 20 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46     LIMIT and OFF
1bce0 53 45 54 20 63 6c 61 75 73 65 73 2e 20 20 54 68  SET clauses.  Th
1bcf0 65 20 73 75 62 71 75 65 72 79 20 63 61 6e 6e 6f  e subquery canno
1bd00 74 20 75 73 65 20 61 6e 79 20 63 6f 6d 70 6f 75  t use any compou
1bd10 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65  nd.**        ope
1bd20 72 61 74 6f 72 20 6f 74 68 65 72 20 74 68 61 6e  rator other than
1bd30 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65 63 61 75   UNION ALL becau
1bd40 73 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72  se all the other
1bd50 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20   compound.**    
1bd60 20 20 20 20 6f 70 65 72 61 74 6f 72 73 20 68 61      operators ha
1bd70 76 65 20 61 6e 20 69 6d 70 6c 69 65 64 20 44 49  ve an implied DI
1bd80 53 54 49 4e 43 54 20 77 68 69 63 68 20 69 73 20  STINCT which is 
1bd90 64 69 73 61 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a  disallowed by.**
1bda0 20 20 20 20 20 20 20 20 72 65 73 74 72 69 63 74          restrict
1bdb0 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a 20 20  ion (4)..**.**  
1bdc0 20 20 20 20 20 20 41 6c 73 6f 2c 20 65 61 63 68        Also, each
1bdd0 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 74 68   component of th
1bde0 65 20 73 75 62 2d 71 75 65 72 79 20 6d 75 73 74  e sub-query must
1bdf0 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
1be00 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20 20 20   number.**      
1be10 20 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75    of result colu
1be20 6d 6e 73 2e 20 54 68 69 73 20 69 73 20 61 63 74  mns. This is act
1be30 75 61 6c 6c 79 20 61 20 72 65 71 75 69 72 65 6d  ually a requirem
1be40 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 6f 6d 70  ent for any comp
1be50 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 53  ound.**        S
1be60 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
1be70 20 62 75 74 20 61 6c 6c 20 74 68 65 20 63 6f 64   but all the cod
1be80 65 20 68 65 72 65 20 64 6f 65 73 20 69 73 20 6d  e here does is m
1be90 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 6e 6f  ake sure that no
1bea0 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 63 68 20  .**        such 
1beb0 28 69 6c 6c 65 67 61 6c 29 20 73 75 62 2d 71 75  (illegal) sub-qu
1bec0 65 72 79 20 69 73 20 66 6c 61 74 74 65 6e 65 64  ery is flattened
1bed0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
1bee0 6c 20 64 65 74 65 63 74 20 74 68 65 0a 2a 2a 20  l detect the.** 
1bef0 20 20 20 20 20 20 20 73 79 6e 74 61 78 20 65 72         syntax er
1bf00 72 6f 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ror and return a
1bf10 20 64 65 74 61 69 6c 65 64 20 6d 65 73 73 61 67   detailed messag
1bf20 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29 20 20  e..**.**  (18)  
1bf30 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
1bf40 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   is a compound s
1bf50 65 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c 6c 20  elect, then all 
1bf60 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20  terms of the.** 
1bf70 20 20 20 20 20 20 20 4f 52 44 45 52 20 62 79 20         ORDER by 
1bf80 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 70 61  clause of the pa
1bf90 72 65 6e 74 20 6d 75 73 74 20 62 65 20 73 69 6d  rent must be sim
1bfa0 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ple references t
1bfb0 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6c  o .**        col
1bfc0 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 75 62 2d  umns of the sub-
1bfd0 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  query..**.**  (1
1bfe0 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  9)  The subquery
1bff0 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
1c000 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
1c010 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a   query does not.
1c020 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 61  **        have a
1c030 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
1c040 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49 66 20 74  *.**  (20)  If t
1c050 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
1c060 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
1c070 74 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20  t, then it must 
1c080 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20  not use.**      
1c090 20 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c    an ORDER BY cl
1c0a0 61 75 73 65 2e 20 20 54 69 63 6b 65 74 20 23 33  ause.  Ticket #3
1c0b0 37 37 33 2e 20 20 57 65 20 63 6f 75 6c 64 20 72  773.  We could r
1c0c0 65 6c 61 78 20 74 68 69 73 20 63 6f 6e 73 74 72  elax this constr
1c0d0 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 73  aint.**        s
1c0e0 6f 6d 65 77 68 61 74 20 62 79 20 73 61 79 69 6e  omewhat by sayin
1c0f0 67 20 74 68 61 74 20 74 68 65 20 74 65 72 6d 73  g that the terms
1c100 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
1c110 20 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20   clause must.** 
1c120 20 20 20 20 20 20 20 61 70 70 65 61 72 20 61 73         appear as
1c130 20 75 6e 6d 6f 64 69 66 69 65 64 20 72 65 73 75   unmodified resu
1c140 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  lt columns in th
1c150 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20  e outer query.  
1c160 42 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20  But we.**       
1c170 20 68 61 76 65 20 6f 74 68 65 72 20 6f 70 74 69   have other opti
1c180 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e  mizations in min
1c190 64 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74  d to deal with t
1c1a0 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  hat case..**.** 
1c1b0 20 28 32 31 29 20 20 54 68 65 20 73 75 62 71 75   (21)  The subqu
1c1c0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
1c1d0 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75   LIMIT or the ou
1c1e0 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
1c1f0 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49  .**        DISTI
1c200 4e 43 54 2e 20 20 28 53 65 65 20 74 69 63 6b 65  NCT.  (See ticke
1c210 74 20 5b 37 35 32 65 31 36 34 36 66 63 5d 29 2e  t [752e1646fc]).
1c220 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20 54 68  .**.**  (22)  Th
1c230 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
1c240 74 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54  t a recursive CT
1c250 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 33 29 20 20  E..**.**  (23)  
1c260 54 68 65 20 70 61 72 65 6e 74 20 69 73 20 6e 6f  The parent is no
1c270 74 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54  t a recursive CT
1c280 45 2c 20 6f 72 20 74 68 65 20 73 75 62 2d 71 75  E, or the sub-qu
1c290 65 72 79 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20  ery is not a.** 
1c2a0 20 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20         compound 
1c2b0 71 75 65 72 79 2e 20 54 68 69 73 20 72 65 73 74  query. This rest
1c2c0 72 69 63 74 69 6f 6e 20 69 73 20 62 65 63 61 75  riction is becau
1c2d0 73 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20  se transforming 
1c2e0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 70 61  the.**        pa
1c2f0 72 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70 6f 75  rent to a compou
1c300 6e 64 20 71 75 65 72 79 20 63 6f 6e 66 75 73 65  nd query confuse
1c310 73 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  s the code that 
1c320 68 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20 20 20  handles.**      
1c330 20 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72    recursive quer
1c340 69 65 73 20 69 6e 20 6d 75 6c 74 69 53 65 6c 65  ies in multiSele
1c350 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 34  ct()..**.**  (24
1c360 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1c370 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
1c380 61 74 65 20 74 68 61 74 20 75 73 65 73 20 74 68  ate that uses th
1c390 65 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e 28 29  e built-in min()
1c3a0 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 6f   or .**        o
1c3b0 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e  r max() function
1c3c0 73 2e 20 20 28 57 69 74 68 6f 75 74 20 74 68 69  s.  (Without thi
1c3d0 73 20 72 65 73 74 72 69 63 74 69 6f 6e 2c 20 61  s restriction, a
1c3e0 20 71 75 65 72 79 20 6c 69 6b 65 3a 0a 2a 2a 20   query like:.** 
1c3f0 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 78         "SELECT x
1c400 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 6d 61   FROM (SELECT ma
1c410 78 28 79 29 2c 20 78 20 46 52 4f 4d 20 74 31 29  x(y), x FROM t1)
1c420 22 20 77 6f 75 6c 64 20 6e 6f 74 20 6e 65 63 65  " would not nece
1c430 73 73 61 72 69 6c 79 0a 2a 2a 20 20 20 20 20 20  ssarily.**      
1c440 20 20 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c    return the val
1c450 75 65 20 58 20 66 6f 72 20 77 68 69 63 68 20 59  ue X for which Y
1c460 20 77 61 73 20 6d 61 78 69 6d 61 6c 2e 29 0a 2a   was maximal.).*
1c470 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  *.**.** In this 
1c480 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22  routine, the "p"
1c490 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
1c4a0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f  pointer to the o
1c4b0 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54  uter query..** T
1c4c0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70  he subquery is p
1c4d0 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d  ->pSrc->a[iFrom]
1c4e0 2e 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65  .  isAgg is true
1c4f0 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   if the outer qu
1c500 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72  ery.** uses aggr
1c510 65 67 61 74 65 73 20 61 6e 64 20 73 75 62 71 75  egates and subqu
1c520 65 72 79 49 73 41 67 67 20 69 73 20 74 72 75 65  eryIsAgg is true
1c530 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
1c540 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73   uses aggregates
1c550 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74  ..**.** If flatt
1c560 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74  ening is not att
1c570 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75  empted, this rou
1c580 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
1c590 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a  and returns 0..*
1c5a0 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
1c5b0 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69  is attempted thi
1c5c0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1c5d0 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f  s 1..**.** All o
1c5e0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1c5f0 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f   analysis must o
1c600 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65  ccur on both the
1c610 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
1c620 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79  .** the subquery
1c630 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
1c640 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74  tine runs..*/.st
1c650 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e  atic int flatten
1c660 53 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73  Subquery(.  Pars
1c670 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1c680 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
1c690 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
1c6a0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
1c6b0 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f   The parent or o
1c6c0 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74  uter SELECT stat
1c6d0 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ement */.  int i
1c6e0 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  From,           
1c6f0 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70  /* Index in p->p
1c700 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20  Src->a[] of the 
1c710 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a  inner subquery *
1c720 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20  /.  int isAgg,  
1c730 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1c740 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54   if outer SELECT
1c750 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
1c760 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  functions */.  i
1c770 6e 74 20 73 75 62 71 75 65 72 79 49 73 41 67 67  nt subqueryIsAgg
1c780 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
1c790 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
1c7a0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1c7b0 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ions */.){.  con
1c7c0 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41  st char *zSavedA
1c7d0 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61  uthContext = pPa
1c7e0 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
1c7f0 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61  t;.  Select *pPa
1c800 72 65 6e 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a  rent;.  Select *
1c810 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54  pSub;       /* T
1c820 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f  he inner query o
1c830 72 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a  r "subquery" */.
1c840 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 31 3b    Select *pSub1;
1c850 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1c860 20 74 6f 20 74 68 65 20 72 69 67 68 74 6d 6f 73   to the rightmos
1c870 74 20 73 65 6c 65 63 74 20 69 6e 20 73 75 62 2d  t select in sub-
1c880 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69  query */.  SrcLi
1c890 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f  st *pSrc;      /
1c8a0 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
1c8b0 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
1c8c0 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73  uery */.  SrcLis
1c8d0 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a  t *pSubSrc;   /*
1c8e0 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
1c8f0 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
1c900 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1c910 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65  pList;    /* The
1c920 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
1c930 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
1c940 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b  /.  int iParent;
1c950 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20          /* VDBE 
1c960 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
1c970 20 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74   the pSub result
1c980 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20   set temp table 
1c990 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
1c9a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1c9b0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78   counter */.  Ex
1c9c0 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
1c9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c9e0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
1c9f0 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
1ca00 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75  rcList_item *pSu
1ca10 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20  bitem;   /* The 
1ca20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 73 71  subquery */.  sq
1ca30 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1ca40 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68  se->db;..  /* Ch
1ca50 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c  eck to see if fl
1ca60 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
1ca70 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30  itted.  Return 0
1ca80 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20   if not..  */.  
1ca90 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
1caa0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72    assert( p->pPr
1cab0 69 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a 20 55 6e  ior==0 );  /* Un
1cac0 61 62 6c 65 20 74 6f 20 66 6c 61 74 74 65 6e 20  able to flatten 
1cad0 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69 65 73  compound queries
1cae0 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69   */.  if( Optimi
1caf0 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64  zationDisabled(d
1cb00 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46  b, SQLITE_QueryF
1cb10 6c 61 74 74 65 6e 65 72 29 20 29 20 72 65 74 75  lattener) ) retu
1cb20 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70  rn 0;.  pSrc = p
1cb30 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
1cb40 28 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e  ( pSrc && iFrom>
1cb50 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63  =0 && iFrom<pSrc
1cb60 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62  ->nSrc );.  pSub
1cb70 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b  item = &pSrc->a[
1cb80 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e  iFrom];.  iParen
1cb90 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43  t = pSubitem->iC
1cba0 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20  ursor;.  pSub = 
1cbb0 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
1cbc0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75  t;.  assert( pSu
1cbd0 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73  b!=0 );.  if( is
1cbe0 41 67 67 20 26 26 20 73 75 62 71 75 65 72 79 49  Agg && subqueryI
1cbf0 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b  sAgg ) return 0;
1cc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc10 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1cc20 28 31 29 20 20 2a 2f 0a 20 20 69 66 28 20 73 75  (1)  */.  if( su
1cc30 62 71 75 65 72 79 49 73 41 67 67 20 26 26 20 70  bqueryIsAgg && p
1cc40 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65  Src->nSrc>1 ) re
1cc50 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1cc60 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1cc70 28 32 29 20 20 2a 2f 0a 20 20 70 53 75 62 53 72  (2)  */.  pSubSr
1cc80 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a  c = pSub->pSrc;.
1cc90 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72    assert( pSubSr
1cca0 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20  c );.  /* Prior 
1ccb0 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32  to version 3.1.2
1ccc0 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64  , when LIMIT and
1ccd0 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20 62   OFFSET had to b
1cce0 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e  e simple constan
1ccf0 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62  ts,.  ** not arb
1cd00 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f  itrary expressio
1cd10 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73  ns, we allowed s
1cd20 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66  ome combining of
1cd30 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
1cd40 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74  T.  ** because t
1cd50 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d  hey could be com
1cd60 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  puted at compile
1cd70 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e  -time.  But when
1cd80 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
1cd90 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72  T.  ** became ar
1cda0 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69  bitrary expressi
1cdb0 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72  ons, we were for
1cdc0 63 65 64 20 74 6f 20 61 64 64 20 72 65 73 74 72  ced to add restr
1cdd0 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a  ictions (13).  *
1cde0 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20  * and (14). */. 
1cdf0 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
1ce00 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29  t && p->pLimit )
1ce10 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1ce20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1ce30 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20  iction (13) */. 
1ce40 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66 66 73   if( pSub->pOffs
1ce50 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  et ) return 0;  
1ce60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce70 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1ce80 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20  iction (14) */. 
1ce90 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
1cea0 73 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e 64 29  s & SF_Compound)
1ceb0 21 3d 30 20 26 26 20 70 53 75 62 2d 3e 70 4c 69  !=0 && pSub->pLi
1cec0 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  mit ){.    retur
1ced0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1cee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf00 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1cf10 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  15) */.  }.  if(
1cf20 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d   pSubSrc->nSrc==
1cf30 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  0 ) return 0;   
1cf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf50 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1cf60 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28  on (7)  */.  if(
1cf70 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
1cf80 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 20  & SF_Distinct ) 
1cf90 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1cfa0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1cfb0 6f 6e 20 28 35 29 20 20 2a 2f 0a 20 20 69 66 28  on (5)  */.  if(
1cfc0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1cfd0 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c   (pSrc->nSrc>1 |
1cfe0 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20  | isAgg) ){.    
1cff0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1d000 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1d010 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d  ns (8)(9) */.  }
1d020 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
1d030 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
1d040 74 29 21 3d 30 20 26 26 20 73 75 62 71 75 65 72  t)!=0 && subquer
1d050 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20 72  yIsAgg ){.     r
1d060 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1d070 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1d080 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (6)  */.  }.  if
1d090 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26  ( p->pOrderBy &&
1d0a0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1d0b0 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
1d0c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1d0f0 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20  estriction (11) 
1d100 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41  */.  }.  if( isA
1d110 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  gg && pSub->pOrd
1d120 65 72 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b  erBy ) return 0;
1d130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d140 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1d150 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  16) */.  if( pSu
1d160 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e  b->pLimit && p->
1d170 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20  pWhere ) return 
1d180 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1d190 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1d1a0 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  19) */.  if( pSu
1d1b0 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d  b->pLimit && (p-
1d1c0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
1d1d0 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20  istinct)!=0 ){. 
1d1e0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1d1f0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1d200 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d  tion (21) */.  }
1d210 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 53 75  .  testcase( pSu
1d220 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
1d230 5f 52 65 63 75 72 73 69 76 65 20 29 3b 0a 20 20  _Recursive );.  
1d240 74 65 73 74 63 61 73 65 28 20 70 53 75 62 2d 3e  testcase( pSub->
1d250 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 69  selFlags & SF_Mi
1d260 6e 4d 61 78 41 67 67 20 29 3b 0a 20 20 69 66 28  nMaxAgg );.  if(
1d270 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
1d280 26 20 28 53 46 5f 52 65 63 75 72 73 69 76 65 7c  & (SF_Recursive|
1d290 53 46 5f 4d 69 6e 4d 61 78 41 67 67 29 20 29 7b  SF_MinMaxAgg) ){
1d2a0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f  .    return 0; /
1d2b0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28  * Restrictions (
1d2c0 32 32 29 20 61 6e 64 20 28 32 34 29 20 2a 2f 0a  22) and (24) */.
1d2d0 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65    }.  if( (p->se
1d2e0 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
1d2f0 72 73 69 76 65 29 20 26 26 20 70 53 75 62 2d 3e  rsive) && pSub->
1d300 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 65  pPrior ){.    re
1d310 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72  turn 0; /* Restr
1d320 69 63 74 69 6f 6e 20 28 32 33 29 20 2a 2f 0a 20  iction (23) */. 
1d330 20 7d 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45 54   }..  /* OBSOLET
1d340 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20 2a  E COMMENT 1:.  *
1d350 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a  * Restriction 3:
1d360 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
1d370 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b  y is a join, mak
1d380 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75  e sure the subqu
1d390 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74  ery is .  ** not
1d3a0 20 75 73 65 64 20 61 73 20 74 68 65 20 72 69 67   used as the rig
1d3b0 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e  ht operand of an
1d3c0 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78   outer join.  Ex
1d3d0 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68  amples of why th
1d3e0 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61  is.  ** is not a
1d3f0 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
1d400 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
1d410 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32  T OUTER JOIN (t2
1d420 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20   JOIN t3).  **. 
1d430 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
1d440 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
1d450 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
1d460 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
1d470 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
1d480 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a  t2) JOIN t3.  **
1d490 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e  .  ** which is n
1d4a0 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61  ot at all the sa
1d4b0 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20  me thing..  **. 
1d4c0 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d   ** OBSOLETE COM
1d4d0 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20 52 65 73  MENT 2:.  ** Res
1d4e0 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49 66  triction 12:  If
1d4f0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
1d500 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
1d510 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74  nd of a left out
1d520 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61  er.  ** join, ma
1d530 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71  ke sure the subq
1d540 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52  uery has no WHER
1d550 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41  E clause..  ** A
1d560 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77 68  n examples of wh
1d570 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6c  y this is not al
1d580 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  lowed:.  **.  **
1d590 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54           t1 LEFT
1d5a0 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c   OUTER JOIN (SEL
1d5b0 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48  ECT * FROM t2 WH
1d5c0 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a  ERE t2.x>0).  **
1d5d0 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
1d5e0 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
1d5f0 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
1d600 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
1d610 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
1d620 4e 20 74 32 29 20 57 48 45 52 45 20 74 32 2e 78  N t2) WHERE t2.x
1d630 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74  >0.  **.  ** But
1d640 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73 74   the t2.x>0 test
1d650 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69   will always fai
1d660 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20  l on a NULL row 
1d670 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20 2a  of t2, which.  *
1d680 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20 63 6f  * effectively co
1d690 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54 45 52  nverts the OUTER
1d6a0 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e   JOIN into an IN
1d6b0 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a 20  NER JOIN..  **. 
1d6c0 20 2a 2a 20 54 48 49 53 20 4f 56 45 52 52 49 44   ** THIS OVERRID
1d6d0 45 53 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d  ES OBSOLETE COMM
1d6e0 45 4e 54 53 20 31 20 41 4e 44 20 32 20 41 42 4f  ENTS 1 AND 2 ABO
1d6f0 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20  VE:.  ** Ticket 
1d700 23 33 33 30 30 20 73 68 6f 77 73 20 74 68 61 74  #3300 shows that
1d710 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20   flattening the 
1d720 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20  right term of a 
1d730 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20 69  LEFT JOIN.  ** i
1d740 73 20 66 72 61 75 67 68 74 20 77 69 74 68 20 64  s fraught with d
1d750 61 6e 67 65 72 2e 20 20 42 65 73 74 20 74 6f 20  anger.  Best to 
1d760 61 76 6f 69 64 20 74 68 65 20 77 68 6f 6c 65 20  avoid the whole 
1d770 74 68 69 6e 67 2e 20 20 49 66 20 74 68 65 0a 20  thing.  If the. 
1d780 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73 20   ** subquery is 
1d790 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f  the right term o
1d7a0 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74  f a LEFT JOIN, t
1d7b0 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74  hen do not flatt
1d7c0 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  en..  */.  if( (
1d7d0 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pSubitem->jointy
1d7e0 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
1d7f0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1d800 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  0;.  }..  /* Res
1d810 74 72 69 63 74 69 6f 6e 20 31 37 3a 20 49 66 20  triction 17: If 
1d820 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
1d830 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
1d840 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74  CT, then it must
1d850 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74  .  ** use only t
1d860 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
1d870 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20  rator. And none 
1d880 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20 73 65  of the simple se
1d890 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20 20 2a  lect queries.  *
1d8a0 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  * that make up t
1d8b0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  he compound SELE
1d8c0 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74  CT are allowed t
1d8d0 6f 20 62 65 20 61 67 67 72 65 67 61 74 65 20 6f  o be aggregate o
1d8e0 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20  r distinct.  ** 
1d8f0 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20  queries..  */.  
1d900 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72  if( pSub->pPrior
1d910 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62   ){.    if( pSub
1d920 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
1d930 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f      return 0;  /
1d940 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 32 30  * Restriction 20
1d950 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   */.    }.    if
1d960 28 20 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73  ( isAgg || (p->s
1d970 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
1d980 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72  tinct)!=0 || pSr
1d990 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20  c->nSrc!=1 ){.  
1d9a0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1d9b0 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62    }.    for(pSub
1d9c0 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70  1=pSub; pSub1; p
1d9d0 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69  Sub1=pSub1->pPri
1d9e0 6f 72 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  or){.      testc
1d9f0 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c  ase( (pSub1->sel
1da00 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
1da10 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
1da20 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74  e))==SF_Distinct
1da30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1da40 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46  se( (pSub1->selF
1da50 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
1da60 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
1da70 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65  ))==SF_Aggregate
1da80 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1da90 28 20 70 53 75 62 2d 3e 70 53 72 63 21 3d 30 20  ( pSub->pSrc!=0 
1daa0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53  );.      if( (pS
1dab0 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
1dac0 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
1dad0 41 67 67 72 65 67 61 74 65 29 29 21 3d 30 0a 20  Aggregate))!=0. 
1dae0 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d        || (pSub1-
1daf0 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62 31  >pPrior && pSub1
1db00 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20  ->op!=TK_ALL) . 
1db10 20 20 20 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e        || pSub1->
1db20 70 53 72 63 2d 3e 6e 53 72 63 3c 31 0a 20 20 20  pSrc->nSrc<1.   
1db30 20 20 20 20 7c 7c 20 70 53 75 62 2d 3e 70 45 4c      || pSub->pEL
1db40 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 53 75 62  ist->nExpr!=pSub
1db50 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  1->pEList->nExpr
1db60 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
1db70 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1db80 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61    }.      testca
1db90 73 65 28 20 70 53 75 62 31 2d 3e 70 53 72 63 2d  se( pSub1->pSrc-
1dba0 3e 6e 53 72 63 3e 31 20 29 3b 0a 20 20 20 20 7d  >nSrc>1 );.    }
1dbb0 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63  ..    /* Restric
1dbc0 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20 20 20  tion 18. */.    
1dbd0 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
1dbe0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b  ){.      int ii;
1dbf0 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  .      for(ii=0;
1dc00 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d   ii<p->pOrderBy-
1dc10 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20  >nExpr; ii++){. 
1dc20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f         if( p->pO
1dc30 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e  rderBy->a[ii].u.
1dc40 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30  x.iOrderByCol==0
1dc50 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
1dc60 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1dc70 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72    /***** If we r
1dc80 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
1dc90 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70   flattening is p
1dca0 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f  ermitted. *****/
1dcb0 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65  ..  /* Authorize
1dcc0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   the subquery */
1dcd0 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68  .  pParse->zAuth
1dce0 43 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69 74  Context = pSubit
1dcf0 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45 53  em->zName;.  TES
1dd00 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69 74  TONLY(i =) sqlit
1dd10 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1dd20 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
1dd30 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 74  T, 0, 0, 0);.  t
1dd40 65 73 74 63 61 73 65 28 20 69 3d 3d 53 51 4c 49  estcase( i==SQLI
1dd50 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50 61  TE_DENY );.  pPa
1dd60 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
1dd70 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f  t = zSavedAuthCo
1dd80 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20  ntext;..  /* If 
1dd90 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
1dda0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
1ddb0 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  CT statement, th
1ddc0 65 6e 20 28 62 79 20 72 65 73 74 72 69 63 74 69  en (by restricti
1ddd0 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20  ons.  ** 17 and 
1dde0 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73  18 above) it mus
1ddf0 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c  t be a UNION ALL
1de00 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20   and the parent 
1de10 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a  query must .  **
1de20 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   be of the form:
1de30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
1de40 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74  ELECT <expr-list
1de50 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65  > FROM (<sub-que
1de60 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75  ry>) <where-clau
1de70 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66  se> .  **.  ** f
1de80 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f  ollowed by any O
1de90 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61  RDER BY, LIMIT a
1dea0 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61  nd/or OFFSET cla
1deb0 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b  uses. This block
1dec0 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d  .  ** creates N-
1ded0 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  1 copies of the 
1dee0 70 61 72 65 6e 74 20 71 75 65 72 79 20 77 69 74  parent query wit
1def0 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42  hout any ORDER B
1df00 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a  Y, LIMIT or .  *
1df10 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  * OFFSET clauses
1df20 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20   and joins them 
1df30 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64  to the left-hand
1df40 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69  -side of the ori
1df50 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67  ginal.  ** using
1df60 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
1df70 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61  tors. In this ca
1df80 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  se N is the numb
1df90 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a  er of simple.  *
1dfa0 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  * select stateme
1dfb0 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f  nts in the compo
1dfc0 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20  und sub-query.. 
1dfd0 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65   **.  ** Example
1dfe0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
1dff0 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20  SELECT a+1 FROM 
1e000 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  (.  **        SE
1e010 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a  LECT x FROM tab.
1e020 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f    **        UNIO
1e030 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20  N ALL.  **      
1e040 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20    SELECT y FROM 
1e050 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  tab.  **        
1e060 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
1e070 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73        SELECT abs
1e080 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a  (z*2) FROM tab2.
1e090 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45    **     ) WHERE
1e0a0 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31   a!=5 ORDER BY 1
1e0b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73  .  **.  ** Trans
1e0c0 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a  formed into:.  *
1e0d0 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
1e0e0 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57  T x+1 FROM tab W
1e0f0 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a  HERE x+1!=5.  **
1e100 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
1e110 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79   **     SELECT y
1e120 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52  +1 FROM tab WHER
1e130 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20  E y+1!=5.  **   
1e140 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
1e150 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28       SELECT abs(
1e160 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32  z*2)+1 FROM tab2
1e170 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b   WHERE abs(z*2)+
1e180 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52  1!=5.  **     OR
1e190 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20  DER BY 1.  **.  
1e1a0 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20  ** We call this 
1e1b0 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75  the "compound-su
1e1c0 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
1e1d0 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  g"..  */.  for(p
1e1e0 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
1e1f0 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75  ; pSub; pSub=pSu
1e200 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  b->pPrior){.    
1e210 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
1e220 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
1e230 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
1e240 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c  By;.    Expr *pL
1e250 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
1e260 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 66 66  ;.    Expr *pOff
1e270 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
1e280 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50  ;.    Select *pP
1e290 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
1e2a0 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
1e2b0 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53  y = 0;.    p->pS
1e2c0 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  rc = 0;.    p->p
1e2d0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  Prior = 0;.    p
1e2e0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
1e2f0 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
1e300 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
1e310 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
1e320 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e  , p, 0);.    p->
1e330 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
1e340 74 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  t;.    p->pLimit
1e350 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70   = pLimit;.    p
1e360 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
1e370 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53  derBy;.    p->pS
1e380 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70  rc = pSrc;.    p
1e390 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20  ->op = TK_ALL;. 
1e3a0 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
1e3b0 7b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  {.      p->pPrio
1e3c0 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
1e3d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65  }else{.      pNe
1e3e0 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  w->pPrior = pPri
1e3f0 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  or;.      if( pP
1e400 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70  rior ) pPrior->p
1e410 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Next = pNew;.   
1e420 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d     pNew->pNext =
1e430 20 70 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72   p;.      p->pPr
1e440 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ior = pNew;.    
1e450 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  }.    if( db->ma
1e460 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
1e470 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 1;.  }..  /*
1e480 20 42 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e   Begin flattenin
1e490 67 20 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65  g the iFrom-th e
1e4a0 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
1e4b0 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e   clause .  ** in
1e4c0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1e4d0 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20  ..  */.  pSub = 
1e4e0 70 53 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d  pSub1 = pSubitem
1e4f0 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a  ->pSelect;..  /*
1e500 20 44 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e   Delete the tran
1e510 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  sient table stru
1e520 63 74 75 72 65 20 61 73 73 6f 63 69 61 74 65 64  cture associated
1e530 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73   with the.  ** s
1e540 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73  ubquery.  */.  s
1e550 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1e560 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61   pSubitem->zData
1e570 62 61 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  base);.  sqlite3
1e580 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
1e590 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73  tem->zName);.  s
1e5a0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1e5b0 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61   pSubitem->zAlia
1e5c0 73 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e  s);.  pSubitem->
1e5d0 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  zDatabase = 0;. 
1e5e0 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
1e5f0 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
1e600 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  ->zAlias = 0;.  
1e610 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
1e620 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66  t = 0;..  /* Def
1e630 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  er deleting the 
1e640 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73  Table object ass
1e650 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1e660 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75  .  ** subquery u
1e670 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61  ntil code genera
1e680 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  tion is.  ** com
1e690 70 6c 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65  plete, since the
1e6a0 72 65 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69  re may still exi
1e6b0 73 74 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74  st Expr.pTab ent
1e6c0 72 69 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72  ries that.  ** r
1e6d0 65 66 65 72 20 74 6f 20 74 68 65 20 73 75 62 71  efer to the subq
1e6e0 75 65 72 79 20 65 76 65 6e 20 61 66 74 65 72 20  uery even after 
1e6f0 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63  flattening.  Tic
1e700 6b 65 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a  ket #3346..  **.
1e710 20 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70    ** pSubitem->p
1e720 54 61 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f  Tab is always no
1e730 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72  n-NULL by test r
1e740 65 73 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20  estrictions and 
1e750 74 65 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a  tests above..  *
1e760 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  /.  if( ALWAYS(p
1e770 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30  Subitem->pTab!=0
1e780 29 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ) ){.    Table *
1e790 70 54 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62  pTabToDel = pSub
1e7a0 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  item->pTab;.    
1e7b0 69 66 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e  if( pTabToDel->n
1e7c0 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Ref==1 ){.      
1e7d0 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
1e7e0 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
1e7f0 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
1e800 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c  .      pTabToDel
1e810 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20  ->pNextZombie = 
1e820 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62  pToplevel->pZomb
1e830 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70 54 6f  ieTab;.      pTo
1e840 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54  plevel->pZombieT
1e850 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a  ab = pTabToDel;.
1e860 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e870 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66   pTabToDel->nRef
1e880 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  --;.    }.    pS
1e890 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30  ubitem->pTab = 0
1e8a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
1e8b0 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72  following loop r
1e8c0 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
1e8d0 68 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70  h term in a comp
1e8e0 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20  ound-subquery.  
1e8f0 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61  ** flattening (a
1e900 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
1e910 65 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 64  e).  If we are d
1e920 6f 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74  oing a different
1e930 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c   kind.  ** of fl
1e940 61 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61  attening - a fla
1e950 74 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68  ttening other th
1e960 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75  an a compound-su
1e970 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
1e980 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  g -.  ** then th
1e990 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e  is loop only run
1e9a0 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s once..  **.  *
1e9b0 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65  * This loop move
1e9c0 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f  s all of the FRO
1e9d0 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  M elements of th
1e9e0 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
1e9f0 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f  the.  ** the FRO
1ea00 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1ea10 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
1ea20 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c  fore doing this,
1ea30 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74   remember.  ** t
1ea40 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
1ea50 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61   for the origina
1ea60 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52  l outer query FR
1ea70 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20  OM element in.  
1ea80 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65  ** iParent.  The
1ea90 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20   iParent cursor 
1eaa0 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
1eab0 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20  ed.  Subsequent 
1eac0 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73  code.  ** will s
1ead0 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20  can expressions 
1eae0 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72  looking for iPar
1eaf0 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  ent references a
1eb00 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20  nd replace.  ** 
1eb10 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73  those references
1eb20 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e   with expression
1eb30 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74  s that resolve t
1eb40 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46  o the subquery F
1eb50 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74  ROM.  ** element
1eb60 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70  s we are now cop
1eb70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ying in..  */.  
1eb80 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70  for(pParent=p; p
1eb90 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d  Parent; pParent=
1eba0 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c  pParent->pPrior,
1ebb0 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69   pSub=pSub->pPri
1ebc0 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75  or){.    int nSu
1ebd0 62 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69  bSrc;.    u8 joi
1ebe0 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70  ntype = 0;.    p
1ebf0 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
1ec00 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  Src;     /* FROM
1ec10 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75   clause of subqu
1ec20 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53  ery */.    nSubS
1ec30 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53  rc = pSubSrc->nS
1ec40 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  rc;  /* Number o
1ec50 66 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75  f terms in subqu
1ec60 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  ery FROM clause 
1ec70 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50  */.    pSrc = pP
1ec80 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20  arent->pSrc;    
1ec90 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
1eca0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
1ecb0 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70  ry */..    if( p
1ecc0 53 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Src ){.      ass
1ecd0 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20  ert( pParent==p 
1ece0 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d  );  /* First tim
1ecf0 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f  e through the lo
1ed00 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e  op */.      join
1ed10 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d  type = pSubitem-
1ed20 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d  >jointype;.    }
1ed30 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1ed40 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29  rt( pParent!=p )
1ed50 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75  ;  /* 2nd and su
1ed60 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74  bsequent times t
1ed70 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
1ed80 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  */.      pSrc = 
1ed90 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20  pParent->pSrc = 
1eda0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1edb0 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30  pend(db, 0, 0, 0
1edc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72  );.      if( pSr
1edd0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
1ede0 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
1edf0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
1ee00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1ee10 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1ee20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75 73   The subquery us
1ee30 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74  es a single slot
1ee40 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1ee50 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
1ee60 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20  .    ** query.  
1ee70 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1ee80 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
1ee90 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73  e element in its
1eea0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20   FROM clause,.  
1eeb0 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64    ** then expand
1eec0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1eed0 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66   to make space f
1eee0 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c  or it to hold al
1eef0 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a  l elements.    *
1ef00 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
1ef10 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
1ef20 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
1ef30 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43  .    **    SELEC
1ef40 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28  T * FROM tabA, (
1ef50 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75  SELECT * FROM su
1ef60 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b  b1, sub2), tabB;
1ef70 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1ef80 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68  he outer query h
1ef90 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74  as 3 slots in it
1efa0 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
1efb0 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a  One slot of the.
1efc0 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
1efd0 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73  ry (the middle s
1efe0 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79 20  lot) is used by 
1eff0 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54  the subquery.  T
1f000 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62  he next.    ** b
1f010 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c  lock of code wil
1f020 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74  l expand the out
1f030 20 71 75 65 72 79 20 74 6f 20 34 20 73 6c 6f 74   query to 4 slot
1f040 73 2e 20 20 54 68 65 20 6d 69 64 64 6c 65 0a 20  s.  The middle. 
1f050 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78     ** slot is ex
1f060 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c  panded to two sl
1f070 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ots in order to 
1f080 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 74  make space for t
1f090 68 65 0a 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c  he.    ** two el
1f0a0 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52  ements in the FR
1f0b0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1f0c0 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a   subquery..    *
1f0d0 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72  /.    if( nSubSr
1f0e0 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61  c>1 ){.      pPa
1f0f0 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72  rent->pSrc = pSr
1f100 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
1f110 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53  stEnlarge(db, pS
1f120 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46  rc, nSubSrc-1,iF
1f130 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66  rom+1);.      if
1f140 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1f150 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  ed ){.        br
1f160 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1f170 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73   }..    /* Trans
1f180 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  fer the FROM cla
1f190 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74  use terms from t
1f1a0 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
1f1b0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
1f1c0 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  r query..    */.
1f1d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1f1e0 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
1f1f0 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
1f200 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63  tDelete(db, pSrc
1f210 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73  ->a[i+iFrom].pUs
1f220 69 6e 67 29 3b 0a 20 20 20 20 20 20 70 53 72 63  ing);.      pSrc
1f230 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
1f240 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
1f250 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
1f260 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
1f270 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
1f280 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
1f290 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a  pSrc->a[iFrom].j
1f2a0 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79  ointype = jointy
1f2b0 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f  pe;.  .    /* No
1f2c0 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75  w begin substitu
1f2d0 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65  ting subquery re
1f2e0 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
1f2f0 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a  ions for .    **
1f300 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1f310 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68  he iParent in th
1f320 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
1f330 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78     ** .    ** Ex
1f340 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
1f350 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b    **   SELECT a+
1f360 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45  5, b*10 FROM (SE
1f370 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79  LECT x*3 AS a, y
1f380 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31  +10 AS b FROM t1
1f390 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20  ) WHERE a>b;.   
1f3a0 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20   **   \         
1f3b0 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
1f3c0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75  __________ subqu
1f3d0 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ery __________/ 
1f3e0 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a           /.    *
1f3f0 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  *    \__________
1f400 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65  ___________ oute
1f410 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  r query ________
1f420 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1f430 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20  ______/.    **. 
1f440 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74     ** We look at
1f450 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
1f460 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  n in the outer q
1f470 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70  uery and every p
1f480 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20  lace we see.    
1f490 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69  ** "a" we substi
1f4a0 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65  tute "x*3" and e
1f4b0 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
1f4c0 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74  e "b" we substit
1f4d0 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20  ute "y+10"..    
1f4e0 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  */.    pList = p
1f4f0 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a  Parent->pEList;.
1f500 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
1f510 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1f520 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  ){.      if( pLi
1f530 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d  st->a[i].zName==
1f540 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  0 ){.        cha
1f550 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  r *zName = sqlit
1f560 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
1f570 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
1f580 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1f590 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  e3Dequote(zName)
1f5a0 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  ;.        pList-
1f5b0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e  >a[i].zName = zN
1f5c0 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
1f5d0 20 7d 0a 20 20 20 20 73 75 62 73 74 45 78 70 72   }.    substExpr
1f5e0 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74  List(db, pParent
1f5f0 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e  ->pEList, iParen
1f600 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1f610 3b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  ;.    if( isAgg 
1f620 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78  ){.      substEx
1f630 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65  prList(db, pPare
1f640 6e 74 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50  nt->pGroupBy, iP
1f650 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
1f660 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ist);.      pPar
1f670 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  ent->pHaving = s
1f680 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61  ubstExpr(db, pPa
1f690 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69  rent->pHaving, i
1f6a0 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
1f6b0 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
1f6c0 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
1f6d0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73  rBy ){.      ass
1f6e0 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f  ert( pParent->pO
1f6f0 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
1f700 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64     pParent->pOrd
1f710 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72  erBy = pSub->pOr
1f720 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75  derBy;.      pSu
1f730 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  b->pOrderBy = 0;
1f740 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
1f750 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
1f760 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45   ){.      substE
1f770 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72  xprList(db, pPar
1f780 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69  ent->pOrderBy, i
1f790 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
1f7a0 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
1f7b0 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72   if( pSub->pWher
1f7c0 65 20 29 7b 0a 20 20 20 20 20 20 70 57 68 65 72  e ){.      pWher
1f7d0 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  e = sqlite3ExprD
1f7e0 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68  up(db, pSub->pWh
1f7f0 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  ere, 0);.    }el
1f800 73 65 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65  se{.      pWhere
1f810 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
1f820 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67  if( subqueryIsAg
1f830 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  g ){.      asser
1f840 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76  t( pParent->pHav
1f850 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ing==0 );.      
1f860 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
1f870 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65   = pParent->pWhe
1f880 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  re;.      pParen
1f890 74 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65  t->pWhere = pWhe
1f8a0 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  re;.      pParen
1f8b0 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62  t->pHaving = sub
1f8c0 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65  stExpr(db, pPare
1f8d0 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61  nt->pHaving, iPa
1f8e0 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
1f8f0 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  st);.      pPare
1f900 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71  nt->pHaving = sq
1f910 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
1f920 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
1f930 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  g, .            
1f940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f950 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1f960 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  rDup(db, pSub->p
1f970 48 61 76 69 6e 67 2c 20 30 29 29 3b 0a 20 20 20  Having, 0));.   
1f980 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
1f990 6e 74 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20  nt->pGroupBy==0 
1f9a0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
1f9b0 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
1f9c0 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
1f9d0 64 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75 70  db, pSub->pGroup
1f9e0 42 79 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  By, 0);.    }els
1f9f0 65 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  e{.      pParent
1fa00 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73 74  ->pWhere = subst
1fa10 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74  Expr(db, pParent
1fa20 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e  ->pWhere, iParen
1fa30 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1fa40 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
1fa50 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
1fa60 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61  3ExprAnd(db, pPa
1fa70 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 70 57  rent->pWhere, pW
1fa80 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  here);.    }.  .
1fa90 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74      /* The flatt
1faa0 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64 69  ened query is di
1fab0 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65 72  stinct if either
1fac0 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68   the inner or th
1fad0 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
1fae0 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
1faf0 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  . .    */.    pP
1fb00 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20  arent->selFlags 
1fb10 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  |= pSub->selFlag
1fb20 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 3b  s & SF_Distinct;
1fb30 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  .  .    /*.    *
1fb40 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  * SELECT ... FRO
1fb50 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49  M (SELECT ... LI
1fb60 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29 20  MIT a OFFSET b) 
1fb70 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79  LIMIT x OFFSET y
1fb80 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1fb90 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20 74  One is tempted t
1fba0 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61 20 61  o try to add a a
1fbb0 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20  nd b to combine 
1fbc0 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74  the limits.  But
1fbd0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65   this.    ** doe
1fbe0 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69  s not work if ei
1fbf0 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65  ther limit is ne
1fc00 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20  gative..    */. 
1fc10 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69     if( pSub->pLi
1fc20 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61  mit ){.      pPa
1fc30 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  rent->pLimit = p
1fc40 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  Sub->pLimit;.   
1fc50 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20     pSub->pLimit 
1fc60 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
1fc70 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64    /* Finially, d
1fc80 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65  elete what is le
1fc90 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ft of the subque
1fca0 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ry and return.  
1fcb0 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f  ** success..  */
1fcc0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
1fcd0 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 31  Delete(db, pSub1
1fce0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  );..  return 1;.
1fcf0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
1fd00 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1fd10 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1fd20 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1fd30 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a  IT_VIEW) */../*.
1fd40 2a 2a 20 42 61 73 65 64 20 6f 6e 20 74 68 65 20  ** Based on the 
1fd50 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1fd60 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
1fd70 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  e indicated by t
1fd80 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75  he first.** argu
1fd90 6d 65 6e 74 2c 20 74 68 69 73 20 66 75 6e 63 74  ment, this funct
1fda0 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 74 68  ion checks if th
1fdb0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
1fdc0 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  true:.**.**    *
1fdd0 20 74 68 65 20 71 75 65 72 79 20 63 6f 6e 74 61   the query conta
1fde0 69 6e 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c  ins just a singl
1fdf0 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
1fe00 74 69 6f 6e 2c 0a 2a 2a 20 20 20 20 2a 20 74 68  tion,.**    * th
1fe10 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
1fe20 74 69 6f 6e 20 69 73 20 65 69 74 68 65 72 20 6d  tion is either m
1fe30 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 2c 20 61  in() or max(), a
1fe40 6e 64 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61  nd.**    * the a
1fe50 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 61  rgument to the a
1fe60 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1fe70 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  n is a column va
1fe80 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c  lue..**.** If al
1fe90 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61  l of the above a
1fea0 72 65 20 74 72 75 65 2c 20 74 68 65 6e 20 57 48  re true, then WH
1feb0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20  ERE_ORDERBY_MIN 
1fec0 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  or WHERE_ORDERBY
1fed0 5f 4d 41 58 0a 2a 2a 20 69 73 20 72 65 74 75 72  _MAX.** is retur
1fee0 6e 65 64 20 61 73 20 61 70 70 72 6f 70 72 69 61  ned as appropria
1fef0 74 65 2e 20 41 6c 73 6f 2c 20 2a 70 70 4d 69 6e  te. Also, *ppMin
1ff00 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Max is set to po
1ff10 69 6e 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 6c  int to the .** l
1ff20 69 73 74 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ist of arguments
1ff30 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 61   passed to the a
1ff40 67 67 72 65 67 61 74 65 20 62 65 66 6f 72 65 20  ggregate before 
1ff50 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
1ff60 20 4f 72 2c 20 69 66 20 74 68 65 20 63 6f 6e 64   Or, if the cond
1ff70 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 61 72 65  itions above are
1ff80 20 6e 6f 74 20 6d 65 74 2c 20 2a 70 70 4d 69 6e   not met, *ppMin
1ff90 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 30 20  Max is set to 0 
1ffa0 61 6e 64 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44  and.** WHERE_ORD
1ffb0 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 69 73 20 72  ERBY_NORMAL is r
1ffc0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1ffd0 69 63 20 75 38 20 6d 69 6e 4d 61 78 51 75 65 72  ic u8 minMaxQuer
1ffe0 79 28 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  y(AggInfo *pAggI
1fff0 6e 66 6f 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a  nfo, ExprList **
20000 70 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74  ppMinMax){.  int
20010 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52   eRet = WHERE_OR
20020 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20  DERBY_NORMAL;   
20030 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
20040 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2a 70 70   value */..  *pp
20050 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 69 66  MinMax = 0;.  if
20060 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  ( pAggInfo->nFun
20070 63 3d 3d 31 20 29 7b 0a 20 20 20 20 45 78 70 72  c==1 ){.    Expr
20080 20 2a 70 45 78 70 72 20 3d 20 70 41 67 67 49 6e   *pExpr = pAggIn
20090 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 45 78  fo->aFunc[0].pEx
200a0 70 72 3b 20 2f 2a 20 41 67 67 72 65 67 61 74 65  pr; /* Aggregate
200b0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   function */.   
200c0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
200d0 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
200e0 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 72 67 75  st;      /* Argu
200f0 6d 65 6e 74 73 20 74 6f 20 61 67 67 20 66 75 6e  ments to agg fun
20100 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 61 73  ction */..    as
20110 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
20120 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
20130 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69   );.    if( pELi
20140 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
20150 78 70 72 3d 3d 31 20 26 26 20 70 45 4c 69 73 74  xpr==1 && pEList
20160 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
20170 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
20180 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
20190 68 61 72 20 2a 7a 46 75 6e 63 20 3d 20 70 45 78  har *zFunc = pEx
201a0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
201b0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
201c0 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d  trICmp(zFunc, "m
201d0 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  in")==0 ){.     
201e0 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f     eRet = WHERE_
201f0 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20  ORDERBY_MIN;.   
20200 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d       *ppMinMax =
20210 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d   pEList;.      }
20220 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
20230 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22  StrICmp(zFunc, "
20240 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  max")==0 ){.    
20250 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45      eRet = WHERE
20260 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20  _ORDERBY_MAX;.  
20270 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20        *ppMinMax 
20280 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  = pEList;.      
20290 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  }.    }.  }..  a
202a0 73 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78  ssert( *ppMinMax
202b0 3d 3d 30 20 7c 7c 20 28 2a 70 70 4d 69 6e 4d 61  ==0 || (*ppMinMa
202c0 78 29 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a  x)->nExpr==1 );.
202d0 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d    return eRet;.}
202e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65  ../*.** The sele
202f0 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
20300 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
20310 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
20320 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
20330 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
20340 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 61  rgument is the a
20350 73 73 6f 63 69 61 74 65 64 20 61 67 67 72 65 67  ssociated aggreg
20360 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e  ate-info object.
20370 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   This .** functi
20380 6f 6e 20 74 65 73 74 73 20 69 66 20 74 68 65 20  on tests if the 
20390 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65  SELECT is of the
203a0 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53   form:.**.**   S
203b0 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
203c0 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20  ROM <tbl>.**.** 
203d0 77 68 65 72 65 20 74 61 62 6c 65 20 69 73 20 61  where table is a
203e0 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c   database table,
203f0 20 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63   not a sub-selec
20400 74 20 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68  t or view. If th
20410 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20  e query.** does 
20420 6d 61 74 63 68 20 74 68 69 73 20 70 61 74 74 65  match this patte
20430 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74  rn, then a point
20440 65 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20  er to the Table 
20450 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74  object represent
20460 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20  ing.** <tbl> is 
20470 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
20480 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e  ise, 0 is return
20490 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61  ed..*/.static Ta
204a0 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75  ble *isSimpleCou
204b0 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67  nt(Select *p, Ag
204c0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
204d0 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
204e0 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a  .  Expr *pExpr;.
204f0 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70  .  assert( !p->p
20500 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66  GroupBy );..  if
20510 28 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70  ( p->pWhere || p
20520 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
20530 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72  =1 .   || p->pSr
20540 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d  c->nSrc!=1 || p-
20550 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  >pSrc->a[0].pSel
20560 65 63 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ect.  ){.    ret
20570 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61  urn 0;.  }.  pTa
20580 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
20590 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20  ].pTab;.  pExpr 
205a0 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  = p->pEList->a[0
205b0 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72  ].pExpr;.  asser
205c0 74 28 20 70 54 61 62 20 26 26 20 21 70 54 61 62  t( pTab && !pTab
205d0 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 70 45 78  ->pSelect && pEx
205e0 70 72 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56  pr );..  if( IsV
205f0 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72  irtual(pTab) ) r
20600 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
20610 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
20620 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75  _FUNCTION ) retu
20630 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45  rn 0;.  if( NEVE
20640 52 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  R(pAggInfo->nFun
20650 63 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30  c==0) ) return 0
20660 3b 0a 20 20 69 66 28 20 28 70 41 67 67 49 6e 66  ;.  if( (pAggInf
20670 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e  o->aFunc[0].pFun
20680 63 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53 51 4c  c->funcFlags&SQL
20690 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d  ITE_FUNC_COUNT)=
206a0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
206b0 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
206c0 73 26 45 50 5f 44 69 73 74 69 6e 63 74 20 29 20  s&EP_Distinct ) 
206d0 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74  return 0;..  ret
206e0 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a  urn pTab;.}../*.
206f0 2a 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63 65  ** If the source
20700 2d 6c 69 73 74 20 69 74 65 6d 20 70 61 73 73 65  -list item passe
20710 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
20720 20 77 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77   was augmented w
20730 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45  ith an.** INDEXE
20740 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  D BY clause, the
20750 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20  n try to locate 
20760 74 68 65 20 73 70 65 63 69 66 69 65 64 20 69 6e  the specified in
20770 64 65 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a  dex. If there.**
20780 20 77 61 73 20 73 75 63 68 20 61 20 63 6c 61 75   was such a clau
20790 73 65 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64  se and the named
207a0 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65   index cannot be
207b0 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a   found, return .
207c0 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  ** SQLITE_ERROR 
207d0 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72  and leave an err
207e0 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74  or in pParse. Ot
207f0 68 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74  herwise, populat
20800 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e  e .** pFrom->pIn
20810 64 65 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53  dex and return S
20820 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74  QLITE_OK..*/.int
20830 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42   sqlite3IndexedB
20840 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70  yLookup(Parse *p
20850 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72  Parse, struct Sr
20860 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
20870 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  m){.  if( pFrom-
20880 3e 70 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e  >pTab && pFrom->
20890 7a 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 54 61  zIndex ){.    Ta
208a0 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
208b0 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61  m->pTab;.    cha
208c0 72 20 2a 7a 49 6e 64 65 78 20 3d 20 70 46 72 6f  r *zIndex = pFro
208d0 6d 2d 3e 7a 49 6e 64 65 78 3b 0a 20 20 20 20 49  m->zIndex;.    I
208e0 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
208f0 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
20900 49 6e 64 65 78 3b 20 0a 20 20 20 20 20 20 20 20  Index; .        
20910 70 49 64 78 20 26 26 20 73 71 6c 69 74 65 33 53  pIdx && sqlite3S
20920 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61  trICmp(pIdx->zNa
20930 6d 65 2c 20 7a 49 6e 64 65 78 29 3b 20 0a 20 20  me, zIndex); .  
20940 20 20 20 20 20 20 70 49 64 78 3d 70 49 64 78 2d        pIdx=pIdx-
20950 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20 20  >pNext.    );.  
20960 20 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20    if( !pIdx ){. 
20970 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
20980 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
20990 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 73 22   such index: %s"
209a0 2c 20 7a 49 6e 64 65 78 2c 20 30 29 3b 0a 20 20  , zIndex, 0);.  
209b0 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
209c0 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20  kSchema = 1;.   
209d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
209e0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
209f0 20 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20    pFrom->pIndex 
20a00 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65  = pIdx;.  }.  re
20a10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
20a20 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63 74 20 63  }./*.** Detect c
20a30 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73  ompound SELECT s
20a40 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 75  tatements that u
20a50 73 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  se an ORDER BY c
20a60 6c 61 75 73 65 20 77 69 74 68 20 0a 2a 2a 20 61  lause with .** a
20a70 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  n alternative co
20a80 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
20a90 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  ..**.**    SELEC
20aa0 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58  T ... FROM t1 EX
20ab0 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20  CEPT SELECT ... 
20ac0 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59  FROM t2 ORDER BY
20ad0 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a   .. COLLATE ....
20ae0 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20  **.** These are 
20af0 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 73  rewritten as a s
20b00 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  ubquery:.**.**  
20b10 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
20b20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d  (SELECT ... FROM
20b30 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43   t1 EXCEPT SELEC
20b40 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 29 0a 2a  T ... FROM t2).*
20b50 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 2e  *     ORDER BY .
20b60 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a  .. COLLATE ....*
20b70 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66  *.** This transf
20b80 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 63 65  ormation is nece
20b90 73 73 61 72 79 20 62 65 63 61 75 73 65 20 74 68  ssary because th
20ba0 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  e multiSelectOrd
20bb0 65 72 42 79 28 29 20 72 6f 75 74 69 6e 65 0a 2a  erBy() routine.*
20bc0 2a 20 61 62 6f 76 65 20 74 68 61 74 20 67 65 6e  * above that gen
20bd0 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
20be0 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53  for a compound S
20bf0 45 4c 45 43 54 20 77 69 74 68 20 61 6e 20 4f 52  ELECT with an OR
20c00 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a  DER BY clause.**
20c10 20 75 73 65 73 20 61 20 6d 65 72 67 65 20 61 6c   uses a merge al
20c20 67 6f 72 69 74 68 6d 20 74 68 61 74 20 72 65 71  gorithm that req
20c30 75 69 72 65 73 20 74 68 65 20 73 61 6d 65 20 63  uires the same c
20c40 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
20c50 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75  e on the.** resu
20c60 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e  lt columns as on
20c70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
20c80 61 75 73 65 2e 20 20 53 65 65 20 74 69 63 6b 65  ause.  See ticke
20c90 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77 77 2e  t.** http://www.
20ca0 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69  sqlite.org/src/i
20cb0 6e 66 6f 2f 36 37 30 39 35 37 34 64 32 61 0a 2a  nfo/6709574d2a.*
20cc0 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66  *.** This transf
20cd0 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  ormation is only
20ce0 20 6e 65 65 64 65 64 20 66 6f 72 20 45 58 43 45   needed for EXCE
20cf0 50 54 2c 20 49 4e 54 45 52 53 45 43 54 2c 20 61  PT, INTERSECT, a
20d00 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65  nd UNION..** The
20d10 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
20d20 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e 65 20 77  tor works fine w
20d30 69 74 68 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  ith multiSelectO
20d40 72 64 65 72 42 79 28 29 20 65 76 65 6e 20 77 68  rderBy() even wh
20d50 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20  en.** there are 
20d60 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73 20 69 6e  COLLATE terms in
20d70 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a   the ORDER BY..*
20d80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e  /.static int con
20d90 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65  vertCompoundSele
20da0 63 74 54 6f 53 75 62 71 75 65 72 79 28 57 61 6c  ctToSubquery(Wal
20db0 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
20dc0 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
20dd0 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  i;.  Select *pNe
20de0 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 58 3b  w;.  Select *pX;
20df0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
20e00 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
20e10 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 53 72 63  t_item *a;.  Src
20e20 4c 69 73 74 20 2a 70 4e 65 77 53 72 63 3b 0a 20  List *pNewSrc;. 
20e30 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a   Parse *pParse;.
20e40 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a    Token dummy;..
20e50 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d    if( p->pPrior=
20e60 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
20e70 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28 20  Continue;.  if( 
20e80 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  p->pOrderBy==0 )
20e90 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
20ea0 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58 3d 70  inue;.  for(pX=p
20eb0 3b 20 70 58 20 26 26 20 28 70 58 2d 3e 6f 70 3d  ; pX && (pX->op=
20ec0 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f  =TK_ALL || pX->o
20ed0 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b 20 70  p==TK_SELECT); p
20ee0 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a  X=pX->pPrior){}.
20ef0 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 72 65    if( pX==0 ) re
20f00 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
20f10 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f 72 64  e;.  a = p->pOrd
20f20 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72 28 69  erBy->a;.  for(i
20f30 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  =p->pOrderBy->nE
20f40 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  xpr-1; i>=0; i--
20f50 29 7b 0a 20 20 20 20 69 66 28 20 61 5b 69 5d 2e  ){.    if( a[i].
20f60 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
20f70 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72 65 61  P_Collate ) brea
20f80 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 30  k;.  }.  if( i<0
20f90 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
20fa0 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49 66  ntinue;..  /* If
20fb0 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
20fc0 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73  oint, that means
20fd0 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74   the transformat
20fe0 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 2e  ion is required.
20ff0 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20   */..  pParse = 
21000 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
21010 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
21020 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  db;.  pNew = sql
21030 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
21040 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
21050 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
21060 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
21070 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73 65 74  _Abort;.  memset
21080 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69 7a 65  (&dummy, 0, size
21090 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20 70 4e  of(dummy));.  pN
210a0 65 77 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  ewSrc = sqlite3S
210b0 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d  rcListAppendFrom
210c0 54 65 72 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c  Term(pParse,0,0,
210d0 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c  0,&dummy,pNew,0,
210e0 30 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 53 72  0);.  if( pNewSr
210f0 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  c==0 ) return WR
21100 43 5f 41 62 6f 72 74 3b 0a 20 20 2a 70 4e 65 77  C_Abort;.  *pNew
21110 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70 53 72 63   = *p;.  p->pSrc
21120 20 3d 20 70 4e 65 77 53 72 63 3b 0a 20 20 70 2d   = pNewSrc;.  p-
21130 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
21140 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
21150 70 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74  pParse, 0, sqlit
21160 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 41 4c  e3Expr(db, TK_AL
21170 4c 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20  L, 0));.  p->op 
21180 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70  = TK_SELECT;.  p
21190 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20  ->pWhere = 0;.  
211a0 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d  pNew->pGroupBy =
211b0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76   0;.  pNew->pHav
211c0 69 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ing = 0;.  pNew-
211d0 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
211e0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
211f0 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a    p->pNext = 0;.
21200 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
21210 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20   ~SF_Compound;. 
21220 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70   assert( pNew->p
21230 50 72 69 6f 72 21 3d 30 20 29 3b 0a 20 20 70 4e  Prior!=0 );.  pN
21240 65 77 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78  ew->pPrior->pNex
21250 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77  t = pNew;.  pNew
21260 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
21270 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20  pNew->pOffset = 
21280 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  0;.  return WRC_
21290 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66  Continue;.}..#if
212a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
212b0 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  _CTE./*.** Argum
212c0 65 6e 74 20 70 57 69 74 68 20 28 77 68 69 63 68  ent pWith (which
212d0 20 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 70 6f   may be NULL) po
212e0 69 6e 74 73 20 74 6f 20 61 20 6c 69 6e 6b 65 64  ints to a linked
212f0 20 6c 69 73 74 20 6f 66 20 6e 65 73 74 65 64 20   list of nested 
21300 0a 2a 2a 20 57 49 54 48 20 63 6f 6e 74 65 78 74  .** WITH context
21310 73 2c 20 66 72 6f 6d 20 69 6e 6e 65 72 20 74 6f  s, from inner to
21320 20 6f 75 74 65 72 6d 6f 73 74 2e 20 49 66 20 74   outermost. If t
21330 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66  he table identif
21340 69 65 64 20 62 79 20 0a 2a 2a 20 46 52 4f 4d 20  ied by .** FROM 
21350 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 70  clause element p
21360 49 74 65 6d 20 69 73 20 72 65 61 6c 6c 79 20 61  Item is really a
21370 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78   common-table-ex
21380 70 72 65 73 73 69 6f 6e 20 28 43 54 45 29 20 0a  pression (CTE) .
21390 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61  ** then return a
213a0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
213b0 43 54 45 20 64 65 66 69 6e 69 74 69 6f 6e 20 66  CTE definition f
213c0 6f 72 20 74 68 61 74 20 74 61 62 6c 65 2e 20 4f  or that table. O
213d0 74 68 65 72 77 69 73 65 0a 2a 2a 20 72 65 74 75  therwise.** retu
213e0 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  rn NULL..**.** I
213f0 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c  f a non-NULL val
21400 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  ue is returned, 
21410 73 65 74 20 2a 70 70 43 6f 6e 74 65 78 74 20 74  set *ppContext t
21420 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 57  o point to the W
21430 69 74 68 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68  ith.** object th
21440 61 74 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  at the returned 
21450 43 54 45 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a  CTE belongs to..
21460 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
21470 20 43 74 65 20 2a 73 65 61 72 63 68 57 69 74 68   Cte *searchWith
21480 28 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c  (.  With *pWith,
21490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214a0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f      /* Current o
214b0 75 74 65 72 6d 6f 73 74 20 57 49 54 48 20 63 6c  utermost WITH cl
214c0 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
214d0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
214e0 49 74 65 6d 2c 20 20 20 20 20 2f 2a 20 46 52 4f  Item,     /* FRO
214f0 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74  M clause element
21500 20 74 6f 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20   to resolve */. 
21510 20 57 69 74 68 20 2a 2a 70 70 43 6f 6e 74 65 78   With **ppContex
21520 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
21530 20 2f 2a 20 4f 55 54 3a 20 57 49 54 48 20 63 6c   /* OUT: WITH cl
21540 61 75 73 65 20 72 65 74 75 72 6e 20 76 61 6c 75  ause return valu
21550 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  e belongs to */.
21560 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
21570 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 49  *zName;.  if( pI
21580 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d  tem->zDatabase==
21590 30 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 49  0 && (zName = pI
215a0 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29  tem->zName)!=0 )
215b0 7b 0a 20 20 20 20 57 69 74 68 20 2a 70 3b 0a 20  {.    With *p;. 
215c0 20 20 20 66 6f 72 28 70 3d 70 57 69 74 68 3b 20     for(p=pWith; 
215d0 70 3b 20 70 3d 70 2d 3e 70 4f 75 74 65 72 29 7b  p; p=p->pOuter){
215e0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
215f0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
21600 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCte; i++){.  
21610 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
21620 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20  3StrICmp(zName, 
21630 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  p->a[i].zName)==
21640 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  0 ){.          *
21650 70 70 43 6f 6e 74 65 78 74 20 3d 20 70 3b 0a 20  ppContext = p;. 
21660 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
21670 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  &p->a[i];.      
21680 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
21690 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
216a0 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 64 65  ;.}../* The code
216b0 20 67 65 6e 65 72 61 74 6f 72 20 6d 61 69 6e 74   generator maint
216c0 61 69 6e 73 20 61 20 73 74 61 63 6b 20 6f 66 20  ains a stack of 
216d0 61 63 74 69 76 65 20 57 49 54 48 20 63 6c 61 75  active WITH clau
216e0 73 65 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ses.** with the 
216f0 69 6e 6e 65 72 2d 6d 6f 73 74 20 57 49 54 48 20  inner-most WITH 
21700 63 6c 61 75 73 65 20 62 65 69 6e 67 20 61 74 20  clause being at 
21710 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
21720 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tack..**.** This
21730 20 72 6f 75 74 69 6e 65 20 70 75 73 68 65 73 20   routine pushes 
21740 74 68 65 20 57 49 54 48 20 63 6c 61 75 73 65 20  the WITH clause 
21750 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
21760 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a  cond argument.**
21770 20 6f 6e 74 6f 20 74 68 65 20 74 6f 70 20 6f 66   onto the top of
21780 20 74 68 65 20 73 74 61 63 6b 2e 20 49 66 20 61   the stack. If a
21790 72 67 75 6d 65 6e 74 20 62 46 72 65 65 20 69 73  rgument bFree is
217a0 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 69 73   true, then this
217b0 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20  .** WITH clause 
217c0 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 70 6f  will never be po
217d0 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74  pped from the st
217e0 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ack. In this cas
217f0 65 20 69 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62  e it.** should b
21800 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69  e freed along wi
21810 74 68 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  th the Parse obj
21820 65 63 74 2e 20 49 6e 20 6f 74 68 65 72 20 63 61  ect. In other ca
21830 73 65 73 2c 20 77 68 65 6e 0a 2a 2a 20 62 46 72  ses, when.** bFr
21840 65 65 3d 3d 30 2c 20 74 68 65 20 57 69 74 68 20  ee==0, the With 
21850 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 66  object will be f
21860 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  reed along with 
21870 74 68 65 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73  the SELECT .** s
21880 74 61 74 65 6d 65 6e 74 20 77 69 74 68 20 77 68  tatement with wh
21890 69 63 68 20 69 74 20 69 73 20 61 73 73 6f 63 69  ich it is associ
218a0 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
218b0 6c 69 74 65 33 57 69 74 68 50 75 73 68 28 50 61  lite3WithPush(Pa
218c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 74  rse *pParse, Wit
218d0 68 20 2a 70 57 69 74 68 2c 20 75 38 20 62 46 72  h *pWith, u8 bFr
218e0 65 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 62  ee){.  assert( b
218f0 46 72 65 65 3d 3d 30 20 7c 7c 20 70 50 61 72 73  Free==0 || pPars
21900 65 2d 3e 70 57 69 74 68 3d 3d 30 20 29 3b 0a 20  e->pWith==0 );. 
21910 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20   if( pWith ){.  
21920 20 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 20    pWith->pOuter 
21930 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b  = pParse->pWith;
21940 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69  .    pParse->pWi
21950 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20  th = pWith;.    
21960 70 50 61 72 73 65 2d 3e 62 46 72 65 65 57 69 74  pParse->bFreeWit
21970 68 20 3d 20 62 46 72 65 65 3b 0a 20 20 7d 0a 7d  h = bFree;.  }.}
21980 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
21990 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20  ction checks if 
219a0 61 72 67 75 6d 65 6e 74 20 70 46 72 6f 6d 20 72  argument pFrom r
219b0 65 66 65 72 73 20 74 6f 20 61 20 43 54 45 20 64  efers to a CTE d
219c0 65 63 6c 61 72 65 64 20 62 79 20 0a 2a 2a 20 61  eclared by .** a
219d0 20 57 49 54 48 20 63 6c 61 75 73 65 20 6f 6e 20   WITH clause on 
219e0 74 68 65 20 73 74 61 63 6b 20 63 75 72 72 65 6e  the stack curren
219f0 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65 64 20 62  tly maintained b
21a00 79 20 74 68 65 20 70 61 72 73 65 72 2e 20 41 6e  y the parser. An
21a10 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72 65 6e 74  d,.** if current
21a20 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20  ly processing a 
21a30 43 54 45 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  CTE expression, 
21a40 69 66 20 69 74 20 69 73 20 61 20 72 65 63 75 72  if it is a recur
21a50 73 69 76 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  sive.** referenc
21a60 65 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  e to the current
21a70 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70   CTE..**.** If p
21a80 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e 74 6f 20  From falls into 
21a90 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 74 77  either of the tw
21aa0 6f 20 63 61 74 65 67 6f 72 69 65 73 20 61 62 6f  o categories abo
21ab0 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 0a  ve, pFrom->pTab.
21ac0 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65  ** and other fie
21ad0 6c 64 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65  lds are populate
21ae0 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54  d accordingly. T
21af0 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  he caller should
21b00 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d   check.** (pFrom
21b10 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f 20 64 65  ->pTab!=0) to de
21b20 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
21b30 6f 72 20 6e 6f 74 20 61 20 73 75 63 63 65 73 73  or not a success
21b40 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20 77 61 73  ful match.** was
21b50 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68   found..**.** Wh
21b60 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 6d  ether or not a m
21b70 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c 20 53  atch is found, S
21b80 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
21b90 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72  rned if no error
21ba0 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49 66 20 61  .** occurs. If a
21bb0 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63  n error does occ
21bc0 75 72 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ur, an error mes
21bd0 73 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69  sage is stored i
21be0 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73 65 72 20  n the.** parser 
21bf0 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f 72 20 63  and some error c
21c00 6f 64 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53  ode other than S
21c10 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
21c20 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
21c30 20 77 69 74 68 45 78 70 61 6e 64 28 0a 20 20 57   withExpand(.  W
21c40 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
21c50 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
21c60 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b  t_item *pFrom.){
21c70 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
21c80 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
21c90 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  se;.  sqlite3 *d
21ca0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
21cb0 20 20 73 74 72 75 63 74 20 43 74 65 20 2a 70 43    struct Cte *pC
21cc0 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
21cd0 20 20 2f 2a 20 4d 61 74 63 68 65 64 20 43 54 45    /* Matched CTE
21ce0 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 20   (or NULL if no 
21cf0 6d 61 74 63 68 29 20 2a 2f 0a 20 20 57 69 74 68  match) */.  With
21d00 20 2a 70 57 69 74 68 3b 20 20 20 20 20 20 20 20   *pWith;        
21d10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
21d20 49 54 48 20 63 6c 61 75 73 65 20 74 68 61 74 20  ITH clause that 
21d30 70 43 74 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20  pCte belongs to 
21d40 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  */..  assert( pF
21d50 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
21d60 0a 20 20 70 43 74 65 20 3d 20 73 65 61 72 63 68  .  pCte = search
21d70 57 69 74 68 28 70 50 61 72 73 65 2d 3e 70 57 69  With(pParse->pWi
21d80 74 68 2c 20 70 46 72 6f 6d 2c 20 26 70 57 69 74  th, pFrom, &pWit
21d90 68 29 3b 0a 20 20 69 66 28 20 70 43 74 65 20 29  h);.  if( pCte )
21da0 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
21db0 62 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  b;.    ExprList 
21dc0 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53 65 6c  *pEList;.    Sel
21dd0 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20 53  ect *pSel;.    S
21de0 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b 20 20 20  elect *pLeft;   
21df0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21e00 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54  Left-most SELECT
21e10 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
21e20 20 20 69 6e 74 20 62 4d 61 79 52 65 63 75 72 73    int bMayRecurs
21e30 69 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ive;            
21e40 2f 2a 20 54 72 75 65 20 69 66 20 63 6f 6d 70 6f  /* True if compo
21e50 75 6e 64 20 6a 6f 69 6e 65 64 20 62 79 20 55 4e  und joined by UN
21e60 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20  ION [ALL] */.   
21e70 20 57 69 74 68 20 2a 70 53 61 76 65 64 57 69 74   With *pSavedWit
21e80 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  h;             /
21e90 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  * Initial value 
21ea0 6f 66 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68  of pParse->pWith
21eb0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70   */..    /* If p
21ec0 43 74 65 2d 3e 7a 45 72 72 20 69 73 20 6e 6f 6e  Cte->zErr is non
21ed0 2d 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f  -NULL at this po
21ee0 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 69  int, then this i
21ef0 73 20 61 6e 20 69 6c 6c 65 67 61 6c 0a 20 20 20  s an illegal.   
21f00 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20 72 65   ** recursive re
21f10 66 65 72 65 6e 63 65 20 74 6f 20 43 54 45 20 70  ference to CTE p
21f20 43 74 65 2e 20 4c 65 61 76 65 20 61 6e 20 65 72  Cte. Leave an er
21f30 72 6f 72 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ror in pParse an
21f40 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20  d return.    ** 
21f50 65 61 72 6c 79 2e 20 49 66 20 70 43 74 65 2d 3e  early. If pCte->
21f60 7a 45 72 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68  zErr is NULL, th
21f70 65 6e 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  en this is not a
21f80 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72   recursive refer
21f90 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20  ence..    ** In 
21fa0 74 68 69 73 20 63 61 73 65 2c 20 70 72 6f 63 65  this case, proce
21fb0 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ed.  */.    if( 
21fc0 70 43 74 65 2d 3e 7a 45 72 72 20 29 7b 0a 20 20  pCte->zErr ){.  
21fd0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
21fe0 4d 73 67 28 70 50 61 72 73 65 2c 20 70 43 74 65  Msg(pParse, pCte
21ff0 2d 3e 7a 45 72 72 2c 20 70 43 74 65 2d 3e 7a 4e  ->zErr, pCte->zN
22000 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
22010 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
22020 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
22030 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
22040 3d 30 20 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d  =0 );.    pFrom-
22050 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73  >pTab = pTab = s
22060 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
22070 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
22080 62 6c 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70  ble));.    if( p
22090 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
220a0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 70  WRC_Abort;.    p
220b0 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  Tab->nRef = 1;. 
220c0 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d     pTab->zName =
220d0 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
220e0 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  (db, pCte->zName
220f0 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b  );.    pTab->iPK
22100 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 70 54 61  ey = -1;.    pTa
22110 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20  b->nRowLogEst = 
22120 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30  200; assert( 200
22130 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
22140 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 20 20  1048576) );.    
22150 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
22160 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a  = TF_Ephemeral;.
22170 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65      pFrom->pSele
22180 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
22190 63 74 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e  ctDup(db, pCte->
221a0 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
221b0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
221c0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53  ailed ) return S
221d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
221e0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
221f0 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20  pSelect );..    
22200 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73  /* Check if this
22210 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65 20   is a recursive 
22220 43 54 45 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c  CTE. */.    pSel
22230 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
22240 74 3b 0a 20 20 20 20 62 4d 61 79 52 65 63 75 72  t;.    bMayRecur
22250 73 69 76 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f  sive = ( pSel->o
22260 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65  p==TK_ALL || pSe
22270 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  l->op==TK_UNION 
22280 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52  );.    if( bMayR
22290 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
222a0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 53    int i;.      S
222b0 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70  rcList *pSrc = p
222c0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  From->pSelect->p
222d0 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Src;.      for(i
222e0 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  =0; i<pSrc->nSrc
222f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
22300 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
22310 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53  tem *pItem = &pS
22320 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
22330 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61    if( pItem->zDa
22340 74 61 62 61 73 65 3d 3d 30 20 0a 20 20 20 20 20  tabase==0 .     
22350 20 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e      && pItem->zN
22360 61 6d 65 21 3d 30 20 0a 20 20 20 20 20 20 20 20  ame!=0 .        
22370 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
22380 72 49 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61  rICmp(pItem->zNa
22390 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29  me, pCte->zName)
223a0 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
223b0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
223c0 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20  Tab = pTab;.    
223d0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 52        pItem->isR
223e0 65 63 75 72 73 69 76 65 20 3d 20 31 3b 0a 20 20  ecursive = 1;.  
223f0 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52          pTab->nR
22400 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ef++;.          
22410 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  pSel->selFlags |
22420 3d 20 53 46 5f 52 65 63 75 72 73 69 76 65 3b 0a  = SF_Recursive;.
22430 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22440 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
22450 4f 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72 73 69  Only one recursi
22460 76 65 20 72 65 66 65 72 65 6e 63 65 20 69 73 20  ve reference is 
22470 70 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a 20  permitted. */ . 
22480 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 52 65     if( pTab->nRe
22490 66 3e 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  f>2 ){.      sql
224a0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 0a 20 20  ite3ErrorMsg(.  
224b0 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
224c0 22 6d 75 6c 74 69 70 6c 65 20 72 65 66 65 72 65  "multiple refere
224d0 6e 63 65 73 20 74 6f 20 72 65 63 75 72 73 69 76  nces to recursiv
224e0 65 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 70 43  e table: %s", pC
224f0 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20  te->zName.      
22500 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
22510 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
22520 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
22530 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 31 20 7c 7c  pTab->nRef==1 ||
22540 20 28 28 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67   ((pSel->selFlag
22550 73 26 53 46 5f 52 65 63 75 72 73 69 76 65 29 20  s&SF_Recursive) 
22560 26 26 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 32  && pTab->nRef==2
22570 20 29 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d 3e   ));..    pCte->
22580 7a 45 72 72 20 3d 20 22 63 69 72 63 75 6c 61 72  zErr = "circular
22590 20 72 65 66 65 72 65 6e 63 65 3a 20 25 73 22 3b   reference: %s";
225a0 0a 20 20 20 20 70 53 61 76 65 64 57 69 74 68 20  .    pSavedWith 
225b0 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b  = pParse->pWith;
225c0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69  .    pParse->pWi
225d0 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20  th = pWith;.    
225e0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
225f0 74 28 70 57 61 6c 6b 65 72 2c 20 62 4d 61 79 52  t(pWalker, bMayR
22600 65 63 75 72 73 69 76 65 20 3f 20 70 53 65 6c 2d  ecursive ? pSel-
22610 3e 70 50 72 69 6f 72 20 3a 20 70 53 65 6c 29 3b  >pPrior : pSel);
22620 0a 0a 20 20 20 20 66 6f 72 28 70 4c 65 66 74 3d  ..    for(pLeft=
22630 70 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72  pSel; pLeft->pPr
22640 69 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74  ior; pLeft=pLeft
22650 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 70  ->pPrior);.    p
22660 45 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70  EList = pLeft->p
22670 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70  EList;.    if( p
22680 43 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20 20  Cte->pCols ){.  
22690 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e      if( pEList->
226a0 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e 70 43 6f  nExpr!=pCte->pCo
226b0 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  ls->nExpr ){.   
226c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
226d0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
226e0 62 6c 65 20 25 73 20 68 61 73 20 25 64 20 76 61  ble %s has %d va
226f0 6c 75 65 73 20 66 6f 72 20 25 64 20 63 6f 6c 75  lues for %d colu
22700 6d 6e 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  mns",.          
22710 20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70    pCte->zName, p
22720 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 43  EList->nExpr, pC
22730 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72  te->pCols->nExpr
22740 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
22750 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
22760 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a  h = pSavedWith;.
22770 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
22780 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
22790 20 20 20 7d 0a 20 20 20 20 20 20 70 45 4c 69 73     }.      pELis
227a0 74 20 3d 20 70 43 74 65 2d 3e 70 43 6f 6c 73 3b  t = pCte->pCols;
227b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 6c 65  .    }..    sele
227c0 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  ctColumnsFromExp
227d0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
227e0 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f  List, &pTab->nCo
227f0 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b  l, &pTab->aCol);
22800 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63  .    if( bMayRec
22810 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
22820 69 66 28 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61  if( pSel->selFla
22830 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
22840 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74  e ){.        pCt
22850 65 2d 3e 7a 45 72 72 20 3d 20 22 6d 75 6c 74 69  e->zErr = "multi
22860 70 6c 65 20 72 65 63 75 72 73 69 76 65 20 72 65  ple recursive re
22870 66 65 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20  ferences: %s";. 
22880 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22890 20 20 20 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d      pCte->zErr =
228a0 20 22 72 65 63 75 72 73 69 76 65 20 72 65 66 65   "recursive refe
228b0 72 65 6e 63 65 20 69 6e 20 61 20 73 75 62 71 75  rence in a subqu
228c0 65 72 79 3a 20 25 73 22 3b 0a 20 20 20 20 20 20  ery: %s";.      
228d0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  }.      sqlite3W
228e0 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
228f0 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a  r, pSel);.    }.
22900 20 20 20 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d      pCte->zErr =
22910 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   0;.    pParse->
22920 70 57 69 74 68 20 3d 20 70 53 61 76 65 64 57 69  pWith = pSavedWi
22930 74 68 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  th;.  }..  retur
22940 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
22950 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
22960 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f  QLITE_OMIT_CTE./
22970 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45  *.** If the SELE
22980 43 54 20 70 61 73 73 65 64 20 61 73 20 74 68 65  CT passed as the
22990 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
229a0 20 68 61 73 20 61 6e 20 61 73 73 6f 63 69 61 74   has an associat
229b0 65 64 20 57 49 54 48 20 0a 2a 2a 20 63 6c 61 75  ed WITH .** clau
229c0 73 65 2c 20 70 6f 70 20 69 74 20 66 72 6f 6d 20  se, pop it from 
229d0 74 68 65 20 73 74 61 63 6b 20 73 74 6f 72 65 64  the stack stored
229e0 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
229f0 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a  Parse object..**
22a00 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
22a10 6e 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65  n is used as the
22a20 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b   xSelectCallback
22a30 32 28 29 20 63 61 6c 6c 62 61 63 6b 20 62 79 0a  2() callback by.
22a40 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
22a50 45 78 70 61 6e 64 28 29 20 77 68 65 6e 20 77 61  Expand() when wa
22a60 6c 6b 69 6e 67 20 61 20 53 45 4c 45 43 54 20 74  lking a SELECT t
22a70 72 65 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 74  ree to resolve t
22a80 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e  able.** names an
22a90 64 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61  d other FROM cla
22aa0 75 73 65 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a  use elements. .*
22ab0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
22ac0 6c 65 63 74 50 6f 70 57 69 74 68 28 57 61 6c 6b  lectPopWith(Walk
22ad0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
22ae0 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  ect *p){.  Parse
22af0 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b   *pParse = pWalk
22b00 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 57 69  er->pParse;.  Wi
22b10 74 68 20 2a 70 57 69 74 68 20 3d 20 66 69 6e 64  th *pWith = find
22b20 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57  Rightmost(p)->pW
22b30 69 74 68 3b 0a 20 20 69 66 28 20 70 57 69 74 68  ith;.  if( pWith
22b40 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  !=0 ){.    asser
22b50 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68  t( pParse->pWith
22b60 3d 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20 70  ==pWith );.    p
22b70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
22b80 57 69 74 68 2d 3e 70 4f 75 74 65 72 3b 0a 20 20  With->pOuter;.  
22b90 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  }.}.#else.#defin
22ba0 65 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 20  e selectPopWith 
22bb0 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
22bc0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
22bd0 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63  a Walker callbac
22be0 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67  k for "expanding
22bf0 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  " a SELECT state
22c00 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64  ment..** "Expand
22c10 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f  ing" means to do
22c20 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
22c30 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61  **.**    (1)  Ma
22c40 6b 65 20 73 75 72 65 20 56 44 42 45 20 63 75 72  ke sure VDBE cur
22c50 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65  sor numbers have
22c60 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74   been assigned t
22c70 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20  o every.**      
22c80 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68     element of th
22c90 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a  e FROM clause..*
22ca0 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c  *.**    (2)  Fil
22cb0 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73  l in the pTabLis
22cc0 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c  t->a[].pTab fiel
22cd0 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73  ds in the SrcLis
22ce0 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20  t that .**      
22cf0 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20     defines FROM 
22d00 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69  clause.  When vi
22d10 65 77 73 20 61 70 70 65 61 72 20 69 6e 20 74 68  ews appear in th
22d20 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a  e FROM clause,.*
22d30 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70  *         fill p
22d40 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65  TabList->a[].pSe
22d50 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79  lect with a copy
22d60 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
22d70 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
22d80 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65      that impleme
22d90 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41  nts the view.  A
22da0 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66   copy is made of
22db0 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45   the view's SELE
22dc0 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74  CT.**         st
22dd0 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20  atement so that 
22de0 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f  we can freely mo
22df0 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74  dify or delete t
22e00 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  hat statement.**
22e10 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74           without
22e20 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20   worrying about 
22e30 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70  messing up the p
22e40 65 72 73 69 73 74 65 6e 74 20 72 65 70 72 65 73  ersistent repres
22e50 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  entation.**     
22e60 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e      of the view.
22e70 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41  .**.**    (3)  A
22e80 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  dd terms to the 
22e90 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
22ea0 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65 20  accommodate the 
22eb0 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a  NATURAL keyword.
22ec0 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f  **         on jo
22ed0 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61  ins and the ON a
22ee0 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  nd USING clause 
22ef0 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20  of joins..**.** 
22f00 20 20 20 28 34 29 20 20 53 63 61 6e 20 74 68 65     (4)  Scan the
22f10 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
22f20 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
22f30 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b  et (pEList) look
22f40 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  ing.**         f
22f50 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  or instances of 
22f60 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72  the "*" operator
22f70 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20   or the TABLE.* 
22f80 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20  operator..**    
22f90 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65       If found, e
22fa0 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74  xpand each "*" t
22fb0 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
22fc0 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65  n in every table
22fd0 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20  .**         and 
22fe0 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76  TABLE.* to be ev
22ff0 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41  ery column in TA
23000 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  BLE..**.*/.stati
23010 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61  c int selectExpa
23020 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61  nder(Walker *pWa
23030 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
23040 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
23050 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
23060 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  rse;.  int i, j,
23070 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   k;.  SrcList *p
23080 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c  TabList;.  ExprL
23090 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73  ist *pEList;.  s
230a0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
230b0 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c  em *pFrom;.  sql
230c0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
230d0 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70  e->db;.  Expr *p
230e0 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70 45 78  E, *pRight, *pEx
230f0 70 72 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c 61  pr;.  u16 selFla
23100 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73  gs = p->selFlags
23110 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ;..  p->selFlags
23120 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b   |= SF_Expanded;
23130 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
23140 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20 20 20  cFailed  ){.    
23150 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
23160 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45 56 45  ;.  }.  if( NEVE
23170 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29 20 7c 7c  R(p->pSrc==0) ||
23180 20 28 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f   (selFlags & SF_
23190 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a  Expanded)!=0 ){.
231a0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
231b0 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rune;.  }.  pTab
231c0 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
231d0 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
231e0 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 57  List;.  sqlite3W
231f0 69 74 68 50 75 73 68 28 70 50 61 72 73 65 2c 20  ithPush(pParse, 
23200 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29  findRightmost(p)
23210 2d 3e 70 57 69 74 68 2c 20 30 29 3b 0a 0a 20 20  ->pWith, 0);..  
23220 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72  /* Make sure cur
23230 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65  sor numbers have
23240 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74   been assigned t
23250 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e  o all entries in
23260 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
23270 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c  lause of the SEL
23280 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  ECT statement.. 
23290 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63   */.  sqlite3Src
232a0 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
232b0 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
232c0 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  st);..  /* Look 
232d0 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e  up every table n
232e0 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d  amed in the FROM
232f0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
23300 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20  elect.  If.  ** 
23310 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  an entry of the 
23320 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61  FROM clause is a
23330 20 73 75 62 71 75 65 72 79 20 69 6e 73 74 65 61   subquery instea
23340 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  d of a table or 
23350 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  view,.  ** then 
23360 63 72 65 61 74 65 20 61 20 74 72 61 6e 73 69 65  create a transie
23370 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
23380 72 65 20 74 6f 20 64 65 73 63 72 69 62 65 20 74  re to describe t
23390 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a  he subquery..  *
233a0 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72  /.  for(i=0, pFr
233b0 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
233c0 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
233d0 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
233e0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
233f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
23400 72 6f 6d 2d 3e 69 73 52 65 63 75 72 73 69 76 65  rom->isRecursive
23410 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54  ==0 || pFrom->pT
23420 61 62 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46  ab );.    if( pF
23430 72 6f 6d 2d 3e 69 73 52 65 63 75 72 73 69 76 65  rom->isRecursive
23440 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
23450 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
23460 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
23470 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68  This statement h
23480 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
23490 70 72 65 70 61 72 65 64 2e 20 20 54 68 65 72 65  prepared.  There
234a0 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20   is no need.    
234b0 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68    ** to go furth
234c0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  er. */.      ass
234d0 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 23 69 66  ert( i==0 );.#if
234e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
234f0 5f 43 54 45 0a 20 20 20 20 20 20 73 65 6c 65 63  _CTE.      selec
23500 74 50 6f 70 57 69 74 68 28 70 57 61 6c 6b 65 72  tPopWith(pWalker
23510 2c 20 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , p);.#endif.   
23520 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
23530 75 6e 65 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  une;.    }.#ifnd
23540 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
23550 54 45 0a 20 20 20 20 69 66 28 20 77 69 74 68 45  TE.    if( withE
23560 78 70 61 6e 64 28 70 57 61 6c 6b 65 72 2c 20 70  xpand(pWalker, p
23570 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 57  From) ) return W
23580 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69 66  RC_Abort;.    if
23590 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29 20  ( pFrom->pTab ) 
235a0 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20  {} else.#endif. 
235b0 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e     if( pFrom->zN
235c0 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65  ame==0 ){.#ifnde
235d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
235e0 42 51 55 45 52 59 0a 20 20 20 20 20 20 53 65 6c  BQUERY.      Sel
235f0 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f  ect *pSel = pFro
23600 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
23610 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79    /* A sub-query
23620 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
23630 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
23640 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
23650 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20   pSel!=0 );.    
23660 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
23670 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20  >pTab==0 );.    
23680 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
23690 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65  ect(pWalker, pSe
236a0 6c 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d  l);.      pFrom-
236b0 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73  >pTab = pTab = s
236c0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
236d0 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
236e0 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ble));.      if(
236f0 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
23700 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
23710 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20     pTab->nRef = 
23720 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  1;.      pTab->z
23730 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
23740 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74  rintf(db, "sqlit
23750 65 5f 73 71 5f 25 70 22 2c 20 28 76 6f 69 64 2a  e_sq_%p", (void*
23760 29 70 54 61 62 29 3b 0a 20 20 20 20 20 20 77 68  )pTab);.      wh
23770 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f  ile( pSel->pPrio
23780 72 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c  r ){ pSel = pSel
23790 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20  ->pPrior; }.    
237a0 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46    selectColumnsF
237b0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
237c0 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74  se, pSel->pEList
237d0 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26  , &pTab->nCol, &
237e0 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20  pTab->aCol);.   
237f0 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
23800 20 2d 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d   -1;.      pTab-
23810 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30  >nRowLogEst = 20
23820 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d  0; assert( 200==
23830 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
23840 34 38 35 37 36 29 20 29 3b 0a 20 20 20 20 20 20  48576) );.      
23850 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
23860 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a  = TF_Ephemeral;.
23870 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
23880 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72  {.      /* An or
23890 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20  dinary table or 
238a0 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65  view name in the
238b0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
238c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
238d0 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
238e0 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61        pFrom->pTa
238f0 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
23900 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65  e3LocateTableIte
23910 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 72  m(pParse, 0, pFr
23920 6f 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  om);.      if( p
23930 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
23940 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
23950 20 69 66 28 20 70 54 61 62 2d 3e 6e 52 65 66 3d   if( pTab->nRef=
23960 3d 30 78 66 66 66 66 20 29 7b 0a 20 20 20 20 20  =0xffff ){.     
23970 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
23980 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
23990 6d 61 6e 79 20 72 65 66 65 72 65 6e 63 65 73 20  many references 
239a0 74 6f 20 5c 22 25 73 5c 22 3a 20 6d 61 78 20 36  to \"%s\": max 6
239b0 35 35 33 35 22 2c 0a 20 20 20 20 20 20 20 20 20  5535",.         
239c0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a    pTab->zName);.
239d0 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70          pFrom->p
239e0 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Tab = 0;.       
239f0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
23a00 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
23a10 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23   pTab->nRef++;.#
23a20 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
23a30 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
23a40 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54   !defined (SQLIT
23a50 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
23a60 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20 70  BLE).      if( p
23a70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20  Tab->pSelect || 
23a80 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
23a90 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
23aa0 20 72 65 61 63 68 20 68 65 72 65 20 69 66 20 74   reach here if t
23ab0 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69  he named table i
23ac0 73 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65  s a really a vie
23ad0 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  w */.        if(
23ae0 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
23af0 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
23b00 65 2c 20 70 54 61 62 29 20 29 20 72 65 74 75 72  e, pTab) ) retur
23b10 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
23b20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
23b30 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  om->pSelect==0 )
23b40 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d  ;.        pFrom-
23b50 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
23b60 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
23b70 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30  pTab->pSelect, 0
23b80 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
23b90 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
23ba0 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65  lker, pFrom->pSe
23bb0 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23  lect);.      }.#
23bc0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
23bd0 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69   /* Locate the i
23be0 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20 74 68  ndex named by th
23bf0 65 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  e INDEXED BY cla
23c00 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a  use, if any. */.
23c10 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
23c20 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70  ndexedByLookup(p
23c30 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b  Parse, pFrom) ){
23c40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
23c50 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20  C_Abort;.    }. 
23c60 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73   }..  /* Process
23c70 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
23c80 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53  s, and ON and US
23c90 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a  ING clauses of j
23ca0 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  oins..  */.  if(
23cb0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
23cc0 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63 65  d || sqliteProce
23cd0 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70  ssJoin(pParse, p
23ce0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
23cf0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a  WRC_Abort;.  }..
23d00 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22    /* For every "
23d10 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  *" that occurs i
23d20 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  n the column lis
23d30 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  t, insert the na
23d40 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20  mes of.  ** all 
23d50 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74  columns in all t
23d60 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20  ables.  And for 
23d70 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e  every TABLE.* in
23d80 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20  sert the names. 
23d90 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d   ** of all colum
23da0 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68  ns in TABLE.  Th
23db0 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74 65  e parser inserte
23dc0 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70 72  d a special expr
23dd0 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68  ession.  ** with
23de0 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72   the TK_ALL oper
23df0 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a  ator for each "*
23e00 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20  " that it found 
23e10 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  in the column li
23e20 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c  st..  ** The fol
23e30 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74  lowing code just
23e40 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74   has to locate t
23e50 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73  he TK_ALL expres
23e60 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64  sions and expand
23e70 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74  .  ** each one t
23e80 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
23e90 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c  l columns in all
23ea0 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
23eb0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f  ** The first loo
23ec0 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f  p just checks to
23ed0 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72   see if there ar
23ee0 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74  e any "*" operat
23ef0 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65  ors.  ** that ne
23f00 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20  ed expanding..  
23f10 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  */.  for(k=0; k<
23f20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b  pEList->nExpr; k
23f30 2b 2b 29 7b 0a 20 20 20 20 70 45 20 3d 20 70 45  ++){.    pE = pE
23f40 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72  List->a[k].pExpr
23f50 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70  ;.    if( pE->op
23f60 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b  ==TK_ALL ) break
23f70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
23f80 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
23f90 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b  pE->pRight!=0 );
23fa0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d  .    assert( pE-
23fb0 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28  >op!=TK_DOT || (
23fc0 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26 20  pE->pLeft!=0 && 
23fd0 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  pE->pLeft->op==T
23fe0 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20 69 66 28  K_ID) );.    if(
23ff0 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
24000 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f  && pE->pRight->o
24010 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61  p==TK_ALL ) brea
24020 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70  k;.  }.  if( k<p
24030 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
24040 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66      /*.    ** If
24050 20 77 65 20 67 65 74 20 68 65 72 65 20 69 74 20   we get here it 
24060 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74  means the result
24070 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e   set contains on
24080 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20  e or more "*".  
24090 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74    ** operators t
240a0 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65  hat need to be e
240b0 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74  xpanded.  Loop t
240c0 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72  hrough each expr
240d0 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e  ession.    ** in
240e0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
240f0 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20  and expand them 
24100 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20  one by one..    
24110 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  */.    struct Ex
24120 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d  prList_item *a =
24130 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20   pEList->a;.    
24140 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d  ExprList *pNew =
24150 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67   0;.    int flag
24160 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  s = pParse->db->
24170 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c  flags;.    int l
24180 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67  ongNames = (flag
24190 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43  s & SQLITE_FullC
241a0 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20 20  olNames)!=0.    
241b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241c0 20 20 26 26 20 28 66 6c 61 67 73 20 26 20 53 51    && (flags & SQ
241d0 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
241e0 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20  es)==0;..    /* 
241f0 57 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  When processing 
24200 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
24210 75 65 72 69 65 73 2c 20 69 74 20 69 73 20 61 6c  ueries, it is al
24220 77 61 79 73 20 74 68 65 20 63 61 73 65 0a 20 20  ways the case.  
24230 20 20 2a 2a 20 74 68 61 74 20 66 75 6c 6c 5f 63    ** that full_c
24240 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 3d 4f 46 46 20  olumn_names=OFF 
24250 61 6e 64 20 73 68 6f 72 74 5f 63 6f 6c 75 6d 6e  and short_column
24260 5f 6e 61 6d 65 73 3d 4f 4e 2e 20 20 54 68 65 0a  _names=ON.  The.
24270 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 52 65      ** sqlite3Re
24280 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
24290 29 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20  ) routine makes 
242a0 69 74 20 73 6f 2e 20 2a 2f 0a 20 20 20 20 61 73  it so. */.    as
242b0 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61  sert( (p->selFla
242c0 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72  gs & SF_NestedFr
242d0 6f 6d 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  om)==0.         
242e0 20 7c 7c 20 28 28 66 6c 61 67 73 20 26 20 53 51   || ((flags & SQ
242f0 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
24300 73 29 3d 3d 30 20 26 26 0a 20 20 20 20 20 20 20  s)==0 &&.       
24310 20 20 20 20 20 20 20 28 66 6c 61 67 73 20 26 20         (flags & 
24320 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
24330 61 6d 65 73 29 21 3d 30 29 20 29 3b 0a 0a 20 20  ames)!=0) );..  
24340 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
24350 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
24360 7b 0a 20 20 20 20 20 20 70 45 20 3d 20 61 5b 6b  {.      pE = a[k
24370 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70  ].pExpr;.      p
24380 52 69 67 68 74 20 3d 20 70 45 2d 3e 70 52 69 67  Right = pE->pRig
24390 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ht;.      assert
243a0 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54  ( pE->op!=TK_DOT
243b0 20 7c 7c 20 70 52 69 67 68 74 21 3d 30 20 29 3b   || pRight!=0 );
243c0 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  .      if( pE->o
243d0 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 28 70 45  p!=TK_ALL && (pE
243e0 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
243f0 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41  pRight->op!=TK_A
24400 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  LL) ){.        /
24410 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61  * This particula
24420 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65  r expression doe
24430 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
24440 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20   expanded..     
24450 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e     */.        pN
24460 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
24470 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
24480 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45  e, pNew, a[k].pE
24490 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  xpr);.        if
244a0 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
244b0 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
244c0 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65  ->nExpr-1].zName
244d0 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20   = a[k].zName;. 
244e0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61           pNew->a
244f0 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e  [pNew->nExpr-1].
24500 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70  zSpan = a[k].zSp
24510 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b  an;.          a[
24520 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  k].zName = 0;.  
24530 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70          a[k].zSp
24540 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  an = 0;.        
24550 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70  }.        a[k].p
24560 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Expr = 0;.      
24570 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
24580 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f  * This expressio
24590 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20  n is a "*" or a 
245a0 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65  "TABLE.*" and ne
245b0 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20  eds to be.      
245c0 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a    ** expanded. *
245d0 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61  /.        int ta
245e0 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20  bleSeen = 0;    
245f0 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68    /* Set to 1 wh
24600 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73  en TABLE matches
24610 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72   */.        char
24620 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 20 20 20   *zTName = 0;   
24630 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e      /* text of n
24640 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a  ame of TABLE */.
24650 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e          if( pE->
24660 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20  op==TK_DOT ){.  
24670 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
24680 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a  pE->pLeft!=0 );.
24690 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
246a0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
246b0 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45 50  ty(pE->pLeft, EP
246c0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
246d0 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d          zTName =
246e0 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54   pE->pLeft->u.zT
246f0 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  oken;.        }.
24700 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c          for(i=0,
24710 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
24720 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
24730 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
24740 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ++){.          T
24750 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72  able *pTab = pFr
24760 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  om->pTab;.      
24770 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62      Select *pSub
24780 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
24790 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  t;.          cha
247a0 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46  r *zTabName = pF
247b0 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20  rom->zAlias;.   
247c0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
247d0 72 20 2a 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d  r *zSchemaName =
247e0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   0;.          in
247f0 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20  t iDb;.         
24800 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30   if( zTabName==0
24810 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24820 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d  zTabName = pTab-
24830 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
24840 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
24850 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
24860 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ed ) break;.    
24870 20 20 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d        if( pSub==
24880 30 20 7c 7c 20 28 70 53 75 62 2d 3e 73 65 6c 46  0 || (pSub->selF
24890 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64  lags & SF_Nested
248a0 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20  From)==0 ){.    
248b0 20 20 20 20 20 20 20 20 70 53 75 62 20 3d 20 30          pSub = 0
248c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
248d0 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c 69  ( zTName && sqli
248e0 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d  te3StrICmp(zTNam
248f0 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20  e, zTabName)!=0 
24900 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
24910 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
24920 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24930 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74       iDb = sqlit
24940 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
24950 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
24960 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  a);.            
24970 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 69 44  zSchemaName = iD
24980 62 3e 3d 30 20 3f 20 64 62 2d 3e 61 44 62 5b 69  b>=0 ? db->aDb[i
24990 44 62 5d 2e 7a 4e 61 6d 65 20 3a 20 22 2a 22 3b  Db].zName : "*";
249a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
249b0 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
249c0 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
249d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
249e0 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54  char *zName = pT
249f0 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
24a00 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  e;.            c
24a10 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20  har *zColname;  
24a20 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74 65 64 20  /* The computed 
24a30 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  column name */. 
24a40 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
24a50 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d  *zToFree;   /* M
24a60 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67 20 74  alloced string t
24a70 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
24a80 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  freed */.       
24a90 20 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e       Token sColn
24aa0 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ame;  /* Compute
24ab0 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73  d column name as
24ac0 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20   a token */..   
24ad0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
24ae0 20 7a 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20   zName );.      
24af0 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
24b00 20 26 26 20 70 53 75 62 0a 20 20 20 20 20 20 20   && pSub.       
24b10 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
24b20 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65 28 70 53  MatchSpanName(pS
24b30 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  ub->pEList->a[j]
24b40 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d  .zSpan, 0, zTNam
24b50 65 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20  e, 0)==0.       
24b60 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
24b70 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
24b80 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20              }.. 
24b90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
24ba0 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72   a column is mar
24bb0 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e 27 20  ked as 'hidden' 
24bc0 28 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20  (currently only 
24bd0 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20  possible.       
24be0 20 20 20 20 20 2a 2a 20 66 6f 72 20 76 69 72 74       ** for virt
24bf0 75 61 6c 20 74 61 62 6c 65 73 29 2c 20 64 6f 20  ual tables), do 
24c00 6e 6f 74 20 69 6e 63 6c 75 64 65 20 69 74 20 69  not include it i
24c10 6e 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20  n the expanded. 
24c20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65             ** re
24c30 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e 0a 20  sult-set list.. 
24c40 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
24c50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49 73            if( Is
24c60 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54  HiddenColumn(&pT
24c70 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a  ab->aCol[j]) ){.
24c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
24c90 73 65 72 74 28 49 73 56 69 72 74 75 61 6c 28 70  sert(IsVirtual(p
24ca0 54 61 62 29 29 3b 0a 20 20 20 20 20 20 20 20 20  Tab));.         
24cb0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
24cc0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
24cd0 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65           tableSe
24ce0 65 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20  en = 1;..       
24cf0 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20       if( i>0 && 
24d00 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  zTName==0 ){.   
24d10 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
24d20 70 46 72 6f 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20  pFrom->jointype 
24d30 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30  & JT_NATURAL)!=0
24d40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24d50 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75   && tableAndColu
24d60 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74  mnIndex(pTabList
24d70 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30  , i, zName, 0, 0
24d80 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
24d90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
24da0 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52     /* In a NATUR
24db0 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68  AL join, omit th
24dc0 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66  e join columns f
24dd0 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20  rom the .       
24de0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c           ** tabl
24df0 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f  e to the right o
24e00 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20  f the join */.  
24e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
24e20 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
24e30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24e40 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
24e50 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70 46 72  3IdListIndex(pFr
24e60 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d  om->pUsing, zNam
24e70 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)>=0 ){.       
24e80 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
24e90 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49   join with a USI
24ea0 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20  NG clause, omit 
24eb0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20  columns in the. 
24ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
24ed0 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66  * using clause f
24ee0 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e  rom the table on
24ef0 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20   the right. */. 
24f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
24f10 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
24f20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24f30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
24f40 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69     pRight = sqli
24f50 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
24f60 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  D, zName);.     
24f70 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20         zColname 
24f80 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  = zName;.       
24f90 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 30       zToFree = 0
24fa0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
24fb0 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70  ( longNames || p
24fc0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20  TabList->nSrc>1 
24fd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
24fe0 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20   Expr *pLeft;.  
24ff0 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66              pLef
25000 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
25010 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e  db, TK_ID, zTabN
25020 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
25030 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
25040 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
25050 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20   TK_DOT, pLeft, 
25060 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
25070 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 53            if( zS
25080 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20  chemaName ){.   
25090 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65               pLe
250a0 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
250b0 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68  (db, TK_ID, zSch
250c0 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  emaName);.      
250d0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
250e0 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
250f0 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70  Parse, TK_DOT, p
25100 4c 65 66 74 2c 20 70 45 78 70 72 2c 20 30 29 3b  Left, pExpr, 0);
25110 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
25120 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
25130 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a  f( longNames ){.
25140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25150 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74  zColname = sqlit
25160 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
25170 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c  s.%s", zTabName,
25180 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
25190 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65           zToFree
251a0 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20   = zColname;.   
251b0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
251c0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
251d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
251e0 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  xpr = pRight;.  
251f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
25200 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
25210 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
25220 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65  pend(pParse, pNe
25230 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  w, pExpr);.     
25240 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e         sColname.
25250 7a 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20  z = zColname;.  
25260 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61            sColna
25270 6d 65 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  me.n = sqlite3St
25280 72 6c 65 6e 33 30 28 7a 43 6f 6c 6e 61 6d 65 29  rlen30(zColname)
25290 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
252a0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
252b0 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 65  Name(pParse, pNe
252c0 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30 29  w, &sColname, 0)
252d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
252e0 28 20 70 4e 65 77 20 26 26 20 28 70 2d 3e 73 65  ( pNew && (p->se
252f0 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74  lFlags & SF_Nest
25300 65 64 46 72 6f 6d 29 21 3d 30 20 29 7b 0a 20 20  edFrom)!=0 ){.  
25310 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
25320 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
25330 20 2a 70 58 20 3d 20 26 70 4e 65 77 2d 3e 61 5b   *pX = &pNew->a[
25340 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  pNew->nExpr-1];.
25350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
25360 28 20 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20  ( pSub ){.      
25370 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53            pX->zS
25380 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53  pan = sqlite3DbS
25390 74 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e  trDup(db, pSub->
253a0 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70  pEList->a[j].zSp
253b0 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  an);.           
253c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
253d0 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20  X->zSpan==0 );. 
253e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
253f0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
25400 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20      pX->zSpan = 
25410 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
25420 62 2c 20 22 25 73 2e 25 73 2e 25 73 22 2c 0a 20  b, "%s.%s.%s",. 
25430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25450 20 20 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d            zSchem
25460 61 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 2c  aName, zTabName,
25470 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20   zColname);.    
25480 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
25490 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d  case( pX->zSpan=
254a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
254b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
254c0 20 20 20 20 70 58 2d 3e 62 53 70 61 6e 49 73 54      pX->bSpanIsT
254d0 61 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ab = 1;.        
254e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
254f0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
25500 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20  db, zToFree);.  
25510 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25520 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
25530 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20  !tableSeen ){.  
25540 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
25550 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  me ){.          
25560 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
25570 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
25580 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a  ch table: %s", z
25590 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  TName);.        
255a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
255b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
255c0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
255d0 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65   tables specifie
255e0 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  d");.          }
255f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25600 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
25610 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
25620 74 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a  te(db, pEList);.
25630 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20      p->pEList = 
25640 70 4e 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51  pNew;.  }.#if SQ
25650 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a  LITE_MAX_COLUMN.
25660 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20    if( p->pEList 
25670 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  && p->pEList->nE
25680 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  xpr>db->aLimit[S
25690 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
256a0 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  MN] ){.    sqlit
256b0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
256c0 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c  e, "too many col
256d0 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73  umns in result s
256e0 65 74 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  et");.  }.#endif
256f0 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
25700 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
25710 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66   No-op routine f
25720 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74 72 65  or the parse-tre
25730 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20  e walker..**.** 
25740 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
25750 65 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e  e is the Walker.
25760 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68  xExprCallback th
25770 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  en expression tr
25780 65 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65  ees.** are walke
25790 64 20 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63  d without any ac
257a0 74 69 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65  tions being take
257b0 6e 20 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20  n at each node. 
257c0 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20   Presumably,.** 
257d0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
257e0 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 57 61  e is used for Wa
257f0 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61  lker.xExprCallba
25800 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b  ck then .** Walk
25810 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  er.xSelectCallba
25820 63 6b 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20  ck is set to do 
25830 73 6f 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c  something useful
25840 20 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73   for every .** s
25850 75 62 71 75 65 72 79 20 69 6e 20 74 68 65 20 70  ubquery in the p
25860 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 73  arser tree..*/.s
25870 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 57 61  tatic int exprWa
25880 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e  lkNoop(Walker *N
25890 6f 74 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f  otUsed, Expr *No
258a0 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
258b0 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
258c0 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
258d0 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
258e0 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
258f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65   This routine "e
25900 78 70 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54  xpands" a SELECT
25910 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61   statement and a
25920 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 71 75 65  ll of its subque
25930 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64  ries..** For add
25940 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
25950 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d  ion on what it m
25960 65 61 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22  eans to "expand"
25970 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61   a SELECT.** sta
25980 74 65 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20  tement, see the 
25990 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73  comment on the s
259a0 65 6c 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b  electExpand work
259b0 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76  er callback abov
259c0 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69  e..**.** Expandi
259d0 6e 67 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ng a SELECT stat
259e0 65 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72  ement is the fir
259f0 73 74 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65  st step in proce
25a00 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43  ssing a.** SELEC
25a10 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  T statement.  Th
25a20 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
25a30 6e 74 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e  nt must be expan
25a40 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61  ded before.** na
25a50 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73  me resolution is
25a60 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a   performed..**.*
25a70 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  * If anything go
25a80 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72  es wrong, an err
25a90 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77 72  or message is wr
25aa0 69 74 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73  itten into pPars
25ab0 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e  e..** The callin
25ac0 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64  g function can d
25ad0 65 74 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65  etect the proble
25ae0 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20  m by looking at 
25af0 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20  pParse->nErr.** 
25b00 61 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64  and/or pParse->d
25b10 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e  b->mallocFailed.
25b20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
25b30 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
25b40 61 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73  and(Parse *pPars
25b50 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  e, Select *pSele
25b60 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  ct){.  Walker w;
25b70 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
25b80 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77   sizeof(w));.  w
25b90 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
25ba0 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20   exprWalkNoop;. 
25bb0 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
25bc0 73 65 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  se;.  if( pParse
25bd0 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64 20 29 7b  ->hasCompound ){
25be0 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61  .    w.xSelectCa
25bf0 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e 76 65 72 74  llback = convert
25c00 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f  CompoundSelectTo
25c10 53 75 62 71 75 65 72 79 3b 0a 20 20 20 20 73 71  Subquery;.    sq
25c20 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
25c30 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  &w, pSelect);.  
25c40 7d 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  }.  w.xSelectCal
25c50 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78  lback = selectEx
25c60 70 61 6e 64 65 72 3b 0a 20 20 77 2e 78 53 65 6c  pander;.  w.xSel
25c70 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73  ectCallback2 = s
25c80 65 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a 20 20  electPopWith;.  
25c90 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
25ca0 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
25cb0 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
25cc0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
25cd0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
25ce0 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43   Walker.xSelectC
25cf0 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b  allback callback
25d00 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33   for the sqlite3
25d10 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29  SelectTypeInfo()
25d20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  .** interface..*
25d30 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52  *.** For each FR
25d40 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
25d50 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a  ry, add Column.z
25d60 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e  Type and Column.
25d70 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61  zColl.** informa
25d80 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c  tion to the Tabl
25d90 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
25da0 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20   represents the 
25db0 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66  result set.** of
25dc0 20 74 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a   that subquery..
25dd0 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  **.** The Table 
25de0 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
25df0 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65  epresents the re
25e00 73 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e  sult set was con
25e10 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73  structed.** by s
25e20 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29 20  electExpander() 
25e30 62 75 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  but the type and
25e40 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72   collation infor
25e50 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74  mation was omitt
25e60 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f  ed.** at that po
25e70 69 6e 74 20 62 65 63 61 75 73 65 20 69 64 65 6e  int because iden
25e80 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20  tifiers had not 
25e90 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65  yet been resolve
25ea0 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  d.  This.** rout
25eb0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
25ec0 74 65 72 20 69 64 65 6e 74 69 66 69 65 72 20 72  ter identifier r
25ed0 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  esolution..*/.st
25ee0 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
25ef0 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49  AddSubqueryTypeI
25f00 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  nfo(Walker *pWal
25f10 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
25f20 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
25f30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63  ;.  int i;.  Src
25f40 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
25f50 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
25f60 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20  _item *pFrom;.. 
25f70 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46   assert( p->selF
25f80 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76  lags & SF_Resolv
25f90 65 64 20 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  ed );.  if( (p->
25fa0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61  selFlags & SF_Ha
25fb0 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29 7b  sTypeInfo)==0 ){
25fc0 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
25fd0 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49 6e   |= SF_HasTypeIn
25fe0 66 6f 3b 0a 20 20 20 20 70 50 61 72 73 65 20 3d  fo;.    pParse =
25ff0 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
26000 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d  ;.    pTabList =
26010 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 66 6f   p->pSrc;.    fo
26020 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
26030 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
26040 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
26050 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
26060 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
26070 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
26080 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 54 61    if( ALWAYS(pTa
26090 62 21 3d 30 29 20 26 26 20 28 70 54 61 62 2d 3e  b!=0) && (pTab->
260a0 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
260b0 68 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20  hemeral)!=0 ){. 
260c0 20 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d         /* A sub-
260d0 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
260e0 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
260f0 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 20 20  LECT */.        
26100 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70  Select *pSel = p
26110 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
26120 20 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 20         if( pSel 
26130 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  ){.          whi
26140 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  le( pSel->pPrior
26150 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e   ) pSel = pSel->
26160 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
26170 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d    selectAddColum
26180 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
26190 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  n(pParse, pTab, 
261a0 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  pSel);.        }
261b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
261c0 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
261d0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
261e0 20 61 64 64 73 20 64 61 74 61 74 79 70 65 20 61   adds datatype a
261f0 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  nd collating seq
26200 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f  uence informatio
26210 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c  n to.** the Tabl
26220 65 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20  e structures of 
26230 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
26240 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a  subqueries in a.
26250 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
26260 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  ent..**.** Use t
26270 68 69 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65  his routine afte
26280 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  r name resolutio
26290 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
262a0 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41  d sqlite3SelectA
262b0 64 64 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65  ddTypeInfo(Parse
262c0 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
262d0 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e   *pSelect){.#ifn
262e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
262f0 53 55 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65  SUBQUERY.  Walke
26300 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77  r w;.  memset(&w
26310 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b  , 0, sizeof(w));
26320 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
26330 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 41 64  back2 = selectAd
26340 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66  dSubqueryTypeInf
26350 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  o;.  w.xExprCall
26360 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e  back = exprWalkN
26370 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  oop;.  w.pParse 
26380 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69  = pParse;.  sqli
26390 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
263a0 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64  , pSelect);.#end
263b0 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  if.}.../*.** Thi
263c0 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75  s routine sets u
263d0 70 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  p a SELECT state
263e0 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73  ment for process
263f0 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c  ing.  The.** fol
26400 6c 6f 77 69 6e 67 20 69 73 20 61 63 63 6f 6d 70  lowing is accomp
26410 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  lished:.**.**   
26420 20 20 2a 20 20 56 44 42 45 20 43 75 72 73 6f 72    *  VDBE Cursor
26430 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 73 73   numbers are ass
26440 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f  igned to all FRO
26450 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a  M-clause terms..
26460 2a 2a 20 20 20 20 20 2a 20 20 45 70 68 65 6d 65  **     *  Epheme
26470 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  ral Table object
26480 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f  s are created fo
26490 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  r all FROM-claus
264a0 65 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  e subqueries..**
264b0 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55       *  ON and U
264c0 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65  SING clauses are
264d0 20 73 68 69 66 74 65 64 20 69 6e 74 6f 20 57 48   shifted into WH
264e0 45 52 45 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  ERE statements.*
264f0 2a 20 20 20 20 20 2a 20 20 57 69 6c 64 63 61 72  *     *  Wildcar
26500 64 73 20 22 2a 22 20 61 6e 64 20 22 54 41 42 4c  ds "*" and "TABL
26510 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74 20 73  E.*" in result s
26520 65 74 73 20 61 72 65 20 65 78 70 61 6e 64 65 64  ets are expanded
26530 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64 65 6e  ..**     *  Iden
26540 74 69 66 69 65 72 73 20 69 6e 20 65 78 70 72 65  tifiers in expre
26550 73 73 69 6f 6e 20 61 72 65 20 6d 61 74 63 68 65  ssion are matche
26560 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a  d to tables..**.
26570 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
26580 61 63 74 73 20 72 65 63 75 72 73 69 76 65 6c 79  acts recursively
26590 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65 72 69   on all subqueri
265a0 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 53 45  es within the SE
265b0 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  LECT..*/.void sq
265c0 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
265d0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
265e0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
265f0 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
26600 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
26610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
26620 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
26630 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e  ent being coded.
26640 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
26650 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20  t *pOuterNC  /* 
26660 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72  Name context for
26670 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b   container */.){
26680 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
26690 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30    if( NEVER(p==0
266a0 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62  ) ) return;.  db
266b0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
266c0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
266d0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
266e0 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
266f0 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e  s & SF_HasTypeIn
26700 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  fo ) return;.  s
26710 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
26720 6e 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  nd(pParse, p);. 
26730 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
26740 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
26750 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
26760 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
26770 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50 61 72  SelectNames(pPar
26780 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43 29  se, p, pOuterNC)
26790 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
267a0 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
267b0 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
267c0 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  n;.  sqlite3Sele
267d0 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50  ctAddTypeInfo(pP
267e0 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  arse, p);.}../*.
267f0 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67  ** Reset the agg
26800 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
26810 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67  or..**.** The ag
26820 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
26830 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66 20  tor is a set of 
26840 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61  memory cells tha
26850 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d  t hold.** interm
26860 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 20 77  ediate results w
26870 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67  hile calculating
26880 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20   an aggregate.  
26890 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
268a0 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
268b0 68 61 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73  hat stores NULLs
268c0 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65   in all of those
268d0 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73   memory.** cells
268e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
268f0 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f   resetAccumulato
26900 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
26910 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
26920 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
26930 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
26940 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
26950 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
26960 70 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65  pFunc;.  int nRe
26970 67 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  g = pAggInfo->nF
26980 75 6e 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e  unc + pAggInfo->
26990 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e  nColumn;.  if( n
269a0 52 65 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Reg==0 ) return;
269b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
269c0 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79  EBUG.  /* Verify
269d0 20 74 68 61 74 20 61 6c 6c 20 41 67 67 49 6e 66   that all AggInf
269e0 6f 20 72 65 67 69 73 74 65 72 73 20 61 72 65 20  o registers are 
269f0 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65  within the range
26a00 20 73 70 65 63 69 66 69 65 64 20 62 79 0a 20 20   specified by.  
26a10 2a 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67  ** AggInfo.mnReg
26a20 2e 2e 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20  ..AggInfo.mxReg 
26a30 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  */.  assert( nRe
26a40 67 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52  g==pAggInfo->mxR
26a50 65 67 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52  eg-pAggInfo->mnR
26a60 65 67 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d  eg+1 );.  for(i=
26a70 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
26a80 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
26a90 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e    assert( pAggIn
26aa0 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d  fo->aCol[i].iMem
26ab0 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  >=pAggInfo->mnRe
26ac0 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41  g.         && pA
26ad0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e  ggInfo->aCol[i].
26ae0 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e  iMem<=pAggInfo->
26af0 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66  mxReg );.  }.  f
26b00 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
26b10 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b  fo->nFunc; i++){
26b20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67  .    assert( pAg
26b30 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e  gInfo->aFunc[i].
26b40 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  iMem>=pAggInfo->
26b50 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26  mnReg.         &
26b60 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  & pAggInfo->aFun
26b70 63 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49  c[i].iMem<=pAggI
26b80 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20  nfo->mxReg );.  
26b90 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
26ba0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
26bb0 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67  OP_Null, 0, pAgg
26bc0 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67  Info->mnReg, pAg
26bd0 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20  gInfo->mxReg);. 
26be0 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49   for(pFunc=pAggI
26bf0 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b  nfo->aFunc, i=0;
26c00 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
26c10 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b  nc; i++, pFunc++
26c20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63  ){.    if( pFunc
26c30 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
26c40 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
26c50 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b   = pFunc->pExpr;
26c60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
26c70 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
26c80 70 45 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pE, EP_xIsSelect
26c90 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
26ca0 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c  E->x.pList==0 ||
26cb0 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45   pE->x.pList->nE
26cc0 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr!=1 ){.      
26cd0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
26ce0 67 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49  g(pParse, "DISTI
26cf0 4e 43 54 20 61 67 67 72 65 67 61 74 65 73 20 6d  NCT aggregates m
26d00 75 73 74 20 68 61 76 65 20 65 78 61 63 74 6c 79  ust have exactly
26d10 20 6f 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20   one ".         
26d20 20 20 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20    "argument");. 
26d30 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44         pFunc->iD
26d40 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
26d50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26d60 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
26d70 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
26d80 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
26d90 65 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2c 20  e, pE->x.pList, 
26da0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  0, 0);.        s
26db0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
26dc0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
26dd0 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69  eral, pFunc->iDi
26de0 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20  stinct, 0, 0,.  
26df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e00 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
26e10 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
26e20 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NFO);.      }.  
26e30 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
26e40 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41   Invoke the OP_A
26e50 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64  ggFinalize opcod
26e60 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72  e for every aggr
26e70 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  egate function.*
26e80 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f  * in the AggInfo
26e90 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
26ea0 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c  tatic void final
26eb0 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
26ec0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
26ed0 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
26ee0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
26ef0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
26f00 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
26f10 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
26f20 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
26f30 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
26f40 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
26f50 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
26f60 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
26f70 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
26f80 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73  >x.pList;.    as
26f90 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
26fa0 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72  operty(pF->pExpr
26fb0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
26fc0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
26fd0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41  beAddOp4(v, OP_A
26fe0 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65  ggFinal, pF->iMe
26ff0 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74  m, pList ? pList
27000 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a  ->nExpr : 0, 0,.
27010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27020 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d        (void*)pF-
27030 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  >pFunc, P4_FUNCD
27040 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  EF);.  }.}../*.*
27050 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63 63  * Update the acc
27060 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20  umulator memory 
27070 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67  cells for an agg
27080 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a  regate based on.
27090 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ** the current c
270a0 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a  ursor position..
270b0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
270c0 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
270d0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
270e0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
270f0 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
27100 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
27110 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 65   int i;.  int re
27120 67 48 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  gHit = 0;.  int 
27130 61 64 64 72 48 69 74 54 65 73 74 20 3d 20 30 3b  addrHitTest = 0;
27140 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
27150 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74  o_func *pF;.  st
27160 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
27170 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66   *pC;..  pAggInf
27180 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  o->directMode = 
27190 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  1;.  for(i=0, pF
271a0 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
271b0 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
271c0 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b  unc; i++, pF++){
271d0 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20  .    int nArg;. 
271e0 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20     int addrNext 
271f0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  = 0;.    int reg
27200 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  Agg;.    ExprLis
27210 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70  t *pList = pF->p
27220 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
27230 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
27240 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e  HasProperty(pF->
27250 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
27260 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ect) );.    if( 
27270 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e  pList ){.      n
27280 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  Arg = pList->nEx
27290 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67  pr;.      regAgg
272a0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
272b0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
272c0 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Arg);.      sqli
272d0 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
272e0 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ist(pParse, pLis
272f0 74 2c 20 72 65 67 41 67 67 2c 20 53 51 4c 49 54  t, regAgg, SQLIT
27300 45 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20  E_ECEL_DUP);.   
27310 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41   }else{.      nA
27320 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  rg = 0;.      re
27330 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  gAgg = 0;.    }.
27340 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73      if( pF->iDis
27350 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
27360 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c    addrNext = sql
27370 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
27380 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65  l(v);.      asse
27390 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20  rt( nArg==1 );. 
273a0 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63       codeDistinc
273b0 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e 69 44  t(pParse, pF->iD
273c0 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78  istinct, addrNex
273d0 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b 0a 20  t, 1, regAgg);. 
273e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d     }.    if( pF-
273f0 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67  >pFunc->funcFlag
27400 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
27410 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20  NEEDCOLL ){.    
27420 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
27430 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75   = 0;.      stru
27440 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
27450 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69   *pItem;.      i
27460 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65  nt j;.      asse
27470 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20  rt( pList!=0 ); 
27480 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20   /* pList!=0 if 
27490 70 46 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e 45  pF->pFunc has NE
274a0 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20  EDCOLL */.      
274b0 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70  for(j=0, pItem=p
274c0 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20  List->a; !pColl 
274d0 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20  && j<nArg; j++, 
274e0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
274f0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
27500 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
27510 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
27520 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
27530 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
27540 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
27550 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
27560 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  tColl;.      }. 
27570 20 20 20 20 20 69 66 28 20 72 65 67 48 69 74 3d       if( regHit=
27580 3d 30 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e  =0 && pAggInfo->
27590 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 29 20 72  nAccumulator ) r
275a0 65 67 48 69 74 20 3d 20 2b 2b 70 50 61 72 73 65  egHit = ++pParse
275b0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71  ->nMem;.      sq
275c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
275d0 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72  v, OP_CollSeq, r
275e0 65 67 48 69 74 2c 20 30 2c 20 30 2c 20 28 63 68  egHit, 0, 0, (ch
275f0 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  ar *)pColl, P4_C
27600 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20  OLLSEQ);.    }. 
27610 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
27620 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 53 74  dOp4(v, OP_AggSt
27630 65 70 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70  ep, 0, regAgg, p
27640 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20  F->iMem,.       
27650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
27660 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c  void*)pF->pFunc,
27670 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
27680 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
27690 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72  ngeP5(v, (u8)nAr
276a0 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  g);.    sqlite3E
276b0 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
276c0 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
276d0 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20  egAgg, nArg);.  
276e0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
276f0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
27700 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b  , regAgg, nArg);
27710 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78  .    if( addrNex
27720 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
27730 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
27740 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b  el(v, addrNext);
27750 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
27760 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
27770 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rse);.    }.  }.
27780 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70  .  /* Before pop
27790 75 6c 61 74 69 6e 67 20 74 68 65 20 61 63 63 75  ulating the accu
277a0 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72  mulator register
277b0 73 2c 20 63 6c 65 61 72 20 74 68 65 20 63 6f 6c  s, clear the col
277c0 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20  umn cache..  ** 
277d0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e  Otherwise, if an
277e0 79 20 6f 66 20 74 68 65 20 72 65 71 75 69 72 65  y of the require
277f0 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20  d column values 
27800 61 72 65 20 61 6c 72 65 61 64 79 20 70 72 65 73  are already pres
27810 65 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67  ent .  ** in reg
27820 69 73 74 65 72 73 2c 20 73 71 6c 69 74 65 33 45  isters, sqlite3E
27830 78 70 72 43 6f 64 65 28 29 20 6d 61 79 20 75 73  xprCode() may us
27840 65 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f  e OP_SCopy to co
27850 70 79 20 74 68 65 20 76 61 6c 75 65 0a 20 20 2a  py the value.  *
27860 2a 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42  * to pC->iMem. B
27870 75 74 20 62 79 20 74 68 65 20 74 69 6d 65 20 74  ut by the time t
27880 68 65 20 76 61 6c 75 65 20 69 73 20 75 73 65 64  he value is used
27890 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 72  , the original r
278a0 65 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79  egister.  ** may
278b0 20 68 61 76 65 20 62 65 65 6e 20 75 73 65 64 2c   have been used,
278c0 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68   invalidating th
278d0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 75 66  e underlying buf
278e0 66 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a  fer holding the.
278f0 20 20 2a 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f    ** text or blo
27900 62 20 76 61 6c 75 65 2e 20 53 65 65 20 74 69 63  b value. See tic
27910 6b 65 74 20 5b 38 38 33 30 33 34 64 63 62 35 5d  ket [883034dcb5]
27920 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74  ..  **.  ** Anot
27930 68 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75  her solution wou
27940 6c 64 20 62 65 20 74 6f 20 63 68 61 6e 67 65 20  ld be to change 
27950 74 68 65 20 4f 50 5f 53 43 6f 70 79 20 75 73 65  the OP_SCopy use
27960 64 20 74 6f 20 63 6f 70 79 20 63 61 63 68 65 64  d to copy cached
27970 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20  .  ** values to 
27980 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f  an OP_Copy..  */
27990 0a 20 20 69 66 28 20 72 65 67 48 69 74 20 29 7b  .  if( regHit ){
279a0 0a 20 20 20 20 61 64 64 72 48 69 74 54 65 73 74  .    addrHitTest
279b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
279c0 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp1(v, OP_If, r
279d0 65 67 48 69 74 29 3b 20 56 64 62 65 43 6f 76 65  egHit); VdbeCove
279e0 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73  rage(v);.  }.  s
279f0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
27a00 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
27a10 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67  for(i=0, pC=pAgg
27a20 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41  Info->aCol; i<pA
27a30 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c  ggInfo->nAccumul
27a40 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29  ator; i++, pC++)
27a50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
27a60 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43  rCode(pParse, pC
27a70 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65  ->pExpr, pC->iMe
27a80 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e  m);.  }.  pAggIn
27a90 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d  fo->directMode =
27aa0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   0;.  sqlite3Exp
27ab0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
27ac0 73 65 29 3b 0a 20 20 69 66 28 20 61 64 64 72 48  se);.  if( addrH
27ad0 69 74 54 65 73 74 20 29 7b 0a 20 20 20 20 73 71  itTest ){.    sq
27ae0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
27af0 65 28 76 2c 20 61 64 64 72 48 69 74 54 65 73 74  e(v, addrHitTest
27b00 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
27b10 41 64 64 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f  Add a single OP_
27b20 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74  Explain instruct
27b30 69 6f 6e 20 74 6f 20 74 68 65 20 56 44 42 45 20  ion to the VDBE 
27b40 74 6f 20 65 78 70 6c 61 69 6e 20 61 20 73 69 6d  to explain a sim
27b50 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20  ple.** count(*) 
27b60 71 75 65 72 79 20 28 22 53 45 4c 45 43 54 20 63  query ("SELECT c
27b70 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54 61  ount(*) FROM pTa
27b80 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  b")..*/.#ifndef 
27b90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
27ba0 41 49 4e 0a 73 74 61 74 69 63 20 76 6f 69 64 20  AIN.static void 
27bb0 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75  explainSimpleCou
27bc0 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
27bd0 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
27be0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
27bf0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
27c00 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
27c10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
27c20 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69  able being queri
27c30 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
27c40 49 64 78 20 20 20 20 20 20 20 20 20 20 20 20 20  Idx             
27c50 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
27c60 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a   used to optimiz
27c70 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20  e scan, or NULL 
27c80 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72  */.){.  if( pPar
27c90 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
27ca0 7b 0a 20 20 20 20 69 6e 74 20 62 43 6f 76 65 72  {.    int bCover
27cb0 20 3d 20 28 70 49 64 78 21 3d 30 20 26 26 20 28   = (pIdx!=0 && (
27cc0 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c  HasRowid(pTab) |
27cd0 7c 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49  | !IsPrimaryKeyI
27ce0 6e 64 65 78 28 70 49 64 78 29 29 29 3b 0a 20 20  ndex(pIdx)));.  
27cf0 20 20 63 68 61 72 20 2a 7a 45 71 70 20 3d 20 73    char *zEqp = s
27d00 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50  qlite3MPrintf(pP
27d10 61 72 73 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20  arse->db, "SCAN 
27d20 54 41 42 4c 45 20 25 73 25 73 25 73 22 2c 0a 20  TABLE %s%s%s",. 
27d30 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
27d40 6d 65 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76  me,.        bCov
27d50 65 72 20 3f 20 22 20 55 53 49 4e 47 20 43 4f 56  er ? " USING COV
27d60 45 52 49 4e 47 20 49 4e 44 45 58 20 22 20 3a 20  ERING INDEX " : 
27d70 22 22 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76  "",.        bCov
27d80 65 72 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  er ? pIdx->zName
27d90 20 3a 20 22 22 0a 20 20 20 20 29 3b 0a 20 20 20   : "".    );.   
27da0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
27db0 70 34 28 0a 20 20 20 20 20 20 20 20 70 50 61 72  p4(.        pPar
27dc0 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 45 78  se->pVdbe, OP_Ex
27dd0 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69  plain, pParse->i
27de0 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20  SelectId, 0, 0, 
27df0 7a 45 71 70 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zEqp, P4_DYNAMIC
27e00 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65  .    );.  }.}.#e
27e10 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70  lse.# define exp
27e20 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28  lainSimpleCount(
27e30 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f  a,b,c).#endif../
27e40 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
27e50 64 65 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43  de for the SELEC
27e60 54 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65  T statement give
27e70 6e 20 69 6e 20 74 68 65 20 70 20 61 72 67 75 6d  n in the p argum
27e80 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ent.  .**.** The
27e90 20 72 65 73 75 6c 74 73 20 61 72 65 20 72 65 74   results are ret
27ea0 75 72 6e 65 64 20 61 63 63 6f 72 64 69 6e 67 20  urned according 
27eb0 74 6f 20 74 68 65 20 53 65 6c 65 63 74 44 65 73  to the SelectDes
27ec0 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20  t structure..** 
27ed0 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  See comments in 
27ee0 73 71 6c 69 74 65 49 6e 74 2e 68 20 66 6f 72 20  sqliteInt.h for 
27ef0 66 75 72 74 68 65 72 20 69 6e 66 6f 72 6d 61 74  further informat
27f00 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
27f10 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
27f20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
27f30 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72  rors.  If any er
27f40 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f  rors are.** enco
27f50 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e  untered, then an
27f60 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
27f70 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65  or message is le
27f80 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d  ft in.** pParse-
27f90 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20  >zErrMsg..**.** 
27fa0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
27fb0 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53  s NOT free the S
27fc0 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
27fd0 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a  passed in.  The.
27fe0 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  ** calling funct
27ff0 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20  ion needs to do 
28000 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  that..*/.int sql
28010 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61  ite3Select(.  Pa
28020 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
28030 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
28040 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
28050 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
28060 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
28070 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
28080 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20  eing coded. */. 
28090 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
280a0 73 74 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20  st      /* What 
280b0 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 71  to do with the q
280c0 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
280d0 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  ){.  int i, j;  
280e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
280f0 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
28100 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
28110 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75  nfo;     /* Retu
28120 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57  rn from sqlite3W
28130 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20  hereBegin() */. 
28140 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
28150 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76          /* The v
28160 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75  irtual machine u
28170 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
28180 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67  n */.  int isAgg
28190 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
281a0 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74   True for select
281b0 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75   lists like "cou
281c0 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72  nt(*)" */.  Expr
281d0 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
281e0 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f     /* List of co
281f0 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74  lumns to extract
28200 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  . */.  SrcList *
28210 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a  pTabList;     /*
28220 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
28230 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a  to select from *
28240 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
28250 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
28260 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
28270 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
28280 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
28290 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  upBy;    /* The 
282a0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
282b0 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
282c0 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67  .  Expr *pHaving
282d0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
282e0 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20   HAVING clause. 
282f0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
28300 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20    int rc = 1;   
28310 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
28320 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d  e to return from
28330 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
28340 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20  /.  DistinctCtx 
28350 73 44 69 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e  sDistinct; /* In
28360 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64  fo on how to cod
28370 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  e the DISTINCT k
28380 65 79 77 6f 72 64 20 2a 2f 0a 20 20 53 6f 72 74  eyword */.  Sort
28390 43 74 78 20 73 53 6f 72 74 3b 20 20 20 20 20 20  Ctx sSort;      
283a0 20 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f     /* Info on ho
283b0 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20 4f 52  w to code the OR
283c0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
283d0 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49  .  AggInfo sAggI
283e0 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66  nfo;      /* Inf
283f0 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79  ormation used by
28400 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69   aggregate queri
28410 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64  es */.  int iEnd
28420 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
28430 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
28440 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72   end of the quer
28450 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  y */.  sqlite3 *
28460 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  db;           /*
28470 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
28480 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66  nnection */..#if
28490 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
284a0 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69  _EXPLAIN.  int i
284b0 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64 20  RestoreSelectId 
284c0 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  = pParse->iSelec
284d0 74 49 64 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69  tId;.  pParse->i
284e0 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73  SelectId = pPars
284f0 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
28500 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62  ++;.#endif..  db
28510 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
28520 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d   if( p==0 || db-
28530 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
28540 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b   pParse->nErr ){
28550 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
28560 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
28570 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
28580 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c  , SQLITE_SELECT,
28590 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75   0, 0, 0) ) retu
285a0 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26  rn 1;.  memset(&
285b0 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a  sAggInfo, 0, siz
285c0 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a  eof(sAggInfo));.
285d0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
285e0 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65  rderBy==0 || pDe
285f0 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44  st->eDest!=SRT_D
28600 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 61 73 73  istFifo );.  ass
28610 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
28620 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ==0 || pDest->eD
28630 65 73 74 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b  est!=SRT_Fifo );
28640 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
28650 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65  rderBy==0 || pDe
28660 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44  st->eDest!=SRT_D
28670 69 73 74 51 75 65 75 65 20 29 3b 0a 20 20 61 73  istQueue );.  as
28680 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
28690 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65  y==0 || pDest->e
286a0 44 65 73 74 21 3d 53 52 54 5f 51 75 65 75 65 20  Dest!=SRT_Queue 
286b0 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62  );.  if( Ignorab
286c0 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29  leOrderby(pDest)
286d0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70   ){.    assert(p
286e0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
286f0 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74  _Exists || pDest
28700 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69  ->eDest==SRT_Uni
28710 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  on || .         
28720 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
28730 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44  SRT_Except || pD
28740 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
28750 44 69 73 63 61 72 64 20 7c 7c 0a 20 20 20 20 20  Discard ||.     
28760 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65        pDest->eDe
28770 73 74 3d 3d 53 52 54 5f 51 75 65 75 65 20 20 7c  st==SRT_Queue  |
28780 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
28790 53 52 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a  SRT_DistFifo ||.
287a0 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
287b0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ->eDest==SRT_Dis
287c0 74 51 75 65 75 65 20 7c 7c 20 70 44 65 73 74 2d  tQueue || pDest-
287d0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f  >eDest==SRT_Fifo
287e0 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52 44  );.    /* If ORD
287f0 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64  ER BY makes no d
28800 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65  ifference in the
28810 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65 69   output then nei
28820 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a  ther does.    **
28830 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74 20   DISTINCT so it 
28840 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20 74  can be removed t
28850 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  oo. */.    sqlit
28860 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
28870 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
28880 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  );.    p->pOrder
28890 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73  By = 0;.    p->s
288a0 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44  elFlags &= ~SF_D
288b0 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73  istinct;.  }.  s
288c0 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
288d0 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a  (pParse, p, 0);.
288e0 20 20 6d 65 6d 73 65 74 28 26 73 53 6f 72 74 2c    memset(&sSort,
288f0 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f 72 74   0, sizeof(sSort
28900 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f 72 64  ));.  sSort.pOrd
28910 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
28920 42 79 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d  By;.  pTabList =
28930 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69   p->pSrc;.  pELi
28940 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
28950 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
28960 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
28970 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
28980 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
28990 20 7d 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d   }.  isAgg = (p-
289a0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
289b0 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20  ggregate)!=0;.  
289c0 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
289d0 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  0 );..  /* Begin
289e0 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65   generating code
289f0 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
28a00 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
28a10 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
28a20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
28a30 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74  d;..  /* If writ
28a40 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72  ing to memory or
28a50 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65   generating a se
28a60 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69  t.  ** only a si
28a70 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20  ngle column may 
28a80 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a  be output..  */.
28a90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28aa0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69  MIT_SUBQUERY.  i
28ab0 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69  f( checkForMulti
28ac0 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f  ColumnSelectErro
28ad0 72 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c  r(pParse, pDest,
28ae0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20   pEList->nExpr) 
28af0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  ){.    goto sele
28b00 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64  ct_end;.  }.#end
28b10 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  if..  /* Generat
28b20 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73  e code for all s
28b30 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68  ub-queries in th
28b40 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20  e FROM clause.  
28b50 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
28b60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
28b70 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
28b80 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
28b90 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21  EW).  for(i=0; !
28ba0 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70  p->pPrior && i<p
28bb0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
28bc0 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
28bd0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
28be0 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
28bf0 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63  >a[i];.    Selec
28c00 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20  tDest dest;.    
28c10 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70  Select *pSub = p
28c20 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  Item->pSelect;. 
28c30 20 20 20 69 6e 74 20 69 73 41 67 67 53 75 62 3b     int isAggSub;
28c40 0a 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d  ..    if( pSub==
28c50 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  0 ) continue;.. 
28c60 20 20 20 2f 2a 20 53 6f 6d 65 74 69 6d 65 73 20     /* Sometimes 
28c70 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73  the code for a s
28c80 75 62 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20  ubquery will be 
28c90 67 65 6e 65 72 61 74 65 64 20 6d 6f 72 65 20 74  generated more t
28ca0 68 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63 65 2c  han.    ** once,
28cb0 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
28cc0 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
28cd0 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20  WHERE clause in 
28ce0 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20 20 20  a LEFT JOIN,.   
28cf0 20 2a 2a 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e   ** for example.
28d00 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20    In that case, 
28d10 64 6f 20 6e 6f 74 20 72 65 67 65 6e 65 72 61 74  do not regenerat
28d20 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 6d 61  e the code to ma
28d30 6e 69 66 65 73 74 0a 20 20 20 20 2a 2a 20 61 20  nifest.    ** a 
28d40 76 69 65 77 20 6f 72 20 74 68 65 20 63 6f 2d 72  view or the co-r
28d50 6f 75 74 69 6e 65 20 74 6f 20 69 6d 70 6c 65 6d  outine to implem
28d60 65 6e 74 20 61 20 76 69 65 77 2e 20 20 54 68 65  ent a view.  The
28d70 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65 0a   first instance.
28d80 20 20 20 20 2a 2a 20 69 73 20 73 75 66 66 69 63      ** is suffic
28d90 69 65 6e 74 2c 20 74 68 6f 75 67 68 20 74 68 65  ient, though the
28da0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d   subroutine to m
28db0 61 6e 69 66 65 73 74 20 74 68 65 20 76 69 65 77  anifest the view
28dc0 20 64 6f 65 73 20 6e 65 65 64 0a 20 20 20 20 2a   does need.    *
28dd0 2a 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  * to be invoked 
28de0 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66  again. */.    if
28df0 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  ( pItem->addrFil
28e00 6c 53 75 62 20 29 7b 0a 20 20 20 20 20 20 69 66  lSub ){.      if
28e10 28 20 70 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f  ( pItem->viaCoro
28e20 75 74 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20  utine==0 ){.    
28e30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
28e40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
28e50 62 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  b, pItem->regRet
28e60 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72  urn, pItem->addr
28e70 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 20 20  FillSub);.      
28e80 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  }.      continue
28e90 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
28ea0 49 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65 2e  Increment Parse.
28eb0 6e 48 65 69 67 68 74 20 62 79 20 74 68 65 20 68  nHeight by the h
28ec0 65 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61 72  eight of the lar
28ed0 67 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e 0a  gest expression.
28ee0 20 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66 65      ** tree refe
28ef0 72 72 65 64 20 74 6f 20 62 79 20 74 68 69 73 2c  rred to by this,
28f00 20 74 68 65 20 70 61 72 65 6e 74 20 73 65 6c 65   the parent sele
28f10 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20 73 65  ct. The child se
28f20 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20  lect.    ** may 
28f30 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73 73 69  contain expressi
28f40 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74 20 6d  on trees of at m
28f50 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49  ost.    ** (SQLI
28f60 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
28f70 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68 74 29  H-Parse.nHeight)
28f80 20 68 65 69 67 68 74 2e 20 54 68 69 73 20 69 73   height. This is
28f90 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f   a bit.    ** mo
28fa0 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20  re conservative 
28fb0 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2c 20  than necessary, 
28fc0 62 75 74 20 6d 75 63 68 20 65 61 73 69 65 72 20  but much easier 
28fd0 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20  than enforcing. 
28fe0 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c     ** an exact l
28ff0 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  imit..    */.   
29000 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74   pParse->nHeight
29010 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63   += sqlite3Selec
29020 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a  tExprHeight(p);.
29030 0a 20 20 20 20 69 73 41 67 67 53 75 62 20 3d 20  .    isAggSub = 
29040 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20  (pSub->selFlags 
29050 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21  & SF_Aggregate)!
29060 3d 30 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 74  =0;.    if( flat
29070 74 65 6e 53 75 62 71 75 65 72 79 28 70 50 61 72  tenSubquery(pPar
29080 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67 2c  se, p, i, isAgg,
29090 20 69 73 41 67 67 53 75 62 29 20 29 7b 0a 20 20   isAggSub) ){.  
290a0 20 20 20 20 2f 2a 20 54 68 69 73 20 73 75 62 71      /* This subq
290b0 75 65 72 79 20 63 61 6e 20 62 65 20 61 62 73 6f  uery can be abso
290c0 72 62 65 64 20 69 6e 74 6f 20 69 74 73 20 70 61  rbed into its pa
290d0 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69  rent. */.      i
290e0 66 28 20 69 73 41 67 67 53 75 62 20 29 7b 0a 20  f( isAggSub ){. 
290f0 20 20 20 20 20 20 20 69 73 41 67 67 20 3d 20 31         isAgg = 1
29100 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c  ;.        p->sel
29110 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67 67 72  Flags |= SF_Aggr
29120 65 67 61 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20  egate;.      }. 
29130 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20       i = -1;.   
29140 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 4c   }else if( pTabL
29150 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20  ist->nSrc==1.   
29160 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d          && Optim
29170 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64  izationEnabled(d
29180 62 2c 20 53 51 4c 49 54 45 5f 53 75 62 71 43 6f  b, SQLITE_SubqCo
29190 72 6f 75 74 69 6e 65 29 0a 20 20 20 20 29 7b 0a  routine).    ){.
291a0 20 20 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65        /* Impleme
291b0 6e 74 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  nt a co-routine 
291c0 74 68 61 74 20 77 69 6c 6c 20 72 65 74 75 72 6e  that will return
291d0 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
291e0 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20   the result.    
291f0 20 20 2a 2a 20 73 65 74 20 6f 6e 20 65 61 63 68    ** set on each
29200 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20   invocation..   
29210 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
29220 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
29230 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
29240 28 76 29 2b 31 3b 0a 20 20 20 20 20 20 70 49 74  (v)+1;.      pIt
29250 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20  em->regReturn = 
29260 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
29270 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
29280 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
29290 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74  itCoroutine, pIt
292a0 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 30  em->regReturn, 0
292b0 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20  , addrTop);.    
292c0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
292d0 2c 20 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70  , "%s", pItem->p
292e0 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
292f0 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46      pItem->addrF
29300 69 6c 6c 53 75 62 20 3d 20 61 64 64 72 54 6f 70  illSub = addrTop
29310 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
29320 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
29330 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69  est, SRT_Corouti
29340 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  ne, pItem->regRe
29350 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 65 78 70  turn);.      exp
29360 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70  lainSetInteger(p
29370 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c  Item->iSelectId,
29380 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e 65   (u8)pParse->iNe
29390 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
293a0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
293b0 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26  (pParse, pSub, &
293c0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74  dest);.      pIt
293d0 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  em->pTab->nRowLo
293e0 67 45 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f  gEst = sqlite3Lo
293f0 67 45 73 74 28 70 53 75 62 2d 3e 6e 53 65 6c 65  gEst(pSub->nSele
29400 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 70 49  ctRow);.      pI
29410 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e  tem->viaCoroutin
29420 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 74  e = 1;.      pIt
29430 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20  em->regResult = 
29440 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 20 20  dest.iSdst;.    
29450 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
29460 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72  Op1(v, OP_EndCor
29470 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72  outine, pItem->r
29480 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20  egReturn);.     
29490 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
294a0 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 2d  Here(v, addrTop-
294b0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
294c0 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63  3ClearTempRegCac
294d0 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  he(pParse);.    
294e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
294f0 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
29500 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
29510 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72 61  fill an ephemera
29520 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 20 20 20  l table with.   
29530 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e     ** the conten
29540 74 20 6f 66 20 74 68 69 73 20 73 75 62 71 75 65  t of this subque
29550 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64 72  ry.  pItem->addr
29560 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f 69  FillSub will poi
29570 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  nt.      ** to t
29580 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
29590 65 20 67 65 6e 65 72 61 74 65 64 20 73 75 62 72  e generated subr
295a0 6f 75 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d 3e  outine.  pItem->
295b0 72 65 67 52 65 74 75 72 6e 0a 20 20 20 20 20 20  regReturn.      
295c0 2a 2a 20 69 73 20 61 20 72 65 67 69 73 74 65 72  ** is a register
295d0 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f   allocated to ho
295e0 6c 64 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  ld the subroutin
295f0 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  e return address
29600 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
29610 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20 20 20  int topAddr;.   
29620 20 20 20 69 6e 74 20 6f 6e 63 65 41 64 64 72 20     int onceAddr 
29630 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  = 0;.      int r
29640 65 74 41 64 64 72 3b 0a 20 20 20 20 20 20 61 73  etAddr;.      as
29650 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 61 64 64  sert( pItem->add
29660 72 46 69 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a 20  rFillSub==0 );. 
29670 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52       pItem->regR
29680 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65  eturn = ++pParse
29690 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 74 6f  ->nMem;.      to
296a0 70 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  pAddr = sqlite3V
296b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
296c0 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 49 74 65  Integer, 0, pIte
296d0 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  m->regReturn);. 
296e0 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72       pItem->addr
296f0 46 69 6c 6c 53 75 62 20 3d 20 74 6f 70 41 64 64  FillSub = topAdd
29700 72 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70  r+1;.      if( p
29710 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74  Item->isCorrelat
29720 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ed==0 ){.       
29730 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 71 75   /* If the subqu
29740 65 72 79 20 69 73 20 6e 6f 74 20 63 6f 72 72 65  ery is not corre
29750 6c 61 74 65 64 20 61 6e 64 20 69 66 20 77 65 20  lated and if we 
29760 61 72 65 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f  are not inside o
29770 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74  f.        ** a t
29780 72 69 67 67 65 72 2c 20 74 68 65 6e 20 77 65 20  rigger, then we 
29790 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d  only need to com
297a0 70 75 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f  pute the value o
297b0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 0a 20  f the subquery. 
297c0 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20         ** once. 
297d0 2a 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 41  */.        onceA
297e0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  ddr = sqlite3Cod
297f0 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56  eOnce(pParse); V
29800 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
29810 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
29820 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61  ent((v, "materia
29830 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49  lize \"%s\"", pI
29840 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
29850 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
29860 0a 20 20 20 20 20 20 20 20 56 64 62 65 4e 6f 6f  .        VdbeNoo
29870 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61  pComment((v, "ma
29880 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22  terialize \"%s\"
29890 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
298a0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d  zName));.      }
298b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
298c0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
298d0 73 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62  st, SRT_EphemTab
298e0 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
298f0 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
29900 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d  SetInteger(pItem
29910 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38  ->iSelectId, (u8
29920 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65  )pParse->iNextSe
29930 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73  lectId);.      s
29940 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
29950 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74  rse, pSub, &dest
29960 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
29970 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
29980 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
29990 28 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f  (pSub->nSelectRo
299a0 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e  w);.      if( on
299b0 63 65 41 64 64 72 20 29 20 73 71 6c 69 74 65 33  ceAddr ) sqlite3
299c0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
299d0 6f 6e 63 65 41 64 64 72 29 3b 0a 20 20 20 20 20  onceAddr);.     
299e0 20 72 65 74 41 64 64 72 20 3d 20 73 71 6c 69 74   retAddr = sqlit
299f0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
29a00 4f 50 5f 52 65 74 75 72 6e 2c 20 70 49 74 65 6d  OP_Return, pItem
29a10 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
29a20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
29a30 28 76 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49  (v, "end %s", pI
29a40 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
29a50 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
29a60 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  3VdbeChangeP1(v,
29a70 20 74 6f 70 41 64 64 72 2c 20 72 65 74 41 64 64   topAddr, retAdd
29a80 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
29a90 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63  3ClearTempRegCac
29aa0 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  he(pParse);.    
29ab0 7d 0a 20 20 20 20 69 66 28 20 2f 2a 70 50 61 72  }.    if( /*pPar
29ac0 73 65 2d 3e 6e 45 72 72 20 7c 7c 2a 2f 20 64 62  se->nErr ||*/ db
29ad0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
29ae0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
29af0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
29b00 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67     pParse->nHeig
29b10 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c  ht -= sqlite3Sel
29b20 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29  ectExprHeight(p)
29b30 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d  ;.    pTabList =
29b40 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66   p->pSrc;.    if
29b50 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  ( !IgnorableOrde
29b60 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20  rby(pDest) ){.  
29b70 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72      sSort.pOrder
29b80 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
29b90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45  ;.    }.  }.  pE
29ba0 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
29bb0 3b 0a 23 65 6e 64 69 66 0a 20 20 70 57 68 65 72  ;.#endif.  pWher
29bc0 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  e = p->pWhere;. 
29bd0 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
29be0 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69  GroupBy;.  pHavi
29bf0 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b  ng = p->pHaving;
29c00 0a 20 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54  .  sDistinct.isT
29c10 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61  nct = (p->selFla
29c20 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
29c30 29 21 3d 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53  )!=0;..#ifndef S
29c40 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
29c50 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20  UND_SELECT.  /* 
29c60 49 66 20 74 68 65 72 65 20 69 73 20 61 72 65 20  If there is are 
29c70 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75  a sequence of qu
29c80 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61  eries, do the ea
29c90 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74  rlier ones first
29ca0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
29cb0 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 63  pPrior ){.    rc
29cc0 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70   = multiSelect(p
29cd0 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29  Parse, p, pDest)
29ce0 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74  ;.    explainSet
29cf0 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e  Integer(pParse->
29d00 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74  iSelectId, iRest
29d10 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  oreSelectId);.  
29d20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
29d30 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
29d40 20 74 68 65 20 71 75 65 72 79 20 69 73 20 44 49   the query is DI
29d50 53 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f  STINCT with an O
29d60 52 44 45 52 20 42 59 20 62 75 74 20 69 73 20 6e  RDER BY but is n
29d70 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c  ot an aggregate,
29d80 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68   and .  ** if th
29d90 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73  e select-list is
29da0 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
29db0 20 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20   ORDER BY list, 
29dc0 74 68 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a  then this query.
29dd0 20 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72    ** can be rewr
29de0 69 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50  itten as a GROUP
29df0 20 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f   BY. In other wo
29e00 72 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a  rds, this:.  **.
29e10 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
29e20 44 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f  DISTINCT xyz FRO
29e30 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78  M ... ORDER BY x
29e40 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20  yz.  **.  ** is 
29e50 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a  transformed to:.
29e60 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
29e70 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e  LECT xyz FROM ..
29e80 2e 20 47 52 4f 55 50 20 42 59 20 78 79 7a 0a 20  . GROUP BY xyz. 
29e90 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63   **.  ** The sec
29ea0 6f 6e 64 20 66 6f 72 6d 20 69 73 20 70 72 65 66  ond form is pref
29eb0 65 72 72 65 64 20 61 73 20 61 20 73 69 6e 67 6c  erred as a singl
29ec0 65 20 69 6e 64 65 78 20 28 6f 72 20 74 65 6d 70  e index (or temp
29ed0 2d 74 61 62 6c 65 29 20 6d 61 79 20 62 65 20 0a  -table) may be .
29ee0 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 62 6f    ** used for bo
29ef0 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  th the ORDER BY 
29f00 61 6e 64 20 44 49 53 54 49 4e 43 54 20 70 72 6f  and DISTINCT pro
29f10 63 65 73 73 69 6e 67 2e 20 41 73 20 6f 72 69 67  cessing. As orig
29f20 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69  inally .  ** wri
29f30 74 74 65 6e 20 74 68 65 20 71 75 65 72 79 20 6d  tten the query m
29f40 75 73 74 20 75 73 65 20 61 20 74 65 6d 70 2d 74  ust use a temp-t
29f50 61 62 6c 65 20 66 6f 72 20 61 74 20 6c 65 61 73  able for at leas
29f60 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44  t one of the ORD
29f70 45 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20  ER .  ** BY and 
29f80 44 49 53 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e  DISTINCT, and an
29f90 20 69 6e 64 65 78 20 6f 72 20 73 65 70 61 72 61   index or separa
29fa0 74 65 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f  te temp-table fo
29fb0 72 20 74 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a  r the other..  *
29fc0 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  /.  if( (p->selF
29fd0 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
29fe0 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
29ff0 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ))==SF_Distinct 
2a000 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78  .   && sqlite3Ex
2a010 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 73 53  prListCompare(sS
2a020 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 70 2d  ort.pOrderBy, p-
2a030 3e 70 45 4c 69 73 74 2c 20 2d 31 29 3d 3d 30 0a  >pEList, -1)==0.
2a040 20 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46    ){.    p->selF
2a050 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74  lags &= ~SF_Dist
2a060 69 6e 63 74 3b 0a 20 20 20 20 70 2d 3e 70 47 72  inct;.    p->pGr
2a070 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
2a080 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
2a090 2d 3e 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20  ->pEList, 0);.  
2a0a0 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
2a0b0 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 53  pGroupBy;.    sS
2a0c0 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30  ort.pOrderBy = 0
2a0d0 3b 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20  ;.    /* Notice 
2a0e0 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68  that even though
2a0f0 74 20 53 46 5f 44 69 73 74 69 6e 63 74 20 68 61  t SF_Distinct ha
2a100 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64 20 66  s been cleared f
2a110 72 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c  rom p->selFlags,
2a120 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 44 69 73  .    ** the sDis
2a130 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 69 73 20  tinct.isTnct is 
2a140 73 74 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63  still set.  Henc
2a150 65 2c 20 69 73 54 6e 63 74 20 72 65 70 72 65 73  e, isTnct repres
2a160 65 6e 74 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  ents the.    ** 
2a170 6f 72 69 67 69 6e 61 6c 20 73 65 74 74 69 6e 67  original setting
2a180 20 6f 66 20 74 68 65 20 53 46 5f 44 69 73 74 69   of the SF_Disti
2a190 6e 63 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68  nct flag, not th
2a1a0 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e  e current settin
2a1b0 67 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  g */.    assert(
2a1c0 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
2a1d0 74 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  t );.  }..  /* I
2a1e0 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
2a1f0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
2a200 68 65 6e 20 74 68 69 73 20 73 6f 72 74 69 6e 67  hen this sorting
2a210 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67 68  .  ** index migh
2a220 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 75  t end up being u
2a230 6e 75 73 65 64 20 69 66 20 74 68 65 20 64 61 74  nused if the dat
2a240 61 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65  a can be .  ** e
2a250 78 74 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d  xtracted in pre-
2a260 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20 49  sorted order.  I
2a270 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61  f that is the ca
2a280 73 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  se, then the.  *
2a290 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  * OP_OpenEphemer
2a2a0 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77  al instruction w
2a2b0 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20 74  ill be changed t
2a2c0 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63  o an OP_Noop onc
2a2d0 65 0a 20 20 2a 2a 20 77 65 20 66 69 67 75 72 65  e.  ** we figure
2a2e0 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 73 6f   out that the so
2a2f0 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 6e  rting index is n
2a300 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20  ot needed.  The 
2a310 61 64 64 72 53 6f 72 74 49 6e 64 65 78 0a 20 20  addrSortIndex.  
2a320 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  ** variable is u
2a330 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74  sed to facilitat
2a340 65 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20  e that change.. 
2a350 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e   */.  if( sSort.
2a360 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
2a370 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
2a380 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  o;.    pKeyInfo 
2a390 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
2a3a0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 73 53  rList(pParse, sS
2a3b0 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c  ort.pOrderBy, 0,
2a3c0 20 30 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 69   0);.    sSort.i
2a3d0 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65  ECursor = pParse
2a3e0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 53  ->nTab++;.    sS
2a3f0 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
2a400 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  x =.      sqlite
2a410 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
2a420 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
2a430 0a 20 20 20 20 20 20 20 20 20 20 73 53 6f 72 74  .          sSort
2a440 2e 69 45 43 75 72 73 6f 72 2c 20 73 53 6f 72 74  .iECursor, sSort
2a450 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  .pOrderBy->nExpr
2a460 2b 31 2b 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  +1+pEList->nExpr
2a470 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 28  , 0,.          (
2a480 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
2a490 50 34 5f 4b 45 59 49 4e 46 4f 0a 20 20 20 20 20  P4_KEYINFO.     
2a4a0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
2a4b0 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
2a4c0 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a  ndex = -1;.  }..
2a4d0 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70    /* If the outp
2a4e0 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66  ut is destined f
2a4f0 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  or a temporary t
2a500 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20  able, open that 
2a510 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
2a520 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
2a530 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a  SRT_EphemTab ){.
2a540 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2a550 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
2a560 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74  Ephemeral, pDest
2a570 2d 3e 69 53 44 50 61 72 6d 2c 20 70 45 4c 69 73  ->iSDParm, pELis
2a580 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a  t->nExpr);.  }..
2a590 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d    /* Set the lim
2a5a0 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e  iter..  */.  iEn
2a5b0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
2a5c0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70  akeLabel(v);.  p
2a5d0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 4c  ->nSelectRow = L
2a5e0 41 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20  ARGEST_INT64;.  
2a5f0 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
2a600 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
2a610 20 69 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d   iEnd);.  if( p-
2a620 3e 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20 73 53  >iLimit==0 && sS
2a630 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
2a640 78 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x>=0 ){.    sqli
2a650 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
2a660 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2a670 64 65 78 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f  dex)->opcode = O
2a680 50 5f 53 6f 72 74 65 72 4f 70 65 6e 3b 0a 20 20  P_SorterOpen;.  
2a690 20 20 73 53 6f 72 74 2e 73 6f 72 74 46 6c 61 67    sSort.sortFlag
2a6a0 73 20 7c 3d 20 53 4f 52 54 46 4c 41 47 5f 55 73  s |= SORTFLAG_Us
2a6b0 65 53 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20  eSorter;.  }..  
2a6c0 2f 2a 20 4f 70 65 6e 20 61 20 76 69 72 74 75 61  /* Open a virtua
2a6d0 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66  l index to use f
2a6e0 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20  or the distinct 
2a6f0 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  set..  */.  if( 
2a700 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
2a710 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
2a720 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e   sDistinct.tabTn
2a730 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
2a740 62 2b 2b 3b 0a 20 20 20 20 73 44 69 73 74 69 6e  b++;.    sDistin
2a750 63 74 2e 61 64 64 72 54 6e 63 74 20 3d 20 73 71  ct.addrTnct = sq
2a760 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2a770 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
2a780 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ral,.           
2a790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7a0 20 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74       sDistinct.t
2a7b0 61 62 54 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20  abTnct, 0, 0,.  
2a7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
2a7e0 68 61 72 2a 29 6b 65 79 49 6e 66 6f 46 72 6f 6d  har*)keyInfoFrom
2a7f0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
2a800 20 70 2d 3e 70 45 4c 69 73 74 2c 30 2c 30 29 2c   p->pEList,0,0),
2a810 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a830 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
2a840 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2a850 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55  ngeP5(v, BTREE_U
2a860 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 73  NORDERED);.    s
2a870 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
2a880 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  pe = WHERE_DISTI
2a890 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a 20  NCT_UNORDERED;. 
2a8a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44 69 73   }else{.    sDis
2a8b0 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20  tinct.eTnctType 
2a8c0 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
2a8d0 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66  _NOOP;.  }..  if
2a8e0 28 20 21 69 73 41 67 67 20 26 26 20 70 47 72 6f  ( !isAgg && pGro
2a8f0 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  upBy==0 ){.    /
2a900 2a 20 4e 6f 20 61 67 67 72 65 67 61 74 65 20 66  * No aggregate f
2a910 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 20  unctions and no 
2a920 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
2a930 2a 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72 6c  */.    u16 wctrl
2a940 46 6c 61 67 73 20 3d 20 28 73 44 69 73 74 69 6e  Flags = (sDistin
2a950 63 74 2e 69 73 54 6e 63 74 20 3f 20 57 48 45 52  ct.isTnct ? WHER
2a960 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
2a970 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 65  : 0);..    /* Be
2a980 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  gin the database
2a990 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 70 57   scan. */.    pW
2a9a0 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
2a9b0 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
2a9c0 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
2a9d0 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  e, sSort.pOrderB
2a9e0 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
2a9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa00 20 20 70 2d 3e 70 45 4c 69 73 74 2c 20 77 63 74    p->pEList, wct
2aa10 72 6c 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  rlFlags, 0);.   
2aa20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
2aa30 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
2aa40 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
2aa50 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43  3WhereOutputRowC
2aa60 6f 75 6e 74 28 70 57 49 6e 66 6f 29 20 3c 20 70  ount(pWInfo) < p
2aa70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a  ->nSelectRow ){.
2aa80 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
2aa90 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 57 68 65  Row = sqlite3Whe
2aaa0 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74  reOutputRowCount
2aab0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a  (pWInfo);.    }.
2aac0 20 20 20 20 69 66 28 20 73 44 69 73 74 69 6e 63      if( sDistinc
2aad0 74 2e 69 73 54 6e 63 74 20 26 26 20 73 71 6c 69  t.isTnct && sqli
2aae0 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69 6e  te3WhereIsDistin
2aaf0 63 74 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20  ct(pWInfo) ){.  
2ab00 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54      sDistinct.eT
2ab10 6e 63 74 54 79 70 65 20 3d 20 73 71 6c 69 74 65  nctType = sqlite
2ab20 33 57 68 65 72 65 49 73 44 69 73 74 69 6e 63 74  3WhereIsDistinct
2ab30 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a  (pWInfo);.    }.
2ab40 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f      if( sSort.pO
2ab50 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
2ab60 73 53 6f 72 74 2e 6e 4f 42 53 61 74 20 3d 20 73  sSort.nOBSat = s
2ab70 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64  qlite3WhereIsOrd
2ab80 65 72 65 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  ered(pWInfo);.  
2ab90 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f      if( sSort.nO
2aba0 42 53 61 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64  BSat==sSort.pOrd
2abb0 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  erBy->nExpr ){. 
2abc0 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72         sSort.pOr
2abd0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
2abe0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
2abf0 20 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65   If sorting inde
2ac00 78 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74  x that was creat
2ac10 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50  ed by a prior OP
2ac20 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a  _OpenEphemeral .
2ac30 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
2ac40 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20  on ended up not 
2ac50 62 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68  being needed, th
2ac60 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50  en change the OP
2ac70 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20  _OpenEphemeral. 
2ac80 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50     ** into an OP
2ac90 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  _Noop..    */.  
2aca0 20 20 69 66 28 20 73 53 6f 72 74 2e 61 64 64 72    if( sSort.addr
2acb0 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20  SortIndex>=0 && 
2acc0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d  sSort.pOrderBy==
2acd0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
2ace0 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
2acf0 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72  op(v, sSort.addr
2ad00 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20  SortIndex);.    
2ad10 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68  }..    /* Use th
2ad20 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72  e standard inner
2ad30 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 73 65   loop. */.    se
2ad40 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
2ad50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c  arse, p, pEList,
2ad60 20 2d 31 2c 20 26 73 53 6f 72 74 2c 20 26 73 44   -1, &sSort, &sD
2ad70 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a  istinct, pDest,.
2ad80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad90 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
2ada0 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 70 57  ContinueLabel(pW
2adb0 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20  Info),.         
2adc0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2add0 65 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65  e3WhereBreakLabe
2ade0 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 0a 20 20 20  l(pWInfo));..   
2adf0 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61   /* End the data
2ae00 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a  base scan loop..
2ae10 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
2ae20 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
2ae30 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
2ae40 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 77 68   /* This case wh
2ae50 65 6e 20 74 68 65 72 65 20 65 78 69 73 74 20 61  en there exist a
2ae60 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
2ae70 6e 73 20 6f 72 20 61 20 47 52 4f 55 50 20 42 59  ns or a GROUP BY
2ae80 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 6f   clause.    ** o
2ae90 72 20 62 6f 74 68 20 2a 2f 0a 20 20 20 20 4e 61  r both */.    Na
2aea0 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20  meContext sNC;  
2aeb0 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
2aec0 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67  t for processing
2aed0 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72   aggregate infor
2aee0 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e  mation */.    in
2aef0 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20  t iAMem;        
2af00 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61    /* First Mem a
2af10 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69  ddress for stori
2af20 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  ng current GROUP
2af30 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69   BY */.    int i
2af40 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  BMem;          /
2af50 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72  * First Mem addr
2af60 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73  ess for previous
2af70 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20   GROUP BY */.   
2af80 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20   int iUseFlag;  
2af90 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72       /* Mem addr
2afa0 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67  ess holding flag
2afb0 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
2afc0 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20   at least.      
2afd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afe0 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20    ** one row of 
2aff0 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65  the input to the
2b000 20 61 67 67 72 65 67 61 74 6f 72 20 68 61 73 20   aggregator has 
2b010 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20  been.           
2b020 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
2b030 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20  processed */.   
2b040 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b   int iAbortFlag;
2b050 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72       /* Mem addr
2b060 65 73 73 20 77 68 69 63 68 20 63 61 75 73 65 73  ess which causes
2b070 20 71 75 65 72 79 20 61 62 6f 72 74 20 69 66 20   query abort if 
2b080 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20  positive */.    
2b090 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b  int groupBySort;
2b0a0 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65      /* Rows come
2b0b0 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20   from source in 
2b0c0 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a  GROUP BY order *
2b0d0 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e  /.    int addrEn
2b0e0 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64  d;        /* End
2b0f0 20 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20 66   of processing f
2b100 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a  or this SELECT *
2b110 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 50 54  /.    int sortPT
2b120 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73 65  ab = 0;   /* Pse
2b130 75 64 6f 74 61 62 6c 65 20 75 73 65 64 20 74 6f  udotable used to
2b140 20 64 65 63 6f 64 65 20 73 6f 72 74 69 6e 67 20   decode sorting 
2b150 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 69  results */.    i
2b160 6e 74 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b 20  nt sortOut = 0; 
2b170 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 72 65 67     /* Output reg
2b180 69 73 74 65 72 20 66 72 6f 6d 20 74 68 65 20 73  ister from the s
2b190 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  orter */.    int
2b1a0 20 6f 72 64 65 72 42 79 47 72 70 20 3d 20 30 3b   orderByGrp = 0;
2b1b0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
2b1c0 47 52 4f 55 50 20 42 59 20 61 6e 64 20 4f 52 44  GROUP BY and ORD
2b1d0 45 52 20 42 59 20 61 72 65 20 74 68 65 20 73 61  ER BY are the sa
2b1e0 6d 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65  me */..    /* Re
2b1f0 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c  move any and all
2b200 20 61 6c 69 61 73 65 73 20 62 65 74 77 65 65 6e   aliases between
2b210 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
2b220 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 47  and the.    ** G
2b230 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a  ROUP BY clause..
2b240 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2b250 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
2b260 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20   int k;         
2b270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b280 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
2b290 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  /.      struct E
2b2a0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
2b2b0 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f  tem;  /* For loo
2b2c0 70 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65 73  ping over expres
2b2d0 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a  sion in a list *
2b2e0 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70  /..      for(k=p
2b2f0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
2b300 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74   pItem=p->pEList
2b310 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70  ->a; k>0; k--, p
2b320 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
2b330 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69   pItem->u.x.iAli
2b340 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  as = 0;.      }.
2b350 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f        for(k=pGro
2b360 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74  upBy->nExpr, pIt
2b370 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20  em=pGroupBy->a; 
2b380 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b  k>0; k--, pItem+
2b390 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65  +){.        pIte
2b3a0 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20  m->u.x.iAlias = 
2b3b0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
2b3c0 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52   if( p->nSelectR
2b3d0 6f 77 3e 31 30 30 20 29 20 70 2d 3e 6e 53 65 6c  ow>100 ) p->nSel
2b3e0 65 63 74 52 6f 77 20 3d 20 31 30 30 3b 0a 20 20  ectRow = 100;.  
2b3f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2b400 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 31  ->nSelectRow = 1
2b410 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a  ;.    }...    /*
2b420 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74   If there is bot
2b430 68 20 61 20 47 52 4f 55 50 20 42 59 20 61 6e 64  h a GROUP BY and
2b440 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
2b450 75 73 65 20 61 6e 64 20 74 68 65 79 20 61 72 65  use and they are
2b460 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74 69 63 61  .    ** identica
2b470 6c 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 62  l, then it may b
2b480 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 69  e possible to di
2b490 73 61 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20  sable the ORDER 
2b4a0 42 59 20 63 6c 61 75 73 65 20 0a 20 20 20 20 2a  BY clause .    *
2b4b0 2a 20 6f 6e 20 74 68 65 20 67 72 6f 75 6e 64 73  * on the grounds
2b4c0 20 74 68 61 74 20 74 68 65 20 47 52 4f 55 50 20   that the GROUP 
2b4d0 42 59 20 77 69 6c 6c 20 63 61 75 73 65 20 65 6c  BY will cause el
2b4e0 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f  ements to come o
2b4f0 75 74 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  ut .    ** in th
2b500 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2e  e correct order.
2b510 20 49 74 20 61 6c 73 6f 20 6d 61 79 20 6e 6f 74   It also may not
2b520 20 2d 20 74 68 65 20 47 52 4f 55 50 20 42 59 20   - the GROUP BY 
2b530 6d 61 79 20 75 73 65 20 61 0a 20 20 20 20 2a 2a  may use a.    **
2b540 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
2b550 74 68 61 74 20 63 61 75 73 65 73 20 72 6f 77 73  that causes rows
2b560 20 74 6f 20 62 65 20 67 72 6f 75 70 65 64 20 74   to be grouped t
2b570 6f 67 65 74 68 65 72 20 61 73 20 72 65 71 75 69  ogether as requi
2b580 72 65 64 0a 20 20 20 20 2a 2a 20 62 75 74 20 6e  red.    ** but n
2b590 6f 74 20 61 63 74 75 61 6c 6c 79 20 73 6f 72 74  ot actually sort
2b5a0 65 64 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20  ed. Either way, 
2b5b0 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  record the fact 
2b5c0 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  that the.    ** 
2b5d0 4f 52 44 45 52 20 42 59 20 61 6e 64 20 47 52 4f  ORDER BY and GRO
2b5e0 55 50 20 42 59 20 63 6c 61 75 73 65 73 20 61 72  UP BY clauses ar
2b5f0 65 20 74 68 65 20 73 61 6d 65 20 62 79 20 73 65  e the same by se
2b600 74 74 69 6e 67 20 74 68 65 20 6f 72 64 65 72 42  tting the orderB
2b610 79 47 72 70 0a 20 20 20 20 2a 2a 20 76 61 72 69  yGrp.    ** vari
2b620 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  able.  */.    if
2b630 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  ( sqlite3ExprLis
2b640 74 43 6f 6d 70 61 72 65 28 70 47 72 6f 75 70 42  tCompare(pGroupB
2b650 79 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  y, sSort.pOrderB
2b660 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20  y, -1)==0 ){.   
2b670 20 20 20 6f 72 64 65 72 42 79 47 72 70 20 3d 20     orderByGrp = 
2b680 31 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f  1;.    }. .    /
2b690 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62 65 6c  * Create a label
2b6a0 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e   to jump to when
2b6b0 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62 6f 72   we want to abor
2b6c0 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20  t the query */. 
2b6d0 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71 6c     addrEnd = sql
2b6e0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
2b6f0 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  l(v);..    /* Co
2b700 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20  nvert TK_COLUMN 
2b710 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47  nodes into TK_AG
2b720 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b  G_COLUMN and mak
2b730 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 20  e entries in.   
2b740 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f 72   ** sAggInfo for
2b750 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43   all TK_AGG_FUNC
2b760 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78  TION nodes in ex
2b770 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
2b780 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  .    ** SELECT s
2b790 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f  tatement..    */
2b7a0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  .    memset(&sNC
2b7b0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
2b7c0 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73  );.    sNC.pPars
2b7d0 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20  e = pParse;.    
2b7e0 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
2b7f0 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43  TabList;.    sNC
2b800 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67  .pAggInfo = &sAg
2b810 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67 49  gInfo;.    sAggI
2b820 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20 70 50 61 72  nfo.mnReg = pPar
2b830 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
2b840 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e  sAggInfo.nSortin
2b850 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70  gColumn = pGroup
2b860 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e  By ? pGroupBy->n
2b870 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 73 41  Expr : 0;.    sA
2b880 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20  ggInfo.pGroupBy 
2b890 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  = pGroupBy;.    
2b8a0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2b8b0 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
2b8c0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  pEList);.    sql
2b8d0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2b8e0 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 53 6f  ggList(&sNC, sSo
2b8f0 72 74 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  rt.pOrderBy);.  
2b900 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b    if( pHaving ){
2b910 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2b920 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
2b930 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e  tes(&sNC, pHavin
2b940 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41  g);.    }.    sA
2b950 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61  ggInfo.nAccumula
2b960 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e  tor = sAggInfo.n
2b970 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28  Column;.    for(
2b980 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e  i=0; i<sAggInfo.
2b990 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFunc; i++){.   
2b9a0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
2b9b0 48 61 73 50 72 6f 70 65 72 74 79 28 73 41 67 67  HasProperty(sAgg
2b9c0 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45  Info.aFunc[i].pE
2b9d0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
2b9e0 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e  t) );.      sNC.
2b9f0 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e  ncFlags |= NC_In
2ba00 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 20 20 73  AggFunc;.      s
2ba10 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
2ba20 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73  eAggList(&sNC, s
2ba30 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d  AggInfo.aFunc[i]
2ba40 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29  .pExpr->x.pList)
2ba50 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c  ;.      sNC.ncFl
2ba60 61 67 73 20 26 3d 20 7e 4e 43 5f 49 6e 41 67 67  ags &= ~NC_InAgg
2ba70 46 75 6e 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Func;.    }.    
2ba80 73 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 3d  sAggInfo.mxReg =
2ba90 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20   pParse->nMem;. 
2baa0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
2bab0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73  cFailed ) goto s
2bac0 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20  elect_end;..    
2bad0 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f  /* Processing fo
2bae0 72 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74  r aggregates wit
2baf0 68 20 47 52 4f 55 50 20 42 59 20 69 73 20 76 65  h GROUP BY is ve
2bb00 72 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64  ry different and
2bb10 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72  .    ** much mor
2bb20 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61  e complex than a
2bb30 67 67 72 65 67 61 74 65 73 20 77 69 74 68 6f 75  ggregates withou
2bb40 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20  t a GROUP BY..  
2bb50 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72    */.    if( pGr
2bb60 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b  oupBy ){.      K
2bb70 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
2bb80 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66  ;  /* Keying inf
2bb90 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
2bba0 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65   group by clause
2bbb0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 31   */.      int j1
2bbc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2bbd0 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69 73   A-vs-B comparis
2bbe0 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20  ion jump */.    
2bbf0 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74    int addrOutput
2bc00 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f  Row;  /* Start o
2bc10 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  f subroutine tha
2bc20 74 20 6f 75 74 70 75 74 73 20 61 20 72 65 73 75  t outputs a resu
2bc30 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20  lt row */.      
2bc40 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77  int regOutputRow
2bc50 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64  ;   /* Return ad
2bc60 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
2bc70 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  or output subrou
2bc80 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tine */.      in
2bc90 74 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20  t addrSetAbort; 
2bca0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f    /* Set the abo
2bcb0 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75  rt flag and retu
2bcc0 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  rn */.      int 
2bcd0 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20  addrTopOfLoop;  
2bce0 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e  /* Top of the in
2bcf0 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  put loop */.    
2bd00 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e    int addrSortin
2bd10 67 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f  gIdx; /* The OP_
2bd20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f  OpenEphemeral fo
2bd30 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  r the sorting in
2bd40 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  dex */.      int
2bd50 20 61 64 64 72 52 65 73 65 74 3b 20 20 20 20 20   addrReset;     
2bd60 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66   /* Subroutine f
2bd70 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65  or resetting the
2bd80 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a   accumulator */.
2bd90 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 73        int regRes
2bda0 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74  et;       /* Ret
2bdb0 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69  urn address regi
2bdc0 73 74 65 72 20 66 6f 72 20 72 65 73 65 74 20 73  ster for reset s
2bdd0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20  ubroutine */..  
2bde0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
2bdf0 69 73 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c  is a GROUP BY cl
2be00 61 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65  ause we might ne
2be10 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  ed a sorting ind
2be20 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69  ex to.      ** i
2be30 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c  mplement it.  Al
2be40 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72 74  locate that sort
2be50 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20  ing index now.  
2be60 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a  If it turns out.
2be70 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65        ** that we
2be80 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20   do not need it 
2be90 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f  after all, the O
2bea0 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73  P_SorterOpen ins
2beb0 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  truction.      *
2bec0 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72  * will be conver
2bed0 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e  ted into a Noop.
2bee0 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20    .      */.    
2bef0 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
2bf00 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e  ngIdx = pParse->
2bf10 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b  nTab++;.      pK
2bf20 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
2bf30 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
2bf40 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30  rse, pGroupBy, 0
2bf50 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72  , 0);.      addr
2bf60 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c  SortingIdx = sql
2bf70 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2bf80 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c  , OP_SorterOpen,
2bf90 20 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67   .          sAgg
2bfa0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
2bfb0 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69   sAggInfo.nSorti
2bfc0 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20  ngColumn, .     
2bfd0 20 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70       0, (char*)p
2bfe0 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
2bff0 4e 46 4f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  NFO);..      /* 
2c000 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72  Initialize memor
2c010 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64  y locations used
2c020 20 62 79 20 47 52 4f 55 50 20 42 59 20 61 67 67   by GROUP BY agg
2c030 72 65 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e  regate processin
2c040 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  g.      */.     
2c050 20 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50   iUseFlag = ++pP
2c060 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2c070 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b    iAbortFlag = +
2c080 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2c090 20 20 20 20 20 72 65 67 4f 75 74 70 75 74 52 6f       regOutputRo
2c0a0 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  w = ++pParse->nM
2c0b0 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75  em;.      addrOu
2c0c0 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  tputRow = sqlite
2c0d0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
2c0e0 29 3b 0a 20 20 20 20 20 20 72 65 67 52 65 73 65  );.      regRese
2c0f0 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
2c100 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 52 65  em;.      addrRe
2c110 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  set = sqlite3Vdb
2c120 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
2c130 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61       iAMem = pPa
2c140 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
2c150 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
2c160 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  m += pGroupBy->n
2c170 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65  Expr;.      iBMe
2c180 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
2c190 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72   + 1;.      pPar
2c1a0 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f  se->nMem += pGro
2c1b0 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
2c1c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2c1d0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
2c1e0 65 72 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c 61  er, 0, iAbortFla
2c1f0 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
2c200 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65 61 72  mment((v, "clear
2c210 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
2c220 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2c230 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
2c240 74 65 67 65 72 2c 20 30 2c 20 69 55 73 65 46 6c  teger, 0, iUseFl
2c250 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
2c260 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69  omment((v, "indi
2c270 63 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  cate accumulator
2c280 20 65 6d 70 74 79 22 29 29 3b 0a 20 20 20 20 20   empty"));.     
2c290 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2c2a0 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p3(v, OP_Null, 0
2c2b0 2c 20 69 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70  , iAMem, iAMem+p
2c2c0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31  GroupBy->nExpr-1
2c2d0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67  );..      /* Beg
2c2e0 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77  in a loop that w
2c2f0 69 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20  ill extract all 
2c300 73 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47  source rows in G
2c310 52 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20  ROUP BY order.. 
2c320 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67       ** This mig
2c330 68 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73  ht involve two s
2c340 65 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69  eparate loops wi
2c350 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e  th an OP_Sort in
2c360 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20   between, or.   
2c370 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62     ** it might b
2c380 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20  e a single loop 
2c390 74 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64  that uses an ind
2c3a0 65 78 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e  ex to extract in
2c3b0 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20  formation.      
2c3c0 2a 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74 20  ** in the right 
2c3d0 6f 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77  order to begin w
2c3e0 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ith..      */.  
2c3f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2c400 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
2c410 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64  b, regReset, add
2c420 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70  rReset);.      p
2c430 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
2c440 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
2c450 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
2c460 72 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c  re, pGroupBy, 0,
2c470 0a 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45  .          WHERE
2c480 5f 47 52 4f 55 50 42 59 20 7c 20 28 6f 72 64 65  _GROUPBY | (orde
2c490 72 42 79 47 72 70 20 3f 20 57 48 45 52 45 5f 53  rByGrp ? WHERE_S
2c4a0 4f 52 54 42 59 47 52 4f 55 50 20 3a 20 30 29 2c  ORTBYGROUP : 0),
2c4b0 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   0.      );.    
2c4c0 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
2c4d0 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
2c4e0 64 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  d;.      if( sql
2c4f0 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72  ite3WhereIsOrder
2c500 65 64 28 70 57 49 6e 66 6f 29 3d 3d 70 47 72 6f  ed(pWInfo)==pGro
2c510 75 70 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  upBy->nExpr ){. 
2c520 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70         /* The op
2c530 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20  timizer is able 
2c540 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20  to deliver rows 
2c550 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64 65  in group by orde
2c560 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  r so.        ** 
2c570 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74  we do not have t
2c580 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f  o sort.  The OP_
2c590 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 61  OpenEphemeral ta
2c5a0 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ble will be.    
2c5b0 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64      ** cancelled
2c5c0 20 6c 61 74 65 72 20 62 65 63 61 75 73 65 20 77   later because w
2c5d0 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20  e still need to 
2c5e0 75 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f  use the pKeyInfo
2c5f0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2c600 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20      groupBySort 
2c610 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
2c620 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77  {.        /* Row
2c630 73 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74  s are coming out
2c640 20 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64   in undetermined
2c650 20 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76 65   order.  We have
2c660 20 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20   to push.       
2c670 20 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74   ** each row int
2c680 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  o a sorting inde
2c690 78 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  x, terminate the
2c6a0 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20   first loop,.   
2c6b0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f       ** then loo
2c6c0 70 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69  p over the sorti
2c6d0 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65  ng index in orde
2c6e0 72 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74  r to get the out
2c6f0 70 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  put.        ** i
2c700 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20  n sorted order. 
2c710 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2c720 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 0a 20    int regBase;. 
2c730 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65         int regRe
2c740 63 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 69 6e  cord;.        in
2c750 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  t nCol;.        
2c760 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20  int nGroupBy;.. 
2c770 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 54 65         explainTe
2c780 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  mpTable(pParse, 
2c790 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 73 44  .            (sD
2c7a0 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26  istinct.isTnct &
2c7b0 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53  & (p->selFlags&S
2c7c0 46 5f 44 69 73 74 69 6e 63 74 29 3d 3d 30 29 20  F_Distinct)==0) 
2c7d0 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
2c7e0 20 20 20 20 20 20 22 44 49 53 54 49 4e 43 54 22        "DISTINCT"
2c7f0 20 3a 20 22 47 52 4f 55 50 20 42 59 22 29 3b 0a   : "GROUP BY");.
2c800 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79  .        groupBy
2c810 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sort = 1;.      
2c820 20 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72    nGroupBy = pGr
2c830 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
2c840 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72        nCol = nGr
2c850 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 6a  oupBy;.        j
2c860 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20   = nGroupBy;.   
2c870 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2c880 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
2c890 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2c8a0 20 20 69 66 28 20 73 41 67 67 49 6e 66 6f 2e 61    if( sAggInfo.a
2c8b0 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f  Col[i].iSorterCo
2c8c0 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20  lumn>=j ){.     
2c8d0 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20         nCol++;. 
2c8e0 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a             j++;.
2c8f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c900 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
2c910 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47  gBase = sqlite3G
2c920 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
2c930 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  se, nCol);.     
2c940 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
2c950 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
2c960 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2c970 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
2c980 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  t(pParse, pGroup
2c990 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30 29 3b  By, regBase, 0);
2c9a0 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72  .        j = nGr
2c9b0 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66  oupBy;.        f
2c9c0 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
2c9d0 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  fo.nColumn; i++)
2c9e0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
2c9f0 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
2ca00 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f  pCol = &sAggInfo
2ca10 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  .aCol[i];.      
2ca20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53      if( pCol->iS
2ca30 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29  orterColumn>=j )
2ca40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
2ca50 74 20 72 31 20 3d 20 6a 20 2b 20 72 65 67 42 61  t r1 = j + regBa
2ca60 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se;.            
2ca70 69 6e 74 20 72 32 3b 0a 0a 20 20 20 20 20 20 20  int r2;..       
2ca80 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
2ca90 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
2caa0 6d 6e 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  mn(pParse, .    
2cab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cac0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2cad0 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f  >pTab, pCol->iCo
2cae0 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62  lumn, pCol->iTab
2caf0 6c 65 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20  le, r1, 0);.    
2cb00 20 20 20 20 20 20 20 20 69 66 28 20 72 31 21 3d          if( r1!=
2cb10 72 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r2 ){.          
2cb20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2cb30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
2cb40 79 2c 20 72 32 2c 20 72 31 29 3b 0a 20 20 20 20  y, r2, r1);.    
2cb50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2cb60 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
2cb70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2cb80 0a 20 20 20 20 20 20 20 20 72 65 67 52 65 63 6f  .        regReco
2cb90 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
2cba0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
2cbb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2cbc0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
2cbd0 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42  MakeRecord, regB
2cbe0 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 52 65  ase, nCol, regRe
2cbf0 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73  cord);.        s
2cc00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2cc10 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73  (v, OP_SorterIns
2cc20 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ert, sAggInfo.so
2cc30 72 74 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63  rtingIdx, regRec
2cc40 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ord);.        sq
2cc50 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
2cc60 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
2cc70 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  ecord);.        
2cc80 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
2cc90 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
2cca0 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a  regBase, nCol);.
2ccb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
2ccc0 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
2ccd0 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66  .        sAggInf
2cce0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62  o.sortingIdxPTab
2ccf0 20 3d 20 73 6f 72 74 50 54 61 62 20 3d 20 70 50   = sortPTab = pP
2cd00 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
2cd10 20 20 20 20 20 20 73 6f 72 74 4f 75 74 20 3d 20        sortOut = 
2cd20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
2cd30 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
2cd40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2cd50 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp3(v, OP_OpenP
2cd60 73 65 75 64 6f 2c 20 73 6f 72 74 50 54 61 62 2c  seudo, sortPTab,
2cd70 20 73 6f 72 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b   sortOut, nCol);
2cd80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2cd90 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2cda0 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 73 41 67  _SorterSort, sAg
2cdb0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
2cdc0 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20  , addrEnd);.    
2cdd0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2cde0 28 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f  (v, "GROUP BY so
2cdf0 72 74 22 29 29 3b 20 56 64 62 65 43 6f 76 65 72  rt")); VdbeCover
2ce00 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
2ce10 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74  sAggInfo.useSort
2ce20 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20  ingIdx = 1;.    
2ce30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2ce40 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
2ce50 29 3b 0a 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  );..      }..   
2ce60 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64     /* If the ind
2ce70 65 78 20 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  ex or temporary 
2ce80 74 61 62 6c 65 20 75 73 65 64 20 62 79 20 74 68  table used by th
2ce90 65 20 47 52 4f 55 50 20 42 59 20 73 6f 72 74 0a  e GROUP BY sort.
2cea0 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 6e 61        ** will na
2ceb0 74 75 72 61 6c 6c 79 20 64 65 6c 69 76 65 72 20  turally deliver 
2cec0 72 6f 77 73 20 69 6e 20 74 68 65 20 6f 72 64 65  rows in the orde
2ced0 72 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  r required by th
2cee0 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20 20  e ORDER BY.     
2cef0 20 2a 2a 20 63 6c 61 75 73 65 2c 20 63 61 6e 63   ** clause, canc
2cf00 65 6c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  el the ephemeral
2cf10 20 74 61 62 6c 65 20 6f 70 65 6e 20 63 6f 64 65   table open code
2cf20 64 20 65 61 72 6c 69 65 72 2e 0a 20 20 20 20 20  d earlier..     
2cf30 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69   **.      ** Thi
2cf40 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  s is an optimiza
2cf50 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f 72 72 65  tion - the corre
2cf60 63 74 20 61 6e 73 77 65 72 20 73 68 6f 75 6c 64  ct answer should
2cf70 20 72 65 73 75 6c 74 20 72 65 67 61 72 64 6c 65   result regardle
2cf80 73 73 2e 0a 20 20 20 20 20 20 2a 2a 20 55 73 65  ss..      ** Use
2cf90 20 74 68 65 20 53 51 4c 49 54 45 5f 47 72 6f 75   the SQLITE_Grou
2cfa0 70 42 79 4f 72 64 65 72 20 66 6c 61 67 20 77 69  pByOrder flag wi
2cfb0 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  th SQLITE_TESTCT
2cfc0 52 4c 5f 4f 50 54 49 4d 49 5a 45 52 20 74 6f 20  RL_OPTIMIZER to 
2cfd0 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c  .      ** disabl
2cfe0 65 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  e this optimizat
2cff0 69 6f 6e 20 66 6f 72 20 74 65 73 74 69 6e 67 20  ion for testing 
2d000 70 75 72 70 6f 73 65 73 2e 20 20 2a 2f 0a 20 20  purposes.  */.  
2d010 20 20 20 20 69 66 28 20 6f 72 64 65 72 42 79 47      if( orderByG
2d020 72 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69  rp && Optimizati
2d030 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
2d040 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65  LITE_GroupByOrde
2d050 72 29 20 0a 20 20 20 20 20 20 20 26 26 20 28 67  r) .       && (g
2d060 72 6f 75 70 42 79 53 6f 72 74 20 7c 7c 20 73 71  roupBySort || sq
2d070 6c 69 74 65 33 57 68 65 72 65 49 73 53 6f 72 74  lite3WhereIsSort
2d080 65 64 28 70 57 49 6e 66 6f 29 29 0a 20 20 20 20  ed(pWInfo)).    
2d090 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 53 6f    ){.        sSo
2d0a0 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  rt.pOrderBy = 0;
2d0b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2d0c0 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
2d0d0 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f  (v, sSort.addrSo
2d0e0 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  rtIndex);.      
2d0f0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c  }..      /* Eval
2d100 75 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  uate the current
2d110 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20   GROUP BY terms 
2d120 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c  and store in b0,
2d130 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20   b1, b2....     
2d140 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72   ** (b0 is memor
2d150 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d  y location iBMem
2d160 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b  +0, b1 is iBMem+
2d170 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  1, and so forth)
2d180 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63  .      ** Then c
2d190 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72 72 65  ompare the curre
2d1a0 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  nt GROUP BY term
2d1b0 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 47 52  s against the GR
2d1c0 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20  OUP BY terms.   
2d1d0 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70     ** from the p
2d1e0 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72  revious row curr
2d1f0 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ently stored in 
2d200 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20  a0, a1, a2....  
2d210 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
2d220 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c  rTopOfLoop = sql
2d230 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2d240 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
2d250 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
2d260 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
2d270 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
2d280 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rt ){.        sq
2d290 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2d2a0 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61  v, OP_SorterData
2d2b0 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
2d2c0 6e 67 49 64 78 2c 20 73 6f 72 74 4f 75 74 29 3b  ngIdx, sortOut);
2d2d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
2d2e0 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70  or(j=0; j<pGroup
2d2f0 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b  By->nExpr; j++){
2d300 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 72 6f  .        if( gro
2d310 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20  upBySort ){.    
2d320 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2d330 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
2d340 6c 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c 20  lumn, sortPTab, 
2d350 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20  j, iBMem+j);.   
2d360 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20         if( j==0 
2d370 29 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  ) sqlite3VdbeCha
2d380 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
2d390 43 4c 45 41 52 43 41 43 48 45 29 3b 0a 20 20 20  CLEARCACHE);.   
2d3a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2d3b0 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64        sAggInfo.d
2d3c0 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20  irectMode = 1;. 
2d3d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2d3e0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
2d3f0 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e   pGroupBy->a[j].
2d400 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b  pExpr, iBMem+j);
2d410 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d420 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
2d430 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
2d440 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c  _Compare, iAMem,
2d450 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79   iBMem, pGroupBy
2d460 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ->nExpr,.       
2d470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d480 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65     (char*)sqlite
2d490 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79  3KeyInfoRef(pKey
2d4a0 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46  Info), P4_KEYINF
2d4b0 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20 73  O);.      j1 = s
2d4c0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2d4d0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
2d4e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2d4f0 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 31  3(v, OP_Jump, j1
2d500 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 20 56 64  +1, 0, j1+1); Vd
2d510 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
2d520 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
2d530 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73  e code that runs
2d540 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52   whenever the GR
2d550 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a  OUP BY changes..
2d560 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73        ** Changes
2d570 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59   in the GROUP BY
2d580 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79   are detected by
2d590 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f   the previous co
2d5a0 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63  de.      ** bloc
2d5b0 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72  k.  If there wer
2d5c0 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68  e no changes, th
2d5d0 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70  is block is skip
2d5e0 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ped..      **.  
2d5f0 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65      ** This code
2d600 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20   copies current 
2d610 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69  group by terms i
2d620 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20  n b0,b1,b2,.... 
2d630 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20       ** over to 
2d640 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68  a0,a1,a2.  It th
2d650 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74  en calls the out
2d660 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20  put subroutine. 
2d670 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65       ** and rese
2d680 74 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65  ts the aggregate
2d690 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67   accumulator reg
2d6a0 69 73 74 65 72 73 20 69 6e 20 70 72 65 70 61 72  isters in prepar
2d6b0 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66  ation.      ** f
2d6c0 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55  or the next GROU
2d6d0 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20  P BY batch..    
2d6e0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
2d6f0 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
2d700 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41  Parse, iBMem, iA
2d710 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e  Mem, pGroupBy->n
2d720 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Expr);.      sql
2d730 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2d740 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
2d750 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75  utputRow, addrOu
2d760 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
2d770 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2d780 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22  "output one row"
2d790 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
2d7a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2d7b0 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46  P_IfPos, iAbortF
2d7c0 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 20 56  lag, addrEnd); V
2d7d0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2d7e0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2d7f0 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f  t((v, "check abo
2d800 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
2d810 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2d820 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
2d830 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52   regReset, addrR
2d840 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62  eset);.      Vdb
2d850 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65  eComment((v, "re
2d860 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22  set accumulator"
2d870 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70  ));..      /* Up
2d880 64 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61  date the aggrega
2d890 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20  te accumulators 
2d8a0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e  based on the con
2d8b0 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a  tent of.      **
2d8c0 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
2d8d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2d8e0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2d8f0 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20  ere(v, j1);.    
2d900 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61    updateAccumula
2d910 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
2d920 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
2d930 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2d940 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
2d950 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20  , iUseFlag);.   
2d960 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2d970 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61 74  v, "indicate dat
2d980 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72  a in accumulator
2d990 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45  "));..      /* E
2d9a0 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20  nd of the loop. 
2d9b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
2d9c0 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
2d9d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2d9e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2d9f0 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 73 41 67  _SorterNext, sAg
2da00 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
2da10 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29  , addrTopOfLoop)
2da20 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
2da30 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
2da40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2da50 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
2da60 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
2da70 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2da80 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72  geToNoop(v, addr
2da90 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20 20 20  SortingIdx);.   
2daa0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f     }..      /* O
2dab0 75 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20  utput the final 
2dac0 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20  row of result.  
2dad0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
2dae0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2daf0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
2db00 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75  utputRow, addrOu
2db10 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
2db20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2db30 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20 72 6f  "output final ro
2db40 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  w"));..      /* 
2db50 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20 73 75  Jump over the su
2db60 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20 20 20  broutines.      
2db70 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2db80 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2db90 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6e  _Goto, 0, addrEn
2dba0 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  d);..      /* Ge
2dbb0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
2dbc0 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
2dbd0 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
2dbe0 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20   the result.    
2dbf0 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20    ** set.  This 
2dc00 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74  subroutine first
2dc10 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55   looks at the iU
2dc20 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65  seFlag.  If iUse
2dc30 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73  Flag.      ** is
2dc40 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
2dc50 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  ual to zero, the
2dc60 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61   subroutine is a
2dc70 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20   no-op.  If.    
2dc80 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73    ** the process
2dc90 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  ing calls for th
2dca0 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74  e query to abort
2dcb0 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e  , this subroutin
2dcc0 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65  e.      ** incre
2dcd0 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74  ments the iAbort
2dce0 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  Flag memory loca
2dcf0 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75  tion before retu
2dd00 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a  rning in.      *
2dd10 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61  * order to signa
2dd20 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  l the caller to 
2dd30 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  abort..      */.
2dd40 20 20 20 20 20 20 61 64 64 72 53 65 74 41 62 6f        addrSetAbo
2dd50 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
2dd60 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
2dd70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2dd80 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
2dd90 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f 72 74  teger, 1, iAbort
2dda0 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
2ddb0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65  eComment((v, "se
2ddc0 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  t abort flag"));
2ddd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2dde0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
2ddf0 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74  eturn, regOutput
2de00 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Row);.      sqli
2de10 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
2de20 62 65 6c 28 76 2c 20 61 64 64 72 4f 75 74 70 75  bel(v, addrOutpu
2de30 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61 64 64  tRow);.      add
2de40 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c  rOutputRow = sql
2de50 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2de60 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
2de70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2de80 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73  v, OP_IfPos, iUs
2de90 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75  eFlag, addrOutpu
2dea0 74 52 6f 77 2b 32 29 3b 20 56 64 62 65 43 6f 76  tRow+2); VdbeCov
2deb0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
2dec0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2ded0 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20  "Groupby result 
2dee0 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20  generator entry 
2def0 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20  point"));.      
2df00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2df10 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
2df20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
2df30 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67       finalizeAgg
2df40 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65  Functions(pParse
2df50 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
2df60 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
2df70 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
2df80 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70  Having, addrOutp
2df90 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f  utRow+1, SQLITE_
2dfa0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
2dfb0 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
2dfc0 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
2dfd0 3e 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26 73 53  >pEList, -1, &sS
2dfe0 6f 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ort,.           
2dff0 20 20 20 20 20 20 20 20 20 20 20 26 73 44 69 73             &sDis
2e000 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20  tinct, pDest,.  
2e010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e020 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
2e030 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72  w+1, addrSetAbor
2e040 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
2e050 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2e060 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74  P_Return, regOut
2e070 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
2e080 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2e090 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73 75  end groupby resu
2e0a0 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29 3b  lt generator"));
2e0b0 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
2e0c0 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
2e0d0 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65 74   that will reset
2e0e0 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61 63   the group-by ac
2e0f0 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20 20  cumulator.      
2e100 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2e110 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
2e120 28 76 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  (v, addrReset);.
2e130 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d        resetAccum
2e140 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
2e150 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
2e160 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2e170 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
2e180 20 72 65 67 52 65 73 65 74 29 3b 0a 20 20 20 20   regReset);.    
2e190 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66   .    } /* endif
2e1a0 20 70 47 72 6f 75 70 42 79 2e 20 20 42 65 67 69   pGroupBy.  Begi
2e1b0 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n aggregate quer
2e1c0 69 65 73 20 77 69 74 68 6f 75 74 20 47 52 4f 55  ies without GROU
2e1d0 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20 65 6c 73  P BY: */.    els
2e1e0 65 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69  e {.      ExprLi
2e1f0 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 23 69  st *pDel = 0;.#i
2e200 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2e210 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20 20 20  T_BTREECOUNT.   
2e220 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
2e230 20 20 20 20 20 20 69 66 28 20 28 70 54 61 62 20        if( (pTab 
2e240 3d 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28  = isSimpleCount(
2e250 70 2c 20 26 73 41 67 67 49 6e 66 6f 29 29 21 3d  p, &sAggInfo))!=
2e260 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
2e270 49 66 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74  If isSimpleCount
2e280 28 29 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  () returns a poi
2e290 6e 74 65 72 20 74 6f 20 61 20 54 61 62 6c 65 20  nter to a Table 
2e2a0 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 6e 0a  structure, then.
2e2b0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53          ** the S
2e2c0 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  QL statement is 
2e2d0 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 20  of the form:.   
2e2e0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2e2f0 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  **   SELECT coun
2e300 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a  t(*) FROM <tbl>.
2e310 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2e320 20 20 20 2a 2a 20 77 68 65 72 65 20 74 68 65 20     ** where the 
2e330 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
2e340 72 65 74 75 72 6e 65 64 20 72 65 70 72 65 73 65  returned represe
2e350 6e 74 73 20 74 61 62 6c 65 20 3c 74 62 6c 3e 2e  nts table <tbl>.
2e360 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2e370 20 20 20 20 2a 2a 20 54 68 69 73 20 73 74 61 74      ** This stat
2e380 65 6d 65 6e 74 20 69 73 20 73 6f 20 63 6f 6d 6d  ement is so comm
2e390 6f 6e 20 74 68 61 74 20 69 74 20 69 73 20 6f 70  on that it is op
2e3a0 74 69 6d 69 7a 65 64 20 73 70 65 63 69 61 6c 6c  timized speciall
2e3b0 79 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  y. The.        *
2e3c0 2a 20 4f 50 5f 43 6f 75 6e 74 20 69 6e 73 74 72  * OP_Count instr
2e3d0 75 63 74 69 6f 6e 20 69 73 20 65 78 65 63 75 74  uction is execut
2e3e0 65 64 20 65 69 74 68 65 72 20 6f 6e 20 74 68 65  ed either on the
2e3f0 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 20 74 68   intkey table th
2e400 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  at.        ** co
2e410 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 20  ntains the data 
2e420 66 6f 72 20 74 61 62 6c 65 20 3c 74 62 6c 3e 20  for table <tbl> 
2e430 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66 20 69 74 73  or on one of its
2e440 20 69 6e 64 65 78 65 73 2e 20 49 74 0a 20 20 20   indexes. It.   
2e450 20 20 20 20 20 2a 2a 20 69 73 20 62 65 74 74 65       ** is bette
2e460 72 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  r to execute the
2e470 20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64 65 78 2c   op on an index,
2e480 20 61 73 20 69 6e 64 65 78 65 73 20 61 72 65 20   as indexes are 
2e490 61 6c 6d 6f 73 74 0a 20 20 20 20 20 20 20 20 2a  almost.        *
2e4a0 2a 20 61 6c 77 61 79 73 20 73 70 72 65 61 64 20  * always spread 
2e4b0 61 63 72 6f 73 73 20 6c 65 73 73 20 70 61 67 65  across less page
2e4c0 73 20 74 68 61 6e 20 74 68 65 69 72 20 63 6f 72  s than their cor
2e4d0 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65  responding table
2e4e0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
2e4f0 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
2e500 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
2e510 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
2e520 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
2e530 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 63  hema);.        c
2e540 6f 6e 73 74 20 69 6e 74 20 69 43 73 72 20 3d 20  onst int iCsr = 
2e550 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20  pParse->nTab++; 
2e560 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f      /* Cursor to
2e570 20 73 63 61 6e 20 62 2d 74 72 65 65 20 2a 2f 0a   scan b-tree */.
2e580 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
2e590 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
2e5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e5b0 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
2e5c0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 4b 65 79  e */.        Key
2e5d0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
2e5e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2e5f0 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72    /* Keyinfo for
2e600 20 73 63 61 6e 6e 65 64 20 69 6e 64 65 78 20 2a   scanned index *
2e610 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  /.        Index 
2e620 2a 70 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20  *pBest = 0;     
2e630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e640 2a 20 42 65 73 74 20 69 6e 64 65 78 20 66 6f 75  * Best index fou
2e650 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  nd so far */.   
2e660 20 20 20 20 20 69 6e 74 20 69 52 6f 6f 74 20 3d       int iRoot =
2e670 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 20 20 20 20   pTab->tnum;    
2e680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
2e690 74 20 70 61 67 65 20 6f 66 20 73 63 61 6e 6e 65  t page of scanne
2e6a0 64 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20  d b-tree */..   
2e6b0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
2e6c0 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
2e6d0 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  rse, iDb);.     
2e6e0 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c     sqlite3TableL
2e6f0 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
2e700 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20   pTab->tnum, 0, 
2e710 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20  pTab->zName);.. 
2e720 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68         /* Search
2e730 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 74   for the index t
2e740 68 61 74 20 68 61 73 20 74 68 65 20 6c 6f 77 65  hat has the lowe
2e750 73 74 20 73 63 61 6e 20 63 6f 73 74 2e 0a 20 20  st scan cost..  
2e760 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2e770 20 2a 2a 20 28 32 30 31 31 2d 30 34 2d 31 35 29   ** (2011-04-15)
2e780 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20 66 75 6c   Do not do a ful
2e790 6c 20 73 63 61 6e 20 6f 66 20 61 6e 20 75 6e 6f  l scan of an uno
2e7a0 72 64 65 72 65 64 20 69 6e 64 65 78 2e 0a 20 20  rdered index..  
2e7b0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2e7c0 20 2a 2a 20 28 32 30 31 33 2d 31 30 2d 30 33 29   ** (2013-10-03)
2e7d0 20 44 6f 20 6e 6f 74 20 63 6f 75 6e 74 20 74 68   Do not count th
2e7e0 65 20 65 6e 74 72 69 65 73 20 69 6e 20 61 20 70  e entries in a p
2e7f0 61 72 74 69 61 6c 20 69 6e 64 65 78 2e 0a 20 20  artial index..  
2e800 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2e810 20 2a 2a 20 49 6e 20 70 72 61 63 74 69 63 65 20   ** In practice 
2e820 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
2e830 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f 74 20 62  cture will not b
2e840 65 20 75 73 65 64 2e 20 49 74 20 69 73 20 6f 6e  e used. It is on
2e850 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  ly .        ** p
2e860 61 73 73 65 64 20 74 6f 20 6b 65 65 70 20 4f 50  assed to keep OP
2e870 5f 4f 70 65 6e 52 65 61 64 20 68 61 70 70 79 2e  _OpenRead happy.
2e880 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2e890 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69      if( !HasRowi
2e8a0 64 28 70 54 61 62 29 20 29 20 70 42 65 73 74 20  d(pTab) ) pBest 
2e8b0 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
2e8c0 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
2e8d0 20 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78          for(pIdx
2e8e0 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
2e8f0 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
2e900 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
2e910 20 20 69 66 28 20 70 49 64 78 2d 3e 62 55 6e 6f    if( pIdx->bUno
2e920 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20  rdered==0.      
2e930 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e 73 7a       && pIdx->sz
2e940 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54  IdxRow<pTab->szT
2e950 61 62 52 6f 77 0a 20 20 20 20 20 20 20 20 20 20  abRow.          
2e960 20 26 26 20 70 49 64 78 2d 3e 70 50 61 72 74 49   && pIdx->pPartI
2e970 64 78 57 68 65 72 65 3d 3d 30 0a 20 20 20 20 20  dxWhere==0.     
2e980 20 20 20 20 20 20 26 26 20 28 21 70 42 65 73 74        && (!pBest
2e990 20 7c 7c 20 70 49 64 78 2d 3e 73 7a 49 64 78 52   || pIdx->szIdxR
2e9a0 6f 77 3c 70 42 65 73 74 2d 3e 73 7a 49 64 78 52  ow<pBest->szIdxR
2e9b0 6f 77 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  ow).          ){
2e9c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 42 65  .            pBe
2e9d0 73 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20  st = pIdx;.     
2e9e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2e9f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42 65  .        if( pBe
2ea00 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
2ea10 69 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d 3e 74  iRoot = pBest->t
2ea20 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70  num;.          p
2ea30 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
2ea40 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28  3KeyInfoOfIndex(
2ea50 70 50 61 72 73 65 2c 20 70 42 65 73 74 29 3b 0a  pParse, pBest);.
2ea60 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
2ea70 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61     /* Open a rea
2ea80 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 65  d-only cursor, e
2ea90 78 65 63 75 74 65 20 74 68 65 20 4f 50 5f 43 6f  xecute the OP_Co
2eaa0 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65 20 63  unt, close the c
2eab0 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20  ursor. */.      
2eac0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2ead0 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65  Op4Int(v, OP_Ope
2eae0 6e 52 65 61 64 2c 20 69 43 73 72 2c 20 69 52 6f  nRead, iCsr, iRo
2eaf0 6f 74 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20  ot, iDb, 1);.   
2eb00 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
2eb10 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  o ){.          s
2eb20 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2eb30 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20  P4(v, -1, (char 
2eb40 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
2eb50 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20  EYINFO);.       
2eb60 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
2eb70 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2eb80 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72 2c 20  OP_Count, iCsr, 
2eb90 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30  sAggInfo.aFunc[0
2eba0 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  ].iMem);.       
2ebb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2ebc0 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
2ebd0 69 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20 65  iCsr);.        e
2ebe0 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e  xplainSimpleCoun
2ebf0 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  t(pParse, pTab, 
2ec00 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65  pBest);.      }e
2ec10 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  lse.#endif /* SQ
2ec20 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43  LITE_OMIT_BTREEC
2ec30 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7b 0a  OUNT */.      {.
2ec40 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
2ec50 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73   if the query is
2ec60 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66   of one of the f
2ec70 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a  ollowing forms:.
2ec80 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2ec90 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d     **   SELECT m
2eca0 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20  in(x) FROM .... 
2ecb0 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45         **   SELE
2ecc0 43 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 2e  CT max(x) FROM .
2ecd0 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  ...        **.  
2ece0 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69        ** If it i
2ecf0 73 2c 20 74 68 65 6e 20 61 73 6b 20 74 68 65 20  s, then ask the 
2ed00 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20  code in where.c 
2ed10 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73 6f  to attempt to so
2ed20 72 74 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20  rt results.     
2ed30 20 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65 72     ** as if ther
2ed40 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52 20  e was an "ORDER 
2ed50 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52 20  ON x" or "ORDER 
2ed60 4f 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75 73  ON x DESC" claus
2ed70 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  e. .        ** I
2ed80 66 20 77 68 65 72 65 2e 63 20 69 73 20 61 62 6c  f where.c is abl
2ed90 65 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65 73  e to produce res
2eda0 75 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20 74  ults sorted in t
2edb0 68 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a  his order, then.
2edc0 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 20 76          ** add v
2edd0 64 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65 61  dbe code to brea
2ede0 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72 6f  k out of the pro
2edf0 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74  cessing loop aft
2ee00 65 72 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  er the .        
2ee10 2a 2a 20 66 69 72 73 74 20 69 74 65 72 61 74 69  ** first iterati
2ee20 6f 6e 20 28 73 69 6e 63 65 20 74 68 65 20 66 69  on (since the fi
2ee30 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  rst iteration of
2ee40 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20   the loop is .  
2ee50 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74        ** guarant
2ee60 65 65 64 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  eed to operate o
2ee70 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 20 74  n the row with t
2ee80 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61  he minimum or ma
2ee90 78 69 6d 75 6d 20 0a 20 20 20 20 20 20 20 20 2a  ximum .        *
2eea0 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c 20 74 68  * value of x, th
2eeb0 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75 69  e only row requi
2eec0 72 65 64 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a  red)..        **
2eed0 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73 70  .        ** A sp
2eee0 65 63 69 61 6c 20 66 6c 61 67 20 6d 75 73 74 20  ecial flag must 
2eef0 62 65 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  be passed to sql
2ef00 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
2ef10 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20 20   to slightly.   
2ef20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62       ** modify b
2ef30 65 68 61 76 69 6f 72 20 61 73 20 66 6f 6c 6c 6f  ehavior as follo
2ef40 77 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ws:.        **. 
2ef50 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 49 66         **   + If
2ef60 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20   the query is a 
2ef70 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c  "SELECT min(x)",
2ef80 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63   then the loop c
2ef90 6f 64 65 64 20 62 79 0a 20 20 20 20 20 20 20 20  oded by.        
2efa0 2a 2a 20 20 20 20 20 77 68 65 72 65 2e 63 20 73  **     where.c s
2efb0 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72 61 74  hould not iterat
2efc0 65 20 6f 76 65 72 20 61 6e 79 20 76 61 6c 75 65  e over any value
2efd0 73 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61  s with a NULL va
2efe0 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  lue.        **  
2eff0 20 20 20 66 6f 72 20 78 2e 0a 20 20 20 20 20 20     for x..      
2f000 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2f010 20 20 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a 65    + The optimize
2f020 72 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e  r code in where.
2f030 63 20 28 74 68 65 20 74 68 69 6e 67 20 74 68 61  c (the thing tha
2f040 74 20 64 65 63 69 64 65 73 20 77 68 69 63 68 0a  t decides which.
2f050 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69          **     i
2f060 6e 64 65 78 20 6f 72 20 69 6e 64 69 63 65 73 20  ndex or indices 
2f070 74 6f 20 75 73 65 29 20 73 68 6f 75 6c 64 20 70  to use) should p
2f080 6c 61 63 65 20 61 20 64 69 66 66 65 72 65 6e 74  lace a different
2f090 20 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20   priority on .  
2f0a0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 73 61 74        **     sat
2f0b0 69 73 66 79 69 6e 67 20 74 68 65 20 27 4f 52 44  isfying the 'ORD
2f0c0 45 52 20 42 59 27 20 63 6c 61 75 73 65 20 74 68  ER BY' clause th
2f0d0 61 6e 20 69 74 20 64 6f 65 73 20 69 6e 20 6f 74  an it does in ot
2f0e0 68 65 72 20 63 61 73 65 73 2e 0a 20 20 20 20 20  her cases..     
2f0f0 20 20 20 2a 2a 20 20 20 20 20 52 65 66 65 72 20     **     Refer 
2f100 74 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d  to code and comm
2f110 65 6e 74 73 20 69 6e 20 77 68 65 72 65 2e 63 20  ents in where.c 
2f120 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 20  for details..   
2f130 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2f140 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61  ExprList *pMinMa
2f150 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75  x = 0;.        u
2f160 38 20 66 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f  8 flag = WHERE_O
2f170 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20  RDERBY_NORMAL;. 
2f180 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
2f190 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75  assert( p->pGrou
2f1a0 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pBy==0 );.      
2f1b0 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d    assert( flag==
2f1c0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
2f1d0 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29   p->pHaving==0 )
2f1e0 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  {.          flag
2f1f0 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 26   = minMaxQuery(&
2f200 73 41 67 67 49 6e 66 6f 2c 20 26 70 4d 69 6e 4d  sAggInfo, &pMinM
2f210 61 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ax);.        }. 
2f220 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66         assert( f
2f230 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 4d 69 6e 4d  lag==0 || (pMinM
2f240 61 78 21 3d 30 20 26 26 20 70 4d 69 6e 4d 61 78  ax!=0 && pMinMax
2f250 2d 3e 6e 45 78 70 72 3d 3d 31 29 20 29 3b 0a 0a  ->nExpr==1) );..
2f260 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67          if( flag
2f270 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4d   ){.          pM
2f280 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 45  inMax = sqlite3E
2f290 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
2f2a0 4d 69 6e 4d 61 78 2c 20 30 29 3b 0a 20 20 20 20  MinMax, 0);.    
2f2b0 20 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69        pDel = pMi
2f2c0 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20 20 20 20  nMax;.          
2f2d0 69 66 28 20 70 4d 69 6e 4d 61 78 20 26 26 20 21  if( pMinMax && !
2f2e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2f2f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f300 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f  pMinMax->a[0].so
2f310 72 74 4f 72 64 65 72 20 3d 20 66 6c 61 67 21 3d  rtOrder = flag!=
2f320 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
2f330 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20 20  N ?1:0;.        
2f340 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30      pMinMax->a[0
2f350 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b  ].pExpr->op = TK
2f360 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20  _COLUMN;.       
2f370 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2f380 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69   .        /* Thi
2f390 73 20 63 61 73 65 20 72 75 6e 73 20 69 66 20 74  s case runs if t
2f3a0 68 65 20 61 67 67 72 65 67 61 74 65 20 68 61 73  he aggregate has
2f3b0 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61   no GROUP BY cla
2f3c0 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  use.  The.      
2f3d0 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20    ** processing 
2f3e0 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20  is much simpler 
2f3f0 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f  since there is o
2f400 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  nly a single row
2f410 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f  .        ** of o
2f420 75 74 70 75 74 2e 0a 20 20 20 20 20 20 20 20 2a  utput..        *
2f430 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 74 41  /.        resetA
2f440 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
2f450 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
2f460 20 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20         pWInfo = 
2f470 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2f480 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
2f490 73 74 2c 20 70 57 68 65 72 65 2c 20 70 4d 69 6e  st, pWhere, pMin
2f4a0 4d 61 78 2c 30 2c 66 6c 61 67 2c 30 29 3b 0a 20  Max,0,flag,0);. 
2f4b0 20 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66         if( pWInf
2f4c0 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  o==0 ){.        
2f4d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
2f4e0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c  tDelete(db, pDel
2f4f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
2f500 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
2f510 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f520 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
2f530 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
2f540 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 61 73  nfo);.        as
2f550 73 65 72 74 28 20 70 4d 69 6e 4d 61 78 3d 3d 30  sert( pMinMax==0
2f560 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78   || pMinMax->nEx
2f570 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  pr==1 );.       
2f580 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
2f590 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66  eIsOrdered(pWInf
2f5a0 6f 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  o)>0 ){.        
2f5b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2f5c0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
2f5d0 30 2c 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  0, sqlite3WhereB
2f5e0 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f  reakLabel(pWInfo
2f5f0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  ));.          Vd
2f600 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
2f610 73 28 29 20 62 79 20 69 6e 64 65 78 22 2c 0a 20  s() by index",. 
2f620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2f630 66 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45  flag==WHERE_ORDE
2f640 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d  RBY_MIN?"min":"m
2f650 61 78 22 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ax")));.        
2f660 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
2f670 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
2f680 29 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c  );.        final
2f690 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
2f6a0 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
2f6b0 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  o);.      }..   
2f6c0 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42     sSort.pOrderB
2f6d0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  y = 0;.      sql
2f6e0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
2f6f0 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c  pParse, pHaving,
2f700 20 61 64 64 72 45 6e 64 2c 20 53 51 4c 49 54 45   addrEnd, SQLITE
2f710 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
2f720 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
2f730 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
2f740 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 2c 20 30 2c  ->pEList, -1, 0,
2f750 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
2f760 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
2f770 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45  , addrEnd, addrE
2f780 6e 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nd);.      sqlit
2f790 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
2f7a0 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20  (db, pDel);.    
2f7b0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
2f7c0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
2f7d0 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a   addrEnd);.    .
2f7e0 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67 67    } /* endif agg
2f7f0 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a  regate query */.
2f800 0a 20 20 69 66 28 20 73 44 69 73 74 69 6e 63 74  .  if( sDistinct
2f810 2e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52  .eTnctType==WHER
2f820 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44  E_DISTINCT_UNORD
2f830 45 52 45 44 20 29 7b 0a 20 20 20 20 65 78 70 6c  ERED ){.    expl
2f840 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61  ainTempTable(pPa
2f850 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 22 29  rse, "DISTINCT")
2f860 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
2f870 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
2f880 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
2f890 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74   we need to sort
2f8a0 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a   the results.  *
2f8b0 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20  * and send them 
2f8c0 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
2f8d0 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f  one by one..  */
2f8e0 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72  .  if( sSort.pOr
2f8f0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 65 78 70  derBy ){.    exp
2f900 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50  lainTempTable(pP
2f910 61 72 73 65 2c 20 73 53 6f 72 74 2e 6e 4f 42 53  arse, sSort.nOBS
2f920 61 74 3e 30 20 3f 20 22 52 49 47 48 54 20 50 41  at>0 ? "RIGHT PA
2f930 52 54 20 4f 46 20 4f 52 44 45 52 20 42 59 22 3a  RT OF ORDER BY":
2f940 22 4f 52 44 45 52 20 42 59 22 29 3b 0a 20 20 20  "ORDER BY");.   
2f950 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69   generateSortTai
2f960 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 26 73 53  l(pParse, p, &sS
2f970 6f 72 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ort, pEList->nEx
2f980 70 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a  pr, pDest);.  }.
2f990 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
2f9a0 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75 65  to skip this que
2f9b0 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ry.  */.  sqlite
2f9c0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
2f9d0 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f  l(v, iEnd);..  /
2f9e0 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77 61 73  * The SELECT was
2f9f0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
2fa00 64 65 64 2e 20 20 20 53 65 74 20 74 68 65 20 72  ded.   Set the r
2fa10 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a  eturn code to 0.
2fa20 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65    ** to indicate
2fa30 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f   no errors..  */
2fa40 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a  .  rc = 0;..  /*
2fa50 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74   Control jumps t
2fa60 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65 72 72  o here if an err
2fa70 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
2fa80 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e  d above, or upon
2fa90 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  .  ** successful
2faa0 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53   coding of the S
2fab0 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65  ELECT..  */.sele
2fac0 63 74 5f 65 6e 64 3a 0a 20 20 65 78 70 6c 61 69  ct_end:.  explai
2fad0 6e 53 65 74 49 6e 74 65 67 65 72 28 70 50 61 72  nSetInteger(pPar
2fae0 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 69  se->iSelectId, i
2faf0 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64 29  RestoreSelectId)
2fb00 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79  ;..  /* Identify
2fb10 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66   column names if
2fb20 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
2fb30 53 45 4c 45 43 54 20 61 72 65 20 74 6f 20 62 65  SELECT are to be
2fb40 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20   output..  */.  
2fb50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2fb60 4b 20 26 26 20 70 44 65 73 74 2d 3e 65 44 65 73  K && pDest->eDes
2fb70 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
2fb80 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c  .    generateCol
2fb90 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
2fba0 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
2fbb0 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  t);.  }..  sqlit
2fbc0 65 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67  e3DbFree(db, sAg
2fbd0 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73  gInfo.aCol);.  s
2fbe0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2fbf0 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29   sAggInfo.aFunc)
2fc00 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2fc10 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
2fc20 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45  LITE_ENABLE_TREE
2fc30 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20  _EXPLAIN)./*.** 
2fc40 47 65 6e 65 72 61 74 65 20 61 20 68 75 6d 61 6e  Generate a human
2fc50 2d 72 65 61 64 61 62 6c 65 20 64 65 73 63 72 69  -readable descri
2fc60 70 74 69 6f 6e 20 6f 66 20 61 20 74 68 65 20 53  ption of a the S
2fc70 65 6c 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f  elect object..*/
2fc80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
2fc90 6c 61 69 6e 4f 6e 65 53 65 6c 65 63 74 28 56 64  lainOneSelect(Vd
2fca0 62 65 20 2a 70 56 64 62 65 2c 20 53 65 6c 65 63  be *pVdbe, Selec
2fcb0 74 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  t *p){.  sqlite3
2fcc0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
2fcd0 64 62 65 2c 20 22 53 45 4c 45 43 54 20 22 29 3b  dbe, "SELECT ");
2fce0 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
2fcf0 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
2fd00 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 20  t|SF_Aggregate) 
2fd10 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65  ){.    if( p->se
2fd20 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
2fd30 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71  inct ){.      sq
2fd40 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2fd50 74 66 28 70 56 64 62 65 2c 20 22 44 49 53 54 49  tf(pVdbe, "DISTI
2fd60 4e 43 54 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20  NCT ");.    }.  
2fd70 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
2fd80 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
2fd90 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2fda0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
2fdb0 56 64 62 65 2c 20 22 61 67 67 5f 66 6c 61 67 20  Vdbe, "agg_flag 
2fdc0 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ");.    }.    sq
2fdd0 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70  lite3ExplainNL(p
2fde0 56 64 62 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Vdbe);.    sqlit
2fdf0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2fe00 70 56 64 62 65 2c 20 22 20 20 20 22 29 3b 0a 20  pVdbe, "   ");. 
2fe10 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c   }.  sqlite3Expl
2fe20 61 69 6e 45 78 70 72 4c 69 73 74 28 70 56 64 62  ainExprList(pVdb
2fe30 65 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  e, p->pEList);. 
2fe40 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
2fe50 4c 28 70 56 64 62 65 29 3b 0a 20 20 69 66 28 20  L(pVdbe);.  if( 
2fe60 70 2d 3e 70 53 72 63 20 26 26 20 70 2d 3e 70 53  p->pSrc && p->pS
2fe70 72 63 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20  rc->nSrc ){.    
2fe80 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74  int i;.    sqlit
2fe90 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2fea0 70 56 64 62 65 2c 20 22 46 52 4f 4d 20 22 29 3b  pVdbe, "FROM ");
2feb0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2fec0 61 69 6e 50 75 73 68 28 70 56 64 62 65 29 3b 0a  ainPush(pVdbe);.
2fed0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2fee0 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  ->pSrc->nSrc; i+
2fef0 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
2ff00 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2ff10 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d  Item = &p->pSrc-
2ff20 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c  >a[i];.      sql
2ff30 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
2ff40 66 28 70 56 64 62 65 2c 20 22 7b 25 64 2c 2a 7d  f(pVdbe, "{%d,*}
2ff50 20 3d 20 22 2c 20 70 49 74 65 6d 2d 3e 69 43 75   = ", pItem->iCu
2ff60 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28  rsor);.      if(
2ff70 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
2ff80 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2ff90 65 33 45 78 70 6c 61 69 6e 53 65 6c 65 63 74 28  e3ExplainSelect(
2ffa0 70 56 64 62 65 2c 20 70 49 74 65 6d 2d 3e 70 53  pVdbe, pItem->pS
2ffb0 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
2ffc0 69 66 28 20 70 49 74 65 6d 2d 3e 70 54 61 62 20  if( pItem->pTab 
2ffd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
2ffe0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
2fff0 66 28 70 56 64 62 65 2c 20 22 20 28 74 61 62 6e  f(pVdbe, " (tabn
30000 61 6d 65 3d 25 73 29 22 2c 20 70 49 74 65 6d 2d  ame=%s)", pItem-
30010 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  >pTab->zName);. 
30020 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
30030 65 6c 73 65 20 69 66 28 20 70 49 74 65 6d 2d 3e  else if( pItem->
30040 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  zName ){.       
30050 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
30060 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 25 73  rintf(pVdbe, "%s
30070 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  ", pItem->zName)
30080 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30090 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  if( pItem->zAlia
300a0 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  s ){.        sql
300b0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
300c0 66 28 70 56 64 62 65 2c 20 22 20 28 41 53 20 25  f(pVdbe, " (AS %
300d0 73 29 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69  s)", pItem->zAli
300e0 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  as);.      }.   
300f0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 6a 6f     if( pItem->jo
30100 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54  intype & JT_LEFT
30110 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
30120 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
30130 28 70 56 64 62 65 2c 20 22 20 4c 45 46 54 2d 4a  (pVdbe, " LEFT-J
30140 4f 49 4e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OIN");.      }. 
30150 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
30160 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20  ainNL(pVdbe);.  
30170 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
30180 78 70 6c 61 69 6e 50 6f 70 28 70 56 64 62 65 29  xplainPop(pVdbe)
30190 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
301a0 57 68 65 72 65 20 29 7b 0a 20 20 20 20 73 71 6c  Where ){.    sql
301b0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
301c0 66 28 70 56 64 62 65 2c 20 22 57 48 45 52 45 20  f(pVdbe, "WHERE 
301d0 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ");.    sqlite3E
301e0 78 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62 65  xplainExpr(pVdbe
301f0 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  , p->pWhere);.  
30200 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
30210 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20  NL(pVdbe);.  }. 
30220 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79   if( p->pGroupBy
30230 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
30240 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
30250 62 65 2c 20 22 47 52 4f 55 50 42 59 20 22 29 3b  be, "GROUPBY ");
30260 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
30270 61 69 6e 45 78 70 72 4c 69 73 74 28 70 56 64 62  ainExprList(pVdb
30280 65 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b  e, p->pGroupBy);
30290 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
302a0 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20  ainNL(pVdbe);.  
302b0 7d 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69  }.  if( p->pHavi
302c0 6e 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ng ){.    sqlite
302d0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
302e0 56 64 62 65 2c 20 22 48 41 56 49 4e 47 20 22 29  Vdbe, "HAVING ")
302f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
30300 6c 61 69 6e 45 78 70 72 28 70 56 64 62 65 2c 20  lainExpr(pVdbe, 
30310 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  p->pHaving);.   
30320 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
30330 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20  L(pVdbe);.  }.  
30340 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
30350 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
30360 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
30370 65 2c 20 22 4f 52 44 45 52 42 59 20 22 29 3b 0a  e, "ORDERBY ");.
30380 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
30390 69 6e 45 78 70 72 4c 69 73 74 28 70 56 64 62 65  inExprList(pVdbe
303a0 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
303b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
303c0 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d  inNL(pVdbe);.  }
303d0 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74  .  if( p->pLimit
303e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
303f0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
30400 62 65 2c 20 22 4c 49 4d 49 54 20 22 29 3b 0a 20  be, "LIMIT ");. 
30410 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
30420 6e 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e  nExpr(pVdbe, p->
30430 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c  pLimit);.    sql
30440 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56  ite3ExplainNL(pV
30450 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  dbe);.  }.  if( 
30460 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20  p->pOffset ){.  
30470 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
30480 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 4f  Printf(pVdbe, "O
30490 46 46 53 45 54 20 22 29 3b 0a 20 20 20 20 73 71  FFSET ");.    sq
304a0 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
304b0 28 70 56 64 62 65 2c 20 70 2d 3e 70 4f 66 66 73  (pVdbe, p->pOffs
304c0 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  et);.    sqlite3
304d0 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29  ExplainNL(pVdbe)
304e0 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  ;.  }.}.void sql
304f0 69 74 65 33 45 78 70 6c 61 69 6e 53 65 6c 65 63  ite3ExplainSelec
30500 74 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53  t(Vdbe *pVdbe, S
30510 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28  elect *p){.  if(
30520 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c   p==0 ){.    sql
30530 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
30540 66 28 70 56 64 62 65 2c 20 22 28 6e 75 6c 6c 2d  f(pVdbe, "(null-
30550 73 65 6c 65 63 74 29 22 29 3b 0a 20 20 20 20 72  select)");.    r
30560 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
30570 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28  ite3ExplainPush(
30580 70 56 64 62 65 29 3b 0a 20 20 77 68 69 6c 65 28  pVdbe);.  while(
30590 20 70 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69   p ){.    explai
305a0 6e 4f 6e 65 53 65 6c 65 63 74 28 70 56 64 62 65  nOneSelect(pVdbe
305b0 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  , p);.    p = p-
305c0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  >pNext;.    if( 
305d0 70 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  p==0 ) break;.  
305e0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
305f0 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20 73  NL(pVdbe);.    s
30600 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
30610 6e 74 66 28 70 56 64 62 65 2c 20 22 25 73 5c 6e  ntf(pVdbe, "%s\n
30620 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  ", selectOpName(
30630 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 20 20 73  p->op));.  }.  s
30640 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
30650 6e 74 66 28 70 56 64 62 65 2c 20 22 45 4e 44 22  ntf(pVdbe, "END"
30660 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c  );.  sqlite3Expl
30670 61 69 6e 50 6f 70 28 70 56 64 62 65 29 3b 0a 7d  ainPop(pVdbe);.}
30680 0a 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  ../* End of the 
30690 73 74 72 75 63 74 75 72 65 20 64 65 62 75 67 20  structure debug 
306a0 70 72 69 6e 74 69 6e 67 20 63 6f 64 65 0a 2a 2a  printing code.**
306b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
306c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
306d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
306e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
306f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e  ***********/.#en
30700 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
30710 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45  QLITE_ENABLE_TRE
30720 45 5f 45 58 50 4c 41 49 4e 29 20 2a 2f 0a        E_EXPLAIN) */.