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

Artifact a5ed3fdc82ebab5b9b095ea1971515a7f8a303d2:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
0210: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
0220: 6e 67 20 6f 62 6a 65 63 74 20 69 73 20 75 73 65  ng object is use
0230: 64 20 74 6f 20 72 65 63 6f 72 64 20 69 6e 66 6f  d to record info
0240: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a  rmation about.**
0250: 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20   how to process 
0260: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
0270: 77 6f 72 64 2c 20 74 6f 20 73 69 6d 70 6c 69 66  word, to simplif
0280: 79 20 70 61 73 73 69 6e 67 20 74 68 61 74 20 69  y passing that i
0290: 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e  nformation.** in
02a0: 74 6f 20 74 68 65 20 73 65 6c 65 63 74 49 6e 6e  to the selectInn
02b0: 65 72 4c 6f 6f 70 28 29 20 72 6f 75 74 69 6e 65  erLoop() routine
02c0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
02d0: 75 63 74 20 44 69 73 74 69 6e 63 74 43 74 78 20  uct DistinctCtx 
02e0: 44 69 73 74 69 6e 63 74 43 74 78 3b 0a 73 74 72  DistinctCtx;.str
02f0: 75 63 74 20 44 69 73 74 69 6e 63 74 43 74 78 20  uct DistinctCtx 
0300: 7b 0a 20 20 75 38 20 69 73 54 6e 63 74 3b 20 20  {.  u8 isTnct;  
0310: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
0320: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
0330: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
0340: 2f 0a 20 20 75 38 20 65 54 6e 63 74 54 79 70 65  /.  u8 eTnctType
0350: 3b 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68  ;   /* One of th
0360: 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
0370: 5f 2a 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  _* operators */.
0380: 20 20 69 6e 74 20 74 61 62 54 6e 63 74 3b 20 20    int tabTnct;  
0390: 20 20 2f 2a 20 45 70 68 65 6d 65 72 61 6c 20 74    /* Ephemeral t
03a0: 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20 44 49  able used for DI
03b0: 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69 6e  STINCT processin
03c0: 67 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  g */.  int addrT
03d0: 6e 63 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73  nct;   /* Addres
03e0: 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65  s of OP_OpenEphe
03f0: 6d 65 72 61 6c 20 6f 70 63 6f 64 65 20 66 6f 72  meral opcode for
0400: 20 74 61 62 54 6e 63 74 20 2a 2f 0a 7d 3b 0a 0a   tabTnct */.};..
0410: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
0420: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
0430: 6e 67 20 6f 62 6a 65 63 74 20 69 73 20 75 73 65  ng object is use
0440: 64 20 74 6f 20 72 65 63 6f 72 64 20 69 6e 66 6f  d to record info
0450: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a  rmation about.**
0460: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 28 6f   the ORDER BY (o
0470: 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c 61 75  r GROUP BY) clau
0480: 73 65 20 6f 66 20 71 75 65 72 79 20 69 73 20 62  se of query is b
0490: 65 69 6e 67 20 63 6f 64 65 64 2e 0a 2a 2f 0a 74  eing coded..*/.t
04a0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53 6f  ypedef struct So
04b0: 72 74 43 74 78 20 53 6f 72 74 43 74 78 3b 0a 73  rtCtx SortCtx;.s
04c0: 74 72 75 63 74 20 53 6f 72 74 43 74 78 20 7b 0a  truct SortCtx {.
04d0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
04e0: 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f  erBy;   /* The O
04f0: 52 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55  RDER BY (or GROU
0500: 50 20 42 59 20 63 6c 61 75 73 65 29 20 2a 2f 0a  P BY clause) */.
0510: 20 20 69 6e 74 20 6e 4f 42 53 61 74 3b 20 20 20    int nOBSat;   
0520: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
0530: 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65  r of ORDER BY te
0540: 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 62 79  rms satisfied by
0550: 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e   indices */.  in
0560: 74 20 69 45 43 75 72 73 6f 72 3b 20 20 20 20 20  t iECursor;     
0570: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
0580: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 73 6f 72  mber for the sor
0590: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ter */.  int reg
05a0: 52 65 74 75 72 6e 3b 20 20 20 20 20 20 20 20 2f  Return;        /
05b0: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
05c0: 6e 67 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20  ng block-output 
05d0: 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 2a  return address *
05e0: 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 42 6b 4f  /.  int labelBkO
05f0: 75 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61  ut;       /* Sta
0600: 72 74 20 6c 61 62 65 6c 20 66 6f 72 20 74 68 65  rt label for the
0610: 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 73 75   block-output su
0620: 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
0630: 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b  t addrSortIndex;
0640: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
0650: 66 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f  f the OP_SorterO
0660: 70 65 6e 20 6f 72 20 4f 50 5f 4f 70 65 6e 45 70  pen or OP_OpenEp
0670: 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 75 38 20  hemeral */.  u8 
0680: 73 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20 20  sortFlags;      
0690: 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f     /* Zero or mo
06a0: 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62 69  re SORTFLAG_* bi
06b0: 74 73 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65  ts */.};.#define
06c0: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
06d0: 74 65 72 20 20 30 78 30 31 20 20 20 2f 2a 20 55  ter  0x01   /* U
06e0: 73 65 20 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e  se SorterOpen in
06f0: 73 74 65 61 64 20 6f 66 20 4f 70 65 6e 45 70 68  stead of OpenEph
0700: 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  emeral */../*.**
0710: 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68 65 20   Delete all the 
0720: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53 65 6c  content of a Sel
0730: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 62 75  ect structure bu
0740: 74 20 64 6f 20 6e 6f 74 20 64 65 61 6c 6c 6f 63  t do not dealloc
0750: 61 74 65 0a 2a 2a 20 74 68 65 20 73 65 6c 65 63  ate.** the selec
0760: 74 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  t structure itse
0770: 6c 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  lf..*/.static vo
0780: 69 64 20 63 6c 65 61 72 53 65 6c 65 63 74 28 73  id clearSelect(s
0790: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65  qlite3 *db, Sele
07a0: 63 74 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  ct *p){.  sqlite
07b0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
07c0: 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  db, p->pEList);.
07d0: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
07e0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53  Delete(db, p->pS
07f0: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  rc);.  sqlite3Ex
0800: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
0810: 70 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74  pWhere);.  sqlit
0820: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
0830: 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
0840: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
0850: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 48  Delete(db, p->pH
0860: 61 76 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65  aving);.  sqlite
0870: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
0880: 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  db, p->pOrderBy)
0890: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
08a0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
08b0: 50 72 69 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65  Prior);.  sqlite
08c0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
08d0: 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 73 71  p->pLimit);.  sq
08e0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
08f0: 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
0900: 0a 20 20 73 71 6c 69 74 65 33 57 69 74 68 44 65  .  sqlite3WithDe
0910: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69 74  lete(db, p->pWit
0920: 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  h);.}../*.** Ini
0930: 74 69 61 6c 69 7a 65 20 61 20 53 65 6c 65 63 74  tialize a Select
0940: 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a  Dest structure..
0950: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
0960: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 53 65  electDestInit(Se
0970: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c  lectDest *pDest,
0980: 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20   int eDest, int 
0990: 69 50 61 72 6d 29 7b 0a 20 20 70 44 65 73 74 2d  iParm){.  pDest-
09a0: 3e 65 44 65 73 74 20 3d 20 28 75 38 29 65 44 65  >eDest = (u8)eDe
09b0: 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53 44  st;.  pDest->iSD
09c0: 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20 20  Parm = iParm;.  
09d0: 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20 3d  pDest->affSdst =
09e0: 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53 64   0;.  pDest->iSd
09f0: 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d  st = 0;.  pDest-
0a00: 3e 6e 53 64 73 74 20 3d 20 30 3b 0a 7d 0a 0a 0a  >nSdst = 0;.}...
0a10: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
0a20: 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74 72 75   new Select stru
0a30: 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e  cture and return
0a40: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
0a50: 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  at.** structure.
0a60: 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  .*/.Select *sqli
0a70: 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a 20 20  te3SelectNew(.  
0a80: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
0a90: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
0aa0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
0ab0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
0ac0: 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c      /* which col
0ad0: 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64 65 20  umns to include 
0ae0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
0af0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
0b00: 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20  ,        /* the 
0b10: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77  FROM clause -- w
0b20: 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f 20 73  hich tables to s
0b30: 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  can */.  Expr *p
0b40: 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
0b50: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
0b60: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
0b70: 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a   *pGroupBy,   /*
0b80: 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
0b90: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
0ba0: 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20 20 20  pHaving,        
0bb0: 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  /* the HAVING cl
0bc0: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
0bd0: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
0be0: 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  /* the ORDER BY 
0bf0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20  clause */.  u16 
0c00: 73 65 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20  selFlags,       
0c10: 20 20 2f 2a 20 46 6c 61 67 20 70 61 72 61 6d 65    /* Flag parame
0c20: 74 65 72 73 2c 20 73 75 63 68 20 61 73 20 53 46  ters, such as SF
0c30: 5f 44 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 45  _Distinct */.  E
0c40: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20  xpr *pLimit,    
0c50: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61       /* LIMIT va
0c60: 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73  lue.  NULL means
0c70: 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 45   not used */.  E
0c80: 78 70 72 20 2a 70 4f 66 66 73 65 74 20 20 20 20  xpr *pOffset    
0c90: 20 20 20 20 20 2f 2a 20 4f 46 46 53 45 54 20 76       /* OFFSET v
0ca0: 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e  alue.  NULL mean
0cb0: 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29  s no offset */.)
0cc0: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
0cd0: 3b 0a 20 20 53 65 6c 65 63 74 20 73 74 61 6e 64  ;.  Select stand
0ce0: 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  in;.  sqlite3 *d
0cf0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
0d00: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
0d10: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
0d20: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
0d30: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
0d40: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
0d50: 21 70 4f 66 66 73 65 74 20 7c 7c 20 70 4c 69 6d  !pOffset || pLim
0d60: 69 74 20 29 3b 20 2f 2a 20 4f 46 46 53 45 54 20  it ); /* OFFSET 
0d70: 69 6d 70 6c 69 65 73 20 4c 49 4d 49 54 20 2a 2f  implies LIMIT */
0d80: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
0d90: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
0da0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
0db0: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 26 73 74  ;.    pNew = &st
0dc0: 61 6e 64 69 6e 3b 0a 20 20 20 20 6d 65 6d 73 65  andin;.    memse
0dd0: 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f  t(pNew, 0, sizeo
0de0: 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 7d 0a 20  f(*pNew));.  }. 
0df0: 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29   if( pEList==0 )
0e00: 7b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73  {.    pEList = s
0e10: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
0e20: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
0e30: 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 54  sqlite3Expr(db,T
0e40: 4b 5f 41 4c 4c 2c 30 29 29 3b 0a 20 20 7d 0a 20  K_ALL,0));.  }. 
0e50: 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20   pNew->pEList = 
0e60: 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 53  pEList;.  if( pS
0e70: 72 63 3d 3d 30 20 29 20 70 53 72 63 20 3d 20 73  rc==0 ) pSrc = s
0e80: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
0e90: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
0ea0: 53 72 63 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  Src));.  pNew->p
0eb0: 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 70 4e  Src = pSrc;.  pN
0ec0: 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68  ew->pWhere = pWh
0ed0: 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72  ere;.  pNew->pGr
0ee0: 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79  oupBy = pGroupBy
0ef0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e  ;.  pNew->pHavin
0f00: 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 70  g = pHaving;.  p
0f10: 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  New->pOrderBy = 
0f20: 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 4e 65 77  pOrderBy;.  pNew
0f30: 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 73 65 6c  ->selFlags = sel
0f40: 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 6f  Flags;.  pNew->o
0f50: 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20  p = TK_SELECT;. 
0f60: 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20   pNew->pLimit = 
0f70: 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d 3e  pLimit;.  pNew->
0f80: 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
0f90: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 66  t;.  assert( pOf
0fa0: 66 73 65 74 3d 3d 30 20 7c 7c 20 70 4c 69 6d 69  fset==0 || pLimi
0fb0: 74 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e  t!=0 );.  pNew->
0fc0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
0fd0: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
0fe0: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
0ff0: 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  -1;.  if( db->ma
1000: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a 20  llocFailed ) {. 
1010: 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64     clearSelect(d
1020: 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 69 66  b, pNew);.    if
1030: 28 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e  ( pNew!=&standin
1040: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
1050: 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  (db, pNew);.    
1060: 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  pNew = 0;.  }els
1070: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
1080: 4e 65 77 2d 3e 70 53 72 63 21 3d 30 20 7c 7c 20  New->pSrc!=0 || 
1090: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29  pParse->nErr>0 )
10a0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
10b0: 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e 20 29  pNew!=&standin )
10c0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
10d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
10e0: 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63   the given Selec
10f0: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
1100: 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74  all of its subst
1110: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69  ructures..*/.voi
1120: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  d sqlite3SelectD
1130: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
1140: 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  b, Select *p){. 
1150: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63 6c   if( p ){.    cl
1160: 65 61 72 53 65 6c 65 63 74 28 64 62 2c 20 70 29  earSelect(db, p)
1170: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
1180: 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  ree(db, p);.  }.
1190: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11a0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
11b0: 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
11c0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
11d0: 61 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f 0a 73  a compound..*/.s
11e0: 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 66 69  tatic Select *fi
11f0: 6e 64 52 69 67 68 74 6d 6f 73 74 28 53 65 6c 65  ndRightmost(Sele
1200: 63 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28  ct *p){.  while(
1210: 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 20 3d 20   p->pNext ) p = 
1220: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65 74 75  p->pNext;.  retu
1230: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn p;.}../*.** G
1240: 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e  iven 1 to 3 iden
1250: 74 69 66 69 65 72 73 20 70 72 65 63 65 64 69 6e  tifiers precedin
1260: 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f  g the JOIN keywo
1270: 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68  rd, determine th
1280: 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69  e.** type of joi
1290: 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
12a0: 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74  teger constant t
12b0: 68 61 74 20 65 78 70 72 65 73 73 65 73 20 74 68  hat expresses th
12c0: 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65  at type.** in te
12d0: 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  rms of the follo
12e0: 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a  wing bit values:
12f0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e  .**.**     JT_IN
1300: 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52  NER.**     JT_CR
1310: 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55  OSS.**     JT_OU
1320: 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41  TER.**     JT_NA
1330: 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f  TURAL.**     JT_
1340: 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52  LEFT.**     JT_R
1350: 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c  IGHT.**.** A ful
1360: 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20  l outer join is 
1370: 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  the combination 
1380: 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a  of JT_LEFT and J
1390: 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49  T_RIGHT..**.** I
13a0: 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20  f an illegal or 
13b0: 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e  unsupported join
13c0: 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74   type is seen, t
13d0: 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e  hen still return
13e0: 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c  .** a join type,
13f0: 20 62 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f   but put an erro
1400: 72 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  r in the pParse 
1410: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e  structure..*/.in
1420: 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70  t sqlite3JoinTyp
1430: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1440: 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65   Token *pA, Toke
1450: 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43  n *pB, Token *pC
1460: 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70  ){.  int jointyp
1470: 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a  e = 0;.  Token *
1480: 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65  apAll[3];.  Toke
1490: 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 20 20  n *p;.          
14a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b0: 20 20 20 2f 2a 20 20 20 30 31 32 33 34 35 36 37     /*   01234567
14c0: 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32 33  89 123456789 123
14d0: 34 35 36 37 38 39 20 31 32 33 20 2a 2f 0a 20 20  456789 123 */.  
14e0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
14f0: 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22  r zKeyText[] = "
1500: 6e 61 74 75 72 61 6c 65 66 74 6f 75 74 65 72 69  naturaleftouteri
1510: 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73  ghtfullinnercros
1520: 73 22 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  s";.  static con
1530: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
1540: 75 38 20 69 3b 20 20 20 20 20 20 20 20 2f 2a 20  u8 i;        /* 
1550: 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79  Beginning of key
1560: 77 6f 72 64 20 74 65 78 74 20 69 6e 20 7a 4b 65  word text in zKe
1570: 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75  yText[] */.    u
1580: 38 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c  8 nChar;    /* L
1590: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b 65 79  ength of the key
15a0: 77 6f 72 64 20 69 6e 20 63 68 61 72 61 63 74 65  word in characte
15b0: 72 73 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64  rs */.    u8 cod
15c0: 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74  e;     /* Join t
15d0: 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20  ype mask */.  } 
15e0: 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20  aKeyword[] = {. 
15f0: 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f     /* natural */
1600: 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54   { 0,  7, JT_NAT
1610: 55 52 41 4c 20 20 20 20 20 20 20 20 20 20 20 20  URAL            
1620: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65      },.    /* le
1630: 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34  ft    */ { 6,  4
1640: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54  , JT_LEFT|JT_OUT
1650: 45 52 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  ER          },. 
1660: 20 20 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f     /* outer   */
1670: 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54   { 10, 5, JT_OUT
1680: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ER              
1690: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69      },.    /* ri
16a0: 67 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35  ght   */ { 14, 5
16b0: 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  , JT_RIGHT|JT_OU
16c0: 54 45 52 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  TER         },. 
16d0: 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f     /* full    */
16e0: 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46   { 19, 4, JT_LEF
16f0: 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  T|JT_RIGHT|JT_OU
1700: 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e  TER },.    /* in
1710: 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35  ner   */ { 23, 5
1720: 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20 20  , JT_INNER      
1730: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
1740: 20 20 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f     /* cross   */
1750: 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e   { 28, 5, JT_INN
1760: 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20 20  ER|JT_CROSS     
1770: 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e      },.  };.  in
1780: 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b  t i, j;.  apAll[
1790: 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c  0] = pA;.  apAll
17a0: 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c  [1] = pB;.  apAl
17b0: 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72  l[2] = pC;.  for
17c0: 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41  (i=0; i<3 && apA
17d0: 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll[i]; i++){.   
17e0: 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20   p = apAll[i];. 
17f0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72     for(j=0; j<Ar
1800: 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64  raySize(aKeyword
1810: 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); j++){.      i
1820: 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72  f( p->n==aKeywor
1830: 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20  d[j].nChar .    
1840: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
1850: 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29  StrNICmp((char*)
1860: 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b  p->z, &zKeyText[
1870: 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20  aKeyword[j].i], 
1880: 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  p->n)==0 ){.    
1890: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20      jointype |= 
18a0: 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65  aKeyword[j].code
18b0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
18c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18d0: 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
18e0: 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d  0 || j==1 || j==
18f0: 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d  2 || j==3 || j==
1900: 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d  4 || j==5 || j==
1910: 36 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d  6 );.    if( j>=
1920: 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f  ArraySize(aKeywo
1930: 72 64 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69  rd) ){.      joi
1940: 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f  ntype |= JT_ERRO
1950: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
1960: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a      }.  }.  if(.
1970: 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26       (jointype &
1980: 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55   (JT_INNER|JT_OU
1990: 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52  TER))==(JT_INNER
19a0: 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20  |JT_OUTER) ||.  
19b0: 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a     (jointype & J
19c0: 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b  T_ERROR)!=0.  ){
19d0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
19e0: 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20 20 20  *zSp = " ";.    
19f0: 61 73 73 65 72 74 28 20 70 42 21 3d 30 20 29 3b  assert( pB!=0 );
1a00: 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29  .    if( pC==0 )
1a10: 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73  { zSp++; }.    s
1a20: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1a30: 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20  Parse, "unknown 
1a40: 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a  or unsupported j
1a50: 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20  oin type: ".    
1a60: 20 20 20 22 25 54 20 25 54 25 73 25 54 22 2c 20     "%T %T%s%T", 
1a70: 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43 29  pA, pB, zSp, pC)
1a80: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
1a90: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c   JT_INNER;.  }el
1aa0: 73 65 20 69 66 28 20 28 6a 6f 69 6e 74 79 70 65  se if( (jointype
1ab0: 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
1ac0: 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 6a 6f  .         && (jo
1ad0: 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46  intype & (JT_LEF
1ae0: 54 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a 54  T|JT_RIGHT))!=JT
1af0: 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 73 71 6c  _LEFT ){.    sql
1b00: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1b10: 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49 47  rse, .      "RIG
1b20: 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45  HT and FULL OUTE
1b30: 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20  R JOINs are not 
1b40: 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72  currently suppor
1b50: 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74  ted");.    joint
1b60: 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a  ype = JT_INNER;.
1b70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69    }.  return joi
1b80: 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ntype;.}../*.** 
1b90: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
1ba0: 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   of a column in 
1bb0: 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  a table.  Return
1bc0: 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75 6d   -1 if the colum
1bd0: 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74  n.** is not cont
1be0: 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62  ained in the tab
1bf0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1c00: 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61  t columnIndex(Ta
1c10: 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74  ble *pTab, const
1c20: 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20   char *zCol){.  
1c30: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1c40: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
1c50: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
1c60: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54 61  lite3StrICmp(pTa
1c70: 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  b->aCol[i].zName
1c80: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74  , zCol)==0 ) ret
1c90: 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
1ca0: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
1cb0: 20 53 65 61 72 63 68 20 74 68 65 20 66 69 72 73   Search the firs
1cc0: 74 20 4e 20 74 61 62 6c 65 73 20 69 6e 20 70 53  t N tables in pS
1cd0: 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  rc, from left to
1ce0: 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20   right, looking 
1cf0: 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74  for a.** table t
1d00: 68 61 74 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e  hat has a column
1d10: 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a   named zCol.  .*
1d20: 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c  *.** When found,
1d30: 20 73 65 74 20 2a 70 69 54 61 62 20 61 6e 64 20   set *piTab and 
1d40: 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65 20 74 61  *piCol to the ta
1d50: 62 6c 65 20 69 6e 64 65 78 20 61 6e 64 20 63 6f  ble index and co
1d60: 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66  lumn index.** of
1d70: 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f   the matching co
1d80: 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e 20  lumn and return 
1d90: 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  TRUE..**.** If n
1da0: 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  ot found, return
1db0: 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69   FALSE..*/.stati
1dc0: 63 20 69 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f  c int tableAndCo
1dd0: 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72 63  lumnIndex(.  Src
1de0: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
1df0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 61    /* Array of ta
1e00: 62 6c 65 73 20 74 6f 20 73 65 61 72 63 68 20 2a  bles to search *
1e10: 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
1e20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1e30: 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
1e40: 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61  pSrc->a[] to sea
1e50: 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  rch */.  const c
1e60: 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a  har *zCol,    /*
1e70: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   Name of the col
1e80: 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69  umn we are looki
1e90: 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ng for */.  int 
1ea0: 2a 70 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  *piTab,         
1eb0: 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20   /* Write index 
1ec0: 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72  of pSrc->a[] her
1ed0: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f  e */.  int *piCo
1ee0: 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  l           /* W
1ef0: 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53  rite index of pS
1f00: 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54  rc->a[*piTab].pT
1f10: 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20  ab->aCol[] here 
1f20: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f40: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
1f50: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 20   tables in pSrc 
1f60: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  */.  int iCol;  
1f70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1f80: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74  ex of column mat
1f90: 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20  ching zCol */.. 
1fa0: 20 61 73 73 65 72 74 28 20 28 70 69 54 61 62 3d   assert( (piTab=
1fb0: 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20  =0)==(piCol==0) 
1fc0: 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e  );  /* Both or n
1fd0: 65 69 74 68 65 72 20 61 72 65 20 4e 55 4c 4c 20  either are NULL 
1fe0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
1ff0: 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f  N; i++){.    iCo
2000: 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  l = columnIndex(
2010: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c  pSrc->a[i].pTab,
2020: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20   zCol);.    if( 
2030: 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iCol>=0 ){.     
2040: 20 69 66 28 20 70 69 54 61 62 20 29 7b 0a 20 20   if( piTab ){.  
2050: 20 20 20 20 20 20 2a 70 69 54 61 62 20 3d 20 69        *piTab = i
2060: 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c  ;.        *piCol
2070: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d   = iCol;.      }
2080: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2090: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
20a0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
20b0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
20c0: 20 75 73 65 64 20 74 6f 20 61 64 64 20 74 65 72   used to add ter
20d0: 6d 73 20 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f  ms implied by JO
20e0: 49 4e 20 73 79 6e 74 61 78 20 74 6f 20 74 68 65  IN syntax to the
20f0: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
2100: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 61   expression of a
2110: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2120: 74 2e 20 54 68 65 20 6e 65 77 20 74 65 72 6d 2c  t. The new term,
2130: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44   which.** is AND
2140: 65 64 20 77 69 74 68 20 74 68 65 20 65 78 69 73  ed with the exis
2150: 74 69 6e 67 20 57 48 45 52 45 20 63 6c 61 75 73  ting WHERE claus
2160: 65 2c 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  e, is of the for
2170: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62  m:.**.**    (tab
2180: 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f  1.col1 = tab2.co
2190: 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  l2).**.** where 
21a0: 74 61 62 31 20 69 73 20 74 68 65 20 69 53 72 63  tab1 is the iSrc
21b0: 27 74 68 20 74 61 62 6c 65 20 69 6e 20 53 72 63  'th table in Src
21c0: 4c 69 73 74 20 70 53 72 63 20 61 6e 64 20 74 61  List pSrc and ta
21d0: 62 32 20 69 73 20 74 68 65 20 0a 2a 2a 20 28 69  b2 is the .** (i
21e0: 53 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d  Src+1)'th. Colum
21f0: 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e  n col1 is column
2200: 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62   iColLeft of tab
2210: 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a  1, and col2 is.*
2220: 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67  * column iColRig
2230: 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73  ht of tab2..*/.s
2240: 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57 68  tatic void addWh
2250: 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65  ereTerm(.  Parse
2260: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2270: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2280: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
2290: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
22a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22b0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61     /* List of ta
22c0: 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61  bles in FROM cla
22d0: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  use */.  int iLe
22e0: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
22f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2300: 78 20 6f 66 20 66 69 72 73 74 20 74 61 62 6c 65  x of first table
2310: 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63   to join in pSrc
2320: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65   */.  int iColLe
2330: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
2340: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
2350: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73  f column in firs
2360: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  t table */.  int
2370: 20 69 52 69 67 68 74 2c 20 20 20 20 20 20 20 20   iRight,        
2380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2390: 49 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e 64 20  Index of second 
23a0: 74 61 62 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f  table in pSrc */
23b0: 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69 67 68 74  .  int iColRight
23c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23d0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
23e0: 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20  olumn in second 
23f0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
2400: 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20  sOuterJoin,     
2410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2420: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e  ue if this is an
2430: 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20   OUTER join */. 
2440: 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65 20   Expr **ppWhere 
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2460: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20   /* IN/OUT: The 
2470: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
2480: 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73  add to */.){.  s
2490: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
24a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20  rse->db;.  Expr 
24b0: 2a 70 45 31 3b 0a 20 20 45 78 70 72 20 2a 70 45  *pE1;.  Expr *pE
24c0: 32 3b 0a 20 20 45 78 70 72 20 2a 70 45 71 3b 0a  2;.  Expr *pEq;.
24d0: 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 66 74  .  assert( iLeft
24e0: 3c 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73  <iRight );.  ass
24f0: 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e  ert( pSrc->nSrc>
2500: 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65  iRight );.  asse
2510: 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66  rt( pSrc->a[iLef
2520: 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61 73 73  t].pTab );.  ass
2530: 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 52 69  ert( pSrc->a[iRi
2540: 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20  ght].pTab );..  
2550: 70 45 31 20 3d 20 73 71 6c 69 74 65 33 43 72 65  pE1 = sqlite3Cre
2560: 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62  ateColumnExpr(db
2570: 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69  , pSrc, iLeft, i
2580: 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32 20  ColLeft);.  pE2 
2590: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43  = sqlite3CreateC
25a0: 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53  olumnExpr(db, pS
25b0: 72 63 2c 20 69 52 69 67 68 74 2c 20 69 43 6f 6c  rc, iRight, iCol
25c0: 52 69 67 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d  Right);..  pEq =
25d0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
25e0: 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31  arse, TK_EQ, pE1
25f0: 2c 20 70 45 32 2c 20 30 29 3b 0a 20 20 69 66 28  , pE2, 0);.  if(
2600: 20 70 45 71 20 26 26 20 69 73 4f 75 74 65 72 4a   pEq && isOuterJ
2610: 6f 69 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53  oin ){.    ExprS
2620: 65 74 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20  etProperty(pEq, 
2630: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20  EP_FromJoin);.  
2640: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2650: 61 73 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20  asProperty(pEq, 
2660: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
2670: 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
2680: 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72  ExprSetVVAProper
2690: 74 79 28 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64  ty(pEq, EP_NoRed
26a0: 75 63 65 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69  uce);.    pEq->i
26b0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d  RightJoinTable =
26c0: 20 28 69 31 36 29 70 45 32 2d 3e 69 54 61 62 6c   (i16)pE2->iTabl
26d0: 65 3b 0a 20 20 7d 0a 20 20 2a 70 70 57 68 65 72  e;.  }.  *ppWher
26e0: 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  e = sqlite3ExprA
26f0: 6e 64 28 64 62 2c 20 2a 70 70 57 68 65 72 65 2c  nd(db, *ppWhere,
2700: 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pEq);.}../*.** 
2710: 53 65 74 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a  Set the EP_FromJ
2720: 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e 20  oin property on 
2730: 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
2740: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
2750: 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74 20 74 68  n..** And set th
2760: 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69  e Expr.iRightJoi
2770: 6e 54 61 62 6c 65 20 74 6f 20 69 54 61 62 6c 65  nTable to iTable
2780: 20 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20   for every term 
2790: 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  in the.** expres
27a0: 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sion..**.** The 
27b0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70  EP_FromJoin prop
27c0: 65 72 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20  erty is used on 
27d0: 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72  terms of an expr
27e0: 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a  ession to tell.*
27f0: 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52  * the LEFT OUTER
2800: 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67   JOIN processing
2810: 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68 69 73   logic that this
2820: 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66   term is part of
2830: 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73   the.** join res
2840: 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69  triction specifi
2850: 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  ed in the ON or 
2860: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64  USING clause and
2870: 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f   not a part.** o
2880: 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72  f the more gener
2890: 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  al WHERE clause.
28a0: 20 20 54 68 65 73 65 20 74 65 72 6d 73 20 61 72    These terms ar
28b0: 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20  e moved over to 
28c0: 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  the.** WHERE cla
28d0: 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20  use during join 
28e0: 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77  processing but w
28f0: 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62  e need to rememb
2900: 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20  er that they.** 
2910: 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68  originated in th
2920: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
2930: 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ause..**.** The 
2940: 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
2950: 61 62 6c 65 20 74 65 6c 6c 73 20 74 68 65 20 57  able tells the W
2960: 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
2970: 65 73 73 69 6e 67 20 74 68 61 74 20 74 68 65 0a  essing that the.
2980: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65  ** expression de
2990: 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c 65 20 69  pends on table i
29a0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65  RightJoinTable e
29b0: 76 65 6e 20 69 66 20 74 68 61 74 20 74 61 62 6c  ven if that tabl
29c0: 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c  e is not.** expl
29d0: 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64  icitly mentioned
29e0: 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   in the expressi
29f0: 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66 6f 72 6d  on.  That inform
2a00: 61 74 69 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a  ation is needed.
2a10: 2a 2a 20 66 6f 72 20 63 61 73 65 73 20 6c 69 6b  ** for cases lik
2a20: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
2a30: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2a40: 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f  1 LEFT JOIN t2 O
2a50: 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20  N t1.a=t2.b AND 
2a60: 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65  t1.x=5.**.** The
2a70: 20 77 68 65 72 65 20 63 6c 61 75 73 65 20 6e 65   where clause ne
2a80: 65 64 73 20 74 6f 20 64 65 66 65 72 20 74 68 65  eds to defer the
2a90: 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65   handling of the
2aa0: 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20   t1.x=5.** term 
2ab0: 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68 65 20  until after the 
2ac0: 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a  t2 loop of the j
2ad0: 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74 20 77 61  oin.  In that wa
2ae0: 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20  y, a.** NULL t2 
2af0: 72 6f 77 20 77 69 6c 6c 20 62 65 20 69 6e 73 65  row will be inse
2b00: 72 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 31  rted whenever t1
2b10: 2e 78 21 3d 35 2e 20 20 49 66 20 77 65 20 64 6f  .x!=5.  If we do
2b20: 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72 20 74 68   not.** defer th
2b30: 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31  e handling of t1
2b40: 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c 20 62 65  .x=5, it will be
2b50: 20 70 72 6f 63 65 73 73 65 64 20 69 6d 6d 65 64   processed immed
2b60: 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20  iately.** after 
2b70: 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20  the t1 loop and 
2b80: 72 6f 77 73 20 77 69 74 68 20 74 31 2e 78 21 3d  rows with t1.x!=
2b90: 35 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 70 70  5 will never app
2ba0: 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75  ear in.** the ou
2bb0: 74 70 75 74 2c 20 77 68 69 63 68 20 69 73 20 69  tput, which is i
2bc0: 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61  ncorrect..*/.sta
2bd0: 74 69 63 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e  tic void setJoin
2be0: 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e  Expr(Expr *p, in
2bf0: 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 77 68 69  t iTable){.  whi
2c00: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70  le( p ){.    Exp
2c10: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20  rSetProperty(p, 
2c20: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20  EP_FromJoin);.  
2c30: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2c40: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
2c50: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
2c60: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78  duced) );.    Ex
2c70: 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
2c80: 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29  (p, EP_NoReduce)
2c90: 3b 0a 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a  ;.    p->iRightJ
2ca0: 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29  oinTable = (i16)
2cb0: 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 65 74 4a  iTable;.    setJ
2cc0: 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74  oinExpr(p->pLeft
2cd0: 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70  , iTable);.    p
2ce0: 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20   = p->pRight;.  
2cf0: 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  } .}../*.** This
2d00: 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73   routine process
2d10: 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f  es the join info
2d20: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45  rmation for a SE
2d30: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
2d40: 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  ** ON and USING 
2d50: 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76  clauses are conv
2d60: 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61  erted into extra
2d70: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
2d80: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e  ERE clause..** N
2d90: 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73  ATURAL joins als
2da0: 6f 20 63 72 65 61 74 65 20 65 78 74 72 61 20 57  o create extra W
2db0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
2dc0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72  s..**.** The ter
2dd0: 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61  ms of a FROM cla
2de0: 75 73 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  use are containe
2df0: 64 20 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e  d in the Select.
2e00: 70 53 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a  pSrc structure..
2e10: 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74  ** The left most
2e20: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 66 69   table is the fi
2e30: 72 73 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c  rst entry in Sel
2e40: 65 63 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72  ect.pSrc.  The r
2e50: 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62  ight-most.** tab
2e60: 6c 65 20 69 73 20 74 68 65 20 6c 61 73 74 20 65  le is the last e
2e70: 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20  ntry.  The join 
2e80: 6f 70 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64  operator is held
2e90: 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f   in the entry to
2ea0: 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54  .** the left.  T
2eb0: 68 75 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74  hus entry 0 cont
2ec0: 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ains the join op
2ed0: 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a  erator for the j
2ee0: 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65  oin between.** e
2ef0: 6e 74 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20  ntries 0 and 1. 
2f00: 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47   Any ON or USING
2f10: 20 63 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61   clauses associa
2f20: 74 65 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69  ted with the joi
2f30: 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74  n are.** also at
2f40: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65  tached to the le
2f50: 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20  ft entry..**.** 
2f60: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
2f70: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
2f80: 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e  of errors encoun
2f90: 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  tered..*/.static
2fa0: 20 69 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65   int sqliteProce
2fb0: 73 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50  ssJoin(Parse *pP
2fc0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
2fd0: 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
2fe0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2ff0: 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65      /* All table
3000: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
3010: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ause */.  int i,
3020: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
3030: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
3040: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
3050: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
3060: 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20  tem *pLeft;     
3070: 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65  /* Left table be
3080: 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20  ing joined */.  
3090: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
30a0: 74 65 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20  tem *pRight;    
30b0: 2f 2a 20 52 69 67 68 74 20 74 61 62 6c 65 20 62  /* Right table b
30c0: 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a  eing joined */..
30d0: 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
30e0: 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72  ;.  pLeft = &pSr
30f0: 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68  c->a[0];.  pRigh
3100: 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20  t = &pLeft[1];. 
3110: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
3120: 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70  ->nSrc-1; i++, p
3130: 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b  Right++, pLeft++
3140: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c  ){.    Table *pL
3150: 65 66 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e  eftTab = pLeft->
3160: 70 54 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20  pTab;.    Table 
3170: 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70 52 69  *pRightTab = pRi
3180: 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  ght->pTab;.    i
3190: 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20  nt isOuter;..   
31a0: 20 69 66 28 20 4e 45 56 45 52 28 70 4c 65 66 74   if( NEVER(pLeft
31b0: 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74  Tab==0 || pRight
31c0: 54 61 62 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e  Tab==0) ) contin
31d0: 75 65 3b 0a 20 20 20 20 69 73 4f 75 74 65 72 20  ue;.    isOuter 
31e0: 3d 20 28 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74  = (pRight->joint
31f0: 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
3200: 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e  =0;..    /* When
3210: 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
3220: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c  word is present,
3230: 20 61 64 64 20 57 48 45 52 45 20 63 6c 61 75 73   add WHERE claus
3240: 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20  e terms for.    
3250: 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  ** every column 
3260: 74 68 61 74 20 74 68 65 20 74 77 6f 20 74 61 62  that the two tab
3270: 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d  les have in comm
3280: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
3290: 66 28 20 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74  f( pRight->joint
32a0: 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
32b0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52   ){.      if( pR
32c0: 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69  ight->pOn || pRi
32d0: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
32e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
32f0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3300: 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d  a NATURAL join m
3310: 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20  ay not have ".  
3320: 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20           "an ON 
3330: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22  or USING clause"
3340: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65  , 0);.        re
3350: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
3360: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
3370: 3c 70 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c  <pRightTab->nCol
3380: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
3390: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f  char *zName;   /
33a0: 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e  * Name of column
33b0: 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 74 61   in the right ta
33c0: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ble */.        i
33d0: 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a  nt iLeft;     /*
33e0: 20 4d 61 74 63 68 69 6e 67 20 6c 65 66 74 20 74   Matching left t
33f0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
3400: 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f  int iLeftCol;  /
3410: 2a 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  * Matching colum
3420: 6e 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61  n in the left ta
3430: 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ble */..        
3440: 7a 4e 61 6d 65 20 3d 20 70 52 69 67 68 74 54 61  zName = pRightTa
3450: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
3460: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 61  ;.        if( ta
3470: 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65  bleAndColumnInde
3480: 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61  x(pSrc, i+1, zNa
3490: 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65  me, &iLeft, &iLe
34a0: 66 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20  ftCol) ){.      
34b0: 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d      addWhereTerm
34c0: 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69  (pParse, pSrc, i
34d0: 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20  Left, iLeftCol, 
34e0: 69 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20  i+1, j,.        
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
3500: 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65  sOuter, &p->pWhe
3510: 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  re);.        }. 
3520: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
3530: 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f    /* Disallow bo
3540: 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  th ON and USING 
3550: 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73  clauses in the s
3560: 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a  ame join.    */.
3570: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
3580: 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70  pOn && pRight->p
3590: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73  Using ){.      s
35a0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
35b0: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68  Parse, "cannot h
35c0: 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20  ave both ON and 
35d0: 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20  USING ".        
35e0: 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20  "clauses in the 
35f0: 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20  same join");.   
3600: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3610: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74   }..    /* Add t
3620: 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20  he ON clause to 
3630: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
3640: 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e  HERE clause, con
3650: 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a  nected by.    **
3660: 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
3670: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
3680: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a   pRight->pOn ){.
3690: 20 20 20 20 20 20 69 66 28 20 69 73 4f 75 74 65        if( isOute
36a0: 72 20 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28  r ) setJoinExpr(
36b0: 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69  pRight->pOn, pRi
36c0: 67 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  ght->iCursor);. 
36d0: 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d       p->pWhere =
36e0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
36f0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
3700: 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70  Where, pRight->p
3710: 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68  On);.      pRigh
3720: 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20  t->pOn = 0;.    
3730: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  }..    /* Create
3740: 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20   extra terms on 
3750: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3760: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
3770: 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e   named.    ** in
3780: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
3790: 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20  e.  Example: If 
37a0: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74  the two tables t
37b0: 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20  o be joined are 
37c0: 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20  .    ** A and B 
37d0: 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c  and the USING cl
37e0: 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c  ause names X, Y,
37f0: 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64   and Z, then add
3800: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20   this.    ** to 
3810: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3820: 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44  :    A.X=B.X AND
3830: 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a   A.Y=B.Y AND A.Z
3840: 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f  =B.Z.    ** Repo
3850: 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61  rt an error if a
3860: 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f  ny column mentio
3870: 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47  ned in the USING
3880: 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a   clause is.    *
3890: 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  * not contained 
38a0: 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74  in both tables t
38b0: 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20  o be joined..   
38c0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
38d0: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
38e0: 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73      IdList *pLis
38f0: 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69  t = pRight->pUsi
3900: 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  ng;.      for(j=
3910: 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; j<pList->nId;
3920: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
3930: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
3940: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
3950: 65 72 6d 20 69 6e 20 74 68 65 20 55 53 49 4e 47  erm in the USING
3960: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
3970: 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20     int iLeft;   
3980: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e 20      /* Table on 
3990: 74 68 65 20 6c 65 66 74 20 77 69 74 68 20 6d 61  the left with ma
39a0: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61  tching column na
39b0: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  me */.        in
39c0: 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20 2f  t iLeftCol;    /
39d0: 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  * Column number 
39e0: 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  of matching colu
39f0: 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a  mn on the left *
3a00: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52  /.        int iR
3a10: 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f  ightCol;   /* Co
3a20: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d  lumn number of m
3a30: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f  atching column o
3a40: 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 0a  n the right */..
3a50: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
3a60: 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d  pList->a[j].zNam
3a70: 65 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67 68  e;.        iRigh
3a80: 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64  tCol = columnInd
3a90: 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e  ex(pRightTab, zN
3aa0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
3ab0: 28 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20 20  ( iRightCol<0.  
3ac0: 20 20 20 20 20 20 20 7c 7c 20 21 74 61 62 6c 65         || !table
3ad0: 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  AndColumnIndex(p
3ae0: 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c  Src, i+1, zName,
3af0: 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43   &iLeft, &iLeftC
3b00: 6f 6c 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ol).        ){. 
3b10: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
3b20: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3b30: 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73   "cannot join us
3b40: 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20  ing column %s - 
3b50: 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20  column ".       
3b60: 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e       "not presen
3b70: 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73  t in both tables
3b80: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
3b90: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
3ba0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3bb0: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 50   addWhereTerm(pP
3bc0: 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66  arse, pSrc, iLef
3bd0: 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31  t, iLeftCol, i+1
3be0: 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20 20  , iRightCol,.   
3bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c00: 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70    isOuter, &p->p
3c10: 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Where);.      }.
3c20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
3c30: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  rn 0;.}../* Forw
3c40: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
3c50: 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20  .static KeyInfo 
3c60: 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  *keyInfoFromExpr
3c70: 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
3c80: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
3c90: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
3ca0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
3cb0: 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72  List,     /* For
3cc0: 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62  m the KeyInfo ob
3cd0: 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73 20 45  ject from this E
3ce0: 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  xprList */.  int
3cf0: 20 69 53 74 61 72 74 2c 20 20 20 20 20 20 20 20   iStart,        
3d00: 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74 68 20    /* Begin with 
3d10: 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70  this column of p
3d20: 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  List */.  int nE
3d30: 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20 2f  xtra           /
3d40: 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20  * Add this many 
3d50: 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f  extra columns to
3d60: 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 3b 0a 0a   the end */.);..
3d70: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
3d80: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 70 75  ode that will pu
3d90: 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e  sh the record in
3da0: 20 72 65 67 69 73 74 65 72 73 20 72 65 67 44 61   registers regDa
3db0: 74 61 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72 65  ta.** through re
3dc0: 67 44 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f 6e  gData+nData-1 on
3dd0: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a  to the sorter..*
3de0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75  /.static void pu
3df0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
3e00: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
3e10: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72         /* Parser
3e20: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f   context */.  So
3e30: 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20  rtCtx *pSort,   
3e40: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
3e50: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 4f 52  ion about the OR
3e60: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
3e70: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
3e80: 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ct,       /* The
3e90: 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74   whole SELECT st
3ea0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
3eb0: 20 72 65 67 44 61 74 61 2c 20 20 20 20 20 20 20   regData,       
3ec0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67      /* First reg
3ed0: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61  ister holding da
3ee0: 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20  ta to be sorted 
3ef0: 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20  */.  int nData, 
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3f10: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
3f20: 73 20 69 6e 20 74 68 65 20 64 61 74 61 20 61 72  s in the data ar
3f30: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72  ray */.  int nPr
3f40: 65 66 69 78 52 65 67 20 20 20 20 20 20 20 20 20  efixReg         
3f50: 2f 2a 20 4e 6f 2e 20 6f 66 20 72 65 67 20 70 72  /* No. of reg pr
3f60: 69 6f 72 20 74 6f 20 72 65 67 44 61 74 61 20 61  ior to regData a
3f70: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
3f80: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
3f90: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
3fa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6d            /* Stm
3fc0: 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
3fd0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 53  tion */.  int bS
3fe0: 65 71 20 3d 20 28 28 70 53 6f 72 74 2d 3e 73 6f  eq = ((pSort->so
3ff0: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
4000: 41 47 5f 55 73 65 53 6f 72 74 65 72 29 3d 3d 30  AG_UseSorter)==0
4010: 29 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d  );.  int nExpr =
4020: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
4030: 2d 3e 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20  ->nExpr;        
4040: 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20        /* No. of 
4050: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a  ORDER BY terms *
4060: 2f 0a 20 20 69 6e 74 20 6e 42 61 73 65 20 3d 20  /.  int nBase = 
4070: 6e 45 78 70 72 20 2b 20 62 53 65 71 20 2b 20 6e  nExpr + bSeq + n
4080: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
4090: 20 20 20 20 20 2f 2a 20 46 69 65 6c 64 73 20 69       /* Fields i
40a0: 6e 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  n sorter record 
40b0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65  */.  int regBase
40c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
40d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40e0: 20 20 20 20 20 20 2f 2a 20 52 65 67 73 20 66 6f        /* Regs fo
40f0: 72 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  r sorter record 
4100: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  */.  int regReco
4110: 72 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rd = ++pParse->n
4120: 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
4130: 20 20 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c        /* Assembl
4140: 65 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  ed sorter record
4150: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74   */.  int nOBSat
4160: 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74   = pSort->nOBSat
4170: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4180: 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20         /* ORDER 
4190: 42 59 20 74 65 72 6d 73 20 74 6f 20 73 6b 69 70  BY terms to skip
41a0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f           /* Opco
41d0: 64 65 20 74 6f 20 61 64 64 20 73 6f 72 74 65 72  de to add sorter
41e0: 20 72 65 63 6f 72 64 20 74 6f 20 73 6f 72 74 65   record to sorte
41f0: 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
4200: 62 53 65 71 3d 3d 30 20 7c 7c 20 62 53 65 71 3d  bSeq==0 || bSeq=
4210: 3d 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 72 65  =1 );.  if( nPre
4220: 66 69 78 52 65 67 20 29 7b 0a 20 20 20 20 61 73  fixReg ){.    as
4230: 73 65 72 74 28 20 6e 50 72 65 66 69 78 52 65 67  sert( nPrefixReg
4240: 3d 3d 6e 45 78 70 72 2b 62 53 65 71 20 29 3b 0a  ==nExpr+bSeq );.
4250: 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 72 65      regBase = re
4260: 67 44 61 74 61 20 2d 20 6e 45 78 70 72 20 2d 20  gData - nExpr - 
4270: 62 53 65 71 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  bSeq;.  }else{. 
4280: 20 20 20 72 65 67 42 61 73 65 20 3d 20 70 50 61     regBase = pPa
4290: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
42a0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
42b0: 2b 3d 20 6e 42 61 73 65 3b 0a 20 20 7d 0a 20 20  += nBase;.  }.  
42c0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
42d0: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
42e0: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c  pSort->pOrderBy,
42f0: 20 72 65 67 42 61 73 65 2c 20 53 51 4c 49 54 45   regBase, SQLITE
4300: 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20 69 66  _ECEL_DUP);.  if
4310: 28 20 62 53 65 71 20 29 7b 0a 20 20 20 20 73 71  ( bSeq ){.    sq
4320: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
4330: 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20  v, OP_Sequence, 
4340: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c  pSort->iECursor,
4350: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b   regBase+nExpr);
4360: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 72 65 66  .  }.  if( nPref
4370: 69 78 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ixReg==0 ){.    
4380: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4390: 33 28 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20 72 65  3(v, OP_Move, re
43a0: 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e  gData, regBase+n
43b0: 45 78 70 72 2b 62 53 65 71 2c 20 6e 44 61 74 61  Expr+bSeq, nData
43c0: 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
43d0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
43e0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
43f0: 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42  gBase+nOBSat, nB
4400: 61 73 65 2d 6e 4f 42 53 61 74 2c 20 72 65 67 52  ase-nOBSat, regR
4410: 65 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 6e 4f  ecord);.  if( nO
4420: 42 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e  BSat>0 ){.    in
4430: 74 20 72 65 67 50 72 65 76 4b 65 79 3b 20 20 20  t regPrevKey;   
4440: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 6e 4f 42  /* The first nOB
4450: 53 61 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  Sat columns of t
4460: 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20  he previous row 
4470: 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 46  */.    int addrF
4480: 69 72 73 74 3b 20 20 20 20 2f 2a 20 41 64 64 72  irst;    /* Addr
4490: 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 49 66  ess of the OP_If
44a0: 4e 6f 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  Not opcode */.  
44b0: 20 20 69 6e 74 20 61 64 64 72 4a 6d 70 3b 20 20    int addrJmp;  
44c0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
44d0: 66 20 74 68 65 20 4f 50 5f 4a 75 6d 70 20 6f 70  f the OP_Jump op
44e0: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 56 64 62 65  code */.    Vdbe
44f0: 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 2f 2a  Op *pOp;      /*
4500: 20 4f 70 63 6f 64 65 20 74 68 61 74 20 6f 70 65   Opcode that ope
4510: 6e 73 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f  ns the sorter */
4520: 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20  .    int nKey;  
4530: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4540: 20 6f 66 20 73 6f 72 74 69 6e 67 20 6b 65 79 20   of sorting key 
4550: 63 6f 6c 75 6d 6e 73 2c 20 69 6e 63 6c 75 64 69  columns, includi
4560: 6e 67 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 2a  ng OP_Sequence *
4570: 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  /.    KeyInfo *p
4580: 4b 49 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  KI;     /* Origi
4590: 6e 61 6c 20 4b 65 79 49 6e 66 6f 20 6f 6e 20 74  nal KeyInfo on t
45a0: 68 65 20 73 6f 72 74 65 72 20 74 61 62 6c 65 20  he sorter table 
45b0: 2a 2f 0a 0a 20 20 20 20 72 65 67 50 72 65 76 4b  */..    regPrevK
45c0: 65 79 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ey = pParse->nMe
45d0: 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
45e0: 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e  >nMem += pSort->
45f0: 6e 4f 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65 79  nOBSat;.    nKey
4600: 20 3d 20 6e 45 78 70 72 20 2d 20 70 53 6f 72 74   = nExpr - pSort
4610: 2d 3e 6e 4f 42 53 61 74 20 2b 20 62 53 65 71 3b  ->nOBSat + bSeq;
4620: 0a 20 20 20 20 69 66 28 20 62 53 65 71 20 29 7b  .    if( bSeq ){
4630: 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73 74  .      addrFirst
4640: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
4650: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
4660: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29  , regBase+nExpr)
4670: 3b 20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ; .    }else{.  
4680: 20 20 20 20 61 64 64 72 46 69 72 73 74 20 3d 20      addrFirst = 
4690: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
46a0: 31 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  1(v, OP_Sequence
46b0: 54 65 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43  Test, pSort->iEC
46c0: 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20  ursor);.    }.  
46d0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
46e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
46f0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
4700: 6f 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76 4b  ompare, regPrevK
4710: 65 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53 6f  ey, regBase, pSo
4720: 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20  rt->nOBSat);.   
4730: 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
4740: 62 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74  beGetOp(v, pSort
4750: 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  ->addrSortIndex)
4760: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  ;.    if( pParse
4770: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
4780: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ed ) return;.   
4790: 20 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79 20   pOp->p2 = nKey 
47a0: 2b 20 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b 49  + nData;.    pKI
47b0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49   = pOp->p4.pKeyI
47c0: 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  nfo;.    memset(
47d0: 70 4b 49 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c  pKI->aSortOrder,
47e0: 20 30 2c 20 70 4b 49 2d 3e 6e 46 69 65 6c 64 29   0, pKI->nField)
47f0: 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50 5f 4a 75  ; /* Makes OP_Ju
4800: 6d 70 20 62 65 6c 6f 77 20 74 65 73 74 61 62 6c  mp below testabl
4810: 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  e */.    sqlite3
4820: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
4830: 2d 31 2c 20 28 63 68 61 72 2a 29 70 4b 49 2c 20  -1, (char*)pKI, 
4840: 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
4850: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
4860: 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
4870: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
4880: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c  pSort->pOrderBy,
4890: 20 6e 4f 42 53 61 74 2c 20 31 29 3b 0a 20 20 20   nOBSat, 1);.   
48a0: 20 61 64 64 72 4a 6d 70 20 3d 20 73 71 6c 69 74   addrJmp = sqlit
48b0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
48c0: 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(v);.    sqlite
48d0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
48e0: 50 5f 4a 75 6d 70 2c 20 61 64 64 72 4a 6d 70 2b  P_Jump, addrJmp+
48f0: 31 2c 20 30 2c 20 61 64 64 72 4a 6d 70 2b 31 29  1, 0, addrJmp+1)
4900: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
4910: 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e 6c 61  );.    pSort->la
4920: 62 65 6c 42 6b 4f 75 74 20 3d 20 73 71 6c 69 74  belBkOut = sqlit
4930: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
4940: 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e 72  v);.    pSort->r
4950: 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
4960: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
4970: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
4980: 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53  (v, OP_Gosub, pS
4990: 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  ort->regReturn, 
49a0: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
49b0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
49c0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
49d0: 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70 53 6f  ResetSorter, pSo
49e0: 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20  rt->iECursor);. 
49f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
4a00: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 46 69  mpHere(v, addrFi
4a10: 72 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rst);.    sqlite
4a20: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4a30: 50 5f 4d 6f 76 65 2c 20 72 65 67 42 61 73 65 2c  P_Move, regBase,
4a40: 20 72 65 67 50 72 65 76 4b 65 79 2c 20 70 53 6f   regPrevKey, pSo
4a50: 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20  rt->nOBSat);.   
4a60: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
4a70: 48 65 72 65 28 76 2c 20 61 64 64 72 4a 6d 70 29  Here(v, addrJmp)
4a80: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72  ;.  }.  if( pSor
4a90: 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53  t->sortFlags & S
4aa0: 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65  ORTFLAG_UseSorte
4ab0: 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50  r ){.    op = OP
4ac0: 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 3b 0a 20  _SorterInsert;. 
4ad0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d   }else{.    op =
4ae0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 3b 0a 20   OP_IdxInsert;. 
4af0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
4b00: 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 70 53  AddOp2(v, op, pS
4b10: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72  ort->iECursor, r
4b20: 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 69 66 28  egRecord);.  if(
4b30: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
4b40: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
4b50: 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 69 6e  1, addr2;.    in
4b60: 74 20 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69 66  t iLimit;.    if
4b70: 28 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73  ( pSelect->iOffs
4b80: 65 74 20 29 7b 0a 20 20 20 20 20 20 69 4c 69 6d  et ){.      iLim
4b90: 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f  it = pSelect->iO
4ba0: 66 66 73 65 74 2b 31 3b 0a 20 20 20 20 7d 65 6c  ffset+1;.    }el
4bb0: 73 65 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74  se{.      iLimit
4bc0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d   = pSelect->iLim
4bd0: 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64  it;.    }.    ad
4be0: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
4bf0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
4c00: 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29 3b 20 56  Zero, iLimit); V
4c10: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
4c20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4c30: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
4c40: 6d 6d 2c 20 69 4c 69 6d 69 74 2c 20 2d 31 29 3b  mm, iLimit, -1);
4c50: 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c  .    addr2 = sql
4c60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
4c70: 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20  , OP_Goto);.    
4c80: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
4c90: 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
4ca0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4cb0: 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73 74 2c  dOp1(v, OP_Last,
4cc0: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
4cd0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4ce0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44  beAddOp1(v, OP_D
4cf0: 65 6c 65 74 65 2c 20 70 53 6f 72 74 2d 3e 69 45  elete, pSort->iE
4d00: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c  Cursor);.    sql
4d10: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
4d20: 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 7d 0a  (v, addr2);.  }.
4d30: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64  }../*.** Add cod
4d40: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
4d50: 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61  he OFFSET.*/.sta
4d60: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66  tic void codeOff
4d70: 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  set(.  Vdbe *v, 
4d80: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
4d90: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
4da0: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
4db0: 69 4f 66 66 73 65 74 2c 20 20 20 20 20 20 2f 2a  iOffset,      /*
4dc0: 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
4dd0: 67 20 74 68 65 20 6f 66 66 73 65 74 20 63 6f 75  g the offset cou
4de0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43  nter */.  int iC
4df0: 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a  ontinue     /* J
4e00: 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
4e10: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63   the current rec
4e20: 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ord */.){.  if( 
4e30: 69 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20  iOffset>0 ){.   
4e40: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 73   int addr;.    s
4e50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
4e60: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 69  (v, OP_AddImm, i
4e70: 4f 66 66 73 65 74 2c 20 2d 31 29 3b 0a 20 20 20  Offset, -1);.   
4e80: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
4e90: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
4ea0: 49 66 4e 65 67 2c 20 69 4f 66 66 73 65 74 29 3b  IfNeg, iOffset);
4eb0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
4ec0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
4ed0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
4ee0: 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65  to, 0, iContinue
4ef0: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
4f00: 6e 74 28 28 76 2c 20 22 73 6b 69 70 20 4f 46 46  nt((v, "skip OFF
4f10: 53 45 54 20 72 65 63 6f 72 64 73 22 29 29 3b 0a  SET records"));.
4f20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
4f30: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
4f40: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
4f50: 64 64 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  dd code that wil
4f60: 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  l check to make 
4f70: 73 75 72 65 20 74 68 65 20 4e 20 72 65 67 69 73  sure the N regis
4f80: 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74  ters starting at
4f90: 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20   iMem.** form a 
4fa0: 64 69 73 74 69 6e 63 74 20 65 6e 74 72 79 2e 20  distinct entry. 
4fb0: 20 69 54 61 62 20 69 73 20 61 20 73 6f 72 74 69   iTab is a sorti
4fc0: 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f  ng index that ho
4fd0: 6c 64 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a  lds previously.*
4fe0: 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69  * seen combinati
4ff0: 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20 76 61 6c  ons of the N val
5000: 75 65 73 2e 20 20 41 20 6e 65 77 20 65 6e 74 72  ues.  A new entr
5010: 79 20 69 73 20 6d 61 64 65 20 69 6e 20 69 54 61  y is made in iTa
5020: 62 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72 72  b.** if the curr
5030: 65 6e 74 20 4e 20 76 61 6c 75 65 73 20 61 72 65  ent N values are
5040: 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75   new..**.** A ju
5050: 6d 70 20 74 6f 20 61 64 64 72 52 65 70 65 61 74  mp to addrRepeat
5060: 20 69 73 20 6d 61 64 65 20 61 6e 64 20 74 68 65   is made and the
5070: 20 4e 2b 31 20 76 61 6c 75 65 73 20 61 72 65 20   N+1 values are 
5080: 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 0a  popped from the.
5090: 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65 20  ** stack if the 
50a0: 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61  top N elements a
50b0: 72 65 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e  re not distinct.
50c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
50d0: 63 6f 64 65 44 69 73 74 69 6e 63 74 28 0a 20 20  codeDistinct(.  
50e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
50f0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
5100: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
5110: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
5120: 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20  nt iTab,        
5130: 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20 69    /* A sorting i
5140: 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74 65 73  ndex used to tes
5150: 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e 65  t for distinctne
5160: 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ss */.  int addr
5170: 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75  Repeat,    /* Ju
5180: 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e 6f  mp to here if no
5190: 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  t distinct */.  
51a0: 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20  int N,          
51b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
51c0: 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e  elements */.  in
51d0: 74 20 69 4d 65 6d 20 20 20 20 20 20 20 20 20 20  t iMem          
51e0: 20 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d 65 6e   /* First elemen
51f0: 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  t */.){.  Vdbe *
5200: 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20  v;.  int r1;..  
5210: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
5220: 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65  e;.  r1 = sqlite
5230: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
5240: 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  se);.  sqlite3Vd
5250: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
5260: 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61  P_Found, iTab, a
5270: 64 64 72 52 65 70 65 61 74 2c 20 69 4d 65 6d 2c  ddrRepeat, iMem,
5280: 20 4e 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   N); VdbeCoverag
5290: 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
52a0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
52b0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d  MakeRecord, iMem
52c0: 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69  , N, r1);.  sqli
52d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
52e0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
52f0: 54 61 62 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69  Tab, r1);.  sqli
5300: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
5310: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d  g(pParse, r1);.}
5320: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
5330: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
5340: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
5350: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77   error message w
5360: 68 65 6e 20 61 20 53 45 4c 45 43 54 20 69 73 20  hen a SELECT is 
5370: 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 73 75  used within a su
5380: 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 28  bexpression.** (
5390: 65 78 61 6d 70 6c 65 3a 20 20 22 61 20 49 4e 20  example:  "a IN 
53a0: 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  (SELECT * FROM t
53b0: 61 62 6c 65 29 22 29 20 62 75 74 20 69 74 20 68  able)") but it h
53c0: 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 31 20 72  as more than 1 r
53d0: 65 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e  esult.** column.
53e0: 20 20 57 65 20 64 6f 20 74 68 69 73 20 69 6e 20    We do this in 
53f0: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 62 65 63  a subroutine bec
5400: 61 75 73 65 20 74 68 65 20 65 72 72 6f 72 20 75  ause the error u
5410: 73 65 64 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20  sed to occur.** 
5420: 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63  in multiple plac
5430: 65 73 2e 20 20 28 54 68 65 20 65 72 72 6f 72 20  es.  (The error 
5440: 6f 6e 6c 79 20 6f 63 63 75 72 73 20 69 6e 20 6f  only occurs in o
5450: 6e 65 20 70 6c 61 63 65 20 6e 6f 77 2c 20 62 75  ne place now, bu
5460: 74 20 77 65 0a 2a 2a 20 72 65 74 61 69 6e 20 74  t we.** retain t
5470: 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f  he subroutine to
5480: 20 6d 69 6e 69 6d 69 7a 65 20 63 6f 64 65 20 64   minimize code d
5490: 69 73 72 75 70 74 69 6f 6e 2e 29 0a 2a 2f 0a 73  isruption.).*/.s
54a0: 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 46  tatic int checkF
54b0: 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c  orMultiColumnSel
54c0: 65 63 74 45 72 72 6f 72 28 0a 20 20 50 61 72 73  ectError(.  Pars
54d0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
54e0: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
54f0: 74 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  t. */.  SelectDe
5500: 73 74 20 2a 70 44 65 73 74 2c 20 20 20 2f 2a 20  st *pDest,   /* 
5510: 44 65 73 74 69 6e 61 74 69 6f 6e 20 6f 66 20 53  Destination of S
5520: 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 2a 2f  ELECT results */
5530: 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 20 20 20  .  int nExpr    
5540: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5550: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
5560: 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  mns returned by 
5570: 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20 20 69  SELECT */.){.  i
5580: 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74  nt eDest = pDest
5590: 2d 3e 65 44 65 73 74 3b 0a 20 20 69 66 28 20 6e  ->eDest;.  if( n
55a0: 45 78 70 72 3e 31 20 26 26 20 28 65 44 65 73 74  Expr>1 && (eDest
55b0: 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65  ==SRT_Mem || eDe
55c0: 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 29 7b 0a  st==SRT_Set) ){.
55d0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
55e0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c  Msg(pParse, "onl
55f0: 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c  y a single resul
5600: 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a  t allowed for ".
5610: 20 20 20 20 20 20 20 22 61 20 53 45 4c 45 43 54         "a SELECT
5620: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
5630: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29   an expression")
5640: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
5650: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
5660: 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  urn 0;.  }.}.#en
5670: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
5680: 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
5690: 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74  s the code for t
56a0: 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65  he inside of the
56b0: 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f   inner loop.** o
56c0: 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a  f a SELECT..**.*
56d0: 2a 20 49 66 20 73 72 63 54 61 62 20 69 73 20 6e  * If srcTab is n
56e0: 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68  egative, then th
56f0: 65 20 70 45 4c 69 73 74 20 65 78 70 72 65 73 73  e pEList express
5700: 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c  ions.** are eval
5710: 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74  uated in order t
5720: 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20 66  o get the data f
5730: 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66  or this row.  If
5740: 20 73 72 63 54 61 62 20 69 73 0a 2a 2a 20 7a 65   srcTab is.** ze
5750: 72 6f 20 6f 72 20 6d 6f 72 65 2c 20 74 68 65 6e  ro or more, then
5760: 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20   data is pulled 
5770: 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20  from srcTab and 
5780: 70 45 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f  pEList is used o
5790: 6e 6c 79 20 0a 2a 2a 20 74 6f 20 67 65 74 20 6e  nly .** to get n
57a0: 75 6d 62 65 72 20 63 6f 6c 75 6d 6e 73 20 61 6e  umber columns an
57b0: 64 20 74 68 65 20 64 61 74 61 74 79 70 65 20 66  d the datatype f
57c0: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a  or each column..
57d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
57e0: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a  electInnerLoop(.
57f0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
5800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5810: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
5820: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
5830: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5840: 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c  The complete sel
5850: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ect statement be
5860: 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45  ing coded */.  E
5870: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
5880: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
5890: 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65  f values being e
58a0: 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e  xtracted */.  in
58b0: 74 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20  t srcTab,       
58c0: 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61        /* Pull da
58d0: 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62  ta from this tab
58e0: 6c 65 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20  le */.  SortCtx 
58f0: 2a 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20 20  *pSort,         
5900: 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  /* If not NULL, 
5910: 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70  info on how to p
5920: 72 6f 63 65 73 73 20 4f 52 44 45 52 20 42 59 20  rocess ORDER BY 
5930: 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78  */.  DistinctCtx
5940: 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20   *pDistinct, /* 
5950: 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66  If not NULL, inf
5960: 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63  o on how to proc
5970: 65 73 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a  ess DISTINCT */.
5980: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
5990: 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77  est,      /* How
59a0: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74   to dispose of t
59b0: 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  he results */.  
59c0: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20  int iContinue,  
59d0: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
59e0: 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65  here to continue
59f0: 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a   with next row *
5a00: 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20  /.  int iBreak  
5a10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
5a20: 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61  ump here to brea
5a30: 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e  k out of the inn
5a40: 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20  er loop */.){.  
5a50: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
5a60: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
5a70: 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74 69  ;.  int hasDisti
5a80: 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  nct;        /* T
5a90: 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
5aa0: 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  NCT keyword is p
5ab0: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
5ac0: 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20  regResult;      
5ad0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74          /* Start
5ae0: 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69   of memory holdi
5af0: 6e 67 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  ng result set */
5b00: 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70  .  int eDest = p
5b10: 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f  Dest->eDest;   /
5b20: 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
5b30: 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20   of results */. 
5b40: 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65   int iParm = pDe
5b50: 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20 2f 2a 20  st->iSDParm; /* 
5b60: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
5b70: 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f  o disposal metho
5b80: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75  d */.  int nResu
5b90: 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  ltCol;          
5ba0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
5bb0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a  result columns *
5bc0: 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52  /.  int nPrefixR
5bd0: 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  eg = 0;         
5be0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
5bf0: 72 61 20 72 65 67 69 73 74 65 72 73 20 62 65 66  ra registers bef
5c00: 6f 72 65 20 72 65 67 52 65 73 75 6c 74 20 2a 2f  ore regResult */
5c10: 0a 0a 20 20 61 73 73 65 72 74 28 20 76 20 29 3b  ..  assert( v );
5c20: 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73  .  assert( pELis
5c30: 74 21 3d 30 20 29 3b 0a 20 20 68 61 73 44 69 73  t!=0 );.  hasDis
5c40: 74 69 6e 63 74 20 3d 20 70 44 69 73 74 69 6e 63  tinct = pDistinc
5c50: 74 20 3f 20 70 44 69 73 74 69 6e 63 74 2d 3e 65  t ? pDistinct->e
5c60: 54 6e 63 74 54 79 70 65 20 3a 20 57 48 45 52 45  TnctType : WHERE
5c70: 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a  _DISTINCT_NOOP;.
5c80: 20 20 69 66 28 20 70 53 6f 72 74 20 26 26 20 70    if( pSort && p
5c90: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  Sort->pOrderBy==
5ca0: 30 20 29 20 70 53 6f 72 74 20 3d 20 30 3b 0a 20  0 ) pSort = 0;. 
5cb0: 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 26 26   if( pSort==0 &&
5cc0: 20 21 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b   !hasDistinct ){
5cd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f  .    assert( iCo
5ce0: 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20 20  ntinue!=0 );.   
5cf0: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
5d00: 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74  ->iOffset, iCont
5d10: 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  inue);.  }..  /*
5d20: 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73   Pull the reques
5d30: 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a  ted columns..  *
5d40: 2f 0a 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d  /.  nResultCol =
5d50: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
5d60: 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53  .  if( pDest->iS
5d70: 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  dst==0 ){.    if
5d80: 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  ( pSort ){.     
5d90: 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20 70 53   nPrefixReg = pS
5da0: 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  ort->pOrderBy->n
5db0: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
5dc0: 21 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  !(pSort->sortFla
5dd0: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
5de0: 65 53 6f 72 74 65 72 29 20 29 20 6e 50 72 65 66  eSorter) ) nPref
5df0: 69 78 52 65 67 2b 2b 3b 0a 20 20 20 20 20 20 70  ixReg++;.      p
5e00: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
5e10: 50 72 65 66 69 78 52 65 67 3b 0a 20 20 20 20 7d  PrefixReg;.    }
5e20: 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73  .    pDest->iSds
5e30: 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  t = pParse->nMem
5e40: 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  +1;.    pParse->
5e50: 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43  nMem += nResultC
5e60: 6f 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ol;.  }else if( 
5e70: 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 6e 52 65  pDest->iSdst+nRe
5e80: 73 75 6c 74 43 6f 6c 20 3e 20 70 50 61 72 73 65  sultCol > pParse
5e90: 2d 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 2f 2a  ->nMem ){.    /*
5ea0: 20 54 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f   This is an erro
5eb0: 72 20 63 6f 6e 64 69 74 69 6f 6e 20 74 68 61 74  r condition that
5ec0: 20 63 61 6e 20 72 65 73 75 6c 74 2c 20 66 6f 72   can result, for
5ed0: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61   example, when a
5ee0: 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 6f   SELECT.    ** o
5ef0: 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  n the right-hand
5f00: 20 73 69 64 65 20 6f 66 20 61 6e 20 49 4e 53 45   side of an INSE
5f10: 52 54 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65  RT contains more
5f20: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
5f30: 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65 72  than.    ** ther
5f40: 65 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20 69 6e  e are columns in
5f50: 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68   the table on th
5f60: 65 20 6c 65 66 74 2e 20 20 54 68 65 20 65 72 72  e left.  The err
5f70: 6f 72 20 77 69 6c 6c 20 62 65 20 63 61 75 67 68  or will be caugh
5f80: 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 70  t.    ** and rep
5f90: 6f 72 74 65 64 20 6c 61 74 65 72 2e 20 20 42 75  orted later.  Bu
5fa0: 74 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b  t we need to mak
5fb0: 65 20 73 75 72 65 20 65 6e 6f 75 67 68 20 6d 65  e sure enough me
5fc0: 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74 65  mory is allocate
5fd0: 64 0a 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69  d.    ** to avoi
5fe0: 64 20 6f 74 68 65 72 20 73 70 75 72 69 6f 75 73  d other spurious
5ff0: 20 65 72 72 6f 72 73 20 69 6e 20 74 68 65 20 6d   errors in the m
6000: 65 61 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20 20 20  eantime. */.    
6010: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
6020: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 0a  nResultCol;.  }.
6030: 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d    pDest->nSdst =
6040: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 72   nResultCol;.  r
6050: 65 67 52 65 73 75 6c 74 20 3d 20 70 44 65 73 74  egResult = pDest
6060: 2d 3e 69 53 64 73 74 3b 0a 20 20 69 66 28 20 73  ->iSdst;.  if( s
6070: 72 63 54 61 62 3e 3d 30 20 29 7b 0a 20 20 20 20  rcTab>=0 ){.    
6080: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75  for(i=0; i<nResu
6090: 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ltCol; i++){.   
60a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
60b0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
60c0: 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c 20 72 65  n, srcTab, i, re
60d0: 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20 20 20 20  gResult+i);.    
60e0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
60f0: 2c 20 22 25 73 22 2c 20 70 45 4c 69 73 74 2d 3e  , "%s", pEList->
6100: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20  a[i].zName));.  
6110: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
6120: 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74  eDest!=SRT_Exist
6130: 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  s ){.    /* If t
6140: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  he destination i
6150: 73 20 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29  s an EXISTS(...)
6160: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
6170: 20 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76   actual.    ** v
6180: 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20 62  alues returned b
6190: 79 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65  y the SELECT are
61a0: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20   not required.. 
61b0: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
61c0: 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
61d0: 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  t(pParse, pEList
61e0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 0a 20 20 20  , regResult,.   
61f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
6200: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
6210: 74 7c 7c 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  t||eDest==SRT_Co
6220: 72 6f 75 74 69 6e 65 29 3f 53 51 4c 49 54 45 5f  routine)?SQLITE_
6230: 45 43 45 4c 5f 44 55 50 3a 30 29 3b 0a 20 20 7d  ECEL_DUP:0);.  }
6240: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49  ..  /* If the DI
6250: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77  STINCT keyword w
6260: 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68  as present on th
6270: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
6280: 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73  nt.  ** and this
6290: 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65   row has been se
62a0: 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20  en before, then 
62b0: 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73  do not make this
62c0: 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f   row.  ** part o
62d0: 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20  f the result..  
62e0: 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74  */.  if( hasDist
62f0: 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 77 69 74  inct ){.    swit
6300: 63 68 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65  ch( pDistinct->e
6310: 54 6e 63 74 54 79 70 65 20 29 7b 0a 20 20 20 20  TnctType ){.    
6320: 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
6330: 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b  TINCT_ORDERED: {
6340: 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20  .        VdbeOp 
6350: 2a 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20  *pOp;           
6360: 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65   /* No longer re
6370: 71 75 69 72 65 64 20 4f 70 65 6e 45 70 68 65 6d  quired OpenEphem
6380: 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20  eral instr. */. 
6390: 20 20 20 20 20 20 20 69 6e 74 20 69 4a 75 6d 70         int iJump
63a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
63b0: 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  * Jump destinati
63c0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  on */.        in
63d0: 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20  t regPrev;      
63e0: 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
63f0: 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20 2a 2f  s row content */
6400: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c  ..        /* All
6410: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
6420: 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
6430: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 50   */.        regP
6440: 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  rev = pParse->nM
6450: 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 70 50  em+1;.        pP
6460: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
6470: 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20 20  esultCol;..     
6480: 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65     /* Change the
6490: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
64a0: 6c 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 20  l coded earlier 
64b0: 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20  to an OP_Null.  
64c0: 20 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68        ** sets th
64d0: 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62 69  e MEM_Cleared bi
64e0: 74 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 72  t on the first r
64f0: 65 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a 20  egister of the. 
6500: 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
6510: 75 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20  us value.  This 
6520: 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 4f  will cause the O
6530: 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c  P_Ne below to al
6540: 77 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ways.        ** 
6550: 66 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72 73  fail on the firs
6560: 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
6570: 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20  he loop even if 
6580: 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20  the first.      
6590: 20 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20    ** row is all 
65a0: 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a  NULLs..        *
65b0: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
65c0: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
65d0: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
65e0: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
65f0: 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
6600: 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44 69  VdbeGetOp(v, pDi
6610: 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74  stinct->addrTnct
6620: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  );.        pOp->
6630: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c  opcode = OP_Null
6640: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
6650: 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  1 = 1;.        p
6660: 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65 76  Op->p2 = regPrev
6670: 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d 70  ;..        iJump
6680: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
6690: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 6e  rrentAddr(v) + n
66a0: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 20  ResultCol;.     
66b0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52     for(i=0; i<nR
66c0: 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  esultCol; i++){.
66d0: 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65            CollSe
66e0: 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  q *pColl = sqlit
66f0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
6700: 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  arse, pEList->a[
6710: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
6720: 20 20 20 20 20 69 66 28 20 69 3c 6e 52 65 73 75       if( i<nResu
6730: 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20  ltCol-1 ){.     
6740: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6750: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
6760: 65 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20  e, regResult+i, 
6770: 69 4a 75 6d 70 2c 20 72 65 67 50 72 65 76 2b 69  iJump, regPrev+i
6780: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  );.            V
6790: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
67a0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
67b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
67c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
67d0: 2c 20 4f 50 5f 45 71 2c 20 72 65 67 52 65 73 75  , OP_Eq, regResu
67e0: 6c 74 2b 69 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  lt+i, iContinue,
67f0: 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20   regPrev+i);.   
6800: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
6810: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
6820: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6830: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
6840: 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e  geP4(v, -1, (con
6850: 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  st char *)pColl,
6860: 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
6870: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
6880: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
6890: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
68a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
68b0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
68c0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
68d0: 76 29 3d 3d 69 4a 75 6d 70 20 29 3b 0a 20 20 20  v)==iJump );.   
68e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
68f0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
6900: 79 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65  y, regResult, re
6910: 67 50 72 65 76 2c 20 6e 52 65 73 75 6c 74 43 6f  gPrev, nResultCo
6920: 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72  l-1);.        br
6930: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
6940: 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
6950: 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20  ISTINCT_UNIQUE: 
6960: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6970: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
6980: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
6990: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
69a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
69b0: 7d 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  }..      default
69c0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  : {.        asse
69d0: 72 74 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65  rt( pDistinct->e
69e0: 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f  TnctType==WHERE_
69f0: 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52  DISTINCT_UNORDER
6a00: 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  ED );.        co
6a10: 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73  deDistinct(pPars
6a20: 65 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 74 61  e, pDistinct->ta
6a30: 62 54 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65  bTnct, iContinue
6a40: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 65  , nResultCol, re
6a50: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  gResult);.      
6a60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
6a70: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
6a80: 53 6f 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Sort==0 ){.     
6a90: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
6aa0: 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74  ->iOffset, iCont
6ab0: 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  inue);.    }.  }
6ac0: 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  ..  switch( eDes
6ad0: 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  t ){.    /* In t
6ae0: 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20  his mode, write 
6af0: 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75 6c  each query resul
6b00: 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20  t to the key of 
6b10: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  the temporary.  
6b20: 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d    ** table iParm
6b30: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
6b40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
6b50: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20  POUND_SELECT.   
6b60: 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a   case SRT_Union:
6b70: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b   {.      int r1;
6b80: 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
6b90: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
6ba0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
6bb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6bc0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
6bd0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
6be0: 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a 20 20 20  ultCol, r1);.   
6bf0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6c00: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
6c10: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29  sert, iParm, r1)
6c20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
6c30: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
6c40: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
6c50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
6c60: 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20     /* Construct 
6c70: 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68  a record from th
6c80: 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20  e query result, 
6c90: 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20  but instead of. 
6ca0: 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61     ** saving tha
6cb0: 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74  t record, use it
6cc0: 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c   as a key to del
6cd0: 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f  ete elements fro
6ce0: 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d  m.    ** the tem
6cf0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61  porary table iPa
6d00: 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  rm..    */.    c
6d10: 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20  ase SRT_Except: 
6d20: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
6d30: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6d40: 49 64 78 44 65 6c 65 74 65 2c 20 69 50 61 72 6d  IdxDelete, iParm
6d50: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
6d60: 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20  sultCol);.      
6d70: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
6d80: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
6d90: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
6da0: 43 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 74  CT */..    /* St
6db0: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61  ore the result a
6dc0: 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75  s data using a u
6dd0: 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a  nique key..    *
6de0: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 46  /.    case SRT_F
6df0: 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ifo:.    case SR
6e00: 54 5f 44 69 73 74 46 69 66 6f 3a 0a 20 20 20 20  T_DistFifo:.    
6e10: 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a  case SRT_Table:.
6e20: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68      case SRT_Eph
6e30: 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69  emTab: {.      i
6e40: 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
6e50: 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
6e60: 73 65 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31  se, nPrefixReg+1
6e70: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
6e80: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 61  e( eDest==SRT_Ta
6e90: 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ble );.      tes
6ea0: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
6eb0: 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20  T_EphemTab );.  
6ec0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6ed0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
6ee0: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
6ef0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72  t, nResultCol, r
6f00: 31 2b 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 23  1+nPrefixReg);.#
6f10: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6f20: 49 54 5f 43 54 45 0a 20 20 20 20 20 20 69 66 28  IT_CTE.      if(
6f30: 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74   eDest==SRT_Dist
6f40: 46 69 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Fifo ){.        
6f50: 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e  /* If the destin
6f60: 61 74 69 6f 6e 20 69 73 20 44 69 73 74 46 69 66  ation is DistFif
6f70: 6f 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28  o, then cursor (
6f80: 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e  iParm+1) is open
6f90: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61  .        ** on a
6fa0: 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65  n ephemeral inde
6fb0: 78 2e 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  x. If the curren
6fc0: 74 20 72 6f 77 20 69 73 20 61 6c 72 65 61 64 79  t row is already
6fd0: 20 70 72 65 73 65 6e 74 0a 20 20 20 20 20 20 20   present.       
6fe0: 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78   ** in the index
6ff0: 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 69  , do not write i
7000: 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e  t to the output.
7010: 20 49 66 20 6e 6f 74 2c 20 61 64 64 20 74 68 65   If not, add the
7020: 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72  .        ** curr
7030: 65 6e 74 20 72 6f 77 20 74 6f 20 74 68 65 20 69  ent row to the i
7040: 6e 64 65 78 20 61 6e 64 20 70 72 6f 63 65 65 64  ndex and proceed
7050: 20 77 69 74 68 20 77 72 69 74 69 6e 67 20 69 74   with writing it
7060: 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20   to the.        
7070: 2a 2a 20 6f 75 74 70 75 74 20 74 61 62 6c 65 20  ** output table 
7080: 61 73 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20  as well.  */.   
7090: 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
70a0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
70b0: 6e 74 41 64 64 72 28 76 29 20 2b 20 34 3b 0a 20  ntAddr(v) + 4;. 
70c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
70d0: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
70e0: 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31  P_Found, iParm+1
70f0: 2c 20 61 64 64 72 2c 20 72 31 2c 20 30 29 3b 20  , addr, r1, 0); 
7100: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
7110: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7120: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7130: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
7140: 6d 2b 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  m+1, r1);.      
7150: 20 20 61 73 73 65 72 74 28 20 70 53 6f 72 74 3d    assert( pSort=
7160: 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  =0 );.      }.#e
7170: 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70  ndif.      if( p
7180: 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
7190: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
71a0: 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c  Parse, pSort, p,
71b0: 20 72 31 2b 6e 50 72 65 66 69 78 52 65 67 2c 20   r1+nPrefixReg, 
71c0: 31 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a  1, nPrefixReg);.
71d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
71e0: 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71       int r2 = sq
71f0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
7200: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
7210: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7220: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
7230: 64 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20  d, iParm, r2);. 
7240: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7250: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
7260: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
7270: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73  , r2);.        s
7280: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
7290: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
72a0: 45 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71  END);.        sq
72b0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
72c0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
72d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
72e0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
72f0: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
7300: 31 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29  1, nPrefixReg+1)
7310: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7320: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
7330: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
7340: 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  RY.    /* If we 
7350: 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73  are creating a s
7360: 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20  et for an "expr 
7370: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
7380: 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20   construct,.    
7390: 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68  ** then there sh
73a0: 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65  ould be a single
73b0: 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61   item on the sta
73c0: 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a  ck.  Write this.
73d0: 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f      ** item into
73e0: 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77   the set table w
73f0: 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a  ith bogus data..
7400: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
7410: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
7420: 20 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c 74   assert( nResult
7430: 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Col==1 );.      
7440: 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20 3d  pDest->affSdst =
7450: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7460: 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72     sqlite3Compar
7470: 65 41 66 66 69 6e 69 74 79 28 70 45 4c 69 73 74  eAffinity(pEList
7480: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44  ->a[0].pExpr, pD
7490: 65 73 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20  est->affSdst);. 
74a0: 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29       if( pSort )
74b0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20  {.        /* At 
74c0: 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f 75  first glance you
74d0: 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65 20   would think we 
74e0: 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f  could optimize o
74f0: 75 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ut the.        *
7500: 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74 68  * ORDER BY in th
7510: 69 73 20 63 61 73 65 20 73 69 6e 63 65 20 74 68  is case since th
7520: 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72 69  e order of entri
7530: 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20 20  es in the set.  
7540: 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f        ** does no
7550: 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20 74  t matter.  But t
7560: 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 61 20  here might be a 
7570: 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69 6e  LIMIT clause, in
7580: 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a   which.        *
7590: 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64 65 72  * case the order
75a0: 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a   does matter */.
75b0: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
75c0: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70  Sorter(pParse, p
75d0: 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75  Sort, p, regResu
75e0: 6c 74 2c 20 31 2c 20 6e 50 72 65 66 69 78 52 65  lt, 1, nPrefixRe
75f0: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
7600: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20  .        int r1 
7610: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
7620: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
7630: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7640: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
7650: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
7660: 6c 74 2c 31 2c 72 31 2c 20 26 70 44 65 73 74 2d  lt,1,r1, &pDest-
7670: 3e 61 66 66 53 64 73 74 2c 20 31 29 3b 0a 20 20  >affSdst, 1);.  
7680: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
7690: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
76a0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
76b0: 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20 20  Result, 1);.    
76c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
76d0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
76e0: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
76f0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7700: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
7710: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
7720: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
7730: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
7740: 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73   If any row exis
7750: 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  t in the result 
7760: 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74  set, record that
7770: 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e   fact and abort.
7780: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
7790: 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20   SRT_Exists: {. 
77a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
77b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
77c0: 65 67 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b  eger, 1, iParm);
77d0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
77e0: 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
77f0: 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
7800: 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
7810: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7820: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
7830: 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65  is a scalar sele
7840: 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20  ct that is part 
7850: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
7860: 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74  , then.    ** st
7870: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
7880: 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  in the appropria
7890: 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  te memory cell a
78a0: 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20  nd break out.   
78b0: 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20   ** of the scan 
78c0: 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
78d0: 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b   case SRT_Mem: {
78e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
78f0: 52 65 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a  ResultCol==1 );.
7900: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
7910: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
7920: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
7930: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
7940: 65 73 75 6c 74 2c 20 31 2c 20 6e 50 72 65 66 69  esult, 1, nPrefi
7950: 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xReg);.      }el
7960: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
7970: 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
7980: 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c  pParse, regResul
7990: 74 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20  t, iParm, 1);.  
79a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
79b0: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a  IT clause will j
79c0: 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  ump out of the l
79d0: 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
79e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
79f0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
7a00: 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
7a10: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
7a20: 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20 53 52 54  */..    case SRT
7a30: 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 20 20 20 20  _Coroutine:     
7a40: 20 20 2f 2a 20 53 65 6e 64 20 64 61 74 61 20 74    /* Send data t
7a50: 6f 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a  o a co-routine *
7a60: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f  /.    case SRT_O
7a70: 75 74 70 75 74 3a 20 7b 20 20 20 20 20 20 20 20  utput: {        
7a80: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  /* Return the re
7a90: 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 74  sults */.      t
7aa0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
7ab0: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b  SRT_Coroutine );
7ac0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7ad0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
7ae0: 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ut );.      if( 
7af0: 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  pSort ){.       
7b00: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
7b10: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70  pParse, pSort, p
7b20: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
7b30: 73 75 6c 74 43 6f 6c 2c 20 6e 50 72 65 66 69 78  sultCol, nPrefix
7b40: 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Reg);.      }els
7b50: 65 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54  e if( eDest==SRT
7b60: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  _Coroutine ){.  
7b70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7b80: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
7b90: 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  eld, pDest->iSDP
7ba0: 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  arm);.      }els
7bb0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
7bc0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7bd0: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65  OP_ResultRow, re
7be0: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
7bf0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
7c00: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
7c10: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
7c20: 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  rse, regResult, 
7c30: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
7c40: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
7c50: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
7c60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
7c70: 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
7c80: 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61  e results into a
7c90: 20 70 72 69 6f 72 69 74 79 20 71 75 65 75 65 20   priority queue 
7ca0: 74 68 61 74 20 69 73 20 6f 72 64 65 72 20 61 63  that is order ac
7cb0: 63 6f 72 64 69 6e 67 20 74 6f 0a 20 20 20 20 2a  cording to.    *
7cc0: 2a 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72 42  * pDest->pOrderB
7cd0: 79 20 28 69 6e 20 70 53 4f 29 2e 20 20 70 44 65  y (in pSO).  pDe
7ce0: 73 74 2d 3e 69 53 44 50 61 72 6d 20 28 69 6e 20  st->iSDParm (in 
7cf0: 69 50 61 72 6d 29 20 69 73 20 74 68 65 20 63 75  iParm) is the cu
7d00: 72 73 6f 72 20 66 6f 72 20 61 6e 0a 20 20 20 20  rsor for an.    
7d10: 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 70 53  ** index with pS
7d20: 4f 2d 3e 6e 45 78 70 72 2b 32 20 63 6f 6c 75 6d  O->nExpr+2 colum
7d30: 6e 73 2e 20 20 42 75 69 6c 64 20 61 20 6b 65 79  ns.  Build a key
7d40: 20 75 73 69 6e 67 20 70 53 4f 20 66 6f 72 20 74   using pSO for t
7d50: 68 65 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20  he first.    ** 
7d60: 70 53 4f 2d 3e 6e 45 78 70 72 20 63 6f 6c 75 6d  pSO->nExpr colum
7d70: 6e 73 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75  ns, then make su
7d80: 72 65 20 61 6c 6c 20 6b 65 79 73 20 61 72 65 20  re all keys are 
7d90: 75 6e 69 71 75 65 20 62 79 20 61 64 64 69 6e 67  unique by adding
7da0: 20 61 0a 20 20 20 20 2a 2a 20 66 69 6e 61 6c 20   a.    ** final 
7db0: 4f 50 5f 53 65 71 75 65 6e 63 65 20 63 6f 6c 75  OP_Sequence colu
7dc0: 6d 6e 2e 20 20 54 68 65 20 6c 61 73 74 20 63 6f  mn.  The last co
7dd0: 6c 75 6d 6e 20 69 73 20 74 68 65 20 72 65 63 6f  lumn is the reco
7de0: 72 64 20 61 73 20 61 20 62 6c 6f 62 2e 0a 20 20  rd as a blob..  
7df0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
7e00: 54 5f 44 69 73 74 51 75 65 75 65 3a 0a 20 20 20  T_DistQueue:.   
7e10: 20 63 61 73 65 20 53 52 54 5f 51 75 65 75 65 3a   case SRT_Queue:
7e20: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65   {.      int nKe
7e30: 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 2c  y;.      int r1,
7e40: 20 72 32 2c 20 72 33 3b 0a 20 20 20 20 20 20 69   r2, r3;.      i
7e50: 6e 74 20 61 64 64 72 54 65 73 74 20 3d 20 30 3b  nt addrTest = 0;
7e60: 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
7e70: 2a 70 53 4f 3b 0a 20 20 20 20 20 20 70 53 4f 20  *pSO;.      pSO 
7e80: 3d 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72 42  = pDest->pOrderB
7e90: 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  y;.      assert(
7ea0: 20 70 53 4f 20 29 3b 0a 20 20 20 20 20 20 6e 4b   pSO );.      nK
7eb0: 65 79 20 3d 20 70 53 4f 2d 3e 6e 45 78 70 72 3b  ey = pSO->nExpr;
7ec0: 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
7ed0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
7ee0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 32 20  arse);.      r2 
7ef0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
7f00: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 4b  Range(pParse, nK
7f10: 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 72 33 20  ey+2);.      r3 
7f20: 3d 20 72 32 2b 6e 4b 65 79 2b 31 3b 0a 20 20 20  = r2+nKey+1;.   
7f30: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
7f40: 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20  T_DistQueue ){. 
7f50: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
7f60: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20   destination is 
7f70: 44 69 73 74 51 75 65 75 65 2c 20 74 68 65 6e 20  DistQueue, then 
7f80: 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31 29  cursor (iParm+1)
7f90: 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20   is open.       
7fa0: 20 2a 2a 20 6f 6e 20 61 20 73 65 63 6f 6e 64 20   ** on a second 
7fb0: 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20  ephemeral index 
7fc0: 74 68 61 74 20 68 6f 6c 64 73 20 61 6c 6c 20 76  that holds all v
7fd0: 61 6c 75 65 73 20 65 76 65 72 79 20 70 72 65 76  alues every prev
7fe0: 69 6f 75 73 6c 79 0a 20 20 20 20 20 20 20 20 2a  iously.        *
7ff0: 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 71  * added to the q
8000: 75 65 75 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ueue. */.       
8010: 20 61 64 64 72 54 65 73 74 20 3d 20 73 71 6c 69   addrTest = sqli
8020: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
8030: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50  (v, OP_Found, iP
8040: 61 72 6d 2b 31 2c 20 30 2c 20 0a 20 20 20 20 20  arm+1, 0, .     
8050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8070: 20 20 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52     regResult, nR
8080: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
8090: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
80a0: 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  v);.      }.    
80b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
80c0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
80d0: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
80e0: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 33 29   nResultCol, r3)
80f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  ;.      if( eDes
8100: 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65  t==SRT_DistQueue
8110: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8120: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8130: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
8140: 50 61 72 6d 2b 31 2c 20 72 33 29 3b 0a 20 20 20  Parm+1, r3);.   
8150: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8160: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
8170: 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
8180: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8190: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4b 65 79   for(i=0; i<nKey
81a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
81b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
81c0: 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 0a 20  2(v, OP_SCopy,. 
81d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81e0: 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75           regResu
81f0: 6c 74 20 2b 20 70 53 4f 2d 3e 61 5b 69 5d 2e 75  lt + pSO->a[i].u
8200: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d  .x.iOrderByCol -
8210: 20 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   1,.            
8220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 32                r2
8230: 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +i);.      }.   
8240: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8250: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65  dOp2(v, OP_Seque
8260: 6e 63 65 2c 20 69 50 61 72 6d 2c 20 72 32 2b 6e  nce, iParm, r2+n
8270: 4b 65 79 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Key);.      sqli
8280: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
8290: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
82a0: 72 32 2c 20 6e 4b 65 79 2b 32 2c 20 72 31 29 3b  r2, nKey+2, r1);
82b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
82c0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
82d0: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
82e0: 20 72 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20   r1);.      if( 
82f0: 61 64 64 72 54 65 73 74 20 29 20 73 71 6c 69 74  addrTest ) sqlit
8300: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
8310: 2c 20 61 64 64 72 54 65 73 74 29 3b 0a 20 20 20  , addrTest);.   
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 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
8340: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
8350: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
8360: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 32 2c 20  nge(pParse, r2, 
8370: 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 62  nKey+2);.      b
8380: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
8390: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
83a0: 54 5f 43 54 45 20 2a 2f 0a 0a 0a 0a 23 69 66 20  T_CTE */....#if 
83b0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
83c0: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20  OMIT_TRIGGER).  
83d0: 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65    /* Discard the
83e0: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20   results.  This 
83f0: 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45  is used for SELE
8400: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  CT statements in
8410: 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  side.    ** the 
8420: 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47 45  body of a TRIGGE
8430: 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20  R.  The purpose 
8440: 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73 20  of such selects 
8450: 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a  is to call.    *
8460: 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  * user-defined f
8470: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  unctions that ha
8480: 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73 2e  ve side effects.
8490: 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65    We do not care
84a0: 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68  .    ** about th
84b0: 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73  e actual results
84c0: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a   of the select..
84d0: 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
84e0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
84f0: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  rt( eDest==SRT_D
8500: 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20  iscard );.      
8510: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
8520: 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75  dif.  }..  /* Ju
8530: 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
8540: 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65   the loop if the
8550: 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65   LIMIT is reache
8560: 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66 0a 20  d.  Except, if. 
8570: 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 73   ** there is a s
8580: 6f 72 74 65 72 2c 20 69 6e 20 77 68 69 63 68 20  orter, in which 
8590: 63 61 73 65 20 74 68 65 20 73 6f 72 74 65 72 20  case the sorter 
85a0: 68 61 73 20 61 6c 72 65 61 64 79 20 6c 69 6d 69  has already limi
85b0: 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 6f 75 74  ted.  ** the out
85c0: 70 75 74 20 66 6f 72 20 75 73 2e 0a 20 20 2a 2f  put for us..  */
85d0: 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20  .  if( pSort==0 
85e0: 26 26 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  && p->iLimit ){.
85f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8600: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a 65  ddOp3(v, OP_IfZe
8610: 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69  ro, p->iLimit, i
8620: 42 72 65 61 6b 2c 20 2d 31 29 3b 20 56 64 62 65  Break, -1); Vdbe
8630: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
8640: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
8650: 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a  te a KeyInfo obj
8660: 65 63 74 20 73 75 66 66 69 63 69 65 6e 74 20 66  ect sufficient f
8670: 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 66 20 4e  or an index of N
8680: 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64   key columns and
8690: 0a 2a 2a 20 58 20 65 78 74 72 61 20 63 6f 6c 75  .** X extra colu
86a0: 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20  mns..*/.KeyInfo 
86b0: 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41  *sqlite3KeyInfoA
86c0: 6c 6c 6f 63 28 73 71 6c 69 74 65 33 20 2a 64 62  lloc(sqlite3 *db
86d0: 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20 58 29 7b  , int N, int X){
86e0: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 20 3d 20  .  KeyInfo *p = 
86f0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
8700: 65 72 6f 28 30 2c 20 0a 20 20 20 20 20 20 20 20  ero(0, .        
8710: 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
8720: 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 28 4e 2b  f(KeyInfo) + (N+
8730: 58 29 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  X)*(sizeof(CollS
8740: 65 71 2a 29 2b 31 29 29 3b 0a 20 20 69 66 28 20  eq*)+1));.  if( 
8750: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f 72  p ){.    p->aSor
8760: 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70  tOrder = (u8*)&p
8770: 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20  ->aColl[N+X];.  
8780: 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75    p->nField = (u
8790: 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e 6e 58 46  16)N;.    p->nXF
87a0: 69 65 6c 64 20 3d 20 28 75 31 36 29 58 3b 0a 20  ield = (u16)X;. 
87b0: 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28     p->enc = ENC(
87c0: 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d  db);.    p->db =
87d0: 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66   db;.    p->nRef
87e0: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
87f0: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
8800: 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  led = 1;.  }.  r
8810: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
8820: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b  * Deallocate a K
8830: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f  eyInfo object.*/
8840: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4b 65 79  .void sqlite3Key
8850: 49 6e 66 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66  InfoUnref(KeyInf
8860: 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  o *p){.  if( p )
8870: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
8880: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70  >nRef>0 );.    p
8890: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
88a0: 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73  ( p->nRef==0 ) s
88b0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
88c0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
88d0: 20 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e   Make a new poin
88e0: 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f  ter to a KeyInfo
88f0: 20 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e   object.*/.KeyIn
8900: 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e  fo *sqlite3KeyIn
8910: 66 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70  foRef(KeyInfo *p
8920: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
8930: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65    assert( p->nRe
8940: 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52  f>0 );.    p->nR
8950: 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ef++;.  }.  retu
8960: 72 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  rn p;.}..#ifdef 
8970: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
8980: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
8990: 66 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  f a KeyInfo obje
89a0: 63 74 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  ct can be change
89b0: 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f  .  The KeyInfo o
89c0: 62 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c  bject.** can onl
89d0: 79 20 62 65 20 63 68 61 6e 67 65 64 20 69 66 20  y be changed if 
89e0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 61 20 73  this is just a s
89f0: 69 6e 67 6c 65 20 72 65 66 65 72 65 6e 63 65 20  ingle reference 
8a00: 74 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a  to the object..*
8a10: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8a20: 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 69  e is used only i
8a30: 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28  nside of assert(
8a40: 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  ) statements..*/
8a50: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4b 65 79 49  .int sqlite3KeyI
8a60: 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 4b  nfoIsWriteable(K
8a70: 65 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75  eyInfo *p){ retu
8a80: 72 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d  rn p->nRef==1; }
8a90: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
8aa0: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a  E_DEBUG */../*.*
8ab0: 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65  * Given an expre
8ac0: 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65  ssion list, gene
8ad0: 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73  rate a KeyInfo s
8ae0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
8af0: 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c  cords.** the col
8b00: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
8b10: 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73  for each express
8b20: 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72  ion in that expr
8b30: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
8b40: 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69  ** If the ExprLi
8b50: 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  st is an ORDER B
8b60: 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
8b70: 61 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65  ause then the re
8b80: 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e  sulting.** KeyIn
8b90: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
8ba0: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
8bb0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76  initializing a v
8bc0: 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a  irtual index to.
8bd0: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61  ** implement tha
8be0: 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68  t clause.  If th
8bf0: 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68  e ExprList is th
8c00: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
8c10: 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e  a SELECT.** then
8c20: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
8c30: 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70  ucture is approp
8c40: 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61  riate for initia
8c50: 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c  lizing a virtual
8c60: 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70  .** index to imp
8c70: 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43  lement a DISTINC
8c80: 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70  T test..**.** Sp
8c90: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
8ca0: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
8cb0: 65 20 69 73 20 6f 62 74 61 69 6e 20 66 72 6f 6d  e is obtain from
8cc0: 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61   malloc.  The ca
8cd0: 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
8ce0: 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  n is responsible
8cf0: 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74   for seeing that
8d00: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
8d10: 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a  is eventually.**
8d20: 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69   freed..*/.stati
8d30: 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e  c KeyInfo *keyIn
8d40: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a  foFromExprList(.
8d50: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
8d60: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
8d70: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
8d80: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
8d90: 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20      /* Form the 
8da0: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66  KeyInfo object f
8db0: 72 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73  rom this ExprLis
8dc0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72  t */.  int iStar
8dd0: 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  t,          /* B
8de0: 65 67 69 6e 20 77 69 74 68 20 74 68 69 73 20 63  egin with this c
8df0: 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a  olumn of pList *
8e00: 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20  /.  int nExtra  
8e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
8e20: 74 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20  this many extra 
8e30: 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65  columns to the e
8e40: 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  nd */.){.  int n
8e50: 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  Expr;.  KeyInfo 
8e60: 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  *pInfo;.  struct
8e70: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
8e80: 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pItem;.  sqlite3
8e90: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
8ea0: 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e  b;.  int i;..  n
8eb0: 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  Expr = pList->nE
8ec0: 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73  xpr;.  pInfo = s
8ed0: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
8ee0: 6f 63 28 64 62 2c 20 6e 45 78 70 72 2b 6e 45 78  oc(db, nExpr+nEx
8ef0: 74 72 61 2d 69 53 74 61 72 74 2c 20 31 29 3b 0a  tra-iStart, 1);.
8f00: 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20    if( pInfo ){. 
8f10: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
8f20: 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
8f30: 61 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a 20  able(pInfo) );. 
8f40: 20 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 2c     for(i=iStart,
8f50: 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2b   pItem=pList->a+
8f60: 69 53 74 61 72 74 3b 20 69 3c 6e 45 78 70 72 3b  iStart; i<nExpr;
8f70: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
8f80: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
8f90: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c  Coll;.      pCol
8fa0: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
8fb0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
8fc0: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
8fd0: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
8fe0: 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
8ff0: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49  ltColl;.      pI
9000: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74  nfo->aColl[i-iSt
9010: 61 72 74 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  art] = pColl;.  
9020: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74      pInfo->aSort
9030: 4f 72 64 65 72 5b 69 2d 69 53 74 61 72 74 5d 20  Order[i-iStart] 
9040: 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64  = pItem->sortOrd
9050: 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  er;.    }.  }.  
9060: 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a  return pInfo;.}.
9070: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9080: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
9090: 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20  LECT./*.** Name 
90a0: 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  of the connectio
90b0: 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64  n operator, used
90c0: 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61   for error messa
90d0: 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ges..*/.static c
90e0: 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63  onst char *selec
90f0: 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b  tOpName(int id){
9100: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77  .  char *z;.  sw
9110: 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20  itch( id ){.    
9120: 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20  case TK_ALL:    
9130: 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c     z = "UNION AL
9140: 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  L";   break;.   
9150: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45   case TK_INTERSE
9160: 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45  CT: z = "INTERSE
9170: 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  CT";   break;.  
9180: 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
9190: 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54  :    z = "EXCEPT
91a0: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
91b0: 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20     default:     
91c0: 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e        z = "UNION
91d0: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
91e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a    }.  return z;.
91f0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
9200: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
9210: 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e  _SELECT */..#ifn
9220: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9230: 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e  EXPLAIN./*.** Un
9240: 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e  less an "EXPLAIN
9250: 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d   QUERY PLAN" com
9260: 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72  mand is being pr
9270: 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20 66 75  ocessed, this fu
9280: 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e  nction.** is a n
9290: 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  o-op. Otherwise,
92a0: 20 69 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c   it adds a singl
92b0: 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20  e row of output 
92c0: 74 6f 20 74 68 65 20 45 51 50 20 72 65 73 75 6c  to the EQP resul
92d0: 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20  t,.** where the 
92e0: 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 74 68  caption is of th
92f0: 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
9300: 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45  "USE TEMP B-TREE
9310: 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20   FOR xxx".**.** 
9320: 77 68 65 72 65 20 78 78 78 20 69 73 20 6f 6e 65  where xxx is one
9330: 20 6f 66 20 22 44 49 53 54 49 4e 43 54 22 2c 20   of "DISTINCT", 
9340: 22 4f 52 44 45 52 20 42 59 22 20 6f 72 20 22 47  "ORDER BY" or "G
9350: 52 4f 55 50 20 42 59 22 2e 20 45 78 61 63 74 6c  ROUP BY". Exactl
9360: 79 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 65  y which.** is de
9370: 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
9380: 7a 55 73 61 67 65 20 61 72 67 75 6d 65 6e 74 2e  zUsage argument.
9390: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
93a0: 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
93b0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
93c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 61  const char *zUsa
93d0: 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  ge){.  if( pPars
93e0: 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
93f0: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70  .    Vdbe *v = p
9400: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
9410: 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73    char *zMsg = s
9420: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50  qlite3MPrintf(pP
9430: 61 72 73 65 2d 3e 64 62 2c 20 22 55 53 45 20 54  arse->db, "USE T
9440: 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 25  EMP B-TREE FOR %
9450: 73 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20 20 20  s", zUsage);.   
9460: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9470: 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  p4(v, OP_Explain
9480: 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  , pParse->iSelec
9490: 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c  tId, 0, 0, zMsg,
94a0: 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
94b0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67  }.}../*.** Assig
94c0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62 20 74  n expression b t
94d0: 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41 20 73 65  o lvalue a. A se
94e0: 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72  cond, no-op, ver
94f0: 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61 63  sion of this mac
9500: 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64 65  ro.** is provide
9510: 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4d  d when SQLITE_OM
9520: 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 64 65  IT_EXPLAIN is de
9530: 66 69 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f  fined. This allo
9540: 77 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 69  ws the code.** i
9550: 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  n sqlite3Select(
9560: 29 20 74 6f 20 61 73 73 69 67 6e 20 76 61 6c 75  ) to assign valu
9570: 65 73 20 74 6f 20 73 74 72 75 63 74 75 72 65 20  es to structure 
9580: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
9590: 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78   that.** only ex
95a0: 69 73 74 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d  ist if SQLITE_OM
95b0: 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e 6f  IT_EXPLAIN is no
95c0: 74 20 64 65 66 69 6e 65 64 20 77 69 74 68 6f 75  t defined withou
95d0: 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65 0a  t polluting the.
95e0: 2a 2a 20 63 6f 64 65 20 77 69 74 68 20 23 69 66  ** code with #if
95f0: 6e 64 65 66 20 64 69 72 65 63 74 69 76 65 73 2e  ndef directives.
9600: 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70  .*/.# define exp
9610: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 61  lainSetInteger(a
9620: 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c 73  , b) a = b..#els
9630: 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69  e./* No-op versi
9640: 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61  ons of the expla
9650: 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e  inXXX() function
9660: 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f  s and macros. */
9670: 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
9680: 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29 0a  nTempTable(y,z).
9690: 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
96a0: 53 65 74 49 6e 74 65 67 65 72 28 79 2c 7a 29 0a  SetInteger(y,z).
96b0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
96c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
96d0: 5f 45 58 50 4c 41 49 4e 29 20 26 26 20 21 64 65  _EXPLAIN) && !de
96e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
96f0: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
9700: 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  T)./*.** Unless 
9710: 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52  an "EXPLAIN QUER
9720: 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20  Y PLAN" command 
9730: 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73  is being process
9740: 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
9750: 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  n.** is a no-op.
9760: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 61   Otherwise, it a
9770: 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  dds a single row
9780: 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74 68   of output to th
9790: 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a  e EQP result,.**
97a0: 20 77 68 65 72 65 20 74 68 65 20 63 61 70 74 69   where the capti
97b0: 6f 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20  on is of one of 
97c0: 74 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a  the two forms:.*
97d0: 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54  *.**   "COMPOSIT
97e0: 45 20 53 55 42 51 55 45 52 49 45 53 20 69 53 75  E SUBQUERIES iSu
97f0: 62 31 20 61 6e 64 20 69 53 75 62 32 20 28 6f 70  b1 and iSub2 (op
9800: 29 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49  )".**   "COMPOSI
9810: 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69 53  TE SUBQUERIES iS
9820: 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 55 53  ub1 and iSub2 US
9830: 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45 20  ING TEMP B-TREE 
9840: 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72  (op)".**.** wher
9850: 65 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62  e iSub1 and iSub
9860: 32 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65  2 are the intege
9870: 72 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  rs passed as the
9880: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
9890: 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d  * function param
98a0: 65 74 65 72 73 2c 20 61 6e 64 20 6f 70 20 69 73  eters, and op is
98b0: 20 74 68 65 20 74 65 78 74 20 72 65 70 72 65 73   the text repres
98c0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
98d0: 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20  parameter.** of 
98e0: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 54  the same name. T
98f0: 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 6f 70  he parameter "op
9900: 22 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  " must be one of
9910: 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58   TK_UNION, TK_EX
9920: 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54 45  CEPT,.** TK_INTE
9930: 52 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c 4c 2e  RSECT or TK_ALL.
9940: 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20   The first form 
9950: 69 73 20 75 73 65 64 20 69 66 20 61 72 67 75 6d  is used if argum
9960: 65 6e 74 20 62 55 73 65 54 6d 70 20 69 73 20 0a  ent bUseTmp is .
9970: 2a 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74 68 65  ** false, or the
9980: 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 66 20   second form if 
9990: 69 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73  it is true..*/.s
99a0: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61  tatic void expla
99b0: 69 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20 20 50  inComposite(.  P
99c0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
99d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
99e0: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
99f0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
9a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a10: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54       /* One of T
9a20: 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45  K_UNION, TK_EXCE
9a30: 50 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74  PT etc. */.  int
9a40: 20 69 53 75 62 31 2c 20 20 20 20 20 20 20 20 20   iSub1,         
9a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9a60: 53 75 62 71 75 65 72 79 20 69 64 20 31 20 2a 2f  Subquery id 1 */
9a70: 0a 20 20 69 6e 74 20 69 53 75 62 32 2c 20 20 20  .  int iSub2,   
9a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a90: 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69     /* Subquery i
9aa0: 64 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62 55 73  d 2 */.  int bUs
9ab0: 65 54 6d 70 20 20 20 20 20 20 20 20 20 20 20 20  eTmp            
9ac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
9ad0: 20 69 66 20 61 20 74 65 6d 70 20 74 61 62 6c 65   if a temp table
9ae0: 20 77 61 73 20 75 73 65 64 20 2a 2f 0a 29 7b 0a   was used */.){.
9af0: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b    assert( op==TK
9b00: 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54 4b  _UNION || op==TK
9b10: 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54  _EXCEPT || op==T
9b20: 4b 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c 20 6f  K_INTERSECT || o
9b30: 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20 69  p==TK_ALL );.  i
9b40: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
9b50: 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62  in==2 ){.    Vdb
9b60: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
9b70: 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  Vdbe;.    char *
9b80: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
9b90: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 70  rintf(.        p
9ba0: 50 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f 4d 50  Parse->db, "COMP
9bb0: 4f 55 4e 44 20 53 55 42 51 55 45 52 49 45 53 20  OUND SUBQUERIES 
9bc0: 25 64 20 41 4e 44 20 25 64 20 25 73 28 25 73 29  %d AND %d %s(%s)
9bd0: 22 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c  ", iSub1, iSub2,
9be0: 0a 20 20 20 20 20 20 20 20 62 55 73 65 54 6d 70  .        bUseTmp
9bf0: 3f 22 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54  ?"USING TEMP B-T
9c00: 52 45 45 20 22 3a 22 22 2c 20 73 65 6c 65 63 74  REE ":"", select
9c10: 4f 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20 20 29  OpName(op).    )
9c20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
9c30: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78  eAddOp4(v, OP_Ex
9c40: 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69  plain, pParse->i
9c50: 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20  SelectId, 0, 0, 
9c60: 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zMsg, P4_DYNAMIC
9c70: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 2f  );.  }.}.#else./
9c80: 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73  * No-op versions
9c90: 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58   of the explainX
9ca0: 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61  XX() functions a
9cb0: 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20  nd macros. */.# 
9cc0: 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 43 6f  define explainCo
9cd0: 6d 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c 79 2c  mposite(v,w,x,y,
9ce0: 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  z).#endif../*.**
9cf0: 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   If the inner lo
9d00: 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74 65 64  op was generated
9d10: 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c   using a non-nul
9d20: 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d  l pOrderBy argum
9d30: 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ent,.** then the
9d40: 20 72 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c   results were pl
9d50: 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72  aced in a sorter
9d60: 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f  .  After the loo
9d70: 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a  p is terminated.
9d80: 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75  ** we need to ru
9d90: 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64  n the sorter and
9da0: 20 6f 75 74 70 75 74 20 74 68 65 20 72 65 73 75   output the resu
9db0: 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  lts.  The follow
9dc0: 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67  ing.** routine g
9dd0: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
9de0: 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74  e needed to do t
9df0: 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  hat..*/.static v
9e00: 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74  oid generateSort
9e10: 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70  Tail(.  Parse *p
9e20: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
9e30: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
9e40: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
9e50: 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
9e60: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
9e70: 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c   SortCtx *pSort,
9e80: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
9e90: 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42  n on the ORDER B
9ea0: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
9eb0: 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  t nColumn,      
9ec0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
9ed0: 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a  umns of data */.
9ee0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
9ef0: 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68 65  est /* Write the
9f00: 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20   sorted results 
9f10: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  here */.){.  Vdb
9f20: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
9f30: 56 64 62 65 3b 20 20 20 20 20 20 20 20 20 20 20  Vdbe;           
9f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
9f50: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
9f60: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ent */.  int add
9f70: 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  rBreak = sqlite3
9f80: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
9f90: 3b 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65  ;     /* Jump he
9fa0: 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70 20  re to exit loop 
9fb0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e  */.  int addrCon
9fc0: 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56  tinue = sqlite3V
9fd0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
9fe0: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 66    /* Jump here f
9ff0: 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f  or next cycle */
a000: 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 69  .  int addr;.  i
a010: 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b  nt addrOnce = 0;
a020: 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 45  .  int iTab;.  E
a030: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
a040: 79 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65  y = pSort->pOrde
a050: 72 42 79 3b 0a 20 20 69 6e 74 20 65 44 65 73 74  rBy;.  int eDest
a060: 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b   = pDest->eDest;
a070: 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70  .  int iParm = p
a080: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 0a 20  Dest->iSDParm;. 
a090: 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20 69   int regRow;.  i
a0a0: 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 20 20 69  nt regRowid;.  i
a0b0: 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69  nt nKey;.  int i
a0c0: 53 6f 72 74 54 61 62 3b 20 20 20 20 20 20 20 20  SortTab;        
a0d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f             /* So
a0e0: 72 74 65 72 20 63 75 72 73 6f 72 20 74 6f 20 72  rter cursor to r
a0f0: 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ead from */.  in
a100: 74 20 6e 53 6f 72 74 44 61 74 61 3b 20 20 20 20  t nSortData;    
a110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a120: 20 54 72 61 69 6c 69 6e 67 20 76 61 6c 75 65 73   Trailing values
a130: 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 73 6f   to read from so
a140: 72 74 65 72 20 2a 2f 0a 20 20 75 38 20 70 35 3b  rter */.  u8 p5;
a150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 35 20            /* p5 
a170: 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 31 73  parameter for 1s
a180: 74 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2a 2f 0a 20  t OP_Column */. 
a190: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 53   int i;.  int bS
a1a0: 65 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eq;             
a1b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
a1c0: 65 20 69 66 20 73 6f 72 74 65 72 20 72 65 63 6f  e if sorter reco
a1d0: 72 64 20 69 6e 63 6c 75 64 65 73 20 73 65 71 2e  rd includes seq.
a1e0: 20 6e 6f 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53   no. */.#ifdef S
a1f0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50  QLITE_ENABLE_EXP
a200: 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20  LAIN_COMMENTS.  
a210: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
a220: 69 74 65 6d 20 2a 61 4f 75 74 45 78 20 3d 20 70  item *aOutEx = p
a230: 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 23 65 6e  ->pEList->a;.#en
a240: 64 69 66 0a 0a 20 20 69 66 28 20 70 53 6f 72 74  dif..  if( pSort
a250: 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a  ->labelBkOut ){.
a260: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a270: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
a280: 62 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74  b, pSort->regRet
a290: 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65  urn, pSort->labe
a2a0: 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c  lBkOut);.    sql
a2b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a2c0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
a2d0: 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 73 71  drBreak);.    sq
a2e0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
a2f0: 4c 61 62 65 6c 28 76 2c 20 70 53 6f 72 74 2d 3e  Label(v, pSort->
a300: 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 7d  labelBkOut);.  }
a310: 0a 20 20 69 54 61 62 20 3d 20 70 53 6f 72 74 2d  .  iTab = pSort-
a320: 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 69 66 28  >iECursor;.  if(
a330: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
a340: 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ut || eDest==SRT
a350: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  _Coroutine ){.  
a360: 20 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 0a    regRowid = 0;.
a370: 20 20 20 20 72 65 67 52 6f 77 20 3d 20 70 44 65      regRow = pDe
a380: 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20 20 20 6e  st->iSdst;.    n
a390: 53 6f 72 74 44 61 74 61 20 3d 20 6e 43 6f 6c 75  SortData = nColu
a3a0: 6d 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  mn;.  }else{.   
a3b0: 20 72 65 67 52 6f 77 69 64 20 3d 20 73 71 6c 69   regRowid = sqli
a3c0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
a3d0: 61 72 73 65 29 3b 0a 20 20 20 20 72 65 67 52 6f  arse);.    regRo
a3e0: 77 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  w = sqlite3GetTe
a3f0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
a400: 20 20 20 6e 53 6f 72 74 44 61 74 61 20 3d 20 31     nSortData = 1
a410: 3b 0a 20 20 7d 0a 20 20 6e 4b 65 79 20 3d 20 70  ;.  }.  nKey = p
a420: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2d  OrderBy->nExpr -
a430: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a   pSort->nOBSat;.
a440: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72    if( pSort->sor
a450: 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41  tFlags & SORTFLA
a460: 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20  G_UseSorter ){. 
a470: 20 20 20 69 6e 74 20 72 65 67 53 6f 72 74 4f 75     int regSortOu
a480: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
a490: 65 6d 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62  em;.    iSortTab
a4a0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
a4b0: 2b 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74  +;.    if( pSort
a4c0: 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a  ->labelBkOut ){.
a4d0: 20 20 20 20 20 20 61 64 64 72 4f 6e 63 65 20 3d        addrOnce =
a4e0: 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65   sqlite3CodeOnce
a4f0: 28 70 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f  (pParse); VdbeCo
a500: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d  verage(v);.    }
a510: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a520: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
a530: 6e 50 73 65 75 64 6f 2c 20 69 53 6f 72 74 54 61  nPseudo, iSortTa
a540: 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c 20 6e  b, regSortOut, n
a550: 4b 65 79 2b 31 2b 6e 53 6f 72 74 44 61 74 61 29  Key+1+nSortData)
a560: 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4f 6e  ;.    if( addrOn
a570: 63 65 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  ce ) sqlite3Vdbe
a580: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
a590: 4f 6e 63 65 29 3b 0a 20 20 20 20 61 64 64 72 20  Once);.    addr 
a5a0: 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  = 1 + sqlite3Vdb
a5b0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
a5c0: 72 74 65 72 53 6f 72 74 2c 20 69 54 61 62 2c 20  rterSort, iTab, 
a5d0: 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20  addrBreak);.    
a5e0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
a5f0: 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28  .    codeOffset(
a600: 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61  v, p->iOffset, a
a610: 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  ddrContinue);.  
a620: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a630: 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
a640: 44 61 74 61 2c 20 69 54 61 62 2c 20 72 65 67 53  Data, iTab, regS
a650: 6f 72 74 4f 75 74 29 3b 0a 20 20 20 20 70 35 20  ortOut);.    p5 
a660: 3d 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41  = OPFLAG_CLEARCA
a670: 43 48 45 3b 0a 20 20 20 20 62 53 65 71 20 3d 20  CHE;.    bSeq = 
a680: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
a690: 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74  addr = 1 + sqlit
a6a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a6b0: 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20 61  OP_Sort, iTab, a
a6c0: 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43  ddrBreak); VdbeC
a6d0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
a6e0: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d  codeOffset(v, p-
a6f0: 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f  >iOffset, addrCo
a700: 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 69 53 6f  ntinue);.    iSo
a710: 72 74 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20  rtTab = iTab;.  
a720: 20 20 70 35 20 3d 20 30 3b 0a 20 20 20 20 62 53    p5 = 0;.    bS
a730: 65 71 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f  eq = 1;.  }.  fo
a740: 72 28 69 3d 30 3b 20 69 3c 6e 53 6f 72 74 44 61  r(i=0; i<nSortDa
a750: 74 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  ta; i++){.    sq
a760: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
a770: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53  v, OP_Column, iS
a780: 6f 72 74 54 61 62 2c 20 6e 4b 65 79 2b 62 53 65  ortTab, nKey+bSe
a790: 71 2b 69 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a  q+i, regRow+i);.
a7a0: 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 20 73      if( i==0 ) s
a7b0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
a7c0: 50 35 28 76 2c 20 70 35 29 3b 0a 20 20 20 20 56  P5(v, p5);.    V
a7d0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
a7e0: 25 73 22 2c 20 61 4f 75 74 45 78 5b 69 5d 2e 7a  %s", aOutEx[i].z
a7f0: 4e 61 6d 65 20 3f 20 61 4f 75 74 45 78 5b 69 5d  Name ? aOutEx[i]
a800: 2e 7a 4e 61 6d 65 20 3a 20 61 4f 75 74 45 78 5b  .zName : aOutEx[
a810: 69 5d 2e 7a 53 70 61 6e 29 29 3b 0a 20 20 7d 0a  i].zSpan));.  }.
a820: 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
a830: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  ){.    case SRT_
a840: 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Table:.    case 
a850: 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
a860: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
a870: 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65  eDest==SRT_Table
a880: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
a890: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45  se( eDest==SRT_E
a8a0: 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20  phemTab );.     
a8b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a8c0: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
a8d0: 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77  d, iParm, regRow
a8e0: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
a8f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
a900: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
a910: 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77  , regRow, regRow
a920: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
a930: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
a940: 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
a950: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a960: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
a970: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
a980: 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  Y.    case SRT_S
a990: 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  et: {.      asse
a9a0: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
a9b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
a9c0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
a9d0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
a9e0: 6f 77 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 2c  ow, 1, regRowid,
a9f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
aa00: 20 20 20 20 20 20 20 20 20 26 70 44 65 73 74 2d           &pDest-
aa10: 3e 61 66 66 53 64 73 74 2c 20 31 29 3b 0a 20 20  >affSdst, 1);.  
aa20: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
aa30: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
aa40: 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  ge(pParse, regRo
aa50: 77 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  w, 1);.      sql
aa60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
aa70: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
aa80: 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29  iParm, regRowid)
aa90: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
aaa0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52     }.    case SR
aab0: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61  T_Mem: {.      a
aac0: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
aad0: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
aae0: 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
aaf0: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 69  Parse, regRow, i
ab00: 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  Parm, 1);.      
ab10: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
ab20: 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61  use will termina
ab30: 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  te the loop for 
ab40: 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
ab50: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
ab60: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
ab70: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
ab80: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c  st==SRT_Output |
ab90: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  | eDest==SRT_Cor
aba0: 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20 20 20 20  outine ); .     
abb0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
abc0: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a  ==SRT_Output );.
abd0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
abe0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
abf0: 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 69 66  tine );.      if
ac00: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
ac10: 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  put ){.        s
ac20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ac30: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
ac40: 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20  , pDest->iSdst, 
ac50: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
ac60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
ac70: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
ac80: 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2d 3e  (pParse, pDest->
ac90: 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  iSdst, nColumn);
aca0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
acb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
acc0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
acd0: 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  eld, pDest->iSDP
ace0: 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  arm);.      }.  
acf0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ad00: 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67 52 6f  .  }.  if( regRo
ad10: 77 69 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  wid ){.    sqlit
ad20: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
ad30: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 29  (pParse, regRow)
ad40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
ad50: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
ad60: 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  se, regRowid);. 
ad70: 20 7d 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74   }.  /* The bott
ad80: 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20  om of the loop. 
ad90: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
ada0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
adb0: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a   addrContinue);.
adc0: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72    if( pSort->sor
add0: 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41  tFlags & SORTFLA
ade0: 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20  G_UseSorter ){. 
adf0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ae00: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
ae10: 72 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  rNext, iTab, add
ae20: 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
ae30: 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  (v);.  }else{.  
ae40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ae50: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
ae60: 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62  iTab, addr); Vdb
ae70: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
ae80: 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 72  }.  if( pSort->r
ae90: 65 67 52 65 74 75 72 6e 20 29 20 73 71 6c 69 74  egReturn ) sqlit
aea0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
aeb0: 4f 50 5f 52 65 74 75 72 6e 2c 20 70 53 6f 72 74  OP_Return, pSort
aec0: 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
aed0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
aee0: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42  veLabel(v, addrB
aef0: 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  reak);.}../*.** 
af00: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
af10: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e   to a string con
af20: 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63  taining the 'dec
af30: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f  laration type' o
af40: 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  f the.** express
af50: 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73  ion pExpr. The s
af60: 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65  tring may be tre
af70: 61 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62  ated as static b
af80: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  y the caller..**
af90: 0a 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74 6f 20  .** Also try to 
afa0: 65 73 74 69 6d 61 74 65 20 74 68 65 20 73 69 7a  estimate the siz
afb0: 65 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  e of the returne
afc0: 64 20 76 61 6c 75 65 20 61 6e 64 20 72 65 74 75  d value and retu
afd0: 72 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c  rn that.** resul
afe0: 74 20 69 6e 20 2a 70 45 73 74 57 69 64 74 68 2e  t in *pEstWidth.
aff0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61  .**.** The decla
b000: 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74  ration type is t
b010: 68 65 20 65 78 61 63 74 20 64 61 74 61 74 79 70  he exact datatyp
b020: 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74  e definition ext
b030: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a  racted from the.
b040: 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41  ** original CREA
b050: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
b060: 6e 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73  nt if the expres
b070: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sion is a column
b080: 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61  . The.** declara
b090: 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20  tion type for a 
b0a0: 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49  ROWID field is I
b0b0: 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20  NTEGER. Exactly 
b0c0: 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  when an expressi
b0d0: 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65  on.** is conside
b0e0: 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e  red a column can
b0f0: 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74   be complex in t
b100: 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73  he presence of s
b110: 75 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a  ubqueries. The.*
b120: 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70  * result-set exp
b130: 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f  ression in all o
b140: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
b150: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
b160: 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65  s is .** conside
b170: 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20  red a column by 
b180: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
b190: 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f  *.**   SELECT co
b1a0: 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20  l FROM tbl;.**  
b1b0: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
b1c0: 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a  col FROM tbl;.**
b1d0: 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
b1e0: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b  T col FROM tbl);
b1f0: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63  .**   SELECT abc
b200: 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f   FROM (SELECT co
b210: 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62  l AS abc FROM tb
b220: 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64  l);.** .** The d
b230: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
b240: 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73 69  for any expressi
b250: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  on other than a 
b260: 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a  column is NULL..
b270: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
b280: 6e 65 20 68 61 73 20 65 69 74 68 65 72 20 33 20  ne has either 3 
b290: 6f 72 20 36 20 70 61 72 61 6d 65 74 65 72 73 20  or 6 parameters 
b2a0: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
b2b0: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74  ther or not.** t
b2c0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
b2d0: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
b2e0: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
b2f0: 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2f  tion is used..*/
b300: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
b310: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
b320: 41 44 41 54 41 0a 23 20 64 65 66 69 6e 65 20 63  ADATA.# define c
b330: 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c  olumnType(A,B,C,
b340: 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70  D,E,F) columnTyp
b350: 65 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c 45 2c  eImpl(A,B,C,D,E,
b360: 46 29 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  F).static const 
b370: 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65  char *columnType
b380: 49 6d 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e 74  Impl(.  NameCont
b390: 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70  ext *pNC, .  Exp
b3a0: 72 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73  r *pExpr,.  cons
b3b0: 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 44  t char **pzOrigD
b3c0: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
b3d0: 2a 2a 70 7a 4f 72 69 67 54 61 62 2c 0a 20 20 63  **pzOrigTab,.  c
b3e0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72  onst char **pzOr
b3f0: 69 67 43 6f 6c 2c 0a 20 20 75 38 20 2a 70 45 73  igCol,.  u8 *pEs
b400: 74 57 69 64 74 68 0a 29 7b 0a 20 20 63 68 61 72  tWidth.){.  char
b410: 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 44 62 20   const *zOrigDb 
b420: 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
b430: 74 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b  t *zOrigTab = 0;
b440: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
b450: 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 23 65 6c  OrigCol = 0;.#el
b460: 73 65 20 2f 2a 20 69 66 20 21 64 65 66 69 6e 65  se /* if !define
b470: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
b480: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 29  COLUMN_METADATA)
b490: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c   */.# define col
b4a0: 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c  umnType(A,B,C,D,
b4b0: 45 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49  E,F) columnTypeI
b4c0: 6d 70 6c 28 41 2c 42 2c 46 29 0a 73 74 61 74 69  mpl(A,B,F).stati
b4d0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f  c const char *co
b4e0: 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20  lumnTypeImpl(.  
b4f0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
b500: 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  , .  Expr *pExpr
b510: 2c 0a 20 20 75 38 20 2a 70 45 73 74 57 69 64 74  ,.  u8 *pEstWidt
b520: 68 0a 29 7b 0a 23 65 6e 64 69 66 20 2f 2a 20 21  h.){.#endif /* !
b530: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
b540: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
b550: 41 44 41 54 41 29 20 2a 2f 0a 20 20 63 68 61 72  ADATA) */.  char
b560: 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20   const *zType = 
b570: 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 75 38  0;.  int j;.  u8
b580: 20 65 73 74 57 69 64 74 68 20 3d 20 31 3b 0a 0a   estWidth = 1;..
b590: 20 20 69 66 28 20 4e 45 56 45 52 28 70 45 78 70    if( NEVER(pExp
b5a0: 72 3d 3d 30 29 20 7c 7c 20 70 4e 43 2d 3e 70 53  r==0) || pNC->pS
b5b0: 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75  rcList==0 ) retu
b5c0: 72 6e 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20  rn 0;.  switch( 
b5d0: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
b5e0: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
b5f0: 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
b600: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
b610: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
b620: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20  on is a column. 
b630: 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65  Locate the table
b640: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62   the column is b
b650: 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65 78  eing.      ** ex
b660: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e 20  tracted from in 
b670: 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72 63  NameContext.pSrc
b680: 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c 65  List. This table
b690: 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20 20   may be real.   
b6a0: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74     ** database t
b6b0: 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75 65  able or a subque
b6c0: 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ry..      */.   
b6d0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
b6e0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
b6f0: 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  * Table structur
b700: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72  e column is extr
b710: 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20  acted from */.  
b720: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d      Select *pS =
b730: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
b740: 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63 6f  /* Select the co
b750: 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65  lumn is extracte
b760: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20  d from */.      
b770: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72  int iCol = pExpr
b780: 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49  ->iColumn;  /* I
b790: 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69  ndex of column i
b7a0: 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20  n pTab */.      
b7b0: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
b7c0: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
b7d0: 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MN );.      test
b7e0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
b7f0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
b800: 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26      while( pNC &
b810: 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20  & !pTab ){.     
b820: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62     SrcList *pTab
b830: 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63  List = pNC->pSrc
b840: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f  List;.        fo
b850: 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74  r(j=0;j<pTabList
b860: 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69  ->nSrc && pTabLi
b870: 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72  st->a[j].iCursor
b880: 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  !=pExpr->iTable;
b890: 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  j++);.        if
b8a0: 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ( j<pTabList->nS
b8b0: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
b8c0: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
b8d0: 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[j].pTab;.    
b8e0: 20 20 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c        pS = pTabL
b8f0: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63  ist->a[j].pSelec
b900: 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  t;.        }else
b910: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 20  {.          pNC 
b920: 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pNC->pNext;.  
b930: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
b940: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
b950: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
b960: 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f   At one time, co
b970: 64 65 20 73 75 63 68 20 61 73 20 22 53 45 4c 45  de such as "SELE
b980: 43 54 20 6e 65 77 2e 78 22 20 77 69 74 68 69 6e  CT new.x" within
b990: 20 61 20 74 72 69 67 67 65 72 20 77 6f 75 6c 64   a trigger would
b9a0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73  .        ** caus
b9b0: 65 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  e this condition
b9c0: 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65 20   to run.  Since 
b9d0: 74 68 65 6e 2c 20 77 65 20 68 61 76 65 20 72 65  then, we have re
b9e0: 73 74 72 75 63 74 75 72 65 64 20 68 6f 77 0a 20  structured how. 
b9f0: 20 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65         ** trigge
ba00: 72 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61  r code is genera
ba10: 74 65 64 20 61 6e 64 20 73 6f 20 74 68 69 73 20  ted and so this 
ba20: 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20  condition is no 
ba30: 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20 20 20 20  longer .        
ba40: 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77  ** possible. How
ba50: 65 76 65 72 2c 20 69 74 20 63 61 6e 20 73 74 69  ever, it can sti
ba60: 6c 6c 20 62 65 20 74 72 75 65 20 66 6f 72 20 73  ll be true for s
ba70: 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20  tatements like. 
ba80: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f         ** the fo
ba90: 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20 20  llowing:.       
baa0: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
bab0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
bac0: 28 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20  (col INTEGER);. 
bad0: 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45         **   SELE
bae0: 43 54 20 28 53 45 4c 45 43 54 20 74 31 2e 63 6f  CT (SELECT t1.co
baf0: 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b  l) FROM FROM t1;
bb00: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
bb10: 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75      ** when colu
bb20: 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c  mnType() is call
bb30: 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ed on the expres
bb40: 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e  sion "t1.col" in
bb50: 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
bb60: 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20   sub-select. In 
bb70: 74 68 69 73 20 63 61 73 65 2c 20 73 65 74 20 74  this case, set t
bb80: 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74  he column type t
bb90: 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20  o NULL, even.   
bba0: 20 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 69       ** though i
bbb0: 74 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20  t should really 
bbc0: 62 65 20 22 49 4e 54 45 47 45 52 22 2e 0a 20 20  be "INTEGER"..  
bbd0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
bbe0: 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20   ** This is not 
bbf0: 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68  a problem, as th
bc00: 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66  e column type of
bc10: 20 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76   "t1.col" is nev
bc20: 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73  er.        ** us
bc30: 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54  ed. When columnT
bc40: 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ype() is called 
bc50: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
bc60: 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 28  n .        ** "(
bc70: 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c  SELECT t1.col)",
bc80: 20 74 68 65 20 63 6f 72 72 65 63 74 20 74 79 70   the correct typ
bc90: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 28 73  e is returned (s
bca0: 65 65 20 74 68 65 20 54 4b 5f 53 45 4c 45 43 54  ee the TK_SELECT
bcb0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 72 61 6e  .        ** bran
bcc0: 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20  ch below.  */.  
bcd0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bce0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
bcf0: 72 74 28 20 70 54 61 62 20 26 26 20 70 45 78 70  rt( pTab && pExp
bd00: 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20 29 3b  r->pTab==pTab );
bd10: 0a 20 20 20 20 20 20 69 66 28 20 70 53 20 29 7b  .      if( pS ){
bd20: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
bd30: 22 74 61 62 6c 65 22 20 69 73 20 61 63 74 75 61  "table" is actua
bd40: 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74  lly a sub-select
bd50: 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74 68   or a view in th
bd60: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20  e FROM clause.  
bd70: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
bd80: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
bd90: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63  . Return the dec
bda0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e  laration type an
bdb0: 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20  d origin.       
bdc0: 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65   ** data for the
bdd0: 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75   result-set colu
bde0: 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65  mn of the sub-se
bdf0: 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  lect..        */
be00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
be10: 6c 3e 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69  l>=0 && ALWAYS(i
be20: 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e  Col<pS->pEList->
be30: 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  nExpr) ){.      
be40: 20 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69      /* If iCol i
be50: 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
be60: 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65  , then the expre
be70: 73 73 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74  ssion requests t
be80: 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
be90: 72 6f 77 69 64 20 6f 66 20 74 68 65 20 73 75 62  rowid of the sub
bea0: 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e  -select or view.
beb0: 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   This expression
bec0: 20 69 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a   is legal (see .
bed0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73            ** tes
bee0: 74 20 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32  t case misc2.2.2
bef0: 29 20 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76  ) - it always ev
bf00: 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e  aluates to NULL.
bf10: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
bf20: 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74          NameCont
bf30: 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20  ext sNC;.       
bf40: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d     Expr *p = pS-
bf50: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d  >pEList->a[iCol]
bf60: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
bf70: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
bf80: 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20   pS->pSrc;.     
bf90: 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d       sNC.pNext =
bfa0: 20 70 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20   pNC;.          
bfb0: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43  sNC.pParse = pNC
bfc0: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  ->pParse;.      
bfd0: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
bfe0: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 26  mnType(&sNC, p,&
bff0: 7a 4f 72 69 67 44 62 2c 26 7a 4f 72 69 67 54 61  zOrigDb,&zOrigTa
c000: 62 2c 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65 73  b,&zOrigCol, &es
c010: 74 57 69 64 74 68 29 3b 20 0a 20 20 20 20 20 20  tWidth); .      
c020: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
c030: 69 66 28 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  if( pTab->pSchem
c040: 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  a ){.        /* 
c050: 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  A real table */.
c060: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
c070: 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !pS );.        i
c080: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
c090: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
c0a0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
c0b0: 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f  iCol==-1 || (iCo
c0c0: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
c0d0: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 23 69 66 64  b->nCol) );.#ifd
c0e0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
c0f0: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
c100: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
c110: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l<0 ){.         
c120: 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45   zType = "INTEGE
c130: 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  R";.          zO
c140: 72 69 67 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22  rigCol = "rowid"
c150: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
c160: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
c170: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
c180: 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20  ol].zType;.     
c190: 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20       zOrigCol = 
c1a0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
c1b0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
c1c0: 20 20 65 73 74 57 69 64 74 68 20 3d 20 70 54 61    estWidth = pTa
c1d0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a  b->aCol[iCol].sz
c1e0: 45 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Est;.        }. 
c1f0: 20 20 20 20 20 20 20 7a 4f 72 69 67 54 61 62 20         zOrigTab 
c200: 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
c210: 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e         if( pNC->
c220: 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20 20 20  pParse ){.      
c230: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
c240: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
c250: 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e  ex(pNC->pParse->
c260: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
c270: 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  a);.          zO
c280: 72 69 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61  rigDb = pNC->pPa
c290: 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
c2a0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
c2b0: 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20   }.#else.       
c2c0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
c2d0: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
c2e0: 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20   "INTEGER";.    
c2f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c300: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61       zType = pTa
c310: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54  b->aCol[iCol].zT
c320: 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 65  ype;.          e
c330: 73 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d 3e  stWidth = pTab->
c340: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74  aCol[iCol].szEst
c350: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  ;.        }.#end
c360: 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  if.      }.     
c370: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
c380: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c390: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
c3a0: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
c3b0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78  .      /* The ex
c3c0: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75  pression is a su
c3d0: 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e  b-select. Return
c3e0: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
c3f0: 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20   type and.      
c400: 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66  ** origin info f
c410: 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f  or the single co
c420: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75  lumn in the resu
c430: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
c440: 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74  LECT.      ** st
c450: 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  atement..      *
c460: 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74  /.      NameCont
c470: 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53  ext sNC;.      S
c480: 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70  elect *pS = pExp
c490: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20  r->x.pSelect;.  
c4a0: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53      Expr *p = pS
c4b0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
c4c0: 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
c4d0: 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
c4e0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
c4f0: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
c500: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
c510: 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20   pS->pSrc;.     
c520: 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43   sNC.pNext = pNC
c530: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72  ;.      sNC.pPar
c540: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
c550: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  ;.      zType = 
c560: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
c570: 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a   p, &zOrigDb, &z
c580: 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43  OrigTab, &zOrigC
c590: 6f 6c 2c 20 26 65 73 74 57 69 64 74 68 29 3b 20  ol, &estWidth); 
c5a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
c5b0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
c5c0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
c5d0: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
c5e0: 44 41 54 41 20 20 0a 20 20 69 66 28 20 70 7a 4f  DATA  .  if( pzO
c5f0: 72 69 67 44 62 20 29 7b 0a 20 20 20 20 61 73 73  rigDb ){.    ass
c600: 65 72 74 28 20 70 7a 4f 72 69 67 54 61 62 20 26  ert( pzOrigTab &
c610: 26 20 70 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a 20  & pzOrigCol );. 
c620: 20 20 20 2a 70 7a 4f 72 69 67 44 62 20 3d 20 7a     *pzOrigDb = z
c630: 4f 72 69 67 44 62 3b 0a 20 20 20 20 2a 70 7a 4f  OrigDb;.    *pzO
c640: 72 69 67 54 61 62 20 3d 20 7a 4f 72 69 67 54 61  rigTab = zOrigTa
c650: 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 43 6f  b;.    *pzOrigCo
c660: 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20  l = zOrigCol;.  
c670: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
c680: 45 73 74 57 69 64 74 68 20 29 20 2a 70 45 73 74  EstWidth ) *pEst
c690: 57 69 64 74 68 20 3d 20 65 73 74 57 69 64 74 68  Width = estWidth
c6a0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65  ;.  return zType
c6b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
c6c0: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
c6d0: 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45  ll tell the VDBE
c6e0: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
c6f0: 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e   types of column
c700: 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75  s.** in the resu
c710: 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69  lt set..*/.stati
c720: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43  c void generateC
c730: 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61  olumnTypes(.  Pa
c740: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
c750: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
c760: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
c770: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20   *pTabList,  /* 
c780: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a  List of tables *
c790: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
c7a0: 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65  List    /* Expre
c7b0: 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20  ssions defining 
c7c0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
c7d0: 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  /.){.#ifndef SQL
c7e0: 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50  ITE_OMIT_DECLTYP
c7f0: 45 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  E.  Vdbe *v = pP
c800: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
c810: 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74  nt i;.  NameCont
c820: 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70  ext sNC;.  sNC.p
c830: 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  SrcList = pTabLi
c840: 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65  st;.  sNC.pParse
c850: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72   = pParse;.  for
c860: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
c870: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
c880: 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73   Expr *p = pELis
c890: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
c8a0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
c8b0: 54 79 70 65 3b 0a 23 69 66 64 65 66 20 53 51 4c  Type;.#ifdef SQL
c8c0: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
c8d0: 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 63  N_METADATA.    c
c8e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67  onst char *zOrig
c8f0: 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  Db = 0;.    cons
c900: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62  t char *zOrigTab
c910: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
c920: 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d  char *zOrigCol =
c930: 20 30 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   0;.    zType = 
c940: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
c950: 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a   p, &zOrigDb, &z
c960: 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43  OrigTab, &zOrigC
c970: 6f 6c 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20  ol, 0);..    /* 
c980: 54 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61  The vdbe must ma
c990: 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20  ke its own copy 
c9a0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79  of the column-ty
c9b0: 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20  pe and other .  
c9c0: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63    ** column spec
c9d0: 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e  ific strings, in
c9e0: 20 63 61 73 65 20 74 68 65 20 73 63 68 65 6d 61   case the schema
c9f0: 20 69 73 20 72 65 73 65 74 20 62 65 66 6f 72 65   is reset before
ca00: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72   this.    ** vir
ca10: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20  tual machine is 
ca20: 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
ca30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
ca40: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
ca50: 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45  COLNAME_DATABASE
ca60: 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49 54  , zOrigDb, SQLIT
ca70: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
ca80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
ca90: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
caa0: 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72  LNAME_TABLE, zOr
cab0: 69 67 54 61 62 2c 20 53 51 4c 49 54 45 5f 54 52  igTab, SQLITE_TR
cac0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
cad0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
cae0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
caf0: 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43  E_COLUMN, zOrigC
cb00: 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  ol, SQLITE_TRANS
cb10: 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20  IENT);.#else.   
cb20: 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
cb30: 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20  ype(&sNC, p, 0, 
cb40: 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66  0, 0, 0);.#endif
cb50: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
cb60: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
cb70: 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50   COLNAME_DECLTYP
cb80: 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49 54 45  E, zType, SQLITE
cb90: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
cba0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
cbb0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
cbc0: 44 45 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a  DECLTYPE) */.}..
cbd0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
cbe0: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65  ode that will te
cbf0: 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20  ll the VDBE the 
cc00: 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73  names of columns
cc10: 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c  .** in the resul
cc20: 74 20 73 65 74 2e 20 20 54 68 69 73 20 69 6e 66  t set.  This inf
cc30: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
cc40: 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 0a   to provide the.
cc50: 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65  ** azCol[] value
cc60: 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63  s in the callbac
cc70: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
cc80: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
cc90: 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Names(.  Parse *
cca0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
ccb0: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
ccc0: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
ccd0: 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  bList,  /* List 
cce0: 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45  of tables */.  E
ccf0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
cd00: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
cd10: 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72  s defining the r
cd20: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a  esult set */.){.
cd30: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
cd40: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
cd50: 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33   i, j;.  sqlite3
cd60: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
cd70: 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d  b;.  int fullNam
cd80: 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a  es, shortNames;.
cd90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
cda0: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f  OMIT_EXPLAIN.  /
cdb0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
cdc0: 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68  EXPLAIN, skip th
cdd0: 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28  is step */.  if(
cde0: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
cdf0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
ce00: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
ce10: 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d  ( pParse->colNam
ce20: 65 73 53 65 74 20 7c 7c 20 4e 45 56 45 52 28 76  esSet || NEVER(v
ce30: 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  ==0) || db->mall
ce40: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
ce50: 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c  n;.  pParse->col
ce60: 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20  NamesSet = 1;.  
ce70: 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d  fullNames = (db-
ce80: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
ce90: 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  FullColNames)!=0
cea0: 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d  ;.  shortNames =
ceb0: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
cec0: 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
ced0: 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65  es)!=0;.  sqlite
cee0: 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28  3VdbeSetNumCols(
cef0: 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  v, pEList->nExpr
cf00: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
cf10: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
cf20: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
cf30: 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74  ;.    p = pEList
cf40: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
cf50: 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30    if( NEVER(p==0
cf60: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
cf70: 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b    if( pEList->a[
cf80: 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  i].zName ){.    
cf90: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
cfa0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
cfb0: 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  me;.      sqlite
cfc0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
cfd0: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
cfe0: 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54  ME, zName, SQLIT
cff0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
d000: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e    }else if( (p->
d010: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op==TK_COLUMN ||
d020: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43   p->op==TK_AGG_C
d030: 4f 4c 55 4d 4e 29 20 26 26 20 70 54 61 62 4c 69  OLUMN) && pTabLi
d040: 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  st ){.      Tabl
d050: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63  e *pTab;.      c
d060: 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20  har *zCol;.     
d070: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69   int iCol = p->i
d080: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f  Column;.      fo
d090: 72 28 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c  r(j=0; ALWAYS(j<
d0a0: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 29 3b  pTabList->nSrc);
d0b0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
d0c0: 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a  f( pTabList->a[j
d0d0: 5d 2e 69 43 75 72 73 6f 72 3d 3d 70 2d 3e 69 54  ].iCursor==p->iT
d0e0: 61 62 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20 20  able ) break;.  
d0f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
d100: 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  rt( j<pTabList->
d110: 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54  nSrc );.      pT
d120: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
d130: 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [j].pTab;.      
d140: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
d150: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
d160: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
d170: 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c  Col==-1 || (iCol
d180: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
d190: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
d1a0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
d1b0: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72         zCol = "r
d1c0: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c  owid";.      }el
d1d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c  se{.        zCol
d1e0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
d1f0: 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ol].zName;.     
d200: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 68   }.      if( !sh
d210: 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c  ortNames && !ful
d220: 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20  lNames ){.      
d230: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
d240: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
d250: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20  LNAME_NAME, .   
d260: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d270: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c  DbStrDup(db, pEL
d280: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29  ist->a[i].zSpan)
d290: 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  , SQLITE_DYNAMIC
d2a0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
d2b0: 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a  f( fullNames ){.
d2c0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
d2d0: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
d2e0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
d2f0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
d300: 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
d310: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , zCol);.       
d320: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
d330: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
d340: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65  NAME_NAME, zName
d350: 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  , SQLITE_DYNAMIC
d360: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
d370: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d380: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
d390: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
d3a0: 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54  , zCol, SQLITE_T
d3b0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
d3c0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
d3d0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
d3e0: 7a 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  z = pEList->a[i]
d3f0: 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7a 20  .zSpan;.      z 
d400: 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c 69 74 65 33  = z==0 ? sqlite3
d410: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c  MPrintf(db, "col
d420: 75 6d 6e 25 64 22 2c 20 69 2b 31 29 20 3a 20 73  umn%d", i+1) : s
d430: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
d440: 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c  b, z);.      sql
d450: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
d460: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
d470: 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c 49 54 45  _NAME, z, SQLITE
d480: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d  _DYNAMIC);.    }
d490: 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43  .  }.  generateC
d4a0: 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73  olumnTypes(pPars
d4b0: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
d4c0: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ist);.}../*.** G
d4d0: 69 76 65 6e 20 61 20 61 6e 20 65 78 70 72 65 73  iven a an expres
d4e0: 73 69 6f 6e 20 6c 69 73 74 20 28 77 68 69 63 68  sion list (which
d4f0: 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20 6c   is really the l
d500: 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ist of expressio
d510: 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20  ns.** that form 
d520: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
d530: 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  f a SELECT state
d540: 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65 20 61 70  ment) compute ap
d550: 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c  propriate.** col
d560: 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20  umn names for a 
d570: 74 61 62 6c 65 20 74 68 61 74 20 77 6f 75 6c 64  table that would
d580: 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73   hold the expres
d590: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
d5a0: 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   All column name
d5b0: 73 20 77 69 6c 6c 20 62 65 20 75 6e 69 71 75 65  s will be unique
d5c0: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65  ..**.** Only the
d5d0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72   column names ar
d5e0: 65 20 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c  e computed.  Col
d5f0: 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d  umn.zType, Colum
d600: 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20  n.zColl,.** and 
d610: 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20  other fields of 
d620: 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65  Column are zeroe
d630: 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
d640: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
d650: 63 65 73 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f  cess.  If a memo
d660: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
d670: 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73  ror occurs,.** s
d680: 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61  tore NULL in *pa
d690: 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e  Col and 0 in *pn
d6a0: 43 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Col and return S
d6b0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a  QLITE_NOMEM..*/.
d6c0: 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63  static int selec
d6d0: 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  tColumnsFromExpr
d6e0: 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
d6f0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
d700: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
d710: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
d720: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20   *pEList,       
d730: 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66 72 6f  /* Expr list fro
d740: 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72 69 76  m which to deriv
d750: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  e column names *
d760: 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c 2c 20  /.  i16 *pnCol, 
d770: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
d780: 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
d790: 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20  of columns here 
d7a0: 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61  */.  Column **pa
d7b0: 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Col          /* 
d7c0: 57 72 69 74 65 20 74 68 65 20 6e 65 77 20 63 6f  Write the new co
d7d0: 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65 20 2a  lumn list here *
d7e0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
d7f0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
d800: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
d810: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
d820: 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
d830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
d840: 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
d850: 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20   int cnt;       
d860: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d870: 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f 20 6d  Index added to m
d880: 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75 6e 69  ake the name uni
d890: 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20  que */.  Column 
d8a0: 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20  *aCol, *pCol;   
d8b0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
d8c0: 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c 74 20  ing over result 
d8d0: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74  columns */.  int
d8e0: 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
d8f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
d900: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
d910: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
d920: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 3b 20 20 20  */.  Expr *p;   
d930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d940: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66   /* Expression f
d950: 6f 72 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75  or a single resu
d960: 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  lt column */.  c
d970: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
d980: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
d990: 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  lumn name */.  i
d9a0: 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
d9b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
d9c0: 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a 4e  ze of name in zN
d9d0: 61 6d 65 5b 5d 20 2a 2f 0a 0a 20 20 69 66 28 20  ame[] */..  if( 
d9e0: 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e 43  pEList ){.    nC
d9f0: 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ol = pEList->nEx
da00: 70 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73  pr;.    aCol = s
da10: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
da20: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43  ro(db, sizeof(aC
da30: 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20  ol[0])*nCol);.  
da40: 20 20 74 65 73 74 63 61 73 65 28 20 61 43 6f 6c    testcase( aCol
da50: 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ==0 );.  }else{.
da60: 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20      nCol = 0;.  
da70: 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a    aCol = 0;.  }.
da80: 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b    *pnCol = nCol;
da90: 0a 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c  .  *paCol = aCol
daa0: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  ;..  for(i=0, pC
dab0: 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b  ol=aCol; i<nCol;
dac0: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
dad0: 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70     /* Get an app
dae0: 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f  ropriate name fo
daf0: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20  r the column.   
db00: 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c 69   */.    p = sqli
db10: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
db20: 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  te(pEList->a[i].
db30: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
db40: 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d  (zName = pEList-
db50: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20  >a[i].zName)!=0 
db60: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
db70: 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69  he column contai
db80: 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e  ns an "AS <name>
db90: 22 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e  " phrase, use <n
dba0: 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65  ame> as the name
dbb0: 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20   */.      zName 
dbc0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
dbd0: 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  p(db, zName);.  
dbe0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45    }else{.      E
dbf0: 78 70 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20  xpr *pColExpr = 
dc00: 70 3b 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65  p;  /* The expre
dc10: 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 74 68  ssion that is th
dc20: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  e result column 
dc30: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 54 61  name */.      Ta
dc40: 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
dc50: 20 20 20 2f 2a 20 54 61 62 6c 65 20 61 73 73 6f     /* Table asso
dc60: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
dc70: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
dc80: 20 20 20 20 20 77 68 69 6c 65 28 20 70 43 6f 6c       while( pCol
dc90: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  Expr->op==TK_DOT
dca0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
dcb0: 45 78 70 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d  Expr = pColExpr-
dcc0: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  >pRight;.       
dcd0: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45 78 70   assert( pColExp
dce0: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  r!=0 );.      }.
dcf0: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 45 78        if( pColEx
dd00: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
dd10: 4e 20 26 26 20 41 4c 57 41 59 53 28 70 43 6f 6c  N && ALWAYS(pCol
dd20: 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 29 20 29  Expr->pTab!=0) )
dd30: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  {.        /* For
dd40: 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68 65   columns use the
dd50: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d   column name nam
dd60: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  e */.        int
dd70: 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72   iCol = pColExpr
dd80: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
dd90: 20 20 20 70 54 61 62 20 3d 20 70 43 6f 6c 45 78     pTab = pColEx
dda0: 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  pr->pTab;.      
ddb0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69    if( iCol<0 ) i
ddc0: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
ddd0: 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  y;.        zName
dde0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
ddf0: 66 28 64 62 2c 20 22 25 73 22 2c 0a 20 20 20 20  f(db, "%s",.    
de00: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f               iCo
de10: 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f  l>=0 ? pTab->aCo
de20: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20  l[iCol].zName : 
de30: 22 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 20 20  "rowid");.      
de40: 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c 45 78  }else if( pColEx
de50: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b  pr->op==TK_ID ){
de60: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
de70: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
de80: 79 28 70 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49  y(pColExpr, EP_I
de90: 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
dea0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
deb0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
dec0: 25 73 22 2c 20 70 43 6f 6c 45 78 70 72 2d 3e 75  %s", pColExpr->u
ded0: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
dee0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
def0: 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e  * Use the origin
df00: 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20 63  al text of the c
df10: 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e  olumn expression
df20: 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a   as its name */.
df30: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
df40: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
df50: 62 2c 20 22 25 73 22 2c 20 70 45 4c 69 73 74 2d  b, "%s", pEList-
df60: 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20  >a[i].zSpan);.  
df70: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
df80: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
df90: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71  iled ){.      sq
dfa0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
dfb0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72  zName);.      br
dfc0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
dfd0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
dfe0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
dff0: 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65 20  unique.  If the 
e000: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71  name is not uniq
e010: 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e  ue,.    ** appen
e020: 64 20 61 20 69 6e 74 65 67 65 72 20 74 6f 20 74  d a integer to t
e030: 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20  he name so that 
e040: 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75  it becomes uniqu
e050: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e  e..    */.    nN
e060: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
e070: 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20  len30(zName);.  
e080: 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a    for(j=cnt=0; j
e090: 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <i; j++){.      
e0a0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
e0b0: 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  mp(aCol[j].zName
e0c0: 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  , zName)==0 ){. 
e0d0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65         char *zNe
e0e0: 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  wName;.        i
e0f0: 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt k;.        fo
e100: 72 28 6b 3d 6e 4e 61 6d 65 2d 31 3b 20 6b 3e 31  r(k=nName-1; k>1
e110: 20 26 26 20 73 71 6c 69 74 65 33 49 73 64 69 67   && sqlite3Isdig
e120: 69 74 28 7a 4e 61 6d 65 5b 6b 5d 29 3b 20 6b 2d  it(zName[k]); k-
e130: 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28  -){}.        if(
e140: 20 6b 3e 3d 30 20 26 26 20 7a 4e 61 6d 65 5b 6b   k>=0 && zName[k
e150: 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d 65 20 3d  ]==':' ) nName =
e160: 20 6b 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   k;.        zNam
e170: 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20  e[nName] = 0;.  
e180: 20 20 20 20 20 20 7a 4e 65 77 4e 61 6d 65 20 3d        zNewName =
e190: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
e1a0: 64 62 2c 20 22 25 73 3a 25 64 22 2c 20 7a 4e 61  db, "%s:%d", zNa
e1b0: 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20  me, ++cnt);.    
e1c0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
e1d0: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
e1e0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e        zName = zN
e1f0: 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  ewName;.        
e200: 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  j = -1;.        
e210: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62  if( zName==0 ) b
e220: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
e230: 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e    }.    pCol->zN
e240: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d  ame = zName;.  }
e250: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
e260: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66  cFailed ){.    f
e270: 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b  or(j=0; j<i; j++
e280: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
e290: 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b  DbFree(db, aCol[
e2a0: 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  j].zName);.    }
e2b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
e2c0: 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20  ee(db, aCol);.  
e2d0: 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20    *paCol = 0;.  
e2e0: 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20    *pnCol = 0;.  
e2f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e300: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74  NOMEM;.  }.  ret
e310: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
e320: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65  ../*.** Add type
e330: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69   and collation i
e340: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20  nformation to a 
e350: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65  column list base
e360: 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54  d on.** a SELECT
e370: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a   statement..** .
e380: 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  ** The column li
e390: 73 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61  st presumably ca
e3a0: 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f  me from selectCo
e3b0: 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70  lumnNamesFromExp
e3c0: 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20  rList()..** The 
e3d0: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20  column list has 
e3e0: 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20  only names, not 
e3f0: 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69  types or collati
e400: 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ons.  This.** ro
e410: 75 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75  utine goes throu
e420: 67 68 20 61 6e 64 20 61 64 64 73 20 74 68 65 20  gh and adds the 
e430: 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74  types and collat
e440: 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ions..**.** This
e450: 20 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65   routine require
e460: 73 20 74 68 61 74 20 61 6c 6c 20 69 64 65 6e 74  s that all ident
e470: 69 66 69 65 72 73 20 69 6e 20 74 68 65 20 53 45  ifiers in the SE
e480: 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  LECT.** statemen
e490: 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a  t be resolved..*
e4a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
e4b0: 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
e4c0: 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20  eAndCollation(. 
e4d0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
e4e0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
e4f0: 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20  g contexts */.  
e500: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
e510: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 63 6f 6c        /* Add col
e520: 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d 61  umn type informa
e530: 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 74 61 62  tion to this tab
e540: 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  le */.  Select *
e550: 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a  pSelect       /*
e560: 20 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f 20   SELECT used to 
e570: 64 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73 20  determine types 
e580: 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a  and collations *
e590: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
e5a0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
e5b0: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73  .  NameContext s
e5c0: 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  NC;.  Column *pC
e5d0: 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  ol;.  CollSeq *p
e5e0: 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Coll;.  int i;. 
e5f0: 20 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72 75   Expr *p;.  stru
e600: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
e610: 20 2a 61 3b 0a 20 20 75 36 34 20 73 7a 41 6c 6c   *a;.  u64 szAll
e620: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
e630: 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20   pSelect!=0 );. 
e640: 20 61 73 73 65 72 74 28 20 28 70 53 65 6c 65 63   assert( (pSelec
e650: 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  t->selFlags & SF
e660: 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b  _Resolved)!=0 );
e670: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
e680: 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e  >nCol==pSelect->
e690: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c  pEList->nExpr ||
e6a0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
e6b0: 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  d );.  if( db->m
e6c0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
e6d0: 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26  turn;.  memset(&
e6e0: 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
e6f0: 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63  NC));.  sNC.pSrc
e700: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
e710: 70 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c  pSrc;.  a = pSel
e720: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a  ect->pEList->a;.
e730: 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d    for(i=0, pCol=
e740: 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54  pTab->aCol; i<pT
e750: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  ab->nCol; i++, p
e760: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  Col++){.    p = 
e770: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
e780: 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71  pCol->zType = sq
e790: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
e7a0: 2c 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  , columnType(&sN
e7b0: 43 2c 20 70 2c 30 2c 30 2c 30 2c 20 26 70 43 6f  C, p,0,0,0, &pCo
e7c0: 6c 2d 3e 73 7a 45 73 74 29 29 3b 0a 20 20 20 20  l->szEst));.    
e7d0: 73 7a 41 6c 6c 20 2b 3d 20 70 43 6f 6c 2d 3e 73  szAll += pCol->s
e7e0: 7a 45 73 74 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  zEst;.    pCol->
e7f0: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
e800: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
e810: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d  );.    if( pCol-
e820: 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20 29 20 70  >affinity==0 ) p
e830: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
e840: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
e850: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
e860: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
e870: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
e880: 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
e890: 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d     pCol->zColl =
e8a0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
e8b0: 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  (db, pColl->zNam
e8c0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
e8d0: 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d  pTab->szTabRow =
e8e0: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 73   sqlite3LogEst(s
e8f0: 7a 41 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  zAll*4);.}../*.*
e900: 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54  * Given a SELECT
e910: 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65   statement, gene
e920: 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74 72  rate a Table str
e930: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
e940: 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73  ribes.** the res
e950: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74 20  ult set of that 
e960: 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65  SELECT..*/.Table
e970: 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53   *sqlite3ResultS
e980: 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65  etOfSelect(Parse
e990: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
e9a0: 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61   *pSelect){.  Ta
e9b0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c  ble *pTab;.  sql
e9c0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
e9d0: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76  e->db;.  int sav
e9e0: 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65  edFlags;..  save
e9f0: 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61  dFlags = db->fla
ea00: 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  gs;.  db->flags 
ea10: 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43  &= ~SQLITE_FullC
ea20: 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66  olNames;.  db->f
ea30: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53  lags |= SQLITE_S
ea40: 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20  hortColNames;.  
ea50: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
ea60: 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  p(pParse, pSelec
ea70: 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61  t, 0);.  if( pPa
ea80: 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
ea90: 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70  rn 0;.  while( p
eaa0: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29  Select->pPrior )
eab0: 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65   pSelect = pSele
eac0: 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62  ct->pPrior;.  db
ead0: 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46  ->flags = savedF
eae0: 6c 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73  lags;.  pTab = s
eaf0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
eb00: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
eb10: 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54  ble) );.  if( pT
eb20: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ab==0 ){.    ret
eb30: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20  urn 0;.  }.  /* 
eb40: 54 68 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c  The sqlite3Resul
eb50: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69  tSetOfSelect() i
eb60: 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f  s only used n co
eb70: 6e 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f  ntexts where loo
eb80: 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64  kaside.  ** is d
eb90: 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73  isabled */.  ass
eba0: 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  ert( db->lookasi
ebb0: 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20 29  de.bEnabled==0 )
ebc0: 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d  ;.  pTab->nRef =
ebd0: 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d   1;.  pTab->zNam
ebe0: 65 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e  e = 0;.  pTab->n
ebf0: 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b  RowLogEst = 200;
ec00: 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71   assert( 200==sq
ec10: 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38  lite3LogEst(1048
ec20: 35 37 36 29 20 29 3b 0a 20 20 73 65 6c 65 63 74  576) );.  select
ec30: 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
ec40: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
ec50: 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54  ect->pEList, &pT
ec60: 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d  ab->nCol, &pTab-
ec70: 3e 61 43 6f 6c 29 3b 0a 20 20 73 65 6c 65 63 74  >aCol);.  select
ec80: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
ec90: 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65  Collation(pParse
eca0: 2c 20 70 54 61 62 2c 20 70 53 65 6c 65 63 74 29  , pTab, pSelect)
ecb0: 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20  ;.  pTab->iPKey 
ecc0: 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e  = -1;.  if( db->
ecd0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
ece0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
ecf0: 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  eTable(db, pTab)
ed00: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
ed10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61    }.  return pTa
ed20: 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  b;.}../*.** Get 
ed30: 61 20 56 44 42 45 20 66 6f 72 20 74 68 65 20 67  a VDBE for the g
ed40: 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74  iven parser cont
ed50: 65 78 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ext.  Create a n
ed60: 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73  ew one if necess
ed70: 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ary..** If an er
ed80: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
ed90: 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76  rn NULL and leav
eda0: 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70  e a message in p
edb0: 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a  Parse..*/.Vdbe *
edc0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 50  sqlite3GetVdbe(P
edd0: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
ede0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
edf0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20  e->pVdbe;.  if( 
ee00: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20  v==0 ){.    v = 
ee10: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20  pParse->pVdbe = 
ee20: 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74  sqlite3VdbeCreat
ee30: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
ee40: 66 28 20 76 20 29 20 73 71 6c 69 74 65 33 56 64  f( v ) sqlite3Vd
ee50: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 49  beAddOp0(v, OP_I
ee60: 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20 70 50  nit);.    if( pP
ee70: 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d  arse->pToplevel=
ee80: 3d 30 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d  =0.     && Optim
ee90: 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70  izationEnabled(p
eea0: 50 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45  Parse->db,SQLITE
eeb0: 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29  _FactorOutConst)
eec0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 50  .    ){.      pP
eed0: 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63  arse->okConstFac
eee0: 74 6f 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  tor = 1;.    }..
eef0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a    }.  return v;.
ef00: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  }.../*.** Comput
ef10: 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64  e the iLimit and
ef20: 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20   iOffset fields 
ef30: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61  of the SELECT ba
ef40: 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c  sed on the.** pL
ef50: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
ef60: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70   expressions.  p
ef70: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
ef80: 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65  t hold the expre
ef90: 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61  ssions.** that a
efa0: 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69  ppear in the ori
efb0: 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
efc0: 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49  ent after the LI
efd0: 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a  MIT and OFFSET.*
efe0: 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20  * keywords.  Or 
eff0: 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65  NULL if those ke
f000: 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74  ywords are omitt
f010: 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  ed. iLimit and i
f020: 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74  Offset .** are t
f030: 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72  he integer memor
f040: 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  y register numbe
f050: 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20  rs for counters 
f060: 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  used to compute 
f070: 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e  .** the limit an
f080: 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68  d offset.  If th
f090: 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20  ere is no limit 
f0a0: 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74  and/or offset, t
f0b0: 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61  hen .** iLimit a
f0c0: 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e  nd iOffset are n
f0d0: 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54  egative..**.** T
f0e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e  his routine chan
f0f0: 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f  ges the values o
f100: 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  f iLimit and iOf
f110: 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20  fset only if.** 
f120: 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65  a limit or offse
f130: 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
f140: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
f150: 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a  et.  iLimit and.
f160: 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c  ** iOffset shoul
f170: 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73  d have been pres
f180: 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74  et to appropriat
f190: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73  e default values
f1a0: 20 28 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f 72   (zero).** prior
f1b0: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
f1c0: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
f1d0: 54 68 65 20 69 4f 66 66 73 65 74 20 72 65 67 69  The iOffset regi
f1e0: 73 74 65 72 20 28 69 66 20 69 74 20 65 78 69 73  ster (if it exis
f1f0: 74 73 29 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ts) is initializ
f200: 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a  ed to the value.
f210: 2a 2a 20 6f 66 20 74 68 65 20 4f 46 46 53 45 54  ** of the OFFSET
f220: 2e 20 20 54 68 65 20 69 4c 69 6d 69 74 20 72 65  .  The iLimit re
f230: 67 69 73 74 65 72 20 69 73 20 69 6e 69 74 69 61  gister is initia
f240: 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e 20  lized to LIMIT. 
f250: 20 52 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f 66   Register.** iOf
f260: 66 73 65 74 2b 31 20 69 73 20 69 6e 69 74 69 61  fset+1 is initia
f270: 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b 4f  lized to LIMIT+O
f280: 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  FFSET..**.** Onl
f290: 79 20 69 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f  y if pLimit!=0 o
f2a0: 72 20 70 4f 66 66 73 65 74 21 3d 30 20 64 6f 20  r pOffset!=0 do 
f2b0: 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74  the limit regist
f2c0: 65 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66  ers get.** redef
f2d0: 69 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e  ined.  The UNION
f2e0: 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73   ALL operator us
f2f0: 65 73 20 74 68 69 73 20 70 72 6f 70 65 72 74 79  es this property
f300: 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65   to force.** the
f310: 20 72 65 75 73 65 20 6f 66 20 74 68 65 20 73 61   reuse of the sa
f320: 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66  me limit and off
f330: 73 65 74 20 72 65 67 69 73 74 65 72 73 20 61 63  set registers ac
f340: 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  ross multiple.**
f350: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
f360: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
f370: 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  id computeLimitR
f380: 65 67 69 73 74 65 72 73 28 50 61 72 73 65 20 2a  egisters(Parse *
f390: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
f3a0: 70 2c 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a  p, int iBreak){.
f3b0: 20 20 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20    Vdbe *v = 0;. 
f3c0: 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b   int iLimit = 0;
f3d0: 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a  .  int iOffset;.
f3e0: 20 20 69 6e 74 20 61 64 64 72 31 2c 20 6e 3b 0a    int addr1, n;.
f3f0: 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
f400: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
f410: 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22  .  ** "LIMIT -1"
f420: 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c   always shows al
f430: 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69  l rows.  There i
f440: 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74  s some.  ** cont
f450: 72 6f 76 65 72 73 79 20 61 62 6f 75 74 20 77 68  roversy about wh
f460: 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62  at the correct b
f470: 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62  ehavior should b
f480: 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72  e..  ** The curr
f490: 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
f4a0: 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c  on interprets "L
f4b0: 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a  IMIT 0" to mean.
f4c0: 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20    ** no rows..  
f4d0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
f4e0: 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
f4f0: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  e);.  assert( p-
f500: 3e 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70  >pOffset==0 || p
f510: 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20  ->pLimit!=0 );. 
f520: 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29   if( p->pLimit )
f530: 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20  {.    p->iLimit 
f540: 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61  = iLimit = ++pPa
f550: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76  rse->nMem;.    v
f560: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
f570: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 61  e(pParse);.    a
f580: 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
f590: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
f5a0: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70  prIsInteger(p->p
f5b0: 4c 69 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20  Limit, &n) ){.  
f5c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f5d0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
f5e0: 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b  ger, n, iLimit);
f5f0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
f600: 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f  nt((v, "LIMIT co
f610: 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20  unter"));.      
f620: 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
f630: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f640: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
f650: 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  , 0, iBreak);.  
f660: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e      }else if( n>
f670: 3d 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74  =0 && p->nSelect
f680: 52 6f 77 3e 28 75 36 34 29 6e 20 29 7b 0a 20 20  Row>(u64)n ){.  
f690: 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
f6a0: 52 6f 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20 7d  Row = n;.      }
f6b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f6c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
f6d0: 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69  e(pParse, p->pLi
f6e0: 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  mit, iLimit);.  
f6f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f700: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp1(v, OP_Must
f710: 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 20  BeInt, iLimit); 
f720: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
f730: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
f740: 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f  nt((v, "LIMIT co
f750: 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20  unter"));.      
f760: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f770: 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20  2(v, OP_IfZero, 
f780: 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  iLimit, iBreak);
f790: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
f7a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f7b0: 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20  p->pOffset ){.  
f7c0: 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
f7d0: 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61   iOffset = ++pPa
f7e0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
f7f0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
f800: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61     /* Allocate a
f810: 6e 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  n extra register
f820: 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65   for limit+offse
f830: 74 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  t */.      sqlit
f840: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
f850: 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69  e, p->pOffset, i
f860: 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73  Offset);.      s
f870: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
f880: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
f890: 2c 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65  , iOffset); Vdbe
f8a0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
f8b0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
f8c0: 76 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74  v, "OFFSET count
f8d0: 65 72 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64  er"));.      add
f8e0: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
f8f0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50  AddOp1(v, OP_IfP
f900: 6f 73 2c 20 69 4f 66 66 73 65 74 29 3b 20 56 64  os, iOffset); Vd
f910: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
f920: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f930: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
f940: 65 67 65 72 2c 20 30 2c 20 69 4f 66 66 73 65 74  eger, 0, iOffset
f950: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f960: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
f970: 61 64 64 72 31 29 3b 0a 20 20 20 20 20 20 73 71  addr1);.      sq
f980: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
f990: 76 2c 20 4f 50 5f 41 64 64 2c 20 69 4c 69 6d 69  v, OP_Add, iLimi
f9a0: 74 2c 20 69 4f 66 66 73 65 74 2c 20 69 4f 66 66  t, iOffset, iOff
f9b0: 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 56 64  set+1);.      Vd
f9c0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
f9d0: 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a  IMIT+OFFSET"));.
f9e0: 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71        addr1 = sq
f9f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
fa00: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4c 69  v, OP_IfPos, iLi
fa10: 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  mit); VdbeCovera
fa20: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
fa30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
fa40: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31  , OP_Integer, -1
fa50: 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20  , iOffset+1);.  
fa60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
fa70: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
fa80: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
fa90: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
faa0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
fab0: 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ECT./*.** Return
fac0: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
fad0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
fae0: 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c  nce for the iCol
faf0: 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a  -th column of.**
fb00: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
fb10: 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  for the compound
fb20: 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e  -select statemen
fb30: 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e  t "p".  Return N
fb40: 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f  ULL if.** the co
fb50: 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61  lumn has no defa
fb60: 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ult collating se
fb70: 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  quence..**.** Th
fb80: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
fb90: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d  ence for the com
fba0: 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20  pound select is 
fbb0: 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a  taken from the.*
fbc0: 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  * left-most term
fbd0: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 74   of the select t
fbe0: 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  hat has a collat
fbf0: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f  ing sequence..*/
fc00: 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20  .static CollSeq 
fc10: 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c  *multiSelectColl
fc20: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
fc30: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
fc40: 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53  t iCol){.  CollS
fc50: 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20  eq *pRet;.  if( 
fc60: 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
fc70: 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c   pRet = multiSel
fc80: 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
fc90: 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43  e, p->pPrior, iC
fca0: 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ol);.  }else{.  
fcb0: 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a    pRet = 0;.  }.
fcc0: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
fcd0: 30 20 29 3b 0a 20 20 69 66 28 20 70 52 65 74 3d  0 );.  if( pRet=
fce0: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 2d 3e 70 45  =0 && iCol<p->pE
fcf0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
fd00: 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65     pRet = sqlite
fd10: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
fd20: 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  rse, p->pEList->
fd30: 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a  a[iCol].pExpr);.
fd40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
fd50: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  t;.}../*.** The 
fd60: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
fd70: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
fd80: 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
fd90: 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  is a compound SE
fda0: 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20  LECT.** with an 
fdb0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
fdc0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
fdd0: 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74  llocates and ret
fde0: 75 72 6e 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a  urns a KeyInfo.*
fdf0: 2a 20 73 74 72 75 63 74 75 72 65 20 73 75 69 74  * structure suit
fe00: 61 62 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65  able for impleme
fe10: 6e 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20  nting the ORDER 
fe20: 42 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  BY..**.** Space 
fe30: 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49  to hold the KeyI
fe40: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
fe50: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
fe60: 61 6c 6c 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69  alloc. The calli
fe70: 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  ng.** function i
fe80: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
fe90: 72 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20  r ensuring that 
fea0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  this structure i
feb0: 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  s eventually.** 
fec0: 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  freed..*/.static
fed0: 20 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53   KeyInfo *multiS
fee0: 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49  electOrderByKeyI
fef0: 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73  nfo(Parse *pPars
ff00: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
ff10: 74 20 6e 45 78 74 72 61 29 7b 0a 20 20 45 78 70  t nExtra){.  Exp
ff20: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
ff30: 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
ff40: 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 20 3d 20   int nOrderBy = 
ff50: 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  p->pOrderBy->nEx
ff60: 70 72 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pr;.  sqlite3 *d
ff70: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
ff80: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 52 65 74 20    KeyInfo *pRet 
ff90: 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
ffa0: 41 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72  Alloc(db, nOrder
ffb0: 42 79 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20  By+nExtra, 1);. 
ffc0: 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
ffd0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
ffe0: 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
fff0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
10000 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
10010 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4f 72 64  m *pItem = &pOrd
10020 65 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  erBy->a[i];.    
10030 20 20 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20    Expr *pTerm = 
10040 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pItem->pExpr;.  
10050 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
10060 6c 6c 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70  ll;..      if( p
10070 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50  Term->flags & EP
10080 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20  _Collate ){.    
10090 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
100a0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
100b0 50 61 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20  Parse, pTerm);. 
100c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
100d0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74      pColl = mult
100e0 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
100f0 50 61 72 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d  Parse, p, pItem-
10100 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
10110 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  -1);.        if(
10120 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c   pColl==0 ) pCol
10130 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
10140 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65  l;.        pOrde
10150 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20  rBy->a[i].pExpr 
10160 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  =.          sqli
10170 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74  te3ExprAddCollat
10180 65 53 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20  eString(pParse, 
10190 70 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  pTerm, pColl->zN
101a0 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
101b0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
101c0 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
101d0 65 61 62 6c 65 28 70 52 65 74 29 20 29 3b 0a 20  eable(pRet) );. 
101e0 20 20 20 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c       pRet->aColl
101f0 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20  [i] = pColl;.   
10200 20 20 20 70 52 65 74 2d 3e 61 53 6f 72 74 4f 72     pRet->aSortOr
10210 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42  der[i] = pOrderB
10220 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
10230 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  r;.    }.  }..  
10240 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
10250 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10260 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68  MIT_CTE./*.** Th
10270 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
10280 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 74  ates VDBE code t
10290 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  o compute the co
102a0 6e 74 65 6e 74 20 6f 66 20 61 20 57 49 54 48 20  ntent of a WITH 
102b0 52 45 43 55 52 53 49 56 45 0a 2a 2a 20 71 75 65  RECURSIVE.** que
102c0 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  ry of the form:.
102d0 2a 2a 0a 2a 2a 20 20 20 3c 72 65 63 75 72 73 69  **.**   <recursi
102e0 76 65 2d 74 61 62 6c 65 3e 20 41 53 20 28 3c 73  ve-table> AS (<s
102f0 65 74 75 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f  etup-query> UNIO
10300 4e 20 5b 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69  N [ALL] <recursi
10310 76 65 2d 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20  ve-query>).**   
10320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10330 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f        \_________
10340 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 20 20 20  __/             
10350 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
10360 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  /.**            
10370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
10380 2d 3e 70 50 72 69 6f 72 20 20 20 20 20 20 20 20  ->pPrior        
10390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 0a                p.
103a0 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69  **.**.** There i
103b0 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 72 65  s exactly one re
103c0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 72  ference to the r
103d0 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 69  ecursive-table i
103e0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
103f0 65 0a 2a 2a 20 6f 66 20 72 65 63 75 72 73 69 76  e.** of recursiv
10400 65 2d 71 75 65 72 79 2c 20 6d 61 72 6b 65 64 20  e-query, marked 
10410 77 69 74 68 20 74 68 65 20 53 72 63 4c 69 73 74  with the SrcList
10420 2d 3e 61 5b 5d 2e 69 73 52 65 63 75 72 73 69 76  ->a[].isRecursiv
10430 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  e flag..**.** Th
10440 65 20 73 65 74 75 70 2d 71 75 65 72 79 20 72 75  e setup-query ru
10450 6e 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72  ns once to gener
10460 61 74 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 73  ate an initial s
10470 65 74 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  et of rows that 
10480 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65  go.** into a Que
10490 75 65 20 74 61 62 6c 65 2e 20 20 52 6f 77 73 20  ue table.  Rows 
104a0 61 72 65 20 65 78 74 72 61 63 74 65 64 20 66 72  are extracted fr
104b0 6f 6d 20 74 68 65 20 51 75 65 75 65 20 74 61 62  om the Queue tab
104c0 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65  le one by.** one
104d0 2e 20 20 45 61 63 68 20 72 6f 77 20 65 78 74 72  .  Each row extr
104e0 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65  acted from Queue
104f0 20 69 73 20 6f 75 74 70 75 74 20 74 6f 20 70 44   is output to pD
10500 65 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 73  est.  Then the s
10510 69 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74  ingle.** extract
10520 65 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74  ed row (now in t
10530 68 65 20 69 43 75 72 72 65 6e 74 20 74 61 62 6c  he iCurrent tabl
10540 65 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63  e) becomes the c
10550 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a  ontent of the.**
10560 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65   recursive-table
10570 20 66 6f 72 20 61 20 72 65 63 75 72 73 69 76 65   for a recursive
10580 2d 71 75 65 72 79 20 72 75 6e 2e 20 20 54 68 65  -query run.  The
10590 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 72   output of the r
105a0 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 0a 2a  ecursive-query.*
105b0 2a 20 69 73 20 61 64 64 65 64 20 62 61 63 6b 20  * is added back 
105c0 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20 74  into the Queue t
105d0 61 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74  able.  Then anot
105e0 68 65 72 20 72 6f 77 20 69 73 20 65 78 74 72 61  her row is extra
105f0 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 0a  cted from Queue.
10600 2a 2a 20 61 6e 64 20 74 68 65 20 69 74 65 72 61  ** and the itera
10610 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75  tion continues u
10620 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 74  ntil the Queue t
10630 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
10640 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70  *.** If the comp
10650 6f 75 6e 64 20 71 75 65 72 79 20 6f 70 65 72 61  ound query opera
10660 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74 68 65  tor is UNION the
10670 6e 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 20 72  n no duplicate r
10680 6f 77 73 20 61 72 65 20 65 76 65 72 0a 2a 2a 20  ows are ever.** 
10690 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68  inserted into th
106a0 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20  e Queue table.  
106b0 54 68 65 20 69 44 69 73 74 69 6e 63 74 20 74 61  The iDistinct ta
106c0 62 6c 65 20 6b 65 65 70 73 20 61 20 63 6f 70 79  ble keeps a copy
106d0 20 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20   of all rows.** 
106e0 74 68 61 74 20 68 61 76 65 20 65 76 65 72 20 62  that have ever b
106f0 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74  een inserted int
10700 6f 20 51 75 65 75 65 20 61 6e 64 20 63 61 75 73  o Queue and caus
10710 65 73 20 64 75 70 6c 69 63 61 74 65 73 20 74 6f  es duplicates to
10720 20 62 65 0a 2a 2a 20 64 69 73 63 61 72 64 65 64   be.** discarded
10730 2e 20 20 49 66 20 74 68 65 20 6f 70 65 72 61 74  .  If the operat
10740 6f 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c  or is UNION ALL,
10750 20 74 68 65 6e 20 64 75 70 6c 69 63 61 74 65 73   then duplicates
10760 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a   are allowed..**
10770 20 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72   .** If the quer
10780 79 20 68 61 73 20 61 6e 20 4f 52 44 45 52 20 42  y has an ORDER B
10790 59 2c 20 74 68 65 6e 20 65 6e 74 72 69 65 73 20  Y, then entries 
107a0 69 6e 20 74 68 65 20 51 75 65 75 65 20 74 61 62  in the Queue tab
107b0 6c 65 20 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a  le are kept in.*
107c0 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72  * ORDER BY order
107d0 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 65   and the first e
107e0 6e 74 72 79 20 69 73 20 65 78 74 72 61 63 74 65  ntry is extracte
107f0 64 20 66 6f 72 20 65 61 63 68 20 63 79 63 6c 65  d for each cycle
10800 2e 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e  .  Without.** an
10810 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 51   ORDER BY, the Q
10820 75 65 75 65 20 74 61 62 6c 65 20 69 73 20 6a 75  ueue table is ju
10830 73 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a  st a FIFO..**.**
10840 20 49 66 20 61 20 4c 49 4d 49 54 20 63 6c 61 75   If a LIMIT clau
10850 73 65 20 69 73 20 70 72 6f 76 69 64 65 64 2c 20  se is provided, 
10860 74 68 65 6e 20 74 68 65 20 69 74 65 72 61 74 69  then the iterati
10870 6f 6e 20 73 74 6f 70 73 20 61 66 74 65 72 20 4c  on stops after L
10880 49 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76  IMIT rows.** hav
10890 65 20 62 65 65 6e 20 6f 75 74 70 75 74 20 74 6f  e been output to
108a0 20 70 44 65 73 74 2e 20 20 41 20 4c 49 4d 49 54   pDest.  A LIMIT
108b0 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74   of zero means t
108c0 6f 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77 73  o output no rows
108d0 20 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69   and a.** negati
108e0 76 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74  ve LIMIT means t
108f0 6f 20 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f 77  o output all row
10900 73 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  s.  If there is 
10910 61 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54 20 63  also an OFFSET c
10920 6c 61 75 73 65 0a 2a 2a 20 77 69 74 68 20 61 20  lause.** with a 
10930 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2c 20  positive value, 
10940 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 4f  then the first O
10950 46 46 53 45 54 20 6f 75 74 70 75 74 73 20 61 72  FFSET outputs ar
10960 65 20 64 69 73 63 61 72 64 65 64 20 72 61 74 68  e discarded rath
10970 65 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67  er.** than being
10980 20 73 65 6e 74 20 74 6f 20 70 44 65 73 74 2e 20   sent to pDest. 
10990 20 54 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74   The LIMIT count
109a0 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20   does not begin 
109b0 75 6e 74 69 6c 20 61 66 74 65 72 20 4f 46 46 53  until after OFFS
109c0 45 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65 20  ET.** rows have 
109d0 62 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f  been skipped..*/
109e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
109f0 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69  erateWithRecursi
10a00 76 65 51 75 65 72 79 28 0a 20 20 50 61 72 73 65  veQuery(.  Parse
10a10 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
10a20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
10a30 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
10a40 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
10a50 2a 20 54 68 65 20 72 65 63 75 72 73 69 76 65 20  * The recursive 
10a60 53 45 4c 45 43 54 20 74 6f 20 62 65 20 63 6f 64  SELECT to be cod
10a70 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
10a80 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
10a90 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
10aa0 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
10ab0 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  /.){.  SrcList *
10ac0 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20  pSrc = p->pSrc; 
10ad0 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
10ae0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 72   clause of the r
10af0 65 63 75 72 73 69 76 65 20 71 75 65 72 79 20 2a  ecursive query *
10b00 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70  /.  int nCol = p
10b10 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
10b20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
10b30 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
10b40 63 75 72 73 69 76 65 20 74 61 62 6c 65 20 2a 2f  cursive table */
10b50 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
10b60 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
10b70 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64   /* The prepared
10b80 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   statement under
10b90 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
10ba0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 74 75  .  Select *pSetu
10bb0 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20  p = p->pPrior;  
10bc0 20 2f 2a 20 54 68 65 20 73 65 74 75 70 20 71 75   /* The setup qu
10bd0 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ery */.  int add
10be0 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  rTop;           
10bf0 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66         /* Top of
10c00 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69   the loop */.  i
10c10 6e 74 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64  nt addrCont, add
10c20 72 42 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20  rBreak;      /* 
10c30 43 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42 52 45  CONTINUE and BRE
10c40 41 4b 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a  AK addresses */.
10c50 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d    int iCurrent =
10c60 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
10c70 2f 2a 20 54 68 65 20 43 75 72 72 65 6e 74 20 74  /* The Current t
10c80 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  able */.  int re
10c90 67 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20  gCurrent;       
10ca0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
10cb0 74 65 72 20 68 6f 6c 64 69 6e 67 20 43 75 72 72  ter holding Curr
10cc0 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ent table */.  i
10cd0 6e 74 20 69 51 75 65 75 65 3b 20 20 20 20 20 20  nt iQueue;      
10ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10cf0 54 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  The Queue table 
10d00 2a 2f 0a 20 20 69 6e 74 20 69 44 69 73 74 69 6e  */.  int iDistin
10d10 63 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ct = 0;         
10d20 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20     /* To ensure 
10d30 75 6e 69 71 75 65 20 72 65 73 75 6c 74 73 20 69  unique results i
10d40 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74  f UNION */.  int
10d50 20 65 44 65 73 74 20 3d 20 53 52 54 5f 46 69 66   eDest = SRT_Fif
10d60 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f  o;         /* Ho
10d70 77 20 74 6f 20 77 72 69 74 65 20 74 6f 20 51 75  w to write to Qu
10d80 65 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  eue */.  SelectD
10d90 65 73 74 20 64 65 73 74 51 75 65 75 65 3b 20 20  est destQueue;  
10da0 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74         /* Select
10db0 44 65 73 74 20 74 61 72 67 65 74 74 69 6e 67 20  Dest targetting 
10dc0 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
10dd0 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
10de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10df0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
10e00 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  er */.  int rc; 
10e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
10e30 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  code */.  ExprLi
10e40 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
10e50 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f          /* The O
10e60 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
10e70 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74  /.  Expr *pLimit
10e80 2c 20 2a 70 4f 66 66 73 65 74 3b 20 20 20 20 20  , *pOffset;     
10e90 20 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49 54    /* Saved LIMIT
10ea0 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20   and OFFSET */. 
10eb0 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20 72   int regLimit, r
10ec0 65 67 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f  egOffset;      /
10ed0 2a 20 52 65 67 69 73 74 65 72 73 20 75 73 65 64  * Registers used
10ee0 20 62 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46   by LIMIT and OF
10ef0 46 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62  FSET */..  /* Ob
10f00 74 61 69 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  tain authorizati
10f10 6f 6e 20 74 6f 20 64 6f 20 61 20 72 65 63 75 72  on to do a recur
10f20 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20  sive query */.  
10f30 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
10f40 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
10f50 49 54 45 5f 52 45 43 55 52 53 49 56 45 2c 20 30  ITE_RECURSIVE, 0
10f60 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
10f70 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  ;..  /* Process 
10f80 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
10f90 46 53 45 54 20 63 6c 61 75 73 65 73 2c 20 69 66  FSET clauses, if
10fa0 20 74 68 65 79 20 65 78 69 73 74 20 2a 2f 0a 20   they exist */. 
10fb0 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c   addrBreak = sql
10fc0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
10fd0 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c  l(v);.  computeL
10fe0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
10ff0 61 72 73 65 2c 20 70 2c 20 61 64 64 72 42 72 65  arse, p, addrBre
11000 61 6b 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d 20  ak);.  pLimit = 
11010 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 70 4f 66  p->pLimit;.  pOf
11020 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
11030 74 3b 0a 20 20 72 65 67 4c 69 6d 69 74 20 3d 20  t;.  regLimit = 
11040 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 72 65 67  p->iLimit;.  reg
11050 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66  Offset = p->iOff
11060 73 65 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74  set;.  p->pLimit
11070 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20   = p->pOffset = 
11080 30 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  0;.  p->iLimit =
11090 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
110a0 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  .  pOrderBy = p-
110b0 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a  >pOrderBy;..  /*
110c0 20 4c 6f 63 61 74 65 20 74 68 65 20 63 75 72 73   Locate the curs
110d0 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
110e0 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a   Current table *
110f0 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57  /.  for(i=0; ALW
11100 41 59 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72 63  AYS(i<pSrc->nSrc
11110 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
11120 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 73 52 65   pSrc->a[i].isRe
11130 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
11140 20 69 43 75 72 72 65 6e 74 20 3d 20 70 53 72 63   iCurrent = pSrc
11150 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a  ->a[i].iCursor;.
11160 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11170 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c   }.  }..  /* All
11180 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 6e 75  ocate cursors nu
11190 6d 62 65 72 73 20 66 6f 72 20 51 75 65 75 65 20  mbers for Queue 
111a0 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 20 54  and Distinct.  T
111b0 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
111c0 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 44 69   for.  ** the Di
111d0 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6d 75 73  stinct table mus
111e0 74 20 62 65 20 65 78 61 63 74 6c 79 20 6f 6e 65  t be exactly one
111f0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 51 75   greater than Qu
11200 65 75 65 20 69 6e 20 6f 72 64 65 72 0a 20 20 2a  eue in order.  *
11210 2a 20 66 6f 72 20 74 68 65 20 53 52 54 5f 44 69  * for the SRT_Di
11220 73 74 46 69 66 6f 20 61 6e 64 20 53 52 54 5f 44  stFifo and SRT_D
11230 69 73 74 51 75 65 75 65 20 64 65 73 74 69 6e 61  istQueue destina
11240 74 69 6f 6e 73 20 74 6f 20 77 6f 72 6b 2e 20 2a  tions to work. *
11250 2f 0a 20 20 69 51 75 65 75 65 20 3d 20 70 50 61  /.  iQueue = pPa
11260 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69  rse->nTab++;.  i
11270 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  f( p->op==TK_UNI
11280 4f 4e 20 29 7b 0a 20 20 20 20 65 44 65 73 74 20  ON ){.    eDest 
11290 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54  = pOrderBy ? SRT
112a0 5f 44 69 73 74 51 75 65 75 65 20 3a 20 53 52 54  _DistQueue : SRT
112b0 5f 44 69 73 74 46 69 66 6f 3b 0a 20 20 20 20 69  _DistFifo;.    i
112c0 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73  Distinct = pPars
112d0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c  e->nTab++;.  }el
112e0 73 65 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20  se{.    eDest = 
112f0 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f 51  pOrderBy ? SRT_Q
11300 75 65 75 65 20 3a 20 53 52 54 5f 46 69 66 6f 3b  ueue : SRT_Fifo;
11310 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65  .  }.  sqlite3Se
11320 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
11330 73 74 51 75 65 75 65 2c 20 65 44 65 73 74 2c 20  stQueue, eDest, 
11340 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 41  iQueue);..  /* A
11350 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20  llocate cursors 
11360 66 6f 72 20 43 75 72 72 65 6e 74 2c 20 51 75 65  for Current, Que
11370 75 65 2c 20 61 6e 64 20 44 69 73 74 69 6e 63 74  ue, and Distinct
11380 2e 20 2a 2f 0a 20 20 72 65 67 43 75 72 72 65 6e  . */.  regCurren
11390 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
113a0 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  em;.  sqlite3Vdb
113b0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
113c0 65 6e 50 73 65 75 64 6f 2c 20 69 43 75 72 72 65  enPseudo, iCurre
113d0 6e 74 2c 20 72 65 67 43 75 72 72 65 6e 74 2c 20  nt, regCurrent, 
113e0 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 4f 72  nCol);.  if( pOr
113f0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79  derBy ){.    Key
11400 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
11410 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
11420 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73  rByKeyInfo(pPars
11430 65 2c 20 70 2c 20 31 29 3b 0a 20 20 20 20 73 71  e, p, 1);.    sq
11440 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
11450 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
11460 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 70 4f 72  ral, iQueue, pOr
11470 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20  derBy->nExpr+2, 
11480 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
11490 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
114a0 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
114b0 49 4e 46 4f 29 3b 0a 20 20 20 20 64 65 73 74 51  INFO);.    destQ
114c0 75 65 75 65 2e 70 4f 72 64 65 72 42 79 20 3d 20  ueue.pOrderBy = 
114d0 70 4f 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c 73  pOrderBy;.  }els
114e0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
114f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
11500 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51  penEphemeral, iQ
11510 75 65 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d  ueue, nCol);.  }
11520 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
11530 76 2c 20 22 51 75 65 75 65 20 74 61 62 6c 65 22  v, "Queue table"
11540 29 29 3b 0a 20 20 69 66 28 20 69 44 69 73 74 69  ));.  if( iDisti
11550 6e 63 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61 64  nct ){.    p->ad
11560 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
11570 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11580 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
11590 6d 65 72 61 6c 2c 20 69 44 69 73 74 69 6e 63 74  meral, iDistinct
115a0 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c  , 0);.    p->sel
115b0 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73  Flags |= SF_Uses
115c0 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a  Ephemeral;.  }..
115d0 20 20 2f 2a 20 44 65 74 61 63 68 20 74 68 65 20    /* Detach the 
115e0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
115f0 66 72 6f 6d 20 74 68 65 20 63 6f 6d 70 6f 75 6e  from the compoun
11600 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 70 2d  d SELECT */.  p-
11610 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a  >pOrderBy = 0;..
11620 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72    /* Store the r
11630 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
11640 74 75 70 2d 71 75 65 72 79 20 69 6e 20 51 75 65  tup-query in Que
11650 75 65 2e 20 2a 2f 0a 20 20 70 53 65 74 75 70 2d  ue. */.  pSetup-
11660 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 72 63  >pNext = 0;.  rc
11670 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
11680 28 70 50 61 72 73 65 2c 20 70 53 65 74 75 70 2c  (pParse, pSetup,
11690 20 26 64 65 73 74 51 75 65 75 65 29 3b 0a 20 20   &destQueue);.  
116a0 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20  pSetup->pNext = 
116b0 70 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  p;.  if( rc ) go
116c0 74 6f 20 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73  to end_of_recurs
116d0 69 76 65 5f 71 75 65 72 79 3b 0a 0a 20 20 2f 2a  ive_query;..  /*
116e0 20 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20 72   Find the next r
116f0 6f 77 20 69 6e 20 74 68 65 20 51 75 65 75 65 20  ow in the Queue 
11700 61 6e 64 20 6f 75 74 70 75 74 20 74 68 61 74 20  and output that 
11710 72 6f 77 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70  row */.  addrTop
11720 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
11730 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
11740 64 2c 20 69 51 75 65 75 65 2c 20 61 64 64 72 42  d, iQueue, addrB
11750 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
11760 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 54 72  age(v);..  /* Tr
11770 61 6e 73 66 65 72 20 74 68 65 20 6e 65 78 74 20  ansfer the next 
11780 72 6f 77 20 69 6e 20 51 75 65 75 65 20 6f 76 65  row in Queue ove
11790 72 20 74 6f 20 43 75 72 72 65 6e 74 20 2a 2f 0a  r to Current */.
117a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
117b0 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
117c0 77 2c 20 69 43 75 72 72 65 6e 74 29 3b 20 2f 2a  w, iCurrent); /*
117d0 20 54 6f 20 72 65 73 65 74 20 63 6f 6c 75 6d 6e   To reset column
117e0 20 63 61 63 68 65 20 2a 2f 0a 20 20 69 66 28 20   cache */.  if( 
117f0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
11800 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11810 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
11820 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79  iQueue, pOrderBy
11830 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67 43 75  ->nExpr+1, regCu
11840 72 72 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  rrent);.  }else{
11850 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11860 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
11870 44 61 74 61 2c 20 69 51 75 65 75 65 2c 20 72 65  Data, iQueue, re
11880 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a 20  gCurrent);.  }. 
11890 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
118a0 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  p1(v, OP_Delete,
118b0 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20   iQueue);..  /* 
118c0 4f 75 74 70 75 74 20 74 68 65 20 73 69 6e 67 6c  Output the singl
118d0 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74  e row in Current
118e0 20 2a 2f 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d   */.  addrCont =
118f0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
11900 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 64 65  Label(v);.  code
11910 4f 66 66 73 65 74 28 76 2c 20 72 65 67 4f 66 66  Offset(v, regOff
11920 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a  set, addrCont);.
11930 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
11940 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
11950 70 45 4c 69 73 74 2c 20 69 43 75 72 72 65 6e 74  pEList, iCurrent
11960 2c 0a 20 20 20 20 20 20 30 2c 20 30 2c 20 70 44  ,.      0, 0, pD
11970 65 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61  est, addrCont, a
11980 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28  ddrBreak);.  if(
11990 20 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20   regLimit ){.   
119a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
119b0 70 33 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p3(v, OP_IfZero,
119c0 20 72 65 67 4c 69 6d 69 74 2c 20 61 64 64 72 42   regLimit, addrB
119d0 72 65 61 6b 2c 20 2d 31 29 3b 0a 20 20 20 20 56  reak, -1);.    V
119e0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
119f0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
11a00 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
11a10 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f   addrCont);..  /
11a20 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 72 65  * Execute the re
11a30 63 75 72 73 69 76 65 20 53 45 4c 45 43 54 20 74  cursive SELECT t
11a40 61 6b 69 6e 67 20 74 68 65 20 73 69 6e 67 6c 65  aking the single
11a50 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20   row in Current 
11a60 61 73 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  as.  ** the valu
11a70 65 20 66 6f 72 20 74 68 65 20 72 65 63 75 72 73  e for the recurs
11a80 69 76 65 2d 74 61 62 6c 65 2e 20 53 74 6f 72 65  ive-table. Store
11a90 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
11aa0 74 68 65 20 51 75 65 75 65 2e 0a 20 20 2a 2f 0a  the Queue..  */.
11ab0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
11ac0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
11ad0 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
11ae0 74 51 75 65 75 65 29 3b 0a 20 20 61 73 73 65 72  tQueue);.  asser
11af0 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  t( p->pPrior==0 
11b00 29 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  );.  p->pPrior =
11b10 20 70 53 65 74 75 70 3b 0a 0a 20 20 2f 2a 20 4b   pSetup;..  /* K
11b20 65 65 70 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  eep running the 
11b30 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68 65 20 51  loop until the Q
11b40 75 65 75 65 20 69 73 20 65 6d 70 74 79 20 2a 2f  ueue is empty */
11b50 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
11b60 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
11b70 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20   0, addrTop);.  
11b80 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
11b90 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42  veLabel(v, addrB
11ba0 72 65 61 6b 29 3b 0a 0a 65 6e 64 5f 6f 66 5f 72  reak);..end_of_r
11bb0 65 63 75 72 73 69 76 65 5f 71 75 65 72 79 3a 0a  ecursive_query:.
11bc0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
11bd0 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
11be0 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  db, p->pOrderBy)
11bf0 3b 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  ;.  p->pOrderBy 
11c00 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 2d  = pOrderBy;.  p-
11c10 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
11c20 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d  ;.  p->pOffset =
11c30 20 70 4f 66 66 73 65 74 3b 0a 20 20 72 65 74 75   pOffset;.  retu
11c40 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rn;.}.#endif /* 
11c50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20  SQLITE_OMIT_CTE 
11c60 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  */../* Forward r
11c70 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 73 74 61  eferences */.sta
11c80 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
11c90 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61  ectOrderBy(.  Pa
11ca0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
11cb0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
11cc0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
11cd0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
11ce0 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
11cf0 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
11d00 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
11d10 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
11d20 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
11d30 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
11d40 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 0a 2f  esults */.);.../
11d50 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
11d60 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70  e is called to p
11d70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e  rocess a compoun
11d80 64 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f  d query form fro
11d90 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65  m.** two or more
11da0 20 73 65 70 61 72 61 74 65 20 71 75 65 72 69 65   separate querie
11db0 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55  s using UNION, U
11dc0 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54  NION ALL, EXCEPT
11dd0 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43  , or.** INTERSEC
11de0 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e  T.**.** "p" poin
11df0 74 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  ts to the right-
11e00 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20  most of the two 
11e10 71 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75  queries.  the qu
11e20 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65  ery on the.** le
11e30 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e  ft is p->pPrior.
11e40 20 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79    The left query
11e50 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61   could also be a
11e60 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a   compound query.
11e70 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  ** in which case
11e80 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
11e90 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63  ll be called rec
11ea0 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a  ursively. .**.**
11eb0 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   The results of 
11ec0 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20  the total query 
11ed0 61 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65  are to be writte
11ee0 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61  n into a destina
11ef0 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20  tion.** of type 
11f00 65 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d  eDest with param
11f10 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  eter iParm..**.*
11f20 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f  * Example 1:  Co
11f30 6e 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77  nsider a three-w
11f40 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20  ay compound SQL 
11f50 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
11f60 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52       SELECT a FR
11f70 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t1 UNION SELE
11f80 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49  CT b FROM t2 UNI
11f90 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d  ON SELECT c FROM
11fa0 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73   t3.**.** This s
11fb0 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73  tatement is pars
11fc0 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73  ed up as follows
11fd0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
11fe0 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20  CT c FROM t3.** 
11ff0 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60       |.**      `
12000 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62  ----->  SELECT b
12010 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20   FROM t2.**     
12020 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
12030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60                 `
12040 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20  ------>  SELECT 
12050 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20  a FROM t1.**.** 
12060 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68  The arrows in th
12070 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20  e diagram above 
12080 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65  represent the Se
12090 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e  lect.pPrior poin
120a0 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68  ter..** So if th
120b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
120c0 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61  lled with p equa
120d0 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72  l to the t3 quer
120e0 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f  y, then.** pPrio
120f0 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32  r will be the t2
12100 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77   query.  p->op w
12110 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20  ill be TK_UNION 
12120 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
12130 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20  .** Notice that 
12140 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77  because of the w
12150 61 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73  ay SQLite parses
12160 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
12170 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69  s, the.** indivi
12180 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77  dual selects alw
12190 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c  ays group from l
121a0 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f  eft to right..*/
121b0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
121c0 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  iSelect(.  Parse
121d0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
121e0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
121f0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
12200 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
12210 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
12220 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
12230 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
12240 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
12250 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
12260 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
12270 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
12280 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
12290 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64    /* Success cod
122a0 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74  e from a subrout
122b0 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ine */.  Select 
122c0 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f  *pPrior;       /
122d0 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54  * Another SELECT
122e0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
122f0 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64  our left */.  Vd
12300 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
12310 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
12320 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42  code to this VDB
12330 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  E */.  SelectDes
12340 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20  t dest;      /* 
12350 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74 61  Alternative data
12360 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a   destination */.
12370 20 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74    Select *pDelet
12380 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e  e = 0;  /* Chain
12390 20 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63   of simple selec
123a0 74 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  ts to delete */.
123b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
123c0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
123d0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
123e0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
123f0 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
12400 69 6e 74 20 69 53 75 62 31 20 3d 20 30 3b 20 20  int iSub1 = 0;  
12410 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20        /* EQP id 
12420 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65  of left-hand que
12430 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  ry */.  int iSub
12440 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  2 = 0;        /*
12450 20 45 51 50 20 69 64 20 6f 66 20 72 69 67 68 74   EQP id of right
12460 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23  -hand query */.#
12470 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65  endif..  /* Make
12480 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e   sure there is n
12490 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49  o ORDER BY or LI
124a0 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72  MIT clause on pr
124b0 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e  ior SELECTs.  On
124c0 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74  ly.  ** the last
124d0 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45   (right-most) SE
124e0 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69  LECT in the seri
124f0 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f  es may have an O
12500 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54  RDER BY or LIMIT
12510 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
12520 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 20   p && p->pPrior 
12530 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66  );  /* Calling f
12540 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74 65  unction guarante
12550 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a  es this much */.
12560 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65    assert( (p->se
12570 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
12580 72 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e  rsive)==0 || p->
12590 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d  op==TK_ALL || p-
125a0 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
125b0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
125c0 64 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70  db;.  pPrior = p
125d0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 65 73 74  ->pPrior;.  dest
125e0 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28   = *pDest;.  if(
125f0 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
12600 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
12610 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
12620 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65  "ORDER BY clause
12630 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
12640 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65  er %s not before
12650 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f  ",.      selectO
12660 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
12670 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
12680 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
12690 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _end;.  }.  if( 
126a0 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29  pPrior->pLimit )
126b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
126c0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49  orMsg(pParse,"LI
126d0 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c  MIT clause shoul
126e0 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20  d come after %s 
126f0 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20  not before",.   
12700 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28     selectOpName(
12710 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20  p->op));.    rc 
12720 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
12730 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
12740 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74    }..  v = sqlit
12750 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
12760 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  );.  assert( v!=
12770 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56 44 42  0 );  /* The VDB
12780 45 20 61 6c 72 65 61 64 79 20 63 72 65 61 74 65  E already create
12790 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e  d by calling fun
127a0 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43  ction */..  /* C
127b0 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69 6e  reate the destin
127c0 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20  ation temporary 
127d0 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61  table if necessa
127e0 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  ry.  */.  if( de
127f0 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  st.eDest==SRT_Ep
12800 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73  hemTab ){.    as
12810 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
12820 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
12830 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
12840 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 65  penEphemeral, de
12850 73 74 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70  st.iSDParm, p->p
12860 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
12870 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
12880 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f  angeP5(v, BTREE_
12890 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20  UNORDERED);.    
128a0 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
128b0 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f  _Table;.  }..  /
128c0 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
128d0 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73  SELECTs in the s
128e0 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68  tatement have th
128f0 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
12900 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69   elements.  ** i
12910 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20 73  n their result s
12920 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ets..  */.  asse
12930 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26  rt( p->pEList &&
12940 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20   pPrior->pEList 
12950 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  );.  if( p->pELi
12960 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f  st->nExpr!=pPrio
12970 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  r->pEList->nExpr
12980 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73   ){.    if( p->s
12990 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c  elFlags & SF_Val
129a0 75 65 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ues ){.      sql
129b0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
129c0 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53  rse, "all VALUES
129d0 20 6d 75 73 74 20 68 61 76 65 20 74 68 65 20 73   must have the s
129e0 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 65  ame number of te
129f0 72 6d 73 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  rms");.    }else
12a00 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
12a10 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
12a20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20  "SELECTs to the 
12a30 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f  left and right o
12a40 66 20 25 73 22 0a 20 20 20 20 20 20 20 20 22 20  f %s".        " 
12a50 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20  do not have the 
12a60 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72  same number of r
12a70 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20  esult columns", 
12a80 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
12a90 6f 70 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  op));.    }.    
12aa0 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
12ab0 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
12ac0 64 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  d;.  }..#ifndef 
12ad0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
12ae0 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
12af0 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
12b00 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65   ){.    generate
12b10 57 69 74 68 52 65 63 75 72 73 69 76 65 51 75 65  WithRecursiveQue
12b20 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ry(pParse, p, &d
12b30 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  est);.  }else.#e
12b40 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f  ndif..  /* Compo
12b50 75 6e 64 20 53 45 4c 45 43 54 73 20 74 68 61 74  und SELECTs that
12b60 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42   have an ORDER B
12b70 59 20 63 6c 61 75 73 65 20 61 72 65 20 68 61 6e  Y clause are han
12b80 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e  dled separately.
12b90 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
12ba0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72  OrderBy ){.    r
12bb0 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63  eturn multiSelec
12bc0 74 4f 72 64 65 72 42 79 28 70 50 61 72 73 65 2c  tOrderBy(pParse,
12bd0 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 65   p, pDest);.  }e
12be0 6c 73 65 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  lse..  /* Genera
12bf0 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
12c00 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53  left and right S
12c10 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
12c20 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28  ..  */.  switch(
12c30 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
12c40 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20  se TK_ALL: {.   
12c50 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b     int addr = 0;
12c60 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69  .      int nLimi
12c70 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
12c80 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74   !pPrior->pLimit
12c90 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72   );.      pPrior
12ca0 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c  ->iLimit = p->iL
12cb0 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69  imit;.      pPri
12cc0 6f 72 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 2d  or->iOffset = p-
12cd0 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >iOffset;.      
12ce0 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d  pPrior->pLimit =
12cf0 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
12d00 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65    pPrior->pOffse
12d10 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
12d20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
12d30 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
12d40 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
12d50 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
12d60 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
12d70 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
12d80 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 2d  &dest);.      p-
12d90 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
12da0 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
12db0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  0;.      if( rc 
12dc0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
12dd0 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
12de0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12df0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
12e00 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
12e10 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b   pPrior->iLimit;
12e20 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65  .      p->iOffse
12e30 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66  t = pPrior->iOff
12e40 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  set;.      if( p
12e50 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
12e60 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
12e70 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
12e80 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c  OP_IfZero, p->iL
12e90 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72  imit); VdbeCover
12ea0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
12eb0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
12ec0 22 4a 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c  "Jump ahead if L
12ed0 49 4d 49 54 20 72 65 61 63 68 65 64 22 29 29 3b  IMIT reached"));
12ee0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65  .      }.      e
12ef0 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
12f00 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e  (iSub2, pParse->
12f10 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
12f20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12f30 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
12f40 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20   p, &dest);.    
12f50 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
12f60 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
12f70 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e     pDelete = p->
12f80 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
12f90 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
12fa0 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65  ;.      p->nSele
12fb0 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d  ctRow += pPrior-
12fc0 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
12fd0 20 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70     if( pPrior->p
12fe0 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 26 26 20  Limit.       && 
12ff0 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
13000 65 67 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69  eger(pPrior->pLi
13010 6d 69 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20 20  mit, &nLimit).  
13020 20 20 20 20 20 26 26 20 6e 4c 69 6d 69 74 3e 30       && nLimit>0
13030 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f   && p->nSelectRo
13040 77 20 3e 20 28 75 36 34 29 6e 4c 69 6d 69 74 20  w > (u64)nLimit 
13050 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
13060 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
13070 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = nLimit;.      
13080 7d 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72  }.      if( addr
13090 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
130a0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
130b0 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20  v, addr);.      
130c0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
130d0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
130e0 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73  _EXCEPT:.    cas
130f0 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20  e TK_UNION: {.  
13100 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62      int unionTab
13110 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e  ;    /* Cursor n
13120 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d  umber of the tem
13130 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c  porary table hol
13140 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20  ding result */. 
13150 20 20 20 20 20 75 38 20 6f 70 20 3d 20 30 3b 20       u8 op = 0; 
13160 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
13170 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  the SRT_ operati
13180 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ons to apply to 
13190 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e  self */.      in
131a0 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f  t priorOp;     /
131b0 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61  * The SRT_ opera
131c0 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f  tion to apply to
131d0 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a   prior selects *
131e0 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  /.      Expr *pL
131f0 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20  imit, *pOffset; 
13200 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73 20  /* Saved values 
13210 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64  of p->nLimit and
13220 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20   p->nOffset */. 
13230 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
13240 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
13250 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20  uniondest;..    
13260 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f    testcase( p->o
13270 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 3b 0a  p==TK_EXCEPT );.
13280 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
13290 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
132a0 29 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70  );.      priorOp
132b0 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20   = SRT_Union;.  
132c0 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
132d0 73 74 3d 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20  st==priorOp ){. 
132e0 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e         /* We can
132f0 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61   reuse a tempora
13300 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74  ry table generat
13310 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20 74  ed by a SELECT t
13320 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a  o our.        **
13330 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20   right..        
13340 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
13350 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20  t( p->pLimit==0 
13360 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61  );      /* Not a
13370 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61  llowed on leftwa
13380 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  rd elements */. 
13390 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
133a0 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20  ->pOffset==0 ); 
133b0 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77      /* Not allow
133c0 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65  ed on leftward e
133d0 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  lements */.     
133e0 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65     unionTab = de
133f0 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20  st.iSDParm;.    
13400 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13410 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64   /* We will need
13420 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f   to create our o
13430 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  wn temporary tab
13440 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20  le to hold the. 
13450 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d         ** interm
13460 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a  ediate results..
13470 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
13480 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50     unionTab = pP
13490 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
134a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
134b0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
134c0 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73          addr = s
134d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
134e0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
134f0 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  eral, unionTab, 
13500 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  0);.        asse
13510 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  rt( p->addrOpenE
13520 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a  phm[0] == -1 );.
13530 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f          p->addrO
13540 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64  penEphm[0] = add
13550 72 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 64 52  r;.        findR
13560 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c  ightmost(p)->sel
13570 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73  Flags |= SF_Uses
13580 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20  Ephemeral;.     
13590 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
135a0 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a  List );.      }.
135b0 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
135c0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
135d0 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ents to our left
135e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
135f0 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d  assert( !pPrior-
13600 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20  >pOrderBy );.   
13610 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
13620 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64  DestInit(&uniond
13630 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e  est, priorOp, un
13640 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20 65  ionTab);.      e
13650 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
13660 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e  (iSub1, pParse->
13670 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
13680 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13690 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
136a0 20 70 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64   pPrior, &uniond
136b0 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  est);.      if( 
136c0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
136d0 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
136e0 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  end;.      }..  
136f0 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
13700 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73  current SELECT s
13710 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a  tatement.      *
13720 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f  /.      if( p->o
13730 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a  p==TK_EXCEPT ){.
13740 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54          op = SRT
13750 5f 45 78 63 65 70 74 3b 0a 20 20 20 20 20 20 7d  _Except;.      }
13760 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
13770 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  sert( p->op==TK_
13780 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20  UNION );.       
13790 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b   op = SRT_Union;
137a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
137b0 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
137c0 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e      pLimit = p->
137d0 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
137e0 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
137f0 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e     pOffset = p->
13800 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  pOffset;.      p
13810 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
13820 20 20 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65       uniondest.e
13830 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20  Dest = op;.     
13840 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
13850 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65  er(iSub2, pParse
13860 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
13870 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
13880 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
13890 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74  e, p, &uniondest
138a0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
138b0 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
138c0 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75 65   );.      /* Que
138d0 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e  ry flattening in
138e0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
138f0 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d   might refill p-
13900 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20  >pOrderBy..     
13910 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20 64   ** Be sure to d
13920 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72 42  elete p->pOrderB
13930 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74 6f  y, therefore, to
13940 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20   avoid a memory 
13950 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73  leak. */.      s
13960 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
13970 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64  lete(db, p->pOrd
13980 65 72 42 79 29 3b 0a 20 20 20 20 20 20 70 44 65  erBy);.      pDe
13990 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72  lete = p->pPrior
139a0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
139b0 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
139c0 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
139d0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  0;.      if( p->
139e0 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 20 70  op==TK_UNION ) p
139f0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20  ->nSelectRow += 
13a00 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
13a10 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ow;.      sqlite
13a20 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
13a30 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->pLimit);.    
13a40 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
13a50 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
13a60 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
13a70 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69  ;.      p->iLimi
13a80 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
13a90 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20  iOffset = 0;..  
13aa0 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74      /* Convert t
13ab0 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74  he data in the t
13ac0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
13ad0 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72  nto whatever for
13ae0 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73  m.      ** it is
13af0 20 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74   that we current
13b00 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a  ly need..      *
13b10 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
13b20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69  unionTab==dest.i
13b30 53 44 50 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65  SDParm || dest.e
13b40 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b  Dest!=priorOp );
13b50 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e  .      if( dest.
13b60 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29  eDest!=priorOp )
13b70 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  {.        int iC
13b80 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
13b90 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  art;.        ass
13ba0 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
13bb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 65  ;.        if( de
13bc0 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  st.eDest==SRT_Ou
13bd0 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tput ){.        
13be0 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74    Select *pFirst
13bf0 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
13c00 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70  while( pFirst->p
13c10 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d  Prior ) pFirst =
13c20 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b   pFirst->pPrior;
13c30 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e 65 72  .          gener
13c40 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
13c50 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74  Parse, 0, pFirst
13c60 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
13c70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72     }.        iBr
13c80 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
13c90 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
13ca0 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73         iCont = s
13cb0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
13cc0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
13cd0 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
13ce0 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
13cf0 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
13d00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13d10 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
13d20 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65  , unionTab, iBre
13d30 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
13d40 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 53  e(v);.        iS
13d50 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
13d60 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
13d70 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63 74  ;.        select
13d80 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
13d90 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
13da0 75 6e 69 6f 6e 54 61 62 2c 0a 20 20 20 20 20 20  unionTab,.      
13db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13dc0 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69    0, 0, &dest, i
13dd0 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  Cont, iBreak);. 
13de0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13df0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
13e00 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
13e10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13e20 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
13e30 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74  unionTab, iStart
13e40 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
13e50 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
13e60 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
13e70 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
13e80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13e90 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13ea0 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c  Close, unionTab,
13eb0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
13ec0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
13ed0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
13ee0 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49  ert( p->op==TK_I
13ef0 4e 54 45 52 53 45 43 54 20 29 3b 20 7b 0a 20 20  NTERSECT ); {.  
13f00 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61      int tab1, ta
13f10 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b2;.      int iC
13f20 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
13f30 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  art;.      Expr 
13f40 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65  *pLimit, *pOffse
13f50 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  t;.      int add
13f60 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  r;.      SelectD
13f70 65 73 74 20 69 6e 74 65 72 73 65 63 74 64 65 73  est intersectdes
13f80 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b  t;.      int r1;
13f90 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52  ..      /* INTER
13fa0 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e  SECT is differen
13fb0 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  t from the other
13fc0 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69  s since it requi
13fd0 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  res.      ** two
13fe0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
13ff0 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61 73  s.  Hence it has
14000 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20   its own case.  
14010 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62  Begin.      ** b
14020 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65  y allocating the
14030 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20   tables we will 
14040 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  need..      */. 
14050 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61 72       tab1 = pPar
14060 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
14070 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d    tab2 = pParse-
14080 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61  >nTab++;.      a
14090 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
140a0 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  By==0 );..      
140b0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
140c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
140d0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
140e0 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  b1, 0);.      as
140f0 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
14100 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29  nEphm[0] == -1 )
14110 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
14120 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64  penEphm[0] = add
14130 72 3b 0a 20 20 20 20 20 20 66 69 6e 64 52 69 67  r;.      findRig
14140 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c  htmost(p)->selFl
14150 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
14160 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 61  hemeral;.      a
14170 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
14180 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f   );..      /* Co
14190 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74  de the SELECTs t
141a0 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20  o our left into 
141b0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
141c0 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f  "tab1"..      */
141d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
141e0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69 6e  lectDestInit(&in
141f0 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52 54  tersectdest, SRT
14200 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20  _Union, tab1);. 
14210 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
14220 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
14230 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
14240 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
14250 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
14260 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
14270 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a  intersectdest);.
14280 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
14290 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
142a0 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
142b0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
142c0 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
142d0 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65  t SELECT into te
142e0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
142f0 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ab2".      */.  
14300 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
14310 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14320 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
14330 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
14340 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
14350 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20  rOpenEphm[1] == 
14360 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  -1 );.      p->a
14370 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
14380 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e   addr;.      p->
14390 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
143a0 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
143b0 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
143c0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
143d0 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f   pOffset = p->pO
143e0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
143f0 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
14400 20 20 20 69 6e 74 65 72 73 65 63 74 64 65 73 74     intersectdest
14410 2e 69 53 44 50 61 72 6d 20 3d 20 74 61 62 32 3b  .iSDParm = tab2;
14420 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
14430 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20  tInteger(iSub2, 
14440 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
14450 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
14460 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
14470 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74  (pParse, p, &int
14480 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20  ersectdest);.   
14490 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
144a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
144b0 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
144c0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
144d0 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
144e0 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  r;.      if( p->
144f0 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f  nSelectRow>pPrio
14500 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20  r->nSelectRow ) 
14510 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
14520 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
14530 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ow;.      sqlite
14540 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
14550 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->pLimit);.    
14560 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
14570 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
14580 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
14590 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
145a0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b  rate code to tak
145b0 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69  e the intersecti
145c0 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65  on of the two te
145d0 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a  mporary.      **
145e0 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a   tables..      *
145f0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
14600 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
14610 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
14620 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
14630 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20  .        Select 
14640 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20  *pFirst = p;.   
14650 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72       while( pFir
14660 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69  st->pPrior ) pFi
14670 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50  rst = pFirst->pP
14680 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67 65  rior;.        ge
14690 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
146a0 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69  s(pParse, 0, pFi
146b0 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
146c0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65      }.      iBre
146d0 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
146e0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
146f0 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
14700 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
14710 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75  (v);.      compu
14720 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
14730 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65  (pParse, p, iBre
14740 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
14750 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14760 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c  OP_Rewind, tab1,
14770 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
14780 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
14790 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
147a0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
147b0 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20  .      iStart = 
147c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
147d0 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20  2(v, OP_RowKey, 
147e0 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20 20 20  tab1, r1);.     
147f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14800 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46  p4Int(v, OP_NotF
14810 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e  ound, tab2, iCon
14820 74 2c 20 72 31 2c 20 30 29 3b 20 56 64 62 65 43  t, r1, 0); VdbeC
14830 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
14840 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
14850 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
14860 72 31 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63  r1);.      selec
14870 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
14880 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
14890 20 74 61 62 31 2c 0a 20 20 20 20 20 20 20 20 20   tab1,.         
148a0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
148b0 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c  0, &dest, iCont,
148c0 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
148d0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
148e0 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
148f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14900 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14910 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74  _Next, tab1, iSt
14920 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  art); VdbeCovera
14930 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
14940 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
14950 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
14960 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
14970 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
14980 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a  lose, tab2, 0);.
14990 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
149a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
149b0 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  ose, tab1, 0);. 
149c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
149d0 7d 0a 20 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e  }.  }..  explain
149e0 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65  Composite(pParse
149f0 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20  , p->op, iSub1, 
14a00 69 53 75 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b  iSub2, p->op!=TK
14a10 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d  _ALL);..  /* Com
14a20 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  pute collating s
14a30 65 71 75 65 6e 63 65 73 20 75 73 65 64 20 62 79  equences used by
14a40 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79   .  ** temporary
14a50 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74   tables needed t
14a60 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
14a70 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
14a80 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65  .  ** Attach the
14a90 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
14aa0 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72  re to all tempor
14ab0 61 72 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a  ary tables..  **
14ac0 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69  .  ** This secti
14ad0 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65  on is run by the
14ae0 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
14af0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c  CT statement onl
14b00 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  y..  ** SELECT s
14b10 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65  tatements to the
14b20 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69   left always ski
14b30 70 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68  p this part.  Th
14b40 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
14b50 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61  * SELECT might a
14b60 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61  lso skip this pa
14b70 72 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20  rt if it has no 
14b80 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
14b90 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70  and.  ** no temp
14ba0 20 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75   tables are requ
14bb0 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ired..  */.  if(
14bc0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
14bd0 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 20  F_UsesEphemeral 
14be0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  ){.    int i;   
14bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c00 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
14c10 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49  nter */.    KeyI
14c20 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
14c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
14c40 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
14c50 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  for the result s
14c60 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74  et */.    Select
14c70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
14c80 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
14c90 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53  ooping through S
14ca0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
14cb0 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20   */.    CollSeq 
14cc0 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  **apColl;       
14cd0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
14ce0 70 69 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65  ping through pKe
14cf0 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a  yInfo->aColl[] *
14d00 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20  /.    int nCol; 
14d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
14d30 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75   columns in resu
14d40 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61  lt set */..    a
14d50 73 73 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d  ssert( p->pNext=
14d60 3d 30 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d  =0 );.    nCol =
14d70 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
14d80 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  r;.    pKeyInfo 
14d90 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
14da0 41 6c 6c 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c 20  Alloc(db, nCol, 
14db0 31 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65  1);.    if( !pKe
14dc0 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72  yInfo ){.      r
14dd0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
14de0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c  ;.      goto mul
14df0 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
14e00 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
14e10 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66  , apColl=pKeyInf
14e20 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c  o->aColl; i<nCol
14e30 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29  ; i++, apColl++)
14e40 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20  {.      *apColl 
14e50 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
14e60 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20  lSeq(pParse, p, 
14e70 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  i);.      if( 0=
14e80 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  =*apColl ){.    
14e90 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64 62      *apColl = db
14ea0 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
14eb0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
14ec0 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f  for(pLoop=p; pLo
14ed0 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
14ee0 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20  >pPrior){.      
14ef0 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b  for(i=0; i<2; i+
14f00 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
14f10 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64  addr = pLoop->ad
14f20 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20  drOpenEphm[i];. 
14f30 20 20 20 20 20 20 20 69 66 28 20 61 64 64 72 3c         if( addr<
14f40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
14f50 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e 75 73  * If [0] is unus
14f60 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73 20 61  ed then [1] is a
14f70 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f 20  lso unused.  So 
14f80 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20 20 20  we can.         
14f90 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66 65 6c   ** always safel
14fa0 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20  y abort as soon 
14fb0 61 73 20 74 68 65 20 66 69 72 73 74 20 75 6e 75  as the first unu
14fc0 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e  sed slot is foun
14fd0 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  d */.          a
14fe0 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64  ssert( pLoop->ad
14ff0 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20  drOpenEphm[1]<0 
15000 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
15010 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
15020 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15030 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
15040 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  r, nCol);.      
15050 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
15060 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28  ngeP4(v, addr, (
15070 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79  char*)sqlite3Key
15080 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f  InfoRef(pKeyInfo
15090 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
150a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
150b0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
150c0 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f      pLoop->addrO
150d0 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b  penEphm[i] = -1;
150e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
150f0 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66     sqlite3KeyInf
15100 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29  oUnref(pKeyInfo)
15110 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c  ;.  }..multi_sel
15120 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74  ect_end:.  pDest
15130 2d 3e 69 53 64 73 74 20 3d 20 64 65 73 74 2e 69  ->iSdst = dest.i
15140 53 64 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 6e  Sdst;.  pDest->n
15150 53 64 73 74 20 3d 20 64 65 73 74 2e 6e 53 64 73  Sdst = dest.nSds
15160 74 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  t;.  sqlite3Sele
15170 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65  ctDelete(db, pDe
15180 6c 65 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  lete);.  return 
15190 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
151a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
151b0 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a  OUND_SELECT */..
151c0 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75  /*.** Code an ou
151d0 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20  tput subroutine 
151e0 66 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  for a coroutine 
151f0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
15200 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  f a.** SELECT st
15210 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  atment..**.** Th
15220 65 20 64 61 74 61 20 74 6f 20 62 65 20 6f 75 74  e data to be out
15230 70 75 74 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  put is contained
15240 20 69 6e 20 70 49 6e 2d 3e 69 53 64 73 74 2e 20   in pIn->iSdst. 
15250 20 54 68 65 72 65 20 61 72 65 0a 2a 2a 20 70 49   There are.** pI
15260 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c 75 6d 6e 73  n->nSdst columns
15270 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 20 20   to be output.  
15280 70 44 65 73 74 20 69 73 20 77 68 65 72 65 20 74  pDest is where t
15290 68 65 20 6f 75 74 70 75 74 20 73 68 6f 75 6c 64  he output should
152a0 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a  .** be sent..**.
152b0 2a 2a 20 72 65 67 52 65 74 75 72 6e 20 69 73 20  ** regReturn is 
152c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  the number of th
152d0 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69  e register holdi
152e0 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  ng the subroutin
152f0 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64 64 72  e.** return addr
15300 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65  ess..**.** If re
15310 67 50 72 65 76 3e 30 20 74 68 65 6e 20 69 74 20  gPrev>0 then it 
15320 69 73 20 74 68 65 20 66 69 72 73 74 20 72 65 67  is the first reg
15330 69 73 74 65 72 20 69 6e 20 61 20 76 65 63 74 6f  ister in a vecto
15340 72 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64  r that.** record
15350 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f  s the previous o
15360 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50  utput.  mem[regP
15370 72 65 76 5d 20 69 73 20 61 20 66 6c 61 67 20 74  rev] is a flag t
15380 68 61 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20  hat is false.** 
15390 69 66 20 74 68 65 72 65 20 68 61 73 20 62 65 65  if there has bee
153a0 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f 75  n no previous ou
153b0 74 70 75 74 2e 20 20 49 66 20 72 65 67 50 72 65  tput.  If regPre
153c0 76 3e 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73  v>0 then code is
153d0 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 74 6f  .** generated to
153e0 20 73 75 70 70 72 65 73 73 20 64 75 70 6c 69 63   suppress duplic
153f0 61 74 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20  ates.  pKeyInfo 
15400 69 73 20 75 73 65 64 20 66 6f 72 20 63 6f 6d 70  is used for comp
15410 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a  aring.** keys..*
15420 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d 49  *.** If the LIMI
15430 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c  T found in p->iL
15440 69 6d 69 74 20 69 73 20 72 65 61 63 68 65 64 2c  imit is reached,
15450 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c   jump immediatel
15460 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a  y to.** iBreak..
15470 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
15480 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72  nerateOutputSubr
15490 6f 75 74 69 6e 65 28 0a 20 20 50 61 72 73 65 20  outine(.  Parse 
154a0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
154b0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
154c0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
154d0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
154e0 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
154f0 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53  statement */.  S
15500 65 6c 65 63 74 44 65 73 74 20 2a 70 49 6e 2c 20  electDest *pIn, 
15510 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74         /* Corout
15520 69 6e 65 20 73 75 70 70 6c 79 69 6e 67 20 64 61  ine supplying da
15530 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ta */.  SelectDe
15540 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20  st *pDest,      
15550 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 65 6e 64  /* Where to send
15560 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69   the data */.  i
15570 6e 74 20 72 65 67 52 65 74 75 72 6e 2c 20 20 20  nt regReturn,   
15580 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
15590 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
155a0 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ister */.  int r
155b0 65 67 50 72 65 76 2c 20 20 20 20 20 20 20 20 20  egPrev,         
155c0 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72     /* Previous r
155d0 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 2e 20  esult register. 
155e0 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73 20 69   No uniqueness i
155f0 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  f 0 */.  KeyInfo
15600 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
15610 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e   /* For comparin
15620 67 20 77 69 74 68 20 70 72 65 76 69 6f 75 73 20  g with previous 
15630 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  entry */.  int i
15640 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20  Break           
15650 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
15660 69 66 20 77 65 20 68 69 74 20 74 68 65 20 4c 49  if we hit the LI
15670 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  MIT */.){.  Vdbe
15680 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
15690 64 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74  dbe;.  int iCont
156a0 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64 64 72  inue;.  int addr
156b0 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69  ;..  addr = sqli
156c0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
156d0 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e  dr(v);.  iContin
156e0 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
156f0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
15700 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75 70   /* Suppress dup
15710 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49 4f  licates for UNIO
15720 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49  N, EXCEPT, and I
15730 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20  NTERSECT .  */. 
15740 20 69 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a   if( regPrev ){.
15750 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a      int j1, j2;.
15760 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33      j1 = sqlite3
15770 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
15780 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72 65 76 29  _IfNot, regPrev)
15790 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
157a0 29 3b 0a 20 20 20 20 6a 32 20 3d 20 73 71 6c 69  );.    j2 = sqli
157b0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
157c0 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e   OP_Compare, pIn
157d0 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76  ->iSdst, regPrev
157e0 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a  +1, pIn->nSdst,.
157f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
15810 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49  har*)sqlite3KeyI
15820 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29  nfoRef(pKeyInfo)
15830 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
15840 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15850 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
15860 20 6a 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65   j2+2, iContinue
15870 2c 20 6a 32 2b 32 29 3b 20 56 64 62 65 43 6f 76  , j2+2); VdbeCov
15880 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
15890 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
158a0 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 73 71  e(v, j1);.    sq
158b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
158c0 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49 6e 2d  v, OP_Copy, pIn-
158d0 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b  >iSdst, regPrev+
158e0 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d 31 29  1, pIn->nSdst-1)
158f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15900 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
15910 74 65 67 65 72 2c 20 31 2c 20 72 65 67 50 72 65  teger, 1, regPre
15920 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  v);.  }.  if( pP
15930 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
15940 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
15950 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73  0;..  /* Suppres
15960 73 20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53  s the first OFFS
15970 45 54 20 65 6e 74 72 69 65 73 20 69 66 20 74 68  ET entries if th
15980 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54  ere is an OFFSET
15990 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63   clause.  */.  c
159a0 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e  odeOffset(v, p->
159b0 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e  iOffset, iContin
159c0 75 65 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  ue);..  switch( 
159d0 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a  pDest->eDest ){.
159e0 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
159f0 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20   result as data 
15a00 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b  using a unique k
15a10 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ey..    */.    c
15a20 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
15a30 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
15a40 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e  mTab: {.      in
15a50 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
15a60 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
15a70 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d  ;.      int r2 =
15a80 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
15a90 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
15aa0 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65 73    testcase( pDes
15ab0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 54 61  t->eDest==SRT_Ta
15ac0 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ble );.      tes
15ad0 74 63 61 73 65 28 20 70 44 65 73 74 2d 3e 65 44  tcase( pDest->eD
15ae0 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
15af0 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  b );.      sqlit
15b00 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
15b10 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
15b20 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
15b30 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20 20 20 20  nSdst, r1);.    
15b40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15b50 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
15b60 69 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  id, pDest->iSDPa
15b70 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  rm, r2);.      s
15b80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
15b90 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70  (v, OP_Insert, p
15ba0 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
15bb0 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  1, r2);.      sq
15bc0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
15bd0 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
15be0 4e 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ND);.      sqlit
15bf0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
15c00 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
15c10 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
15c20 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
15c30 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
15c40 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
15c50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
15c60 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49  UBQUERY.    /* I
15c70 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
15c80 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
15c90 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
15ca0 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c  ...)" construct,
15cb0 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
15cc0 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73  re should be a s
15cd0 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68  ingle item on th
15ce0 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20  e stack.  Write 
15cf0 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d  this.    ** item
15d00 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61   into the set ta
15d10 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64  ble with bogus d
15d20 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
15d30 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
15d40 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20        int r1;.  
15d50 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d      assert( pIn-
15d60 3e 6e 53 64 73 74 3d 3d 31 20 29 3b 0a 20 20 20  >nSdst==1 );.   
15d70 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73     pDest->affSds
15d80 74 20 3d 20 0a 20 20 20 20 20 20 20 20 20 73 71  t = .         sq
15d90 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
15da0 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e  nity(p->pEList->
15db0 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73  a[0].pExpr, pDes
15dc0 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20 20 20  t->affSdst);.   
15dd0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
15de0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
15df0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15e00 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
15e10 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e  _MakeRecord, pIn
15e20 2d 3e 69 53 64 73 74 2c 20 31 2c 20 72 31 2c 20  ->iSdst, 1, r1, 
15e30 26 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 2c  &pDest->affSdst,
15e40 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
15e50 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
15e60 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
15e70 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31 29 3b   pIn->iSdst, 1);
15e80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15e90 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
15ea0 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d  dxInsert, pDest-
15eb0 3e 69 53 44 50 61 72 6d 2c 20 72 31 29 3b 0a 20  >iSDParm, r1);. 
15ec0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
15ed0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
15ee0 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
15ef0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  eak;.    }..#if 
15f00 30 20 20 2f 2a 20 4e 65 76 65 72 20 6f 63 63 75  0  /* Never occu
15f10 72 73 20 6f 6e 20 61 6e 20 4f 52 44 45 52 20 42  rs on an ORDER B
15f20 59 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 2f  Y query */.    /
15f30 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69  * If any row exi
15f40 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  st in the result
15f50 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61   set, record tha
15f60 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74  t fact and abort
15f70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
15f80 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a  e SRT_Exists: {.
15f90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15fa0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
15fb0 74 65 67 65 72 2c 20 31 2c 20 70 44 65 73 74 2d  teger, 1, pDest-
15fc0 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  >iSDParm);.     
15fd0 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
15fe0 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e  ause will termin
15ff0 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72  ate the loop for
16000 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
16010 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
16020 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
16030 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c   is a scalar sel
16040 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74  ect that is part
16050 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
16060 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73  n, then.    ** s
16070 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
16080 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69   in the appropri
16090 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  ate memory cell 
160a0 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20  and break out.  
160b0 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e    ** of the scan
160c0 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
160d0 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
160e0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
160f0 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 29 3b  pIn->nSdst==1 );
16100 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
16110 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
16120 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  e, pIn->iSdst, p
16130 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31  Dest->iSDParm, 1
16140 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
16150 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
16160 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68  l jump out of th
16170 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
16180 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16190 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    }.#endif /* #i
161a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
161b0 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20  T_SUBQUERY */.. 
161c0 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
161d0 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  s are stored in 
161e0 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65  a sequence of re
161f0 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73  gisters.    ** s
16200 74 61 72 74 69 6e 67 20 61 74 20 70 44 65 73 74  tarting at pDest
16210 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 6e 20 74  ->iSdst.  Then t
16220 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69  he co-routine yi
16230 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elds..    */.   
16240 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74   case SRT_Corout
16250 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ine: {.      if(
16260 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30   pDest->iSdst==0
16270 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73   ){.        pDes
16280 74 2d 3e 69 53 64 73 74 20 3d 20 73 71 6c 69 74  t->iSdst = sqlit
16290 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
162a0 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73  Parse, pIn->nSds
162b0 74 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73  t);.        pDes
162c0 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e  t->nSdst = pIn->
162d0 6e 53 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  nSdst;.      }. 
162e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
162f0 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
16300 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65   pIn->iSdst, pDe
16310 73 74 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74  st->iSdst, pDest
16320 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
16330 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16340 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
16350 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
16360 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16370 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f   }..    /* If no
16380 6e 65 20 6f 66 20 74 68 65 20 61 62 6f 76 65 2c  ne of the above,
16390 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
163a0 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73   destination mus
163b0 74 20 62 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f  t be.    ** SRT_
163c0 4f 75 74 70 75 74 2e 20 20 54 68 69 73 20 72 6f  Output.  This ro
163d0 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
163e0 61 6c 6c 65 64 20 77 69 74 68 20 61 6e 79 20 6f  alled with any o
163f0 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 65 73 74  ther.    ** dest
16400 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72 20 74 68  ination other th
16410 61 6e 20 74 68 65 20 6f 6e 65 73 20 68 61 6e 64  an the ones hand
16420 6c 65 64 20 61 62 6f 76 65 20 6f 72 20 53 52 54  led above or SRT
16430 5f 4f 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a  _Output..    **.
16440 20 20 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f      ** For SRT_O
16450 75 74 70 75 74 2c 20 72 65 73 75 6c 74 73 20 61  utput, results a
16460 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73  re stored in a s
16470 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73  equence of regis
16480 74 65 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54  ters.  .    ** T
16490 68 65 6e 20 74 68 65 20 4f 50 5f 52 65 73 75 6c  hen the OP_Resul
164a0 74 52 6f 77 20 6f 70 63 6f 64 65 20 69 73 20 75  tRow opcode is u
164b0 73 65 64 20 74 6f 20 63 61 75 73 65 20 73 71 6c  sed to cause sql
164c0 69 74 65 33 5f 73 74 65 70 28 29 20 74 6f 0a 20  ite3_step() to. 
164d0 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65     ** return the
164e0 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 72 65 73   next row of res
164f0 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ult..    */.    
16500 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
16510 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e   assert( pDest->
16520 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
16530 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t );.      sqlit
16540 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16550 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 49  OP_ResultRow, pI
16560 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
16570 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Sdst);.      sql
16580 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
16590 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
165a0 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
165b0 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
165c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
165d0 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74    }..  /* Jump t
165e0 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
165f0 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d   loop if the LIM
16600 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20  IT is reached.. 
16610 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69   */.  if( p->iLi
16620 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
16630 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
16640 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c  OP_IfZero, p->iL
16650 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c 20 2d 31  imit, iBreak, -1
16660 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
16670 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  v);.  }..  /* Ge
16680 6e 65 72 61 74 65 20 74 68 65 20 73 75 62 72 6f  nerate the subro
16690 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a  utine return.  *
166a0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
166b0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
166c0 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c  Continue);.  sql
166d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
166e0 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
166f0 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75  Return);..  retu
16700 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn addr;.}../*.*
16710 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  * Alternative co
16720 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f  mpound select co
16730 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72  de generator for
16740 20 63 61 73 65 73 20 77 68 65 6e 20 74 68 65 72   cases when ther
16750 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52  e.** is an ORDER
16760 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a   BY clause..**.*
16770 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20 71 75  * We assume a qu
16780 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ery of the follo
16790 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a  wing form:.**.**
167a0 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20        <selectA> 
167b0 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65   <operator>  <se
167c0 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59  lectB>  ORDER BY
167d0 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a   <orderbylist>.*
167e0 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20  *.** <operator> 
167f0 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20  is one of UNION 
16800 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45  ALL, UNION, EXCE
16810 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
16820 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69  .  The idea.** i
16830 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c  s to code both <
16840 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65  selectA> and <se
16850 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68 65 20  lectB> with the 
16860 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
16870 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65  as.** co-routine
16880 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65  s.  Then run the
16890 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20   co-routines in 
168a0 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72  parallel and mer
168b0 67 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  ge the results.*
168c0 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  * into the outpu
168d0 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20  t.  In addition 
168e0 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75  to the two corou
168f0 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65  tines (called se
16900 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c  lectA and.** sel
16910 65 63 74 42 29 20 74 68 65 72 65 20 61 72 65 20  ectB) there are 
16920 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a  7 subroutines:.*
16930 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20  *.**    outA:   
16940 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74   Move the output
16950 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41 20   of the selectA 
16960 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74  coroutine into t
16970 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20  he output.**    
16980 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
16990 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a  compound query..
169a0 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20  **.**    outB:  
169b0 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75    Move the outpu
169c0 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42  t of the selectB
169d0 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20   coroutine into 
169e0 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20  the output.**   
169f0 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
16a00 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e   compound query.
16a10 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65    (Only generate
16a20 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a  d for UNION and.
16a30 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
16a40 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50  NION ALL.  EXCEP
16a50 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54  T and INSERTSECT
16a60 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61 20   never output a 
16a70 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  row that.**     
16a80 20 20 20 20 20 20 20 20 61 70 70 65 61 72 73 20          appears 
16a90 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a  only in B.).**.*
16aa0 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61  *    AltB:    Ca
16ab0 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
16ac0 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
16ad0 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
16ae0 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41   A<B..**.**    A
16af0 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  eqB:    Called w
16b00 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
16b10 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
16b20 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e  utines and A==B.
16b30 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20  .**.**    AgtB: 
16b40 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
16b50 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
16b60 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
16b70 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a  s and A>B..**.**
16b80 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c      EofA:    Cal
16b90 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73  led when data is
16ba0 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20   exhausted from 
16bb0 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20  selectA..**.**  
16bc0 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65    EofB:    Calle
16bd0 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65  d when data is e
16be0 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65  xhausted from se
16bf0 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lectB..**.** The
16c00 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
16c10 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20 66 69  of the latter fi
16c20 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64  ve subroutines d
16c30 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a  epend on which .
16c40 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73  ** <operator> is
16c50 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20   used:.**.**.** 
16c60 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f              UNIO
16c70 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e  N ALL         UN
16c80 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20 45  ION            E
16c90 58 43 45 50 54 20 20 20 20 20 20 20 20 20 20 49  XCEPT          I
16ca0 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20  NTERSECT.**     
16cb0 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
16cc0 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
16cd0 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
16ce0 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
16cf0 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c  --------.**   Al
16d00 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  tB:   outA, next
16d10 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78  A      outA, nex
16d20 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  tA       outA, n
16d30 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78  extA         nex
16d40 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a  tA.**.**   AeqB:
16d50 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
16d60 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20         nextA    
16d70 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20           nextA  
16d80 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
16d90 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a  tA.**.**   AgtB:
16da0 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
16db0 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
16dc0 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 20 20           nextB  
16dd0 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a            nextB.
16de0 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20  **.**   EofA:   
16df0 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
16e00 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
16e10 20 20 20 20 20 20 68 61 6c 74 20 20 20 20 20 20        halt      
16e20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a         halt.**.*
16e30 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41  *   EofB:   outA
16e40 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74  , nextA      out
16e50 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f  A, nextA       o
16e60 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
16e70 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e     halt.**.** In
16e80 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c   the AltB, AeqB,
16e90 20 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75   and AgtB subrou
16ea0 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e  tines, an EOF on
16eb0 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78   A following nex
16ec0 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20  tA.** causes an 
16ed0 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74  immediate jump t
16ee0 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f  o EofA and an EO
16ef0 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67  F on B following
16f00 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a   nextB causes.**
16f10 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75   an immediate ju
16f20 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74  mp to EofB.  Wit
16f30 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66  hin EofA and Eof
16f40 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e  B, and EOF on en
16f50 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77  try or.** follow
16f60 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65 73  ing nextX causes
16f70 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65   a jump to the e
16f80 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  nd of the select
16f90 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
16fa0 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d  ** Duplicate rem
16fb0 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f  oval in the UNIO
16fc0 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49  N, EXCEPT, and I
16fd0 4e 54 45 52 53 45 43 54 20 63 61 73 65 73 20 69  NTERSECT cases i
16fe0 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74  s handled.** wit
16ff0 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73  hin the output s
17000 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  ubroutine.  The 
17010 72 65 67 50 72 65 76 20 72 65 67 69 73 74 65 72  regPrev register
17020 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70   set holds the p
17030 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74  reviously.** out
17040 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f  put value.  A co
17050 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65  mparison is made
17060 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 76 61   against this va
17070 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70  lue and the outp
17080 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64  ut.** is skipped
17090 20 69 66 20 74 68 65 20 6e 65 78 74 20 72 65 73   if the next res
170a0 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68  ults would be th
170b0 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70 72  e same as the pr
170c0 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  evious..**.** Th
170d0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
170e0 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c   plan is to impl
170f0 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f  ement the two co
17100 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76  routines and sev
17110 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65  en.** subroutine
17120 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75  s first, then pu
17130 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f  t the control lo
17140 67 69 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f  gic at the botto
17150 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a  m.  Like this:.*
17160 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f  *.**          go
17170 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63  to Init.**     c
17180 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  oA: coroutine fo
17190 72 20 6c 65 66 74 20 71 75 65 72 79 20 28 41 29  r left query (A)
171a0 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72  .**     coB: cor
171b0 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74  outine for right
171c0 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20   query (B).**   
171d0 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e   outA: output on
171e0 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20  e row of A.**   
171f0 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e   outB: output on
17200 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f  e row of B (UNIO
17210 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20  N and UNION ALL 
17220 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41  only).**    EofA
17230 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42  : ....**    EofB
17240 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42  : ....**    AltB
17250 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42  : ....**    AeqB
17260 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42  : ....**    AgtB
17270 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74  : ....**    Init
17280 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72  : initialize cor
17290 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73  outine registers
172a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65  .**          yie
172b0 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20  ld coA.**       
172c0 20 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74     if eof(A) got
172d0 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20  o EofA.**       
172e0 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20     yield coB.** 
172f0 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28           if eof(
17300 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20  B) goto EofB.** 
17310 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65     Cmpr: Compare
17320 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20   A, B.**        
17330 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71    Jump AltB, Aeq
17340 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45  B, AgtB.**     E
17350 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65  nd: ....**.** We
17360 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42   call AltB, AeqB
17370 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e  , AgtB, EofA, an
17380 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69  d EofB "subrouti
17390 6e 65 73 22 20 62 75 74 20 74 68 65 79 20 61 72  nes" but they ar
173a0 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c  e not.** actuall
173b0 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47  y called using G
173c0 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f  osub and they do
173d0 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f   not Return.  Eo
173e0 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70  fA and EofB loop
173f0 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61  .** until all da
17400 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
17410 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65  then jump to the
17420 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c   "end" labe.  Al
17430 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64  tB, AeqB,.** and
17440 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69   AgtB jump to ei
17450 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e  ther L2 or to on
17460 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66  e of EofA or Eof
17470 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  B..*/.#ifndef SQ
17480 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
17490 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63  ND_SELECT.static
174a0 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
174b0 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65  OrderBy(.  Parse
174c0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
174d0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
174e0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
174f0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
17500 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
17510 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
17520 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
17530 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
17540 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
17550 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
17560 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
17570 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
17580 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
17590 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  rs */.  Select *
175a0 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
175b0 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
175c0 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
175d0 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
175e0 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
175f0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
17600 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
17610 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
17620 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44   destA;     /* D
17630 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63  estination for c
17640 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20  oroutine A */.  
17650 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 42  SelectDest destB
17660 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  ;     /* Destina
17670 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69  tion for corouti
17680 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ne B */.  int re
17690 67 41 64 64 72 41 3b 20 20 20 20 20 20 20 20 20  gAddrA;         
176a0 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
176b0 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41  ter for select-A
176c0 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
176d0 69 6e 74 20 72 65 67 41 64 64 72 42 3b 20 20 20  int regAddrB;   
176e0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
176f0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
17700 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65  lect-B coroutine
17710 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65   */.  int addrSe
17720 6c 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41  lectA;      /* A
17730 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
17740 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65  lect-A coroutine
17750 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65   */.  int addrSe
17760 6c 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41  lectB;      /* A
17770 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
17780 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65  lect-B coroutine
17790 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
177a0 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  A;          /* A
177b0 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
177c0 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41  for the output-A
177d0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
177e0 20 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20   int regOutB;   
177f0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
17800 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74  s register for t
17810 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72  he output-B subr
17820 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
17830 61 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20  addrOutA;       
17840 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
17850 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62  the output-A sub
17860 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
17870 20 61 64 64 72 4f 75 74 42 20 3d 20 30 3b 20 20   addrOutB = 0;  
17880 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
17890 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75   the output-B su
178a0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
178b0 74 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20  t addrEofA;     
178c0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
178d0 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65  f the select-A-e
178e0 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74  xhausted subrout
178f0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
17900 72 45 6f 66 41 5f 6e 6f 42 3b 20 20 20 20 20 2f  rEofA_noB;     /
17910 2a 20 41 6c 74 65 72 6e 61 74 65 20 61 64 64 72  * Alternate addr
17920 45 6f 66 41 20 69 66 20 42 20 69 73 20 75 6e 69  EofA if B is uni
17930 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
17940 69 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20  int addrEofB;   
17950 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
17960 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
17970 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f  -exhausted subro
17980 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
17990 64 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20  ddrAltB;        
179a0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
179b0 68 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e  he A<B subroutin
179c0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
179d0 65 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  eqB;         /* 
179e0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
179f0 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ==B subroutine *
17a00 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74 42  /.  int addrAgtB
17a10 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
17a20 72 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20  ress of the A>B 
17a30 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
17a40 69 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20  int regLimitA;  
17a50 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72        /* Limit r
17a60 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
17a70 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ct-A */.  int re
17a80 67 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20  gLimitB;        
17a90 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65  /* Limit registe
17aa0 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a  r for select-A *
17ab0 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b  /.  int regPrev;
17ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72            /* A r
17ad0 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72  ange of register
17ae0 73 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f  s to hold previo
17af0 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69  us output */.  i
17b00 6e 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20  nt savedLimit;  
17b10 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61       /* Saved va
17b20 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74  lue of p->iLimit
17b30 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f   */.  int savedO
17b40 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53  ffset;      /* S
17b50 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d  aved value of p-
17b60 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e  >iOffset */.  in
17b70 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20  t labelCmpr;    
17b80 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
17b90 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
17ba0 65 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68  e merge algorith
17bb0 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c  m */.  int label
17bc0 45 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  End;         /* 
17bd0 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e  Label for the en
17be0 64 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c  d of the overall
17bf0 20 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a   SELECT stmt */.
17c00 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20 20    int j1;       
17c10 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
17c20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61  instructions tha
17c30 74 20 67 65 74 20 72 65 74 61 72 67 65 74 74 65  t get retargette
17c40 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  d */.  int op;  
17c50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17c60 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54  One of TK_ALL, T
17c70 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45  K_UNION, TK_EXCE
17c80 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  PT, TK_INTERSECT
17c90 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
17ca0 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43  KeyDup = 0; /* C
17cb0 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d  omparison inform
17cc0 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63  ation for duplic
17cd0 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20  ate removal */. 
17ce0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65   KeyInfo *pKeyMe
17cf0 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72  rge;   /* Compar
17d00 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ison information
17d10 20 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77   for merging row
17d20 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
17d30 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  db;          /* 
17d40 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
17d50 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ion */.  ExprLis
17d60 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f  t *pOrderBy;   /
17d70 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
17d80 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lause */.  int n
17d90 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
17da0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
17db0 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
17dc0 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
17dd0 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20  int *aPermute;  
17de0 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67        /* Mapping
17df0 20 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74   from ORDER BY t
17e00 65 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73  erms to result s
17e10 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69  et columns */.#i
17e20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17e30 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20  T_EXPLAIN.  int 
17e40 69 53 75 62 31 3b 20 20 20 20 20 20 20 20 20 20  iSub1;          
17e50 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c    /* EQP id of l
17e60 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a  eft-hand query *
17e70 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 3b 20 20  /.  int iSub2;  
17e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50            /* EQP
17e90 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e   id of right-han
17ea0 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69  d query */.#endi
17eb0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  f..  assert( p->
17ec0 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20  pOrderBy!=0 );. 
17ed0 20 61 73 73 65 72 74 28 20 70 4b 65 79 44 75 70   assert( pKeyDup
17ee0 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67  ==0 ); /* "Manag
17ef0 65 64 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74  ed" code needs t
17f00 68 69 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33  his.  Ticket #33
17f10 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  82. */.  db = pP
17f20 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20  arse->db;.  v = 
17f30 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
17f40 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
17f50 20 20 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64         /* Alread
17f60 79 20 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72  y thrown the err
17f70 6f 72 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63  or if VDBE alloc
17f80 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62   failed */.  lab
17f90 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  elEnd = sqlite3V
17fa0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
17fb0 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73  .  labelCmpr = s
17fc0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
17fd0 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50  bel(v);...  /* P
17fe0 61 74 63 68 20 75 70 20 74 68 65 20 4f 52 44 45  atch up the ORDE
17ff0 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f  R BY clause.  */
18000 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20  .  op = p->op;  
18010 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
18020 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  Prior;.  assert(
18030 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
18040 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72  y==0 );.  pOrder
18050 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
18060 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ;.  assert( pOrd
18070 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72  erBy );.  nOrder
18080 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  By = pOrderBy->n
18090 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20  Expr;..  /* For 
180a0 6f 70 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20  operators other 
180b0 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77  than UNION ALL w
180c0 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73  e have to make s
180d0 75 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ure that.  ** th
180e0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
180f0 65 20 63 6f 76 65 72 73 20 65 76 65 72 79 20 74  e covers every t
18100 65 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c  erm of the resul
18110 74 20 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a  t set.  Add.  **
18120 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52   terms to the OR
18130 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73  DER BY clause as
18140 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
18150 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c  .  if( op!=TK_AL
18160 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31  L ){.    for(i=1
18170 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ; db->mallocFail
18180 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70  ed==0 && i<=p->p
18190 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
181a0 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
181b0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
181c0 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72  pItem;.      for
181d0 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (j=0, pItem=pOrd
181e0 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65  erBy->a; j<nOrde
181f0 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  rBy; j++, pItem+
18200 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
18210 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  rt( pItem->u.x.i
18220 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a  OrderByCol>0 );.
18230 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
18240 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
18250 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20  ol==i ) break;. 
18260 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
18270 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a   j==nOrderBy ){.
18280 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e          Expr *pN
18290 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
182a0 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c  (db, TK_INTEGER,
182b0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
182c0 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
182d0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
182e0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c          pNew->fl
182f0 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c  ags |= EP_IntVal
18300 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ue;.        pNew
18310 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a  ->u.iValue = i;.
18320 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
18330 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
18340 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
18350 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29   pOrderBy, pNew)
18360 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
18370 72 64 65 72 42 79 20 29 20 70 4f 72 64 65 72 42  rderBy ) pOrderB
18380 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d  y->a[nOrderBy++]
18390 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
183a0 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20   = (u16)i;.     
183b0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
183c0 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  /* Compute the c
183d0 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74  omparison permut
183e0 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66  ation and keyinf
183f0 6f 20 74 68 61 74 20 69 73 20 75 73 65 64 20 77  o that is used w
18400 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72  ith.  ** the per
18410 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f  mutation used to
18420 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
18430 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20  e next.  ** row 
18440 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73  of results comes
18450 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72   from selectA or
18460 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20   selectB.  Also 
18470 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a  add explicit.  *
18480 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20  * collations to 
18490 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
184a0 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61  use terms so tha
184b0 74 20 77 68 65 6e 20 74 68 65 20 73 75 62 71 75  t when the subqu
184c0 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68  eries.  ** to th
184d0 65 20 72 69 67 68 74 20 61 6e 64 20 74 68 65 20  e right and the 
184e0 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75 61 74  left are evaluat
184f0 65 64 2c 20 74 68 65 79 20 75 73 65 20 74 68 65  ed, they use the
18500 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f   correct.  ** co
18510 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  llation..  */.  
18520 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74  aPermute = sqlit
18530 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
18540 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f  , sizeof(int)*nO
18550 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 61  rderBy);.  if( a
18560 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 73  Permute ){.    s
18570 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
18580 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
18590 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
185a0 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f  OrderBy->a; i<nO
185b0 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74  rderBy; i++, pIt
185c0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  em++){.      ass
185d0 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  ert( pItem->u.x.
185e0 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 0a 20 20  iOrderByCol>0.  
185f0 20 20 20 20 20 20 20 20 26 26 20 70 49 74 65 6d          && pItem
18600 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
18610 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  l<=p->pEList->nE
18620 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 50 65  xpr );.      aPe
18630 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d  rmute[i] = pItem
18640 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
18650 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  l - 1;.    }.   
18660 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 6d 75 6c   pKeyMerge = mul
18670 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b  tiSelectOrderByK
18680 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
18690 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 1);.  }else{. 
186a0 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 30     pKeyMerge = 0
186b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74  ;.  }..  /* Reat
186c0 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42  tach the ORDER B
186d0 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20  Y clause to the 
186e0 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d  query..  */.  p-
186f0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
18700 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e  erBy;.  pPrior->
18710 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
18720 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 50  e3ExprListDup(pP
18730 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72  arse->db, pOrder
18740 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c  By, 0);..  /* Al
18750 6c 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f  locate a range o
18760 66 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  f temporary regi
18770 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65  sters and the Ke
18780 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a  yInfo needed.  *
18790 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20  * for the logic 
187a0 74 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70  that removes dup
187b0 6c 69 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f  licate result ro
187c0 77 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a  ws when the.  **
187d0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49   operator is UNI
187e0 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49  ON, EXCEPT, or I
187f0 4e 54 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f  NTERSECT (but no
18800 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20  t UNION ALL)..  
18810 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
18820 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72  ALL ){.    regPr
18830 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ev = 0;.  }else{
18840 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d  .    int nExpr =
18850 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
18860 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  r;.    assert( n
18870 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c  OrderBy>=nExpr |
18880 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
18890 65 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72 65  ed );.    regPre
188a0 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  v = pParse->nMem
188b0 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  +1;.    pParse->
188c0 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b 31 3b  nMem += nExpr+1;
188d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
188e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
188f0 65 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76  eger, 0, regPrev
18900 29 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d  );.    pKeyDup =
18910 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
18920 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2c 20  lloc(db, nExpr, 
18930 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79  1);.    if( pKey
18940 44 75 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Dup ){.      ass
18950 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
18960 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
18970 4b 65 79 44 75 70 29 20 29 3b 0a 20 20 20 20 20  KeyDup) );.     
18980 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
18990 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
189a0 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b   pKeyDup->aColl[
189b0 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  i] = multiSelect
189c0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
189d0 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70  p, i);.        p
189e0 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64  KeyDup->aSortOrd
189f0 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  er[i] = 0;.     
18a00 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20   }.    }.  }. . 
18a10 20 2f 2a 20 53 65 70 61 72 61 74 65 20 74 68 65   /* Separate the
18a20 20 6c 65 66 74 20 61 6e 64 20 74 68 65 20 72 69   left and the ri
18a30 67 68 74 20 71 75 65 72 79 20 66 72 6f 6d 20 6f  ght query from o
18a40 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a  ne another.  */.
18a50 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
18a60 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74  .  pPrior->pNext
18a70 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 52   = 0;.  sqlite3R
18a80 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70  esolveOrderGroup
18a90 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  By(pParse, p, p-
18aa0 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45  >pOrderBy, "ORDE
18ab0 52 22 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f  R");.  if( pPrio
18ac0 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a  r->pPrior==0 ){.
18ad0 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c      sqlite3Resol
18ae0 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70  veOrderGroupBy(p
18af0 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70  Parse, pPrior, p
18b00 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 2c  Prior->pOrderBy,
18b10 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d 0a 0a   "ORDER");.  }..
18b20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
18b30 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73   limit registers
18b40 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d   */.  computeLim
18b50 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
18b60 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e 64 29  se, p, labelEnd)
18b70 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  ;.  if( p->iLimi
18b80 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  t && op==TK_ALL 
18b90 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41  ){.    regLimitA
18ba0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
18bb0 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 42  m;.    regLimitB
18bc0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
18bd0 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
18be0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
18bf0 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65 74 20  opy, p->iOffset 
18c00 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a  ? p->iOffset+1 :
18c10 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20 20 20   p->iLimit,.    
18c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
18c40 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20 73 71  gLimitA);.    sq
18c50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18c60 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4c  v, OP_Copy, regL
18c70 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69 74 42  imitA, regLimitB
18c80 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
18c90 72 65 67 4c 69 6d 69 74 41 20 3d 20 72 65 67 4c  regLimitA = regL
18ca0 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d 0a 20  imitB = 0;.  }. 
18cb0 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
18cc0 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  te(db, p->pLimit
18cd0 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  );.  p->pLimit =
18ce0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   0;.  sqlite3Exp
18cf0 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
18d00 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d 3e 70 4f  Offset);.  p->pO
18d10 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 72 65  ffset = 0;..  re
18d20 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72 73  gAddrA = ++pPars
18d30 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64  e->nMem;.  regAd
18d40 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  drB = ++pParse->
18d50 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20  nMem;.  regOutA 
18d60 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
18d70 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b  ;.  regOutB = ++
18d80 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
18d90 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
18da0 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20 53 52  tInit(&destA, SR
18db0 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  T_Coroutine, reg
18dc0 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65  AddrA);.  sqlite
18dd0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
18de0 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f  &destB, SRT_Coro
18df0 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29  utine, regAddrB)
18e00 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
18e10 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20   a coroutine to 
18e20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c  evaluate the SEL
18e30 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ECT statement to
18e40 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f   the.  ** left o
18e50 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f  f the compound o
18e60 70 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22 41  perator - the "A
18e70 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20  " select..  */. 
18e80 20 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73   addrSelectA = s
18e90 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
18ea0 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20  tAddr(v) + 1;.  
18eb0 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
18ec0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69  AddOp3(v, OP_Ini
18ed0 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  tCoroutine, regA
18ee0 64 64 72 41 2c 20 30 2c 20 61 64 64 72 53 65 6c  ddrA, 0, addrSel
18ef0 65 63 74 41 29 3b 0a 20 20 56 64 62 65 43 6f 6d  ectA);.  VdbeCom
18f00 6d 65 6e 74 28 28 76 2c 20 22 6c 65 66 74 20 53  ment((v, "left S
18f10 45 4c 45 43 54 22 29 29 3b 0a 20 20 70 50 72 69  ELECT"));.  pPri
18f20 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67  or->iLimit = reg
18f30 4c 69 6d 69 74 41 3b 0a 20 20 65 78 70 6c 61 69  LimitA;.  explai
18f40 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
18f50 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  1, pParse->iNext
18f60 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c  SelectId);.  sql
18f70 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
18f80 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74  e, pPrior, &dest
18f90 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
18fa0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e  eAddOp1(v, OP_En
18fb0 64 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  dCoroutine, regA
18fc0 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddrA);.  sqlite3
18fd0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
18fe0 6a 31 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  j1);..  /* Gener
18ff0 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  ate a coroutine 
19000 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
19010 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
19020 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69   on .  ** the ri
19030 67 68 74 20 2d 20 74 68 65 20 22 42 22 20 73 65  ght - the "B" se
19040 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72  lect.  */.  addr
19050 53 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65  SelectB = sqlite
19060 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
19070 28 76 29 20 2b 20 31 3b 0a 20 20 6a 31 20 3d 20  (v) + 1;.  j1 = 
19080 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19090 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
190a0 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 2c  utine, regAddrB,
190b0 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74 42 29   0, addrSelectB)
190c0 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
190d0 28 76 2c 20 22 72 69 67 68 74 20 53 45 4c 45 43  (v, "right SELEC
190e0 54 22 29 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d  T"));.  savedLim
190f0 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a  it = p->iLimit;.
19100 20 20 73 61 76 65 64 4f 66 66 73 65 74 20 3d 20    savedOffset = 
19110 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d  p->iOffset;.  p-
19120 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d  >iLimit = regLim
19130 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65  itB;.  p->iOffse
19140 74 20 3d 20 30 3b 20 20 0a 20 20 65 78 70 6c 61  t = 0;  .  expla
19150 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
19160 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b2, pParse->iNex
19170 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71  tSelectId);.  sq
19180 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
19190 73 65 2c 20 70 2c 20 26 64 65 73 74 42 29 3b 0a  se, p, &destB);.
191a0 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61    p->iLimit = sa
191b0 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69  vedLimit;.  p->i
191c0 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64 4f 66  Offset = savedOf
191d0 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 56  fset;.  sqlite3V
191e0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
191f0 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  EndCoroutine, re
19200 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47  gAddrB);..  /* G
19210 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
19220 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
19230 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  s the current ro
19240 77 20 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a 20  w of the A.  ** 
19250 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65  select as the ne
19260 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66  xt output row of
19270 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
19280 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62  lect..  */.  Vdb
19290 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
192a0 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65   "Output routine
192b0 20 66 6f 72 20 41 22 29 29 3b 0a 20 20 61 64 64   for A"));.  add
192c0 72 4f 75 74 41 20 3d 20 67 65 6e 65 72 61 74 65  rOutA = generate
192d0 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65  OutputSubroutine
192e0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
192f0 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65            p, &de
19300 73 74 41 2c 20 70 44 65 73 74 2c 20 72 65 67 4f  stA, pDest, regO
19310 75 74 41 2c 0a 20 20 20 20 20 20 20 20 20 20 20  utA,.           
19320 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70        regPrev, p
19330 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64  KeyDup, labelEnd
19340 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72  );.  .  /* Gener
19350 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
19360 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68   that outputs th
19370 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66  e current row of
19380 20 74 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65   the B.  ** sele
19390 63 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f  ct as the next o
193a0 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65  utput row of the
193b0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
193c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
193d0 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54  =TK_ALL || op==T
193e0 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56  K_UNION ){.    V
193f0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
19400 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69  v, "Output routi
19410 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a 20 20 20  ne for B"));.   
19420 20 61 64 64 72 4f 75 74 42 20 3d 20 67 65 6e 65   addrOutB = gene
19430 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75  rateOutputSubrou
19440 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20  tine(pParse,.   
19450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c                p,
19460 20 26 64 65 73 74 42 2c 20 70 44 65 73 74 2c 20   &destB, pDest, 
19470 72 65 67 4f 75 74 42 2c 0a 20 20 20 20 20 20 20  regOutB,.       
19480 20 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65            regPre
19490 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65  v, pKeyDup, labe
194a0 6c 45 6e 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  lEnd);.  }.  sql
194b0 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
194c0 28 70 4b 65 79 44 75 70 29 3b 0a 0a 20 20 2f 2a  (pKeyDup);..  /*
194d0 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
194e0 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68  outine to run wh
194f0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66  en the results f
19500 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20 20 2a  rom select A.  *
19510 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20  * are exhausted 
19520 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e  and only data in
19530 20 73 65 6c 65 63 74 20 42 20 72 65 6d 61 69 6e   select B remain
19540 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  s..  */.  if( op
19550 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f  ==TK_EXCEPT || o
19560 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
19570 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f  ){.    addrEofA_
19580 6e 6f 42 20 3d 20 61 64 64 72 45 6f 66 41 20 3d  noB = addrEofA =
19590 20 6c 61 62 65 6c 45 6e 64 3b 0a 20 20 7d 65 6c   labelEnd;.  }el
195a0 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f  se{  .    VdbeNo
195b0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  opComment((v, "e
195c0 6f 66 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 22  of-A subroutine"
195d0 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41  ));.    addrEofA
195e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
195f0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
19600 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f  , regOutB, addrO
19610 75 74 42 29 3b 0a 20 20 20 20 61 64 64 72 45 6f  utB);.    addrEo
19620 66 41 5f 6e 6f 42 20 3d 20 73 71 6c 69 74 65 33  fA_noB = sqlite3
19630 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19640 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42  _Yield, regAddrB
19650 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20  , labelEnd);.   
19660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19680 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
19690 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
196a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
196b0 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 41  oto, 0, addrEofA
196c0 29 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  );.    p->nSelec
196d0 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e  tRow += pPrior->
196e0 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 0a  nSelectRow;.  }.
196f0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
19700 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72   subroutine to r
19710 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75  un when the resu
19720 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20  lts from select 
19730 42 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75  B.  ** are exhau
19740 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61  sted and only da
19750 74 61 20 69 6e 20 73 65 6c 65 63 74 20 41 20 72  ta in select A r
19760 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  emains..  */.  i
19770 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  f( op==TK_INTERS
19780 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45  ECT ){.    addrE
19790 6f 66 42 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a  ofB = addrEofA;.
197a0 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65      if( p->nSele
197b0 63 74 52 6f 77 20 3e 20 70 50 72 69 6f 72 2d 3e  ctRow > pPrior->
197c0 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e  nSelectRow ) p->
197d0 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72  nSelectRow = pPr
197e0 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
197f0 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20  .  }else{  .    
19800 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
19810 28 76 2c 20 22 65 6f 66 2d 42 20 73 75 62 72 6f  (v, "eof-B subro
19820 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64  utine"));.    ad
19830 64 72 45 6f 66 42 20 3d 20 73 71 6c 69 74 65 33  drEofB = sqlite3
19840 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19850 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c  _Gosub, regOutA,
19860 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20 20   addrOutA);.    
19870 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19880 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
19890 65 67 41 64 64 72 41 2c 20 6c 61 62 65 6c 45 6e  egAddrA, labelEn
198a0 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  d); VdbeCoverage
198b0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
198c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
198d0 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f  _Goto, 0, addrEo
198e0 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  fB);.  }..  /* G
198f0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
19900 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20  handle the case 
19910 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64  of A<B.  */.  Vd
19920 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
19930 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75  , "A-lt-B subrou
19940 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41  tine"));.  addrA
19950 6c 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ltB = sqlite3Vdb
19960 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
19970 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64  sub, regOutA, ad
19980 64 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69 74  drOutA);.  sqlit
19990 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
199a0 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
199b0 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56  rA, addrEofA); V
199c0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
199d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
199e0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
199f0 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a  0, labelCmpr);..
19a00 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
19a10 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
19a20 20 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20   case of A==B.  
19a30 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
19a40 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64 72 41  ALL ){.    addrA
19a50 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a  eqB = addrAltB;.
19a60 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
19a70 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a  TK_INTERSECT ){.
19a80 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61      addrAeqB = a
19a90 64 64 72 41 6c 74 42 3b 0a 20 20 20 20 61 64 64  ddrAltB;.    add
19aa0 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65  rAltB++;.  }else
19ab0 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f  {.    VdbeNoopCo
19ac0 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d  mment((v, "A-eq-
19ad0 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
19ae0 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 0a  .    addrAeqB =.
19af0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19b00 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
19b10 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64  d, regAddrA, add
19b20 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65  rEofA); VdbeCove
19b30 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
19b40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19b50 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61  , OP_Goto, 0, la
19b60 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20  belCmpr);.  }.. 
19b70 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
19b80 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  e to handle the 
19b90 63 61 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f  case of A>B.  */
19ba0 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
19bb0 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73  nt((v, "A-gt-B s
19bc0 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
19bd0 61 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74  addrAgtB = sqlit
19be0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
19bf0 72 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  r(v);.  if( op==
19c00 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b  TK_ALL || op==TK
19c10 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71  _UNION ){.    sq
19c20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19c30 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
19c40 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b  OutB, addrOutB);
19c50 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
19c60 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
19c70 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20  ield, regAddrB, 
19c80 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43  addrEofB); VdbeC
19c90 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
19ca0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19cb0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c  v, OP_Goto, 0, l
19cc0 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a  abelCmpr);..  /*
19cd0 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e 73 20   This code runs 
19ce0 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69  once to initiali
19cf0 7a 65 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20  ze everything.. 
19d00 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
19d10 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
19d20 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
19d30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
19d40 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64  d, regAddrA, add
19d50 72 45 6f 66 41 5f 6e 6f 42 29 3b 20 56 64 62 65  rEofA_noB); Vdbe
19d60 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
19d70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19d80 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
19d90 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42  gAddrB, addrEofB
19da0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
19db0 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d  v);..  /* Implem
19dc0 65 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65 72  ent the main mer
19dd0 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73  ge loop.  */.  s
19de0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
19df0 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43  eLabel(v, labelC
19e00 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  mpr);.  sqlite3V
19e10 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
19e20 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20  Permutation, 0, 
19e30 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50 65  0, 0, (char*)aPe
19e40 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52 52  rmute, P4_INTARR
19e50 41 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  AY);.  sqlite3Vd
19e60 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
19e70 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69 53  ompare, destA.iS
19e80 64 73 74 2c 20 64 65 73 74 42 2e 69 53 64 73 74  dst, destB.iSdst
19e90 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20  , nOrderBy,.    
19ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19eb0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
19ec0 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46  Merge, P4_KEYINF
19ed0 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  O);.  sqlite3Vdb
19ee0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
19ef0 4c 41 47 5f 50 45 52 4d 55 54 45 29 3b 0a 20 20  LAG_PERMUTE);.  
19f00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19f10 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64  3(v, OP_Jump, ad
19f20 64 72 41 6c 74 42 2c 20 61 64 64 72 41 65 71 42  drAltB, addrAeqB
19f30 2c 20 61 64 64 72 41 67 74 42 29 3b 20 56 64 62  , addrAgtB); Vdb
19f40 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
19f50 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
19f60 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72  this point in or
19f70 64 65 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  der to terminate
19f80 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f   the query..  */
19f90 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
19fa0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61  solveLabel(v, la
19fb0 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53  belEnd);..  /* S
19fc0 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
19fd0 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 0a   output columns.
19fe0 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74    */.  if( pDest
19ff0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ->eDest==SRT_Out
1a000 70 75 74 20 29 7b 0a 20 20 20 20 53 65 6c 65 63  put ){.    Selec
1a010 74 20 2a 70 46 69 72 73 74 20 3d 20 70 50 72 69  t *pFirst = pPri
1a020 6f 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  or;.    while( p
1a030 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20  First->pPrior ) 
1a040 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
1a050 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 67 65 6e  >pPrior;.    gen
1a060 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
1a070 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72  (pParse, 0, pFir
1a080 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d  st->pEList);.  }
1a090 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c  ..  /* Reassembl
1a0a0 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71  y the compound q
1a0b0 75 65 72 79 20 73 6f 20 74 68 61 74 20 69 74 20  uery so that it 
1a0c0 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 63 6f  will be freed co
1a0d0 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20  rrectly.  ** by 
1a0e0 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
1a0f0 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  tion */.  if( p-
1a100 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 73  >pPrior ){.    s
1a110 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
1a120 74 65 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72  te(db, p->pPrior
1a130 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69  );.  }.  p->pPri
1a140 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 70  or = pPrior;.  p
1a150 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Prior->pNext = p
1a160 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20  ;..  /*** TBD:  
1a170 49 6e 73 65 72 74 20 73 75 62 72 6f 75 74 69 6e  Insert subroutin
1a180 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65  e calls to close
1a190 20 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f   cursors on inco
1a1a0 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75  mplete.  **** su
1a1b0 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20  bqueries ****/. 
1a1c0 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74   explainComposit
1a1d0 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c  e(pParse, p->op,
1a1e0 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20 30   iSub1, iSub2, 0
1a1f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1a200 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
1a210 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
1a220 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1a230 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
1a240 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1a250 29 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63  )./* Forward Dec
1a260 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61  larations */.sta
1a270 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
1a280 70 72 4c 69 73 74 28 73 71 6c 69 74 65 33 2a 2c  prList(sqlite3*,
1a290 20 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c   ExprList*, int,
1a2a0 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61   ExprList*);.sta
1a2b0 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65  tic void substSe
1a2c0 6c 65 63 74 28 73 71 6c 69 74 65 33 2a 2c 20 53  lect(sqlite3*, S
1a2d0 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78  elect *, int, Ex
1a2e0 70 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a  prList *);../*.*
1a2f0 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74  * Scan through t
1a300 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  he expression pE
1a310 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76  xpr.  Replace ev
1a320 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ery reference to
1a330 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20  .** a column in 
1a340 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61  table number iTa
1a350 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79 20  ble with a copy 
1a360 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  of the iColumn-t
1a370 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45  h.** entry in pE
1a380 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76  List.  (But leav
1a390 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
1a3a0 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e  the ROWID column
1a3b0 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29   .** unchanged.)
1a3c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1a3d0 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74  ine is part of t
1a3e0 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72  he flattening pr
1a3f0 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71  ocedure.  A subq
1a400 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65  uery.** whose re
1a410 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69  sult set is defi
1a420 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70  ned by pEList ap
1a430 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69  pears as entry i
1a440 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c  n the.** FROM cl
1a450 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
1a460 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56   such that the V
1a470 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67  DBE cursor assig
1a480 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46  ned to that.** F
1a490 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79  ORM clause entry
1a4a0 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69   is iTable.  Thi
1a4b0 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74  s routine make t
1a4c0 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a  he necessary .**
1a4d0 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70   changes to pExp
1a4e0 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66  r so that it ref
1a4f0 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ers directly to 
1a500 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
1a510 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75  .** of the subqu
1a520 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72  ery rather the r
1a530 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
1a540 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74   subquery..*/.st
1a550 61 74 69 63 20 45 78 70 72 20 2a 73 75 62 73 74  atic Expr *subst
1a560 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20  Expr(.  sqlite3 
1a570 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 52  *db,        /* R
1a580 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72  eport malloc err
1a590 6f 72 73 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e  ors to this conn
1a5a0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ection */.  Expr
1a5b0 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
1a5c0 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63 68  /* Expr in which
1a5d0 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63   substitution oc
1a5e0 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  curs */.  int iT
1a5f0 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  able,         /*
1a600 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62   Table to be sub
1a610 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78  stituted */.  Ex
1a620 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
1a630 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20    /* Substitute 
1a640 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29  expressions */.)
1a650 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  {.  if( pExpr==0
1a660 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
1a670 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
1a680 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72  _COLUMN && pExpr
1a690 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
1a6a0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70   ){.    if( pExp
1a6b0 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  r->iColumn<0 ){.
1a6c0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
1a6d0 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d  = TK_NULL;.    }
1a6e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72  else{.      Expr
1a6f0 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73   *pNew;.      as
1a700 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
1a710 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  && pExpr->iColum
1a720 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  n<pEList->nExpr 
1a730 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1a740 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30   pExpr->pLeft==0
1a750 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68   && pExpr->pRigh
1a760 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e  t==0 );.      pN
1a770 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
1a780 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e  Dup(db, pEList->
1a790 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  a[pExpr->iColumn
1a7a0 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ].pExpr, 0);.   
1a7b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
1a7c0 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
1a7d0 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70  .      pExpr = p
1a7e0 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  New;.    }.  }el
1a7f0 73 65 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70  se{.    pExpr->p
1a800 4c 65 66 74 20 3d 20 73 75 62 73 74 45 78 70 72  Left = substExpr
1a810 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  (db, pExpr->pLef
1a820 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
1a830 74 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70  t);.    pExpr->p
1a840 52 69 67 68 74 20 3d 20 73 75 62 73 74 45 78 70  Right = substExp
1a850 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 52 69  r(db, pExpr->pRi
1a860 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ght, iTable, pEL
1a870 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78  ist);.    if( Ex
1a880 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1a890 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
1a8a0 74 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73  t) ){.      subs
1a8b0 74 53 65 6c 65 63 74 28 64 62 2c 20 70 45 78 70  tSelect(db, pExp
1a8c0 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69 54  r->x.pSelect, iT
1a8d0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1a8e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a8f0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
1a900 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
1a910 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1a920 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1a930 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 73  eturn pExpr;.}.s
1a940 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
1a950 45 78 70 72 4c 69 73 74 28 0a 20 20 73 71 6c 69  ExprList(.  sqli
1a960 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
1a970 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f   /* Report mallo
1a980 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f  c errors here */
1a990 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
1a9a0 73 74 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  st,     /* List 
1a9b0 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77  to scan and in w
1a9c0 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62  hich to make sub
1a9d0 73 74 69 74 75 74 65 73 20 2a 2f 0a 20 20 69 6e  stitutes */.  in
1a9e0 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
1a9f0 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62     /* Table to b
1aa00 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f  e substituted */
1aa10 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
1aa20 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74  ist     /* Subst
1aa30 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a  itute values */.
1aa40 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
1aa50 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
1aa60 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
1aa70 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
1aa80 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d  i++){.    pList-
1aa90 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 75  >a[i].pExpr = su
1aaa0 62 73 74 45 78 70 72 28 64 62 2c 20 70 4c 69 73  bstExpr(db, pLis
1aab0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69  t->a[i].pExpr, i
1aac0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1aad0 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
1aae0 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20  d substSelect(. 
1aaf0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
1ab00 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20        /* Report 
1ab10 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65  malloc errors he
1ab20 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  re */.  Select *
1ab30 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p,           /* 
1ab40 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1ab50 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b   in which to mak
1ab60 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20  e substitutions 
1ab70 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
1ab80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
1ab90 6c 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65  le to be replace
1aba0 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
1abb0 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53  *pEList     /* S
1abc0 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73  ubstitute values
1abd0 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74   */.){.  SrcList
1abe0 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74   *pSrc;.  struct
1abf0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1ac00 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
1ac10 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
1ac20 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
1ac30 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  t(db, p->pEList,
1ac40 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1ac50 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
1ac60 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42  t(db, p->pGroupB
1ac70 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  y, iTable, pELis
1ac80 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c  t);.  substExprL
1ac90 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ist(db, p->pOrde
1aca0 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  rBy, iTable, pEL
1acb0 69 73 74 29 3b 0a 20 20 70 2d 3e 70 48 61 76 69  ist);.  p->pHavi
1acc0 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  ng = substExpr(d
1acd0 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69  b, p->pHaving, i
1ace0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1acf0 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75    p->pWhere = su
1ad00 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70  bstExpr(db, p->p
1ad10 57 68 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70  Where, iTable, p
1ad20 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 53  EList);.  substS
1ad30 65 6c 65 63 74 28 64 62 2c 20 70 2d 3e 70 50 72  elect(db, p->pPr
1ad40 69 6f 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ior, iTable, pEL
1ad50 69 73 74 29 3b 0a 20 20 70 53 72 63 20 3d 20 70  ist);.  pSrc = p
1ad60 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
1ad70 28 20 70 53 72 63 20 29 3b 20 20 2f 2a 20 45 76  ( pSrc );  /* Ev
1ad80 65 6e 20 66 6f 72 20 28 53 45 4c 45 43 54 20 31  en for (SELECT 1
1ad90 29 20 77 65 20 68 61 76 65 3a 20 70 53 72 63 21  ) we have: pSrc!
1ada0 3d 30 20 62 75 74 20 70 53 72 63 2d 3e 6e 53 72  =0 but pSrc->nSr
1adb0 63 3d 3d 30 20 2a 2f 0a 20 20 69 66 28 20 41 4c  c==0 */.  if( AL
1adc0 57 41 59 53 28 70 53 72 63 29 20 29 7b 0a 20 20  WAYS(pSrc) ){.  
1add0 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53    for(i=pSrc->nS
1ade0 72 63 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e  rc, pItem=pSrc->
1adf0 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74  a; i>0; i--, pIt
1ae00 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62  em++){.      sub
1ae10 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 49 74  stSelect(db, pIt
1ae20 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61  em->pSelect, iTa
1ae30 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1ae40 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
1ae50 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
1ae60 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1ae70 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
1ae80 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
1ae90 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65   */..#if !define
1aea0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
1aeb0 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
1aec0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1aed0 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73  VIEW)./*.** This
1aee0 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
1aef0 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62  s to flatten sub
1af00 71 75 65 72 69 65 73 20 61 73 20 61 20 70 65 72  queries as a per
1af10 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69 7a  formance optimiz
1af20 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72  ation..** This r
1af30 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31  outine returns 1
1af40 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61   if it makes cha
1af50 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f  nges and 0 if no
1af60 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 63 63 75   flattening occu
1af70 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64  rs..**.** To und
1af80 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63  erstand the conc
1af90 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e  ept of flattenin
1afa0 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20  g, consider the 
1afb0 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65  following.** que
1afc0 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  ry:.**.**     SE
1afd0 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c  LECT a FROM (SEL
1afe0 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f  ECT x+y AS a FRO
1aff0 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30  M t1 WHERE z<100
1b000 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a  ) WHERE a>5.**.*
1b010 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 77 61  * The default wa
1b020 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  y of implementin
1b030 67 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20  g this query is 
1b040 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a  to execute the.*
1b050 2a 20 73 75 62 71 75 65 72 79 20 66 69 72 73 74  * subquery first
1b060 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
1b070 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70  esults in a temp
1b080 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65  orary table, the
1b090 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74  n.** run the out
1b0a0 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74  er query on that
1b0b0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1b0c0 2e 20 20 54 68 69 73 20 72 65 71 75 69 72 65 73  .  This requires
1b0d0 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f   two.** passes o
1b0e0 76 65 72 20 74 68 65 20 64 61 74 61 2e 20 20 46  ver the data.  F
1b0f0 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61  urthermore, beca
1b100 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  use the temporar
1b110 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e  y table.** has n
1b120 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57  o indices, the W
1b130 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74  HERE clause on t
1b140 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63  he outer query c
1b150 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69  annot be.** opti
1b160 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  mized..**.** Thi
1b170 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
1b180 74 73 20 74 6f 20 72 65 77 72 69 74 65 20 71 75  ts to rewrite qu
1b190 65 72 69 65 73 20 73 75 63 68 20 61 73 20 74 68  eries such as th
1b1a0 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20  e above into.** 
1b1b0 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65  a single flat se
1b1c0 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a  lect, like this:
1b1d0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
1b1e0 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20  T x+y AS a FROM 
1b1f0 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41  t1 WHERE z<100 A
1b200 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  ND a>5.**.** The
1b210 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
1b220 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66 69  for this simpifi
1b230 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65  cation gives the
1b240 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20   same result.** 
1b250 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20  but only has to 
1b260 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e  scan the data on
1b270 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65  ce.  And because
1b280 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a   indices might .
1b290 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20  ** exist on the 
1b2a0 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70  table t1, a comp
1b2b0 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65  lete scan of the
1b2c0 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a   data might be.*
1b2d0 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a  * avoided..**.**
1b2e0 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f   Flattening is o
1b2f0 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66  nly attempted if
1b300 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
1b310 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
1b320 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65  **.**   (1)  The
1b330 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68   subquery and th
1b340 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
1b350 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67   not both use ag
1b360 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
1b370 20 20 28 32 29 20 20 54 68 65 20 73 75 62 71 75    (2)  The subqu
1b380 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  ery is not an ag
1b390 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 6f  gregate or the o
1b3a0 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
1b3b0 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
1b3c0 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71 75    (3)  The subqu
1b3d0 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72  ery is not the r
1b3e0 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
1b3f0 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f 69  a left outer joi
1b400 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 4f 72 69  n.**        (Ori
1b410 67 69 6e 61 6c 6c 79 20 74 69 63 6b 65 74 20 23  ginally ticket #
1b420 33 30 36 2e 20 20 53 74 72 65 6e 67 74 68 65 6e  306.  Strengthen
1b430 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 33  ed by ticket #33
1b440 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20  00).**.**   (4) 
1b450 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
1b460 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 2e 0a 2a   not DISTINCT..*
1b470 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f  *.**  (**)  At o
1b480 6e 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69 63  ne point restric
1b490 74 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28 35  tions (4) and (5
1b4a0 29 20 64 65 66 69 6e 65 64 20 61 20 73 75 62 73  ) defined a subs
1b4b0 65 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a  et of DISTINCT.*
1b4c0 2a 20 20 20 20 20 20 20 20 73 75 62 2d 71 75 65  *        sub-que
1b4d0 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20 65  ries that were e
1b4e0 78 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 69  xcluded from thi
1b4f0 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  s optimization. 
1b500 52 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20  Restriction .** 
1b510 20 20 20 20 20 20 20 28 34 29 20 68 61 73 20 73         (4) has s
1b520 69 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e 64  ince been expand
1b530 65 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61 6c  ed to exclude al
1b540 6c 20 44 49 53 54 49 4e 43 54 20 73 75 62 71 75  l DISTINCT subqu
1b550 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  eries..**.**   (
1b560 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  6)  The subquery
1b570 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67   does not use ag
1b580 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20  gregates or the 
1b590 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1b5a0 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53  ot.**        DIS
1b5b0 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  TINCT..**.**   (
1b5c0 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  7)  The subquery
1b5d0 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75   has a FROM clau
1b5e0 73 65 2e 20 20 54 4f 44 4f 3a 20 20 46 6f 72 20  se.  TODO:  For 
1b5f0 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68 6f  subqueries witho
1b600 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 41 20 46  ut.**        A F
1b610 52 4f 4d 20 63 6c 61 75 73 65 2c 20 63 6f 6e 73  ROM clause, cons
1b620 69 64 65 72 20 61 64 64 69 6e 67 20 61 20 46 52  ider adding a FR
1b630 4f 4d 20 63 6c 6f 73 65 20 77 69 74 68 20 74 68  OM close with th
1b640 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20 20  e special.**    
1b650 20 20 20 20 74 61 62 6c 65 20 73 71 6c 69 74 65      table sqlite
1b660 5f 6f 6e 63 65 20 74 68 61 74 20 63 6f 6e 73 69  _once that consi
1b670 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  sts of a single 
1b680 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  row containing a
1b690 0a 2a 2a 20 20 20 20 20 20 20 20 73 69 6e 67 6c  .**        singl
1b6a0 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20  e NULL..**.**   
1b6b0 28 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (8)  The subquer
1b6c0 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
1b6d0 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
1b6e0 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
1b6f0 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
1b700 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  9)  The subquery
1b710 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
1b720 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
1b730 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
1b740 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67  use.**        ag
1b750 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
1b760 20 28 31 30 29 20 20 54 68 65 20 73 75 62 71 75   (10)  The subqu
1b770 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
1b780 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74   aggregates or t
1b790 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
1b7a0 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  oes not.**      
1b7b0 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a    use LIMIT..**.
1b7c0 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75  **  (11)  The su
1b7d0 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
1b7e0 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f  uter query do no
1b7f0 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45  t both have ORDE
1b800 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  R BY clauses..**
1b810 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69  .**  (**)  Not i
1b820 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75 62  mplemented.  Sub
1b830 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74 72  sumed into restr
1b840 69 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61 73  iction (3).  Was
1b850 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20   previously.**  
1b860 20 20 20 20 20 20 61 20 73 65 70 61 72 61 74 65        a separate
1b870 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65 72   restriction der
1b880 69 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65  iving from ticke
1b890 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28  t #350..**.**  (
1b8a0 31 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72  13)  The subquer
1b8b0 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72  y and outer quer
1b8c0 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73  y do not both us
1b8d0 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20  e LIMIT..**.**  
1b8e0 28 31 34 29 20 20 54 68 65 20 73 75 62 71 75 65  (14)  The subque
1b8f0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1b900 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28  OFFSET..**.**  (
1b910 31 35 29 20 20 54 68 65 20 6f 75 74 65 72 20 71  15)  The outer q
1b920 75 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72 74  uery is not part
1b930 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
1b940 65 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20  elect or the.** 
1b950 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20         subquery 
1b960 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20  does not have a 
1b970 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a  LIMIT clause..**
1b980 20 20 20 20 20 20 20 20 28 53 65 65 20 74 69 63          (See tic
1b990 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20 74 69  ket #2339 and ti
1b9a0 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34 34  cket [02a8e81d44
1b9b0 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20  ])..**.**  (16) 
1b9c0 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   The outer query
1b9d0 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
1b9e0 67 61 74 65 20 6f 72 20 74 68 65 20 73 75 62 71  gate or the subq
1b9f0 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20 20  uery does.**    
1ba00 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20      not contain 
1ba10 4f 52 44 45 52 20 42 59 2e 20 20 28 54 69 63 6b  ORDER BY.  (Tick
1ba20 65 74 20 23 32 39 34 32 29 20 20 54 68 69 73 20  et #2942)  This 
1ba30 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74  used to not matt
1ba40 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e 74  er.**        unt
1ba50 69 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65 64  il we introduced
1ba60 20 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61   the group_conca
1ba70 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a  t() function.  .
1ba80 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54 68 65  **.**  (17)  The
1ba90 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f   sub-query is no
1baa0 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  t a compound sel
1bab0 65 63 74 2c 20 6f 72 20 69 74 20 69 73 20 61 20  ect, or it is a 
1bac0 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20  UNION ALL .**   
1bad0 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63 6c       compound cl
1bae0 61 75 73 65 20 6d 61 64 65 20 75 70 20 65 6e 74  ause made up ent
1baf0 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67 67  irely of non-agg
1bb00 72 65 67 61 74 65 20 71 75 65 72 69 65 73 2c 20  regate queries, 
1bb10 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 74  and .**        t
1bb20 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 3a  he parent query:
1bb30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
1bb40 2a 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20  * is not itself 
1bb50 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75  part of a compou
1bb60 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20 20  nd select,.**   
1bb70 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20         * is not 
1bb80 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  an aggregate or 
1bb90 44 49 53 54 49 4e 43 54 20 71 75 65 72 79 2c 20  DISTINCT query, 
1bba0 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
1bbb0 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a  * is not a join.
1bbc0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65  **.**        The
1bbd0 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62 2d   parent and sub-
1bbe0 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61 69  query may contai
1bbf0 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e  n WHERE clauses.
1bc00 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20   Subject to.**  
1bc10 20 20 20 20 20 20 72 75 6c 65 73 20 28 31 31 29        rules (11)
1bc20 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34 29 2c  , (13) and (14),
1bc30 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20 63   they may also c
1bc40 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2c  ontain ORDER BY,
1bc50 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49 54  .**        LIMIT
1bc60 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75   and OFFSET clau
1bc70 73 65 73 2e 20 20 54 68 65 20 73 75 62 71 75 65  ses.  The subque
1bc80 72 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e  ry cannot use an
1bc90 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20  y compound.**   
1bca0 20 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f 74       operator ot
1bcb0 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41  her than UNION A
1bcc0 4c 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20 74  LL because all t
1bcd0 68 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e  he other compoun
1bce0 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72  d.**        oper
1bcf0 61 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69 6d  ators have an im
1bd00 70 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20 77  plied DISTINCT w
1bd10 68 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f 77  hich is disallow
1bd20 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20 20  ed by.**        
1bd30 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29 2e  restriction (4).
1bd40 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c  .**.**        Al
1bd50 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65  so, each compone
1bd60 6e 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75  nt of the sub-qu
1bd70 65 72 79 20 6d 75 73 74 20 72 65 74 75 72 6e 20  ery must return 
1bd80 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a  the same number.
1bd90 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 72 65 73  **        of res
1bda0 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69  ult columns. Thi
1bdb0 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  s is actually a 
1bdc0 72 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72 20  requirement for 
1bdd0 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20  any compound.** 
1bde0 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 73 74         SELECT st
1bdf0 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c  atement, but all
1be00 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20 64   the code here d
1be10 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 75 72 65  oes is make sure
1be20 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20   that no.**     
1be30 20 20 20 73 75 63 68 20 28 69 6c 6c 65 67 61 6c     such (illegal
1be40 29 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 66  ) sub-query is f
1be50 6c 61 74 74 65 6e 65 64 2e 20 54 68 65 20 63 61  lattened. The ca
1be60 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74 65 63 74  ller will detect
1be70 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73   the.**        s
1be80 79 6e 74 61 78 20 65 72 72 6f 72 20 61 6e 64 20  yntax error and 
1be90 72 65 74 75 72 6e 20 61 20 64 65 74 61 69 6c 65  return a detaile
1bea0 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a  d message..**.**
1beb0 20 20 28 31 38 29 20 20 49 66 20 74 68 65 20 73    (18)  If the s
1bec0 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
1bed0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74  mpound select, t
1bee0 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66  hen all terms of
1bef0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f   the.**        O
1bf00 52 44 45 52 20 62 79 20 63 6c 61 75 73 65 20 6f  RDER by clause o
1bf10 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73  f the parent mus
1bf20 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65  t be simple refe
1bf30 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20  rences to .**   
1bf40 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20       columns of 
1bf50 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a  the sub-query..*
1bf60 2a 0a 2a 2a 20 20 28 31 39 29 20 20 54 68 65 20  *.**  (19)  The 
1bf70 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
1bf80 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
1bf90 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
1bfa0 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  oes not.**      
1bfb0 20 20 68 61 76 65 20 61 20 57 48 45 52 45 20 63    have a WHERE c
1bfc0 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32  lause..**.**  (2
1bfd0 30 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71  0)  If the sub-q
1bfe0 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
1bff0 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20  nd select, then 
1c000 69 74 20 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a  it must not use.
1c010 2a 2a 20 20 20 20 20 20 20 20 61 6e 20 4f 52 44  **        an ORD
1c020 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54  ER BY clause.  T
1c030 69 63 6b 65 74 20 23 33 37 37 33 2e 20 20 57 65  icket #3773.  We
1c040 20 63 6f 75 6c 64 20 72 65 6c 61 78 20 74 68 69   could relax thi
1c050 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  s constraint.** 
1c060 20 20 20 20 20 20 20 73 6f 6d 65 77 68 61 74 20         somewhat 
1c070 62 79 20 73 61 79 69 6e 67 20 74 68 61 74 20 74  by saying that t
1c080 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  he terms of the 
1c090 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1c0a0 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 61  must.**        a
1c0b0 70 70 65 61 72 20 61 73 20 75 6e 6d 6f 64 69 66  ppear as unmodif
1c0c0 69 65 64 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  ied result colum
1c0d0 6e 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  ns in the outer 
1c0e0 71 75 65 72 79 2e 20 20 42 75 74 20 77 65 0a 2a  query.  But we.*
1c0f0 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 6f 74  *        have ot
1c100 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  her optimization
1c110 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61  s in mind to dea
1c120 6c 20 77 69 74 68 20 74 68 61 74 20 63 61 73 65  l with that case
1c130 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20 54  ..**.**  (21)  T
1c140 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1c150 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
1c160 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
1c170 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  y is not.**     
1c180 20 20 20 44 49 53 54 49 4e 43 54 2e 20 20 28 53     DISTINCT.  (S
1c190 65 65 20 74 69 63 6b 65 74 20 5b 37 35 32 65 31  ee ticket [752e1
1c1a0 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20  646fc])..**.**  
1c1b0 28 32 32 29 20 20 54 68 65 20 73 75 62 71 75 65  (22)  The subque
1c1c0 72 79 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75  ry is not a recu
1c1d0 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a  rsive CTE..**.**
1c1e0 20 20 28 32 33 29 20 20 54 68 65 20 70 61 72 65    (23)  The pare
1c1f0 6e 74 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75  nt is not a recu
1c200 72 73 69 76 65 20 43 54 45 2c 20 6f 72 20 74 68  rsive CTE, or th
1c210 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e  e sub-query is n
1c220 6f 74 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 63  ot a.**        c
1c230 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 54  ompound query. T
1c240 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20  his restriction 
1c250 69 73 20 62 65 63 61 75 73 65 20 74 72 61 6e 73  is because trans
1c260 66 6f 72 6d 69 6e 67 20 74 68 65 0a 2a 2a 20 20  forming the.**  
1c270 20 20 20 20 20 20 70 61 72 65 6e 74 20 74 6f 20        parent to 
1c280 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
1c290 20 63 6f 6e 66 75 73 65 73 20 74 68 65 20 63 6f   confuses the co
1c2a0 64 65 20 74 68 61 74 20 68 61 6e 64 6c 65 73 0a  de that handles.
1c2b0 2a 2a 20 20 20 20 20 20 20 20 72 65 63 75 72 73  **        recurs
1c2c0 69 76 65 20 71 75 65 72 69 65 73 20 69 6e 20 6d  ive queries in m
1c2d0 75 6c 74 69 53 65 6c 65 63 74 28 29 2e 0a 2a 2a  ultiSelect()..**
1c2e0 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72  .**.** In this r
1c2f0 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20  outine, the "p" 
1c300 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
1c310 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75  ointer to the ou
1c320 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68  ter query..** Th
1c330 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70 2d  e subquery is p-
1c340 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e  >pSrc->a[iFrom].
1c350 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65 20    isAgg is true 
1c360 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  if the outer que
1c370 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65  ry.** uses aggre
1c380 67 61 74 65 73 20 61 6e 64 20 73 75 62 71 75 65  gates and subque
1c390 72 79 49 73 41 67 67 20 69 73 20 74 72 75 65 20  ryIsAgg is true 
1c3a0 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
1c3b0 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73 2e  uses aggregates.
1c3c0 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65  .**.** If flatte
1c3d0 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65  ning is not atte
1c3e0 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74  mpted, this rout
1c3f0 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61  ine is a no-op a
1c400 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a  nd returns 0..**
1c410 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
1c420 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69 73  s attempted this
1c430 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1c440 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66   1..**.** All of
1c450 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1c460 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63  analysis must oc
1c470 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20  cur on both the 
1c480 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a  outer query and.
1c490 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79 20  ** the subquery 
1c4a0 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
1c4b0 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61  ine runs..*/.sta
1c4c0 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53  tic int flattenS
1c4d0 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73 65  ubquery(.  Parse
1c4e0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1c4f0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
1c500 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
1c510 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p,           /* 
1c520 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75  The parent or ou
1c530 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  ter SELECT state
1c540 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46  ment */.  int iF
1c550 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rom,           /
1c560 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53  * Index in p->pS
1c570 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69  rc->a[] of the i
1c580 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f  nner subquery */
1c590 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20  .  int isAgg,   
1c5a0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1c5b0 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  if outer SELECT 
1c5c0 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
1c5d0 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  unctions */.  in
1c5e0 74 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  t subqueryIsAgg 
1c5f0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1c600 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
1c610 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
1c620 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ons */.){.  cons
1c630 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75  t char *zSavedAu
1c640 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72  thContext = pPar
1c650 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
1c660 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72  ;.  Select *pPar
1c670 65 6e 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ent;.  Select *p
1c680 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Sub;       /* Th
1c690 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72  e inner query or
1c6a0 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20   "subquery" */. 
1c6b0 20 53 65 6c 65 63 74 20 2a 70 53 75 62 31 3b 20   Select *pSub1; 
1c6c0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1c6d0 74 6f 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74  to the rightmost
1c6e0 20 73 65 6c 65 63 74 20 69 6e 20 73 75 62 2d 71   select in sub-q
1c6f0 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73  uery */.  SrcLis
1c700 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a  t *pSrc;      /*
1c710 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
1c720 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
1c730 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ery */.  SrcList
1c740 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20   *pSubSrc;   /* 
1c750 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
1c760 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
1c770 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1c780 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  List;    /* The 
1c790 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
1c7a0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
1c7b0 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20  .  int iParent; 
1c7c0 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63         /* VDBE c
1c7d0 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
1c7e0 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74 20  the pSub result 
1c7f0 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a  set temp table *
1c800 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
1c810 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1c820 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70  counter */.  Exp
1c830 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
1c840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c850 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
1c860 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
1c870 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62  cList_item *pSub
1c880 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73  item;   /* The s
1c890 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c  ubquery */.  sql
1c8a0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1c8b0 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65  e->db;..  /* Che
1c8c0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61  ck to see if fla
1c8d0 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
1c8e0 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20  tted.  Return 0 
1c8f0 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61  if not..  */.  a
1c900 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
1c910 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69   assert( p->pPri
1c920 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a 20 55 6e 61  or==0 );  /* Una
1c930 62 6c 65 20 74 6f 20 66 6c 61 74 74 65 6e 20 63  ble to flatten c
1c940 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69 65 73 20  ompound queries 
1c950 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a  */.  if( Optimiz
1c960 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62  ationDisabled(db
1c970 2c 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c  , SQLITE_QueryFl
1c980 61 74 74 65 6e 65 72 29 20 29 20 72 65 74 75 72  attener) ) retur
1c990 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d  n 0;.  pSrc = p-
1c9a0 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
1c9b0 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d   pSrc && iFrom>=
1c9c0 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d  0 && iFrom<pSrc-
1c9d0 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69  >nSrc );.  pSubi
1c9e0 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69  tem = &pSrc->a[i
1c9f0 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74  From];.  iParent
1ca00 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75   = pSubitem->iCu
1ca10 72 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70  rsor;.  pSub = p
1ca20 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
1ca30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
1ca40 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 41  !=0 );.  if( isA
1ca50 67 67 20 26 26 20 73 75 62 71 75 65 72 79 49 73  gg && subqueryIs
1ca60 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20  Agg ) return 0; 
1ca70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca80 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1ca90 31 29 20 20 2a 2f 0a 20 20 69 66 28 20 73 75 62  1)  */.  if( sub
1caa0 71 75 65 72 79 49 73 41 67 67 20 26 26 20 70 53  queryIsAgg && pS
1cab0 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74  rc->nSrc>1 ) ret
1cac0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1cad0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1cae0 32 29 20 20 2a 2f 0a 20 20 70 53 75 62 53 72 63  2)  */.  pSubSrc
1caf0 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20   = pSub->pSrc;. 
1cb00 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72 63   assert( pSubSrc
1cb10 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74   );.  /* Prior t
1cb20 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c  o version 3.1.2,
1cb30 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20   when LIMIT and 
1cb40 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20 62 65  OFFSET had to be
1cb50 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74   simple constant
1cb60 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69  s,.  ** not arbi
1cb70 74 72 61 72 79 20 65 78 70 72 65 73 73 73 69 6f  trary expresssio
1cb80 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73  ns, we allowed s
1cb90 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66  ome combining of
1cba0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
1cbb0 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74  T.  ** because t
1cbc0 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d  hey could be com
1cbd0 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  puted at compile
1cbe0 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e  -time.  But when
1cbf0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
1cc00 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72  T.  ** became ar
1cc10 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69  bitrary expressi
1cc20 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72  ons, we were for
1cc30 63 65 64 20 74 6f 20 61 64 64 20 72 65 73 74 72  ced to add restr
1cc40 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a  ictions (13).  *
1cc50 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20  * and (14). */. 
1cc60 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
1cc70 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29  t && p->pLimit )
1cc80 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1cc90 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1cca0 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20  iction (13) */. 
1ccb0 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66 66 73   if( pSub->pOffs
1ccc0 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  et ) return 0;  
1ccd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cce0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1ccf0 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20  iction (14) */. 
1cd00 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
1cd10 73 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e 64 29  s & SF_Compound)
1cd20 21 3d 30 20 26 26 20 70 53 75 62 2d 3e 70 4c 69  !=0 && pSub->pLi
1cd30 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  mit ){.    retur
1cd40 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1cd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd70 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1cd80 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  15) */.  }.  if(
1cd90 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d   pSubSrc->nSrc==
1cda0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  0 ) return 0;   
1cdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdc0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1cdd0 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28  on (7)  */.  if(
1cde0 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
1cdf0 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 20  & SF_Distinct ) 
1ce00 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1ce10 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1ce20 6f 6e 20 28 35 29 20 20 2a 2f 0a 20 20 69 66 28  on (5)  */.  if(
1ce30 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1ce40 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c   (pSrc->nSrc>1 |
1ce50 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20  | isAgg) ){.    
1ce60 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1ce70 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1ce80 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d  ns (8)(9) */.  }
1ce90 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
1cea0 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
1ceb0 74 29 21 3d 30 20 26 26 20 73 75 62 71 75 65 72  t)!=0 && subquer
1cec0 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20 72  yIsAgg ){.     r
1ced0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1cee0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1cef0 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (6)  */.  }.  if
1cf00 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26  ( p->pOrderBy &&
1cf10 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1cf20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
1cf30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1cf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1cf60 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20  estriction (11) 
1cf70 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41  */.  }.  if( isA
1cf80 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  gg && pSub->pOrd
1cf90 65 72 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b  erBy ) return 0;
1cfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfb0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1cfc0 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  16) */.  if( pSu
1cfd0 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e  b->pLimit && p->
1cfe0 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20  pWhere ) return 
1cff0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1d000 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1d010 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  19) */.  if( pSu
1d020 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d  b->pLimit && (p-
1d030 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
1d040 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20  istinct)!=0 ){. 
1d050 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1d060 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1d070 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d  tion (21) */.  }
1d080 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c  .  if( pSub->sel
1d090 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
1d0a0 73 69 76 65 20 29 20 72 65 74 75 72 6e 20 30 3b  sive ) return 0;
1d0b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1d0c0 74 72 69 63 74 69 6f 6e 20 28 32 32 29 20 20 2a  triction (22)  *
1d0d0 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  /.  if( (p->selF
1d0e0 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73  lags & SF_Recurs
1d0f0 69 76 65 29 20 26 26 20 70 53 75 62 2d 3e 70 50  ive) && pSub->pP
1d100 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b  rior ) return 0;
1d110 20 20 20 20 20 20 20 2f 2a 20 28 32 33 29 20 20         /* (23)  
1d120 2a 2f 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45 54  */..  /* OBSOLET
1d130 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20 2a  E COMMENT 1:.  *
1d140 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a  * Restriction 3:
1d150 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
1d160 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b  y is a join, mak
1d170 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75  e sure the subqu
1d180 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74  ery is .  ** not
1d190 20 75 73 65 64 20 61 73 20 74 68 65 20 72 69 67   used as the rig
1d1a0 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e  ht operand of an
1d1b0 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78   outer join.  Ex
1d1c0 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68  amples of why th
1d1d0 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61  is.  ** is not a
1d1e0 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
1d1f0 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
1d200 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32  T OUTER JOIN (t2
1d210 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20   JOIN t3).  **. 
1d220 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
1d230 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
1d240 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
1d250 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
1d260 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
1d270 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a  t2) JOIN t3.  **
1d280 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e  .  ** which is n
1d290 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61  ot at all the sa
1d2a0 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20  me thing..  **. 
1d2b0 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d   ** OBSOLETE COM
1d2c0 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20 52 65 73  MENT 2:.  ** Res
1d2d0 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49 66  triction 12:  If
1d2e0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
1d2f0 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
1d300 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74  nd of a left out
1d310 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61  er.  ** join, ma
1d320 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71  ke sure the subq
1d330 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52  uery has no WHER
1d340 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41  E clause..  ** A
1d350 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77 68  n examples of wh
1d360 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6c  y this is not al
1d370 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  lowed:.  **.  **
1d380 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54           t1 LEFT
1d390 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c   OUTER JOIN (SEL
1d3a0 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48  ECT * FROM t2 WH
1d3b0 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a  ERE t2.x>0).  **
1d3c0 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
1d3d0 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
1d3e0 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
1d3f0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
1d400 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
1d410 4e 20 74 32 29 20 57 48 45 52 45 20 74 32 2e 78  N t2) WHERE t2.x
1d420 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74  >0.  **.  ** But
1d430 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73 74   the t2.x>0 test
1d440 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69   will always fai
1d450 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20  l on a NULL row 
1d460 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20 2a  of t2, which.  *
1d470 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20 63 6f  * effectively co
1d480 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54 45 52  nverts the OUTER
1d490 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e   JOIN into an IN
1d4a0 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a 20  NER JOIN..  **. 
1d4b0 20 2a 2a 20 54 48 49 53 20 4f 56 45 52 52 49 44   ** THIS OVERRID
1d4c0 45 53 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d  ES OBSOLETE COMM
1d4d0 45 4e 54 53 20 31 20 41 4e 44 20 32 20 41 42 4f  ENTS 1 AND 2 ABO
1d4e0 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20  VE:.  ** Ticket 
1d4f0 23 33 33 30 30 20 73 68 6f 77 73 20 74 68 61 74  #3300 shows that
1d500 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20   flattening the 
1d510 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20  right term of a 
1d520 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20 69  LEFT JOIN.  ** i
1d530 73 20 66 72 61 75 67 68 74 20 77 69 74 68 20 64  s fraught with d
1d540 61 6e 67 65 72 2e 20 20 42 65 73 74 20 74 6f 20  anger.  Best to 
1d550 61 76 6f 69 64 20 74 68 65 20 77 68 6f 6c 65 20  avoid the whole 
1d560 74 68 69 6e 67 2e 20 20 49 66 20 74 68 65 0a 20  thing.  If the. 
1d570 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73 20   ** subquery is 
1d580 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f  the right term o
1d590 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74  f a LEFT JOIN, t
1d5a0 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74  hen do not flatt
1d5b0 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  en..  */.  if( (
1d5c0 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pSubitem->jointy
1d5d0 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
1d5e0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1d5f0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  0;.  }..  /* Res
1d600 74 72 69 63 74 69 6f 6e 20 31 37 3a 20 49 66 20  triction 17: If 
1d610 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
1d620 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
1d630 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74  CT, then it must
1d640 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74  .  ** use only t
1d650 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
1d660 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20  rator. And none 
1d670 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20 73 65  of the simple se
1d680 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20 20 2a  lect queries.  *
1d690 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  * that make up t
1d6a0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  he compound SELE
1d6b0 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74  CT are allowed t
1d6c0 6f 20 62 65 20 61 67 67 72 65 67 61 74 65 20 6f  o be aggregate o
1d6d0 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20  r distinct.  ** 
1d6e0 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20  queries..  */.  
1d6f0 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72  if( pSub->pPrior
1d700 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62   ){.    if( pSub
1d710 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
1d720 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f      return 0;  /
1d730 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 32 30  * Restriction 20
1d740 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   */.    }.    if
1d750 28 20 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73  ( isAgg || (p->s
1d760 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
1d770 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72  tinct)!=0 || pSr
1d780 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20  c->nSrc!=1 ){.  
1d790 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1d7a0 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62    }.    for(pSub
1d7b0 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70  1=pSub; pSub1; p
1d7c0 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69  Sub1=pSub1->pPri
1d7d0 6f 72 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  or){.      testc
1d7e0 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c  ase( (pSub1->sel
1d7f0 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
1d800 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
1d810 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74  e))==SF_Distinct
1d820 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1d830 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46  se( (pSub1->selF
1d840 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
1d850 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
1d860 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65  ))==SF_Aggregate
1d870 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1d880 28 20 70 53 75 62 2d 3e 70 53 72 63 21 3d 30 20  ( pSub->pSrc!=0 
1d890 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53  );.      if( (pS
1d8a0 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
1d8b0 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
1d8c0 41 67 67 72 65 67 61 74 65 29 29 21 3d 30 0a 20  Aggregate))!=0. 
1d8d0 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d        || (pSub1-
1d8e0 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62 31  >pPrior && pSub1
1d8f0 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20  ->op!=TK_ALL) . 
1d900 20 20 20 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e        || pSub1->
1d910 70 53 72 63 2d 3e 6e 53 72 63 3c 31 0a 20 20 20  pSrc->nSrc<1.   
1d920 20 20 20 20 7c 7c 20 70 53 75 62 2d 3e 70 45 4c      || pSub->pEL
1d930 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 53 75 62  ist->nExpr!=pSub
1d940 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  1->pEList->nExpr
1d950 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
1d960 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1d970 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61    }.      testca
1d980 73 65 28 20 70 53 75 62 31 2d 3e 70 53 72 63 2d  se( pSub1->pSrc-
1d990 3e 6e 53 72 63 3e 31 20 29 3b 0a 20 20 20 20 7d  >nSrc>1 );.    }
1d9a0 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63  ..    /* Restric
1d9b0 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20 20 20  tion 18. */.    
1d9c0 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
1d9d0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b  ){.      int ii;
1d9e0 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  .      for(ii=0;
1d9f0 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d   ii<p->pOrderBy-
1da00 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20  >nExpr; ii++){. 
1da10 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f         if( p->pO
1da20 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e  rderBy->a[ii].u.
1da30 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30  x.iOrderByCol==0
1da40 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
1da50 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1da60 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72    /***** If we r
1da70 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
1da80 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70   flattening is p
1da90 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f  ermitted. *****/
1daa0 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65  ..  /* Authorize
1dab0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   the subquery */
1dac0 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68  .  pParse->zAuth
1dad0 43 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69 74  Context = pSubit
1dae0 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45 53  em->zName;.  TES
1daf0 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69 74  TONLY(i =) sqlit
1db00 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1db10 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
1db20 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 74  T, 0, 0, 0);.  t
1db30 65 73 74 63 61 73 65 28 20 69 3d 3d 53 51 4c 49  estcase( i==SQLI
1db40 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50 61  TE_DENY );.  pPa
1db50 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
1db60 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f  t = zSavedAuthCo
1db70 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20  ntext;..  /* If 
1db80 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
1db90 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
1dba0 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  CT statement, th
1dbb0 65 6e 20 28 62 79 20 72 65 73 74 72 69 63 74 69  en (by restricti
1dbc0 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20  ons.  ** 17 and 
1dbd0 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73  18 above) it mus
1dbe0 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c  t be a UNION ALL
1dbf0 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20   and the parent 
1dc00 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a  query must .  **
1dc10 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   be of the form:
1dc20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
1dc30 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74  ELECT <expr-list
1dc40 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65  > FROM (<sub-que
1dc50 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75  ry>) <where-clau
1dc60 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66  se> .  **.  ** f
1dc70 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f  ollowed by any O
1dc80 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61  RDER BY, LIMIT a
1dc90 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61  nd/or OFFSET cla
1dca0 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b  uses. This block
1dcb0 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d  .  ** creates N-
1dcc0 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  1 copies of the 
1dcd0 70 61 72 65 6e 74 20 71 75 65 72 79 20 77 69 74  parent query wit
1dce0 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42  hout any ORDER B
1dcf0 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a  Y, LIMIT or .  *
1dd00 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  * OFFSET clauses
1dd10 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20   and joins them 
1dd20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64  to the left-hand
1dd30 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69  -side of the ori
1dd40 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67  ginal.  ** using
1dd50 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
1dd60 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61  tors. In this ca
1dd70 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  se N is the numb
1dd80 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a  er of simple.  *
1dd90 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  * select stateme
1dda0 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f  nts in the compo
1ddb0 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20  und sub-query.. 
1ddc0 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65   **.  ** Example
1ddd0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
1dde0 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20  SELECT a+1 FROM 
1ddf0 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  (.  **        SE
1de00 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a  LECT x FROM tab.
1de10 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f    **        UNIO
1de20 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20  N ALL.  **      
1de30 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20    SELECT y FROM 
1de40 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  tab.  **        
1de50 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
1de60 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73        SELECT abs
1de70 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a  (z*2) FROM tab2.
1de80 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45    **     ) WHERE
1de90 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31   a!=5 ORDER BY 1
1dea0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73  .  **.  ** Trans
1deb0 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a  formed into:.  *
1dec0 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
1ded0 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57  T x+1 FROM tab W
1dee0 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a  HERE x+1!=5.  **
1def0 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
1df00 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79   **     SELECT y
1df10 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52  +1 FROM tab WHER
1df20 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20  E y+1!=5.  **   
1df30 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
1df40 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28       SELECT abs(
1df50 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32  z*2)+1 FROM tab2
1df60 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b   WHERE abs(z*2)+
1df70 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52  1!=5.  **     OR
1df80 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20  DER BY 1.  **.  
1df90 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20  ** We call this 
1dfa0 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75  the "compound-su
1dfb0 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
1dfc0 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  g"..  */.  for(p
1dfd0 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
1dfe0 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75  ; pSub; pSub=pSu
1dff0 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  b->pPrior){.    
1e000 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
1e010 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
1e020 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
1e030 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c  By;.    Expr *pL
1e040 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
1e050 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 66 66  ;.    Expr *pOff
1e060 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
1e070 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50  ;.    Select *pP
1e080 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
1e090 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
1e0a0 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53  y = 0;.    p->pS
1e0b0 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  rc = 0;.    p->p
1e0c0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  Prior = 0;.    p
1e0d0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
1e0e0 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
1e0f0 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
1e100 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
1e110 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e  , p, 0);.    p->
1e120 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
1e130 74 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  t;.    p->pLimit
1e140 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70   = pLimit;.    p
1e150 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
1e160 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53  derBy;.    p->pS
1e170 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70  rc = pSrc;.    p
1e180 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20  ->op = TK_ALL;. 
1e190 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
1e1a0 7b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  {.      p->pPrio
1e1b0 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
1e1c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65  }else{.      pNe
1e1d0 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  w->pPrior = pPri
1e1e0 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  or;.      if( pP
1e1f0 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70  rior ) pPrior->p
1e200 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Next = pNew;.   
1e210 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d     pNew->pNext =
1e220 20 70 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72   p;.      p->pPr
1e230 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ior = pNew;.    
1e240 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  }.    if( db->ma
1e250 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
1e260 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 1;.  }..  /*
1e270 20 42 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e   Begin flattenin
1e280 67 20 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65  g the iFrom-th e
1e290 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
1e2a0 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e   clause .  ** in
1e2b0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1e2c0 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20  ..  */.  pSub = 
1e2d0 70 53 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d  pSub1 = pSubitem
1e2e0 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a  ->pSelect;..  /*
1e2f0 20 44 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e   Delete the tran
1e300 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  sient table stru
1e310 63 74 75 72 65 20 61 73 73 6f 63 69 61 74 65 64  cture associated
1e320 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73   with the.  ** s
1e330 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73  ubquery.  */.  s
1e340 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1e350 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61   pSubitem->zData
1e360 62 61 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  base);.  sqlite3
1e370 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
1e380 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73  tem->zName);.  s
1e390 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1e3a0 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61   pSubitem->zAlia
1e3b0 73 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e  s);.  pSubitem->
1e3c0 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  zDatabase = 0;. 
1e3d0 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
1e3e0 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
1e3f0 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  ->zAlias = 0;.  
1e400 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
1e410 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66  t = 0;..  /* Def
1e420 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  er deleting the 
1e430 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73  Table object ass
1e440 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1e450 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75  .  ** subquery u
1e460 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61  ntil code genera
1e470 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  tion is.  ** com
1e480 70 6c 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65  plete, since the
1e490 72 65 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69  re may still exi
1e4a0 73 74 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74  st Expr.pTab ent
1e4b0 72 69 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72  ries that.  ** r
1e4c0 65 66 65 72 20 74 6f 20 74 68 65 20 73 75 62 71  efer to the subq
1e4d0 75 65 72 79 20 65 76 65 6e 20 61 66 74 65 72 20  uery even after 
1e4e0 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63  flattening.  Tic
1e4f0 6b 65 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a  ket #3346..  **.
1e500 20 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70    ** pSubitem->p
1e510 54 61 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f  Tab is always no
1e520 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72  n-NULL by test r
1e530 65 73 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20  estrictions and 
1e540 74 65 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a  tests above..  *
1e550 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  /.  if( ALWAYS(p
1e560 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30  Subitem->pTab!=0
1e570 29 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ) ){.    Table *
1e580 70 54 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62  pTabToDel = pSub
1e590 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  item->pTab;.    
1e5a0 69 66 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e  if( pTabToDel->n
1e5b0 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Ref==1 ){.      
1e5c0 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
1e5d0 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
1e5e0 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
1e5f0 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c  .      pTabToDel
1e600 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20  ->pNextZombie = 
1e610 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62  pToplevel->pZomb
1e620 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70 54 6f  ieTab;.      pTo
1e630 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54  plevel->pZombieT
1e640 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a  ab = pTabToDel;.
1e650 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e660 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66   pTabToDel->nRef
1e670 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  --;.    }.    pS
1e680 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30  ubitem->pTab = 0
1e690 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
1e6a0 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72  following loop r
1e6b0 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
1e6c0 68 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70  h term in a comp
1e6d0 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20  ound-subquery.  
1e6e0 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61  ** flattening (a
1e6f0 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
1e700 65 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 64  e).  If we are d
1e710 6f 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74  oing a different
1e720 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c   kind.  ** of fl
1e730 61 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61  attening - a fla
1e740 74 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68  ttening other th
1e750 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75  an a compound-su
1e760 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
1e770 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  g -.  ** then th
1e780 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e  is loop only run
1e790 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s once..  **.  *
1e7a0 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65  * This loop move
1e7b0 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f  s all of the FRO
1e7c0 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  M elements of th
1e7d0 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
1e7e0 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f  the.  ** the FRO
1e7f0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1e800 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
1e810 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c  fore doing this,
1e820 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74   remember.  ** t
1e830 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
1e840 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61   for the origina
1e850 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52  l outer query FR
1e860 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20  OM element in.  
1e870 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65  ** iParent.  The
1e880 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20   iParent cursor 
1e890 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
1e8a0 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20  ed.  Subsequent 
1e8b0 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73  code.  ** will s
1e8c0 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20  can expressions 
1e8d0 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72  looking for iPar
1e8e0 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  ent references a
1e8f0 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20  nd replace.  ** 
1e900 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73  those references
1e910 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e   with expression
1e920 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74  s that resolve t
1e930 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46  o the subquery F
1e940 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74  ROM.  ** element
1e950 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70  s we are now cop
1e960 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ying in..  */.  
1e970 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70  for(pParent=p; p
1e980 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d  Parent; pParent=
1e990 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c  pParent->pPrior,
1e9a0 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69   pSub=pSub->pPri
1e9b0 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75  or){.    int nSu
1e9c0 62 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69  bSrc;.    u8 joi
1e9d0 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70  ntype = 0;.    p
1e9e0 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
1e9f0 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  Src;     /* FROM
1ea00 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75   clause of subqu
1ea10 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53  ery */.    nSubS
1ea20 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53  rc = pSubSrc->nS
1ea30 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  rc;  /* Number o
1ea40 66 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75  f terms in subqu
1ea50 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  ery FROM clause 
1ea60 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50  */.    pSrc = pP
1ea70 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20  arent->pSrc;    
1ea80 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
1ea90 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
1eaa0 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70  ry */..    if( p
1eab0 53 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Src ){.      ass
1eac0 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20  ert( pParent==p 
1ead0 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d  );  /* First tim
1eae0 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f  e through the lo
1eaf0 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e  op */.      join
1eb00 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d  type = pSubitem-
1eb10 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d  >jointype;.    }
1eb20 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1eb30 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29  rt( pParent!=p )
1eb40 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75  ;  /* 2nd and su
1eb50 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74  bsequent times t
1eb60 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
1eb70 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  */.      pSrc = 
1eb80 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20  pParent->pSrc = 
1eb90 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1eba0 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30  pend(db, 0, 0, 0
1ebb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72  );.      if( pSr
1ebc0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
1ebd0 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
1ebe0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
1ebf0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1ec00 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1ec10 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75 73   The subquery us
1ec20 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74  es a single slot
1ec30 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1ec40 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
1ec50 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20  .    ** query.  
1ec60 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1ec70 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
1ec80 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73  e element in its
1ec90 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20   FROM clause,.  
1eca0 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64    ** then expand
1ecb0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1ecc0 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66   to make space f
1ecd0 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c  or it to hold al
1ece0 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a  l elements.    *
1ecf0 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
1ed00 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
1ed10 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
1ed20 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43  .    **    SELEC
1ed30 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28  T * FROM tabA, (
1ed40 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75  SELECT * FROM su
1ed50 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b  b1, sub2), tabB;
1ed60 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1ed70 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68  he outer query h
1ed80 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74  as 3 slots in it
1ed90 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
1eda0 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a  One slot of the.
1edb0 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
1edc0 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73  ry (the middle s
1edd0 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79 20  lot) is used by 
1ede0 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54  the subquery.  T
1edf0 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62  he next.    ** b
1ee00 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c  lock of code wil
1ee10 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74  l expand the out
1ee20 20 71 75 65 72 79 20 74 6f 20 34 20 73 6c 6f 74   query to 4 slot
1ee30 73 2e 20 20 54 68 65 20 6d 69 64 64 6c 65 0a 20  s.  The middle. 
1ee40 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78     ** slot is ex
1ee50 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c  panded to two sl
1ee60 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ots in order to 
1ee70 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 74  make space for t
1ee80 68 65 0a 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c  he.    ** two el
1ee90 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52  ements in the FR
1eea0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1eeb0 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a   subquery..    *
1eec0 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72  /.    if( nSubSr
1eed0 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61  c>1 ){.      pPa
1eee0 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72  rent->pSrc = pSr
1eef0 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
1ef00 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53  stEnlarge(db, pS
1ef10 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46  rc, nSubSrc-1,iF
1ef20 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66  rom+1);.      if
1ef30 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1ef40 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  ed ){.        br
1ef50 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1ef60 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73   }..    /* Trans
1ef70 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  fer the FROM cla
1ef80 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74  use terms from t
1ef90 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
1efa0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
1efb0 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  r query..    */.
1efc0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1efd0 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
1efe0 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
1eff0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63  tDelete(db, pSrc
1f000 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73  ->a[i+iFrom].pUs
1f010 69 6e 67 29 3b 0a 20 20 20 20 20 20 70 53 72 63  ing);.      pSrc
1f020 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
1f030 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
1f040 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
1f050 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
1f060 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
1f070 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
1f080 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a  pSrc->a[iFrom].j
1f090 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79  ointype = jointy
1f0a0 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f  pe;.  .    /* No
1f0b0 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75  w begin substitu
1f0c0 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65  ting subquery re
1f0d0 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
1f0e0 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a  ions for .    **
1f0f0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1f100 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68  he iParent in th
1f110 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
1f120 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78     ** .    ** Ex
1f130 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
1f140 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b    **   SELECT a+
1f150 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45  5, b*10 FROM (SE
1f160 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79  LECT x*3 AS a, y
1f170 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31  +10 AS b FROM t1
1f180 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20  ) WHERE a>b;.   
1f190 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20   **   \         
1f1a0 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
1f1b0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75  __________ subqu
1f1c0 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ery __________/ 
1f1d0 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a           /.    *
1f1e0 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  *    \__________
1f1f0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65  ___________ oute
1f200 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  r query ________
1f210 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1f220 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20  ______/.    **. 
1f230 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74     ** We look at
1f240 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
1f250 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  n in the outer q
1f260 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70  uery and every p
1f270 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20  lace we see.    
1f280 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69  ** "a" we substi
1f290 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65  tute "x*3" and e
1f2a0 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
1f2b0 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74  e "b" we substit
1f2c0 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20  ute "y+10"..    
1f2d0 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  */.    pList = p
1f2e0 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a  Parent->pEList;.
1f2f0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
1f300 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1f310 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  ){.      if( pLi
1f320 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d  st->a[i].zName==
1f330 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  0 ){.        cha
1f340 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  r *zName = sqlit
1f350 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
1f360 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
1f370 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1f380 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  e3Dequote(zName)
1f390 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  ;.        pList-
1f3a0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e  >a[i].zName = zN
1f3b0 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
1f3c0 20 7d 0a 20 20 20 20 73 75 62 73 74 45 78 70 72   }.    substExpr
1f3d0 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74  List(db, pParent
1f3e0 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e  ->pEList, iParen
1f3f0 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1f400 3b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  ;.    if( isAgg 
1f410 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78  ){.      substEx
1f420 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65  prList(db, pPare
1f430 6e 74 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50  nt->pGroupBy, iP
1f440 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
1f450 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ist);.      pPar
1f460 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  ent->pHaving = s
1f470 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61  ubstExpr(db, pPa
1f480 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69  rent->pHaving, i
1f490 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
1f4a0 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
1f4b0 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
1f4c0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73  rBy ){.      ass
1f4d0 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f  ert( pParent->pO
1f4e0 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
1f4f0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64     pParent->pOrd
1f500 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72  erBy = pSub->pOr
1f510 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75  derBy;.      pSu
1f520 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  b->pOrderBy = 0;
1f530 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
1f540 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
1f550 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45   ){.      substE
1f560 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72  xprList(db, pPar
1f570 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69  ent->pOrderBy, i
1f580 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
1f590 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
1f5a0 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72   if( pSub->pWher
1f5b0 65 20 29 7b 0a 20 20 20 20 20 20 70 57 68 65 72  e ){.      pWher
1f5c0 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  e = sqlite3ExprD
1f5d0 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68  up(db, pSub->pWh
1f5e0 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  ere, 0);.    }el
1f5f0 73 65 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65  se{.      pWhere
1f600 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
1f610 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67  if( subqueryIsAg
1f620 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  g ){.      asser
1f630 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76  t( pParent->pHav
1f640 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ing==0 );.      
1f650 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
1f660 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65   = pParent->pWhe
1f670 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  re;.      pParen
1f680 74 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65  t->pWhere = pWhe
1f690 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  re;.      pParen
1f6a0 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62  t->pHaving = sub
1f6b0 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65  stExpr(db, pPare
1f6c0 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61  nt->pHaving, iPa
1f6d0 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
1f6e0 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  st);.      pPare
1f6f0 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71  nt->pHaving = sq
1f700 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
1f710 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
1f720 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  g, .            
1f730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f740 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1f750 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  rDup(db, pSub->p
1f760 48 61 76 69 6e 67 2c 20 30 29 29 3b 0a 20 20 20  Having, 0));.   
1f770 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
1f780 6e 74 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20  nt->pGroupBy==0 
1f790 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
1f7a0 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
1f7b0 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
1f7c0 64 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75 70  db, pSub->pGroup
1f7d0 42 79 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  By, 0);.    }els
1f7e0 65 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  e{.      pParent
1f7f0 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73 74  ->pWhere = subst
1f800 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74  Expr(db, pParent
1f810 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e  ->pWhere, iParen
1f820 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1f830 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
1f840 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
1f850 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61  3ExprAnd(db, pPa
1f860 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 70 57  rent->pWhere, pW
1f870 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  here);.    }.  .
1f880 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74      /* The flatt
1f890 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64 69  ened query is di
1f8a0 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65 72  stinct if either
1f8b0 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68   the inner or th
1f8c0 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
1f8d0 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
1f8e0 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  . .    */.    pP
1f8f0 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20  arent->selFlags 
1f900 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  |= pSub->selFlag
1f910 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 3b  s & SF_Distinct;
1f920 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  .  .    /*.    *
1f930 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  * SELECT ... FRO
1f940 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49  M (SELECT ... LI
1f950 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29 20  MIT a OFFSET b) 
1f960 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79  LIMIT x OFFSET y
1f970 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1f980 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20 74  One is tempted t
1f990 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61 20 61  o try to add a a
1f9a0 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20  nd b to combine 
1f9b0 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74  the limits.  But
1f9c0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65   this.    ** doe
1f9d0 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69  s not work if ei
1f9e0 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65  ther limit is ne
1f9f0 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20  gative..    */. 
1fa00 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69     if( pSub->pLi
1fa10 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61  mit ){.      pPa
1fa20 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  rent->pLimit = p
1fa30 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  Sub->pLimit;.   
1fa40 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20     pSub->pLimit 
1fa50 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
1fa60 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64    /* Finially, d
1fa70 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65  elete what is le
1fa80 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ft of the subque
1fa90 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ry and return.  
1faa0 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f  ** success..  */
1fab0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
1fac0 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 31  Delete(db, pSub1
1fad0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  );..  return 1;.
1fae0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
1faf0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1fb00 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1fb10 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1fb20 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a  IT_VIEW) */../*.
1fb30 2a 2a 20 42 61 73 65 64 20 6f 6e 20 74 68 65 20  ** Based on the 
1fb40 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1fb50 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
1fb60 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  e indicated by t
1fb70 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75  he first.** argu
1fb80 6d 65 6e 74 2c 20 74 68 69 73 20 66 75 6e 63 74  ment, this funct
1fb90 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 74 68  ion checks if th
1fba0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
1fbb0 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  true:.**.**    *
1fbc0 20 74 68 65 20 71 75 65 72 79 20 63 6f 6e 74 61   the query conta
1fbd0 69 6e 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c  ins just a singl
1fbe0 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
1fbf0 74 69 6f 6e 2c 0a 2a 2a 20 20 20 20 2a 20 74 68  tion,.**    * th
1fc00 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
1fc10 74 69 6f 6e 20 69 73 20 65 69 74 68 65 72 20 6d  tion is either m
1fc20 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 2c 20 61  in() or max(), a
1fc30 6e 64 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61  nd.**    * the a
1fc40 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 61  rgument to the a
1fc50 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1fc60 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  n is a column va
1fc70 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c  lue..**.** If al
1fc80 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61  l of the above a
1fc90 72 65 20 74 72 75 65 2c 20 74 68 65 6e 20 57 48  re true, then WH
1fca0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20  ERE_ORDERBY_MIN 
1fcb0 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  or WHERE_ORDERBY
1fcc0 5f 4d 41 58 0a 2a 2a 20 69 73 20 72 65 74 75 72  _MAX.** is retur
1fcd0 6e 65 64 20 61 73 20 61 70 70 72 6f 70 72 69 61  ned as appropria
1fce0 74 65 2e 20 41 6c 73 6f 2c 20 2a 70 70 4d 69 6e  te. Also, *ppMin
1fcf0 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Max is set to po
1fd00 69 6e 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 6c  int to the .** l
1fd10 69 73 74 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ist of arguments
1fd20 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 61   passed to the a
1fd30 67 67 72 65 67 61 74 65 20 62 65 66 6f 72 65 20  ggregate before 
1fd40 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
1fd50 20 4f 72 2c 20 69 66 20 74 68 65 20 63 6f 6e 64   Or, if the cond
1fd60 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 61 72 65  itions above are
1fd70 20 6e 6f 74 20 6d 65 74 2c 20 2a 70 70 4d 69 6e   not met, *ppMin
1fd80 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 30 20  Max is set to 0 
1fd90 61 6e 64 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44  and.** WHERE_ORD
1fda0 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 69 73 20 72  ERBY_NORMAL is r
1fdb0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1fdc0 69 63 20 75 38 20 6d 69 6e 4d 61 78 51 75 65 72  ic u8 minMaxQuer
1fdd0 79 28 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  y(AggInfo *pAggI
1fde0 6e 66 6f 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a  nfo, ExprList **
1fdf0 70 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74  ppMinMax){.  int
1fe00 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52   eRet = WHERE_OR
1fe10 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20  DERBY_NORMAL;   
1fe20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1fe30 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2a 70 70   value */..  *pp
1fe40 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 69 66  MinMax = 0;.  if
1fe50 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  ( pAggInfo->nFun
1fe60 63 3d 3d 31 20 29 7b 0a 20 20 20 20 45 78 70 72  c==1 ){.    Expr
1fe70 20 2a 70 45 78 70 72 20 3d 20 70 41 67 67 49 6e   *pExpr = pAggIn
1fe80 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 45 78  fo->aFunc[0].pEx
1fe90 70 72 3b 20 2f 2a 20 41 67 67 72 65 67 61 74 65  pr; /* Aggregate
1fea0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   function */.   
1feb0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
1fec0 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
1fed0 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 72 67 75  st;      /* Argu
1fee0 6d 65 6e 74 73 20 74 6f 20 61 67 67 20 66 75 6e  ments to agg fun
1fef0 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 61 73  ction */..    as
1ff00 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
1ff10 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
1ff20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69   );.    if( pELi
1ff30 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
1ff40 78 70 72 3d 3d 31 20 26 26 20 70 45 4c 69 73 74  xpr==1 && pEList
1ff50 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
1ff60 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
1ff70 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
1ff80 68 61 72 20 2a 7a 46 75 6e 63 20 3d 20 70 45 78  har *zFunc = pEx
1ff90 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
1ffa0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1ffb0 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d  trICmp(zFunc, "m
1ffc0 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  in")==0 ){.     
1ffd0 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f     eRet = WHERE_
1ffe0 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20  ORDERBY_MIN;.   
1fff0 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d       *ppMinMax =
20000 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d   pEList;.      }
20010 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
20020 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22  StrICmp(zFunc, "
20030 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  max")==0 ){.    
20040 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45      eRet = WHERE
20050 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20  _ORDERBY_MAX;.  
20060 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20        *ppMinMax 
20070 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  = pEList;.      
20080 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  }.    }.  }..  a
20090 73 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78  ssert( *ppMinMax
200a0 3d 3d 30 20 7c 7c 20 28 2a 70 70 4d 69 6e 4d 61  ==0 || (*ppMinMa
200b0 78 29 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a  x)->nExpr==1 );.
200c0 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d    return eRet;.}
200d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65  ../*.** The sele
200e0 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
200f0 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
20100 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
20110 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
20120 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
20130 72 67 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73  rgment is the as
20140 73 6f 63 69 61 74 65 64 20 61 67 67 72 65 67 61  sociated aggrega
20150 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20  te-info object. 
20160 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
20170 6e 20 74 65 73 74 73 20 69 66 20 74 68 65 20 53  n tests if the S
20180 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20  ELECT is of the 
20190 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45  form:.**.**   SE
201a0 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
201b0 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77  OM <tbl>.**.** w
201c0 68 65 72 65 20 74 61 62 6c 65 20 69 73 20 61 20  here table is a 
201d0 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20  database table, 
201e0 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74  not a sub-select
201f0 20 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68 65   or view. If the
20200 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d   query.** does m
20210 61 74 63 68 20 74 68 69 73 20 70 61 74 74 65 72  atch this patter
20220 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65  n, then a pointe
20230 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f  r to the Table o
20240 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74 69  bject representi
20250 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72  ng.** <tbl> is r
20260 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
20270 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  se, 0 is returne
20280 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62  d..*/.static Tab
20290 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e  le *isSimpleCoun
202a0 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67  t(Select *p, Agg
202b0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
202c0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
202d0 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a    Expr *pExpr;..
202e0 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47    assert( !p->pG
202f0 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28  roupBy );..  if(
20300 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d   p->pWhere || p-
20310 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
20320 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63  1 .   || p->pSrc
20330 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e  ->nSrc!=1 || p->
20340 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
20350 63 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  ct.  ){.    retu
20360 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rn 0;.  }.  pTab
20370 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
20380 2e 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d  .pTab;.  pExpr =
20390 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
203a0 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74  .pExpr;.  assert
203b0 28 20 70 54 61 62 20 26 26 20 21 70 54 61 62 2d  ( pTab && !pTab-
203c0 3e 70 53 65 6c 65 63 74 20 26 26 20 70 45 78 70  >pSelect && pExp
203d0 72 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69  r );..  if( IsVi
203e0 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65  rtual(pTab) ) re
203f0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
20400 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
20410 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72  FUNCTION ) retur
20420 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  n 0;.  if( NEVER
20430 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  (pAggInfo->nFunc
20440 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ==0) ) return 0;
20450 0a 20 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f  .  if( (pAggInfo
20460 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63  ->aFunc[0].pFunc
20470 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53 51 4c 49  ->funcFlags&SQLI
20480 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d  TE_FUNC_COUNT)==
20490 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
204a0 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
204b0 26 45 50 5f 44 69 73 74 69 6e 63 74 20 29 20 72  &EP_Distinct ) r
204c0 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75  eturn 0;..  retu
204d0 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
204e0 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63 65 2d  * If the source-
204f0 6c 69 73 74 20 69 74 65 6d 20 70 61 73 73 65 64  list item passed
20500 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
20510 77 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69  was augmented wi
20520 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44  th an.** INDEXED
20530 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
20540 20 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 74   try to locate t
20550 68 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 64  he specified ind
20560 65 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  ex. If there.** 
20570 77 61 73 20 73 75 63 68 20 61 20 63 6c 61 75 73  was such a claus
20580 65 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64 20  e and the named 
20590 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65 20  index cannot be 
205a0 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a  found, return .*
205b0 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61  * SQLITE_ERROR a
205c0 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  nd leave an erro
205d0 72 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74 68  r in pParse. Oth
205e0 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65  erwise, populate
205f0 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64   .** pFrom->pInd
20600 65 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ex and return SQ
20610 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
20620 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79  sqlite3IndexedBy
20630 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70 50  Lookup(Parse *pP
20640 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63  arse, struct Src
20650 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
20660 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  ){.  if( pFrom->
20670 70 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e 7a  pTab && pFrom->z
20680 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 54 61 62  Index ){.    Tab
20690 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
206a0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72  ->pTab;.    char
206b0 20 2a 7a 49 6e 64 65 78 20 3d 20 70 46 72 6f 6d   *zIndex = pFrom
206c0 2d 3e 7a 49 6e 64 65 78 3b 0a 20 20 20 20 49 6e  ->zIndex;.    In
206d0 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66  dex *pIdx;.    f
206e0 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
206f0 6e 64 65 78 3b 20 0a 20 20 20 20 20 20 20 20 70  ndex; .        p
20700 49 64 78 20 26 26 20 73 71 6c 69 74 65 33 53 74  Idx && sqlite3St
20710 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d  rICmp(pIdx->zNam
20720 65 2c 20 7a 49 6e 64 65 78 29 3b 20 0a 20 20 20  e, zIndex); .   
20730 20 20 20 20 20 70 49 64 78 3d 70 49 64 78 2d 3e       pIdx=pIdx->
20740 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20 20 20  pNext.    );.   
20750 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20 20   if( !pIdx ){.  
20760 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
20770 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
20780 73 75 63 68 20 69 6e 64 65 78 3a 20 25 73 22 2c  such index: %s",
20790 20 7a 49 6e 64 65 78 2c 20 30 29 3b 0a 20 20 20   zIndex, 0);.   
207a0 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b     pParse->check
207b0 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20  Schema = 1;.    
207c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
207d0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
207e0 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 3d   pFrom->pIndex =
207f0 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74   pIdx;.  }.  ret
20800 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
20810 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63 74 20 63 6f  ./*.** Detect co
20820 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74  mpound SELECT st
20830 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 75 73  atements that us
20840 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  e an ORDER BY cl
20850 61 75 73 65 20 77 69 74 68 20 0a 2a 2a 20 61 6e  ause with .** an
20860 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c   alternative col
20870 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
20880 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
20890 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43   ... FROM t1 EXC
208a0 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46  EPT SELECT ... F
208b0 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20  ROM t2 ORDER BY 
208c0 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a  .. COLLATE ....*
208d0 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 72  *.** These are r
208e0 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 73 75  ewritten as a su
208f0 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20  bquery:.**.**   
20900 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28   SELECT * FROM (
20910 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
20920 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54  t1 EXCEPT SELECT
20930 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 29 0a 2a 2a   ... FROM t2).**
20940 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 2e 2e       ORDER BY ..
20950 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a  . COLLATE ....**
20960 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f  .** This transfo
20970 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73  rmation is neces
20980 73 61 72 79 20 62 65 63 61 75 73 65 20 74 68 65  sary because the
20990 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
209a0 72 42 79 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a  rBy() routine.**
209b0 20 61 62 6f 76 65 20 74 68 61 74 20 67 65 6e 65   above that gene
209c0 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66  rates the code f
209d0 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  or a compound SE
209e0 4c 45 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44  LECT with an ORD
209f0 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20  ER BY clause.** 
20a00 75 73 65 73 20 61 20 6d 65 72 67 65 20 61 6c 67  uses a merge alg
20a10 6f 72 69 74 68 6d 20 74 68 61 74 20 72 65 71 75  orithm that requ
20a20 69 72 65 73 20 74 68 65 20 73 61 6d 65 20 63 6f  ires the same co
20a30 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
20a40 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c   on the.** resul
20a50 74 20 63 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e 20  t columns as on 
20a60 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
20a70 75 73 65 2e 20 20 53 65 65 20 74 69 63 6b 65 74  use.  See ticket
20a80 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73  .** http://www.s
20a90 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e  qlite.org/src/in
20aa0 66 6f 2f 36 37 30 39 35 37 34 64 32 61 0a 2a 2a  fo/6709574d2a.**
20ab0 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f  .** This transfo
20ac0 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  rmation is only 
20ad0 6e 65 65 64 65 64 20 66 6f 72 20 45 58 43 45 50  needed for EXCEP
20ae0 54 2c 20 49 4e 54 45 52 53 45 43 54 2c 20 61 6e  T, INTERSECT, an
20af0 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20  d UNION..** The 
20b00 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
20b10 6f 72 20 77 6f 72 6b 73 20 66 69 6e 65 20 77 69  or works fine wi
20b20 74 68 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  th multiSelectOr
20b30 64 65 72 42 79 28 29 20 65 76 65 6e 20 77 68 65  derBy() even whe
20b40 6e 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20 43  n.** there are C
20b50 4f 4c 4c 41 54 45 20 74 65 72 6d 73 20 69 6e 20  OLLATE terms in 
20b60 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2f  the ORDER BY..*/
20b70 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 76  .static int conv
20b80 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63  ertCompoundSelec
20b90 74 54 6f 53 75 62 71 75 65 72 79 28 57 61 6c 6b  tToSubquery(Walk
20ba0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
20bb0 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ect *p){.  int i
20bc0 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  ;.  Select *pNew
20bd0 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 0a  ;.  Select *pX;.
20be0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
20bf0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
20c00 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 53 72 63 4c  _item *a;.  SrcL
20c10 69 73 74 20 2a 70 4e 65 77 53 72 63 3b 0a 20 20  ist *pNewSrc;.  
20c20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20  Parse *pParse;. 
20c30 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20   Token dummy;.. 
20c40 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d   if( p->pPrior==
20c50 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
20c60 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28 20 70  ontinue;.  if( p
20c70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20  ->pOrderBy==0 ) 
20c80 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
20c90 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58 3d 70 3b  nue;.  for(pX=p;
20ca0 20 70 58 20 26 26 20 28 70 58 2d 3e 6f 70 3d 3d   pX && (pX->op==
20cb0 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70  TK_ALL || pX->op
20cc0 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b 20 70 58  ==TK_SELECT); pX
20cd0 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a 20  =pX->pPrior){}. 
20ce0 20 69 66 28 20 70 58 3d 3d 30 20 29 20 72 65 74   if( pX==0 ) ret
20cf0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
20d00 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f 72 64 65  ;.  a = p->pOrde
20d10 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d  rBy->a;.  for(i=
20d20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  p->pOrderBy->nEx
20d30 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  pr-1; i>=0; i--)
20d40 7b 0a 20 20 20 20 69 66 28 20 61 5b 69 5d 2e 70  {.    if( a[i].p
20d50 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
20d60 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72 65 61 6b  _Collate ) break
20d70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 30 20  ;.  }.  if( i<0 
20d80 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
20d90 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  tinue;..  /* If 
20da0 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
20db0 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  int, that means 
20dc0 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  the transformati
20dd0 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  on is required. 
20de0 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70  */..  pParse = p
20df0 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
20e00 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
20e10 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  b;.  pNew = sqli
20e20 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
20e30 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
20e40 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
20e50 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
20e60 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73 65 74 28  Abort;.  memset(
20e70 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69 7a 65 6f  &dummy, 0, sizeo
20e80 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20 70 4e 65  f(dummy));.  pNe
20e90 77 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  wSrc = sqlite3Sr
20ea0 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54  cListAppendFromT
20eb0 65 72 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c 30  erm(pParse,0,0,0
20ec0 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30  ,&dummy,pNew,0,0
20ed0 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 53 72 63  );.  if( pNewSrc
20ee0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
20ef0 5f 41 62 6f 72 74 3b 0a 20 20 2a 70 4e 65 77 20  _Abort;.  *pNew 
20f00 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70 53 72 63 20  = *p;.  p->pSrc 
20f10 3d 20 70 4e 65 77 53 72 63 3b 0a 20 20 70 2d 3e  = pNewSrc;.  p->
20f20 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pEList = sqlite3
20f30 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
20f40 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74 65  Parse, 0, sqlite
20f50 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 41 4c 4c  3Expr(db, TK_ALL
20f60 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d  , 0));.  p->op =
20f70 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 2d   TK_SELECT;.  p-
20f80 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 70  >pWhere = 0;.  p
20f90 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
20fa0 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  0;.  pNew->pHavi
20fb0 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  ng = 0;.  pNew->
20fc0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
20fd0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
20fe0 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20   p->pNext = 0;. 
20ff0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
21000 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20  ~SF_Compound;.  
21010 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 50  assert( pNew->pP
21020 72 69 6f 72 21 3d 30 20 29 3b 0a 20 20 70 4e 65  rior!=0 );.  pNe
21030 77 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74  w->pPrior->pNext
21040 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d   = pNew;.  pNew-
21050 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70  >pLimit = 0;.  p
21060 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30  New->pOffset = 0
21070 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ;.  return WRC_C
21080 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66 6e  ontinue;.}..#ifn
21090 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
210a0 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  CTE./*.** Argume
210b0 6e 74 20 70 57 69 74 68 20 28 77 68 69 63 68 20  nt pWith (which 
210c0 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 70 6f 69  may be NULL) poi
210d0 6e 74 73 20 74 6f 20 61 20 6c 69 6e 6b 65 64 20  nts to a linked 
210e0 6c 69 73 74 20 6f 66 20 6e 65 73 74 65 64 20 0a  list of nested .
210f0 2a 2a 20 57 49 54 48 20 63 6f 6e 74 65 78 74 73  ** WITH contexts
21100 2c 20 66 72 6f 6d 20 69 6e 6e 65 72 20 74 6f 20  , from inner to 
21110 6f 75 74 65 72 6d 6f 73 74 2e 20 49 66 20 74 68  outermost. If th
21120 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69  e table identifi
21130 65 64 20 62 79 20 0a 2a 2a 20 46 52 4f 4d 20 63  ed by .** FROM c
21140 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 70 49  lause element pI
21150 74 65 6d 20 69 73 20 72 65 61 6c 6c 79 20 61 20  tem is really a 
21160 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78 70  common-table-exp
21170 72 65 73 73 69 6f 6e 20 28 43 54 45 29 20 0a 2a  ression (CTE) .*
21180 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20  * then return a 
21190 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 43  pointer to the C
211a0 54 45 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f  TE definition fo
211b0 72 20 74 68 61 74 20 74 61 62 6c 65 2e 20 4f 74  r that table. Ot
211c0 68 65 72 77 69 73 65 0a 2a 2a 20 72 65 74 75 72  herwise.** retur
211d0 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  n NULL..**.** If
211e0 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75   a non-NULL valu
211f0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 73  e is returned, s
21200 65 74 20 2a 70 70 43 6f 6e 74 65 78 74 20 74 6f  et *ppContext to
21210 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 57 69   point to the Wi
21220 74 68 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  th.** object tha
21230 74 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 43  t the returned C
21240 54 45 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a  TE belongs to..*
21250 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
21260 43 74 65 20 2a 73 65 61 72 63 68 57 69 74 68 28  Cte *searchWith(
21270 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20  .  With *pWith, 
21280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21290 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 75     /* Current ou
212a0 74 65 72 6d 6f 73 74 20 57 49 54 48 20 63 6c 61  termost WITH cla
212b0 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
212c0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
212d0 74 65 6d 2c 20 20 20 20 20 2f 2a 20 46 52 4f 4d  tem,     /* FROM
212e0 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20   clause element 
212f0 74 6f 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20  to resolve */.  
21300 57 69 74 68 20 2a 2a 70 70 43 6f 6e 74 65 78 74  With **ppContext
21310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21320 2f 2a 20 4f 55 54 3a 20 57 49 54 48 20 63 6c 61  /* OUT: WITH cla
21330 75 73 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  use return value
21340 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29   belongs to */.)
21350 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
21360 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 49 74  zName;.  if( pIt
21370 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30  em->zDatabase==0
21380 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 49 74   && (zName = pIt
21390 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  em->zName)!=0 ){
213a0 0a 20 20 20 20 57 69 74 68 20 2a 70 3b 0a 20 20  .    With *p;.  
213b0 20 20 66 6f 72 28 70 3d 70 57 69 74 68 3b 20 70    for(p=pWith; p
213c0 3b 20 70 3d 70 2d 3e 70 4f 75 74 65 72 29 7b 0a  ; p=p->pOuter){.
213d0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
213e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
213f0 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCte; i++){.   
21400 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
21410 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70  StrICmp(zName, p
21420 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  ->a[i].zName)==0
21430 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   ){.          *p
21440 70 43 6f 6e 74 65 78 74 20 3d 20 70 3b 0a 20 20  pContext = p;.  
21450 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 26          return &
21460 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20  p->a[i];.       
21470 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
21480 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
21490 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 64 65 20  .}../* The code 
214a0 67 65 6e 65 72 61 74 6f 72 20 6d 61 69 6e 74 61  generator mainta
214b0 69 6e 73 20 61 20 73 74 61 63 6b 20 6f 66 20 61  ins a stack of a
214c0 63 74 69 76 65 20 57 49 54 48 20 63 6c 61 75 73  ctive WITH claus
214d0 65 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69  es.** with the i
214e0 6e 6e 65 72 2d 6d 6f 73 74 20 57 49 54 48 20 63  nner-most WITH c
214f0 6c 61 75 73 65 20 62 65 69 6e 67 20 61 74 20 74  lause being at t
21500 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
21510 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
21520 72 6f 75 74 69 6e 65 20 70 75 73 68 65 73 20 74  routine pushes t
21530 68 65 20 57 49 54 48 20 63 6c 61 75 73 65 20 70  he WITH clause p
21540 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
21550 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  ond argument.** 
21560 6f 6e 74 6f 20 74 68 65 20 74 6f 70 20 6f 66 20  onto the top of 
21570 74 68 65 20 73 74 61 63 6b 2e 20 49 66 20 61 72  the stack. If ar
21580 67 75 6d 65 6e 74 20 62 46 72 65 65 20 69 73 20  gument bFree is 
21590 74 72 75 65 2c 20 74 68 65 6e 20 74 68 69 73 0a  true, then this.
215a0 2a 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 77  ** WITH clause w
215b0 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 70 6f 70  ill never be pop
215c0 70 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ped from the sta
215d0 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ck. In this case
215e0 20 69 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65   it.** should be
215f0 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74   freed along wit
21600 68 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  h the Parse obje
21610 63 74 2e 20 49 6e 20 6f 74 68 65 72 20 63 61 73  ct. In other cas
21620 65 73 2c 20 77 68 65 6e 0a 2a 2a 20 62 46 72 65  es, when.** bFre
21630 65 3d 3d 30 2c 20 74 68 65 20 57 69 74 68 20 6f  e==0, the With o
21640 62 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 66 72  bject will be fr
21650 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  eed along with t
21660 68 65 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74  he SELECT .** st
21670 61 74 65 6d 65 6e 74 20 77 69 74 68 20 77 68 69  atement with whi
21680 63 68 20 69 74 20 69 73 20 61 73 73 6f 63 69 61  ch it is associa
21690 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ted..*/.void sql
216a0 69 74 65 33 57 69 74 68 50 75 73 68 28 50 61 72  ite3WithPush(Par
216b0 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 74 68  se *pParse, With
216c0 20 2a 70 57 69 74 68 2c 20 75 38 20 62 46 72 65   *pWith, u8 bFre
216d0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 62 46  e){.  assert( bF
216e0 72 65 65 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65  ree==0 || pParse
216f0 2d 3e 70 57 69 74 68 3d 3d 30 20 29 3b 0a 20 20  ->pWith==0 );.  
21700 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20  if( pWith ){.   
21710 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 20 3d   pWith->pOuter =
21720 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a   pParse->pWith;.
21730 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
21740 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 70  h = pWith;.    p
21750 50 61 72 73 65 2d 3e 62 46 72 65 65 57 69 74 68  Parse->bFreeWith
21760 20 3d 20 62 46 72 65 65 3b 0a 20 20 7d 0a 7d 0a   = bFree;.  }.}.
21770 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
21780 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 61  tion checks if a
21790 72 67 75 6d 65 6e 74 20 70 46 72 6f 6d 20 72 65  rgument pFrom re
217a0 66 65 72 73 20 74 6f 20 61 20 43 54 45 20 64 65  fers to a CTE de
217b0 63 6c 61 72 65 64 20 62 79 20 0a 2a 2a 20 61 20  clared by .** a 
217c0 57 49 54 48 20 63 6c 61 75 73 65 20 6f 6e 20 74  WITH clause on t
217d0 68 65 20 73 74 61 63 6b 20 63 75 72 72 65 6e 74  he stack current
217e0 6c 79 20 6d 61 69 6e 74 61 69 6e 65 64 20 62 79  ly maintained by
217f0 20 74 68 65 20 70 61 72 73 65 72 2e 20 41 6e 64   the parser. And
21800 2c 0a 2a 2a 20 69 66 20 63 75 72 72 65 6e 74 6c  ,.** if currentl
21810 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 43  y processing a C
21820 54 45 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 69  TE expression, i
21830 66 20 69 74 20 69 73 20 61 20 72 65 63 75 72 73  f it is a recurs
21840 69 76 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  ive.** reference
21850 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
21860 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46  CTE..**.** If pF
21870 72 6f 6d 20 66 61 6c 6c 73 20 69 6e 74 6f 20 65  rom falls into e
21880 69 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f  ither of the two
21890 20 63 61 74 65 67 6f 72 69 65 73 20 61 62 6f 76   categories abov
218a0 65 2c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a  e, pFrom->pTab.*
218b0 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c  * and other fiel
218c0 64 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64  ds are populated
218d0 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68   accordingly. Th
218e0 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20  e caller should 
218f0 63 68 65 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d  check.** (pFrom-
21900 3e 70 54 61 62 21 3d 30 29 20 74 6f 20 64 65 74  >pTab!=0) to det
21910 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
21920 72 20 6e 6f 74 20 61 20 73 75 63 63 65 73 73 66  r not a successf
21930 75 6c 20 6d 61 74 63 68 0a 2a 2a 20 77 61 73 20  ul match.** was 
21940 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  found..**.** Whe
21950 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 6d 61  ther or not a ma
21960 74 63 68 20 69 73 20 66 6f 75 6e 64 2c 20 53 51  tch is found, SQ
21970 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
21980 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 0a  ned if no error.
21990 2a 2a 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e  ** occurs. If an
219a0 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75   error does occu
219b0 72 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  r, an error mess
219c0 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
219d0 20 74 68 65 0a 2a 2a 20 70 61 72 73 65 72 20 61   the.** parser a
219e0 6e 64 20 73 6f 6d 65 20 65 72 72 6f 72 20 63 6f  nd some error co
219f0 64 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  de other than SQ
21a00 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
21a10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21a20 77 69 74 68 45 78 70 61 6e 64 28 0a 20 20 57 61  withExpand(.  Wa
21a30 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 0a  lker *pWalker, .
21a40 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
21a50 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a  _item *pFrom.){.
21a60 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
21a70 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
21a80 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e;.  sqlite3 *db
21a90 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
21aa0 20 73 74 72 75 63 74 20 43 74 65 20 2a 70 43 74   struct Cte *pCt
21ab0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
21ac0 20 2f 2a 20 4d 61 74 63 68 65 64 20 43 54 45 20   /* Matched CTE 
21ad0 28 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d  (or NULL if no m
21ae0 61 74 63 68 29 20 2a 2f 0a 20 20 57 69 74 68 20  atch) */.  With 
21af0 2a 70 57 69 74 68 3b 20 20 20 20 20 20 20 20 20  *pWith;         
21b00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 49             /* WI
21b10 54 48 20 63 6c 61 75 73 65 20 74 68 61 74 20 70  TH clause that p
21b20 43 74 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a  Cte belongs to *
21b30 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 72  /..  assert( pFr
21b40 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 0a  om->pTab==0 );..
21b50 20 20 70 43 74 65 20 3d 20 73 65 61 72 63 68 57    pCte = searchW
21b60 69 74 68 28 70 50 61 72 73 65 2d 3e 70 57 69 74  ith(pParse->pWit
21b70 68 2c 20 70 46 72 6f 6d 2c 20 26 70 57 69 74 68  h, pFrom, &pWith
21b80 29 3b 0a 20 20 69 66 28 20 70 43 74 65 20 29 7b  );.  if( pCte ){
21b90 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
21ba0 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
21bb0 70 45 4c 69 73 74 3b 0a 20 20 20 20 53 65 6c 65  pEList;.    Sele
21bc0 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20 53 65  ct *pSel;.    Se
21bd0 6c 65 63 74 20 2a 70 4c 65 66 74 3b 20 20 20 20  lect *pLeft;    
21be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
21bf0 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20  eft-most SELECT 
21c00 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
21c10 20 69 6e 74 20 62 4d 61 79 52 65 63 75 72 73 69   int bMayRecursi
21c20 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ve;            /
21c30 2a 20 54 72 75 65 20 69 66 20 63 6f 6d 70 6f 75  * True if compou
21c40 6e 64 20 6a 6f 69 6e 65 64 20 62 79 20 55 4e 49  nd joined by UNI
21c50 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20  ON [ALL] */.    
21c60 57 69 74 68 20 2a 70 53 61 76 65 64 57 69 74 68  With *pSavedWith
21c70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
21c80 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f   Initial value o
21c90 66 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20  f pParse->pWith 
21ca0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 43  */..    /* If pC
21cb0 74 65 2d 3e 7a 45 72 72 20 69 73 20 6e 6f 6e 2d  te->zErr is non-
21cc0 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f 69  NULL at this poi
21cd0 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  nt, then this is
21ce0 20 61 6e 20 69 6c 6c 65 67 61 6c 0a 20 20 20 20   an illegal.    
21cf0 2a 2a 20 72 65 63 75 72 73 69 76 65 20 72 65 66  ** recursive ref
21d00 65 72 65 6e 63 65 20 74 6f 20 43 54 45 20 70 43  erence to CTE pC
21d10 74 65 2e 20 4c 65 61 76 65 20 61 6e 20 65 72 72  te. Leave an err
21d20 6f 72 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  or in pParse and
21d30 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 65   return.    ** e
21d40 61 72 6c 79 2e 20 49 66 20 70 43 74 65 2d 3e 7a  arly. If pCte->z
21d50 45 72 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  Err is NULL, the
21d60 6e 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  n this is not a 
21d70 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
21d80 6e 63 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74  nce..    ** In t
21d90 68 69 73 20 63 61 73 65 2c 20 70 72 6f 63 65 65  his case, procee
21da0 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  d.  */.    if( p
21db0 43 74 65 2d 3e 7a 45 72 72 20 29 7b 0a 20 20 20  Cte->zErr ){.   
21dc0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
21dd0 73 67 28 70 50 61 72 73 65 2c 20 70 43 74 65 2d  sg(pParse, pCte-
21de0 3e 7a 45 72 72 2c 20 70 43 74 65 2d 3e 7a 4e 61  >zErr, pCte->zNa
21df0 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
21e00 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
21e10 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
21e20 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
21e30 30 20 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  0 );.    pFrom->
21e40 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71  pTab = pTab = sq
21e50 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
21e60 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
21e70 6c 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70 54  le));.    if( pT
21e80 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  ab==0 ) return W
21e90 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 70 54  RC_Abort;.    pT
21ea0 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ab->nRef = 1;.  
21eb0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
21ec0 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
21ed0 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29  db, pCte->zName)
21ee0 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65  ;.    pTab->iPKe
21ef0 79 20 3d 20 2d 31 3b 0a 20 20 20 20 70 54 61 62  y = -1;.    pTab
21f00 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32  ->nRowLogEst = 2
21f10 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d  00; assert( 200=
21f20 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
21f30 30 34 38 35 37 36 29 20 29 3b 0a 20 20 20 20 70  048576) );.    p
21f40 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
21f50 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 20   TF_Ephemeral;. 
21f60 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63     pFrom->pSelec
21f70 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
21f80 74 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 70  tDup(db, pCte->p
21f90 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20  Select, 0);.    
21fa0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
21fb0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51  iled ) return SQ
21fc0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
21fd0 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
21fe0 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f  Select );..    /
21ff0 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20  * Check if this 
22000 69 73 20 61 20 72 65 63 75 72 73 69 76 65 20 43  is a recursive C
22010 54 45 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20  TE. */.    pSel 
22020 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
22030 3b 0a 20 20 20 20 62 4d 61 79 52 65 63 75 72 73  ;.    bMayRecurs
22040 69 76 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70  ive = ( pSel->op
22050 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c  ==TK_ALL || pSel
22060 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
22070 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65  ;.    if( bMayRe
22080 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
22090 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 53 72   int i;.      Sr
220a0 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 46  cList *pSrc = pF
220b0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53  rom->pSelect->pS
220c0 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  rc;.      for(i=
220d0 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b  0; i<pSrc->nSrc;
220e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
220f0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
22100 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72  em *pItem = &pSr
22110 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20  c->a[i];.       
22120 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74   if( pItem->zDat
22130 61 62 61 73 65 3d 3d 30 20 0a 20 20 20 20 20 20  abase==0 .      
22140 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61     && pItem->zNa
22150 6d 65 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20  me!=0 .         
22160 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
22170 49 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  ICmp(pItem->zNam
22180 65 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a  e, pCte->zName).
22190 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
221a0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54         pItem->pT
221b0 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20  ab = pTab;.     
221c0 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 52 65       pItem->isRe
221d0 63 75 72 73 69 76 65 20 3d 20 31 3b 0a 20 20 20  cursive = 1;.   
221e0 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65         pTab->nRe
221f0 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  f++;.          p
22200 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  Sel->selFlags |=
22210 20 53 46 5f 52 65 63 75 72 73 69 76 65 3b 0a 20   SF_Recursive;. 
22220 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
22230 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f  .    }..    /* O
22240 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72 73 69 76  nly one recursiv
22250 65 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 70  e reference is p
22260 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a 20 20  ermitted. */ .  
22270 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 52 65 66    if( pTab->nRef
22280 3e 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >2 ){.      sqli
22290 74 65 33 45 72 72 6f 72 4d 73 67 28 0a 20 20 20  te3ErrorMsg(.   
222a0 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 22         pParse, "
222b0 6d 75 6c 74 69 70 6c 65 20 72 65 66 65 72 65 6e  multiple referen
222c0 63 65 73 20 74 6f 20 72 65 63 75 72 73 69 76 65  ces to recursive
222d0 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 70 43 74   table: %s", pCt
222e0 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29  e->zName.      )
222f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
22300 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
22310 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
22320 54 61 62 2d 3e 6e 52 65 66 3d 3d 31 20 7c 7c 20  Tab->nRef==1 || 
22330 28 28 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73  ((pSel->selFlags
22340 26 53 46 5f 52 65 63 75 72 73 69 76 65 29 20 26  &SF_Recursive) &
22350 26 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 32 20  & pTab->nRef==2 
22360 29 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a  ));..    pCte->z
22370 45 72 72 20 3d 20 22 63 69 72 63 75 6c 61 72 20  Err = "circular 
22380 72 65 66 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a  reference: %s";.
22390 20 20 20 20 70 53 61 76 65 64 57 69 74 68 20 3d      pSavedWith =
223a0 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a   pParse->pWith;.
223b0 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
223c0 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 73  h = pWith;.    s
223d0 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
223e0 28 70 57 61 6c 6b 65 72 2c 20 62 4d 61 79 52 65  (pWalker, bMayRe
223f0 63 75 72 73 69 76 65 20 3f 20 70 53 65 6c 2d 3e  cursive ? pSel->
22400 70 50 72 69 6f 72 20 3a 20 70 53 65 6c 29 3b 0a  pPrior : pSel);.
22410 0a 20 20 20 20 66 6f 72 28 70 4c 65 66 74 3d 70  .    for(pLeft=p
22420 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72 69  Sel; pLeft->pPri
22430 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74 2d  or; pLeft=pLeft-
22440 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 70 45  >pPrior);.    pE
22450 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70 45  List = pLeft->pE
22460 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70 43  List;.    if( pC
22470 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20 20 20  te->pCols ){.   
22480 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e     if( pEList->n
22490 45 78 70 72 21 3d 70 43 74 65 2d 3e 70 43 6f 6c  Expr!=pCte->pCol
224a0 73 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  s->nExpr ){.    
224b0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
224c0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
224d0 6c 65 20 25 73 20 68 61 73 20 25 64 20 76 61 6c  le %s has %d val
224e0 75 65 73 20 66 6f 72 20 25 64 20 63 6f 6c 75 6d  ues for %d colum
224f0 6e 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ns",.           
22500 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45   pCte->zName, pE
22510 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 43 74  List->nExpr, pCt
22520 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a  e->pCols->nExpr.
22530 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
22540 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68     pParse->pWith
22550 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20   = pSavedWith;. 
22560 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
22570 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
22580 20 20 7d 0a 20 20 20 20 20 20 70 45 4c 69 73 74    }.      pEList
22590 20 3d 20 70 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a   = pCte->pCols;.
225a0 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 6c 65 63      }..    selec
225b0 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  tColumnsFromExpr
225c0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c  List(pParse, pEL
225d0 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c  ist, &pTab->nCol
225e0 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  , &pTab->aCol);.
225f0 20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75      if( bMayRecu
22600 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69  rsive ){.      i
22610 66 28 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67  f( pSel->selFlag
22620 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
22630 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65   ){.        pCte
22640 2d 3e 7a 45 72 72 20 3d 20 22 6d 75 6c 74 69 70  ->zErr = "multip
22650 6c 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66  le recursive ref
22660 65 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20 20  erences: %s";.  
22670 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22680 20 20 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20     pCte->zErr = 
22690 22 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72  "recursive refer
226a0 65 6e 63 65 20 69 6e 20 61 20 73 75 62 71 75 65  ence in a subque
226b0 72 79 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d  ry: %s";.      }
226c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61  .      sqlite3Wa
226d0 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
226e0 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  , pSel);.    }. 
226f0 20 20 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20     pCte->zErr = 
22700 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70  0;.    pParse->p
22710 57 69 74 68 20 3d 20 70 53 61 76 65 64 57 69 74  With = pSavedWit
22720 68 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  h;.  }..  return
22730 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
22740 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
22750 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a  LITE_OMIT_CTE./*
22760 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43  .** If the SELEC
22770 54 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  T passed as the 
22780 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
22790 68 61 73 20 61 6e 20 61 73 73 6f 63 69 61 74 65  has an associate
227a0 64 20 57 49 54 48 20 0a 2a 2a 20 63 6c 61 75 73  d WITH .** claus
227b0 65 2c 20 70 6f 70 20 69 74 20 66 72 6f 6d 20 74  e, pop it from t
227c0 68 65 20 73 74 61 63 6b 20 73 74 6f 72 65 64 20  he stack stored 
227d0 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 50  as part of the P
227e0 61 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a  arse object..**.
227f0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
22800 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20   is used as the 
22810 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
22820 28 29 20 63 61 6c 6c 62 61 63 6b 20 62 79 0a 2a  () callback by.*
22830 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  * sqlite3SelectE
22840 78 70 61 6e 64 28 29 20 77 68 65 6e 20 77 61 6c  xpand() when wal
22850 6b 69 6e 67 20 61 20 53 45 4c 45 43 54 20 74 72  king a SELECT tr
22860 65 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 61  ee to resolve ta
22870 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e 64  ble.** names and
22880 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75   other FROM clau
22890 73 65 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f  se elements. .*/
228a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
228b0 65 63 74 50 6f 70 57 69 74 68 28 57 61 6c 6b 65  ectPopWith(Walke
228c0 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
228d0 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20  ct *p){.  Parse 
228e0 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65  *pParse = pWalke
228f0 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 57 69 74  r->pParse;.  Wit
22900 68 20 2a 70 57 69 74 68 20 3d 20 66 69 6e 64 52  h *pWith = findR
22910 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69  ightmost(p)->pWi
22920 74 68 3b 0a 20 20 69 66 28 20 70 57 69 74 68 21  th;.  if( pWith!
22930 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
22940 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d  ( pParse->pWith=
22950 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20 70 50  =pWith );.    pP
22960 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57  arse->pWith = pW
22970 69 74 68 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 7d  ith->pOuter;.  }
22980 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
22990 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 20 30   selectPopWith 0
229a0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
229b0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
229c0 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b   Walker callback
229d0 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67 22   for "expanding"
229e0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
229f0 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69  ent..** "Expandi
22a00 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20  ng" means to do 
22a10 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
22a20 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b  *.**    (1)  Mak
22a30 65 20 73 75 72 65 20 56 44 42 45 20 63 75 72 73  e sure VDBE curs
22a40 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20  or numbers have 
22a50 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f  been assigned to
22a60 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20   every.**       
22a70 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65    element of the
22a80 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a   FROM clause..**
22a90 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c  .**    (2)  Fill
22aa0 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74   in the pTabList
22ab0 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64  ->a[].pTab field
22ac0 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74  s in the SrcList
22ad0 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20   that .**       
22ae0 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63    defines FROM c
22af0 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65  lause.  When vie
22b00 77 73 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ws appear in the
22b10 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a   FROM clause,.**
22b20 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54           fill pT
22b30 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c  abList->a[].pSel
22b40 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79 20  ect with a copy 
22b50 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
22b60 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
22b70 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e     that implemen
22b80 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41 20  ts the view.  A 
22b90 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20  copy is made of 
22ba0 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45 43  the view's SELEC
22bb0 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61  T.**         sta
22bc0 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77  tement so that w
22bd0 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64  e can freely mod
22be0 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68  ify or delete th
22bf0 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  at statement.** 
22c00 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20          without 
22c10 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d  worrying about m
22c20 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70 72  essing up the pr
22c30 65 73 69 73 74 65 6e 74 20 72 65 70 72 65 73 65  esistent represe
22c40 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20  ntation.**      
22c50 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a     of the view..
22c60 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64  **.**    (3)  Ad
22c70 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57  d terms to the W
22c80 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61  HERE clause to a
22c90 63 63 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e 41  ccomodate the NA
22ca0 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a  TURAL keyword.**
22cb0 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e           on join
22cc0 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64  s and the ON and
22cd0 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
22ce0 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   joins..**.**   
22cf0 20 28 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c   (4)  Scan the l
22d00 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ist of columns i
22d10 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
22d20 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e   (pEList) lookin
22d30 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72  g.**         for
22d40 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
22d50 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f  e "*" operator o
22d60 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70  r the TABLE.* op
22d70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20  erator..**      
22d80 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70     If found, exp
22d90 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20  and each "*" to 
22da0 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  be every column 
22db0 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a  in every table.*
22dc0 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54 41  *         and TA
22dd0 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72  BLE.* to be ever
22de0 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c  y column in TABL
22df0 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  E..**.*/.static 
22e00 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64  int selectExpand
22e10 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  er(Walker *pWalk
22e20 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
22e30 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
22e40 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
22e50 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  e;.  int i, j, k
22e60 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
22e70 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73  bList;.  ExprLis
22e80 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72  t *pEList;.  str
22e90 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
22ea0 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74   *pFrom;.  sqlit
22eb0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
22ec0 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c  >db;.  Expr *pE,
22ed0 20 2a 70 52 69 67 68 74 2c 20 2a 70 45 78 70 72   *pRight, *pExpr
22ee0 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73  ;.  u16 selFlags
22ef0 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a   = p->selFlags;.
22f00 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  .  p->selFlags |
22f10 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20  = SF_Expanded;. 
22f20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
22f30 61 69 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65  ailed  ){.    re
22f40 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
22f50 20 20 7d 0a 20 20 69 66 28 20 4e 45 56 45 52 28    }.  if( NEVER(
22f60 70 2d 3e 70 53 72 63 3d 3d 30 29 20 7c 7c 20 28  p->pSrc==0) || (
22f70 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78  selFlags & SF_Ex
22f80 70 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20 20  panded)!=0 ){.  
22f90 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
22fa0 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69  ne;.  }.  pTabLi
22fb0 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
22fc0 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
22fd0 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 57 69 74  st;.  sqlite3Wit
22fe0 68 50 75 73 68 28 70 50 61 72 73 65 2c 20 66 69  hPush(pParse, fi
22ff0 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e  ndRightmost(p)->
23000 70 57 69 74 68 2c 20 30 29 3b 0a 0a 20 20 2f 2a  pWith, 0);..  /*
23010 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f   Make sure curso
23020 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62  r numbers have b
23030 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20  een assigned to 
23040 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20  all entries in. 
23050 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   ** the FROM cla
23060 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43  use of the SELEC
23070 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a  T statement..  *
23080 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  /.  sqlite3SrcLi
23090 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
230a0 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
230b0 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70  );..  /* Look up
230c0 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d   every table nam
230d0 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ed in the FROM c
230e0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c  lause of the sel
230f0 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e  ect.  If.  ** an
23100 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52   entry of the FR
23110 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20 73  OM clause is a s
23120 75 62 71 75 65 72 79 20 69 6e 73 74 65 61 64 20  ubquery instead 
23130 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69  of a table or vi
23140 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72  ew,.  ** then cr
23150 65 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74  eate a transient
23160 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
23170 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65   to describe the
23180 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a   subquery..  */.
23190 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
231a0 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
231b0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
231c0 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
231d0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
231e0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
231f0 6d 2d 3e 69 73 52 65 63 75 72 73 69 76 65 3d 3d  m->isRecursive==
23200 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62  0 || pFrom->pTab
23210 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f   );.    if( pFro
23220 6d 2d 3e 69 73 52 65 63 75 72 73 69 76 65 20 29  m->isRecursive )
23230 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
23240 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d  f( pFrom->pTab!=
23250 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
23260 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73  is statement has
23270 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72   already been pr
23280 65 70 61 72 65 64 2e 20 20 54 68 65 72 65 20 69  epared.  There i
23290 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20  s no need.      
232a0 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72  ** to go further
232b0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
232c0 74 28 20 69 3d 3d 30 20 29 3b 0a 23 69 66 6e 64  t( i==0 );.#ifnd
232d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
232e0 54 45 0a 20 20 20 20 20 20 73 65 6c 65 63 74 50  TE.      selectP
232f0 6f 70 57 69 74 68 28 70 57 61 6c 6b 65 72 2c 20  opWith(pWalker, 
23300 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  p);.#endif.     
23310 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
23320 65 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  e;.    }.#ifndef
23330 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
23340 0a 20 20 20 20 69 66 28 20 77 69 74 68 45 78 70  .    if( withExp
23350 61 6e 64 28 70 57 61 6c 6b 65 72 2c 20 70 46 72  and(pWalker, pFr
23360 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  om) ) return WRC
23370 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69 66 28 20  _Abort;.    if( 
23380 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29 20 7b 7d  pFrom->pTab ) {}
23390 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20   else.#endif.   
233a0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d   if( pFrom->zNam
233b0 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  e==0 ){.#ifndef 
233c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
233d0 55 45 52 59 0a 20 20 20 20 20 20 53 65 6c 65 63  UERY.      Selec
233e0 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d  t *pSel = pFrom-
233f0 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
23400 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69  /* A sub-query i
23410 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
23420 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f  e of a SELECT */
23430 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
23440 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Sel!=0 );.      
23450 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
23460 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab==0 );.      
23470 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
23480 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29  t(pWalker, pSel)
23490 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70  ;.      pFrom->p
234a0 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c  Tab = pTab = sql
234b0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
234c0 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
234d0 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e));.      if( p
234e0 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
234f0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
23500 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b   pTab->nRef = 1;
23510 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61  .      pTab->zNa
23520 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
23530 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f  ntf(db, "sqlite_
23540 73 71 5f 25 70 22 2c 20 28 76 6f 69 64 2a 29 70  sq_%p", (void*)p
23550 54 61 62 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  Tab);.      whil
23560 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20  e( pSel->pPrior 
23570 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e  ){ pSel = pSel->
23580 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20  pPrior; }.      
23590 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f  selectColumnsFro
235a0 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
235b0 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 20  , pSel->pEList, 
235c0 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54  &pTab->nCol, &pT
235d0 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20  ab->aCol);.     
235e0 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
235f0 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  1;.      pTab->n
23600 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b  RowLogEst = 200;
23610 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71   assert( 200==sq
23620 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38  lite3LogEst(1048
23630 35 37 36 29 20 29 3b 0a 20 20 20 20 20 20 70 54  576) );.      pT
23640 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
23650 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 23 65  TF_Ephemeral;.#e
23660 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
23670 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69        /* An ordi
23680 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69  nary table or vi
23690 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46  ew name in the F
236a0 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
236b0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
236c0 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  m->pTab==0 );.  
236d0 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
236e0 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33  = pTab = sqlite3
236f0 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28  LocateTableItem(
23700 70 50 61 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d  pParse, 0, pFrom
23710 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
23720 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  b==0 ) return WR
23730 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 69  C_Abort;.      i
23740 66 28 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 30  f( pTab->nRef==0
23750 78 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20  xffff ){.       
23760 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
23770 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
23780 6e 79 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ny references to
23790 20 5c 22 25 73 5c 22 3a 20 6d 61 78 20 36 35 35   \"%s\": max 655
237a0 33 35 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  35",.           
237b0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
237c0 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61        pFrom->pTa
237d0 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  b = 0;.        r
237e0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
237f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
23800 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66  Tab->nRef++;.#if
23810 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
23820 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
23830 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f  defined (SQLITE_
23840 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
23850 45 29 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  E).      if( pTa
23860 62 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49 73  b->pSelect || Is
23870 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
23880 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72  .        /* We r
23890 65 61 63 68 20 68 65 72 65 20 69 66 20 74 68 65  each here if the
238a0 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20   named table is 
238b0 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20  a really a view 
238c0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  */.        if( s
238d0 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
238e0 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
238f0 20 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   pTab) ) return 
23900 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
23910 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
23920 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a  ->pSelect==0 );.
23930 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70          pFrom->p
23940 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
23950 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54  SelectDup(db, pT
23960 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b  ab->pSelect, 0);
23970 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23980 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
23990 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  er, pFrom->pSele
239a0 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  ct);.      }.#en
239b0 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  dif.    }..    /
239c0 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64  * Locate the ind
239d0 65 78 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20  ex named by the 
239e0 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
239f0 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20  e, if any. */.  
23a00 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64    if( sqlite3Ind
23a10 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61  exedByLookup(pPa
23a20 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20  rse, pFrom) ){. 
23a30 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
23a40 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  Abort;.    }.  }
23a50 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e  ..  /* Process N
23a60 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c  ATURAL keywords,
23a70 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e   and ON and USIN
23a80 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69  G clauses of joi
23a90 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ns..  */.  if( d
23aa0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
23ab0 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  || sqliteProcess
23ac0 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20  Join(pParse, p) 
23ad0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
23ae0 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20  C_Abort;.  }..  
23af0 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22  /* For every "*"
23b00 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
23b10 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c  the column list,
23b20 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65   insert the name
23b30 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f  s of.  ** all co
23b40 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62  lumns in all tab
23b50 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76  les.  And for ev
23b60 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65  ery TABLE.* inse
23b70 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a  rt the names.  *
23b80 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  * of all columns
23b90 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20   in TABLE.  The 
23ba0 70 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20  parser inserted 
23bb0 61 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73  a special expres
23bc0 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74  sion.  ** with t
23bd0 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74  he TK_ALL operat
23be0 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20  or for each "*" 
23bf0 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e  that it found in
23c00 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   the column list
23c10 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  ** The follo
23c20 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68  wing code just h
23c30 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  as to locate the
23c40 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69   TK_ALL expressi
23c50 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20  ons and expand. 
23c60 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20   ** each one to 
23c70 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
23c80 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74  columns in all t
23c90 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ables..  **.  **
23ca0 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20   The first loop 
23cb0 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73  just checks to s
23cc0 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ee if there are 
23cd0 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72  any "*" operator
23ce0 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64  s.  ** that need
23cf0 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f   expanding..  */
23d00 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45  .  for(k=0; k<pE
23d10 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
23d20 29 7b 0a 20 20 20 20 70 45 20 3d 20 70 45 4c 69  ){.    pE = pELi
23d30 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a  st->a[k].pExpr;.
23d40 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
23d50 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a  TK_ALL ) break;.
23d60 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
23d70 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45  op!=TK_DOT || pE
23d80 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20  ->pRight!=0 );. 
23d90 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f     assert( pE->o
23da0 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45  p!=TK_DOT || (pE
23db0 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45  ->pLeft!=0 && pE
23dc0 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
23dd0 49 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ID) );.    if( p
23de0 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26  E->op==TK_DOT &&
23df0 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d   pE->pRight->op=
23e00 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b  =TK_ALL ) break;
23e10 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c  .  }.  if( k<pEL
23e20 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
23e30 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77    /*.    ** If w
23e40 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d 65  e get here it me
23e50 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  ans the result s
23e60 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  et contains one 
23e70 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20  or more "*".    
23e80 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61  ** operators tha
23e90 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
23ea0 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72  anded.  Loop thr
23eb0 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73  ough each expres
23ec0 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74  sion.    ** in t
23ed0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e  he result set an
23ee0 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e  d expand them on
23ef0 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f  e by one..    */
23f00 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
23f10 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70  List_item *a = p
23f20 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78  EList->a;.    Ex
23f30 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30  prList *pNew = 0
23f40 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  ;.    int flags 
23f50 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  = pParse->db->fl
23f60 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e  ags;.    int lon
23f70 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20  gNames = (flags 
23f80 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c  & SQLITE_FullCol
23f90 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20 20 20 20  Names)!=0.      
23fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fb0 26 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  && (flags & SQLI
23fc0 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
23fd0 29 3d 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68  )==0;..    /* Wh
23fe0 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 46 52  en processing FR
23ff0 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
24000 72 69 65 73 2c 20 69 74 20 69 73 20 61 6c 77 61  ries, it is alwa
24010 79 73 20 74 68 65 20 63 61 73 65 0a 20 20 20 20  ys the case.    
24020 2a 2a 20 74 68 61 74 20 66 75 6c 6c 5f 63 6f 6c  ** that full_col
24030 75 6d 6e 5f 6e 61 6d 65 73 3d 4f 46 46 20 61 6e  umn_names=OFF an
24040 64 20 73 68 6f 72 74 5f 63 6f 6c 75 6d 6e 5f 6e  d short_column_n
24050 61 6d 65 73 3d 4f 4e 2e 20 20 54 68 65 0a 20 20  ames=ON.  The.  
24060 20 20 2a 2a 20 73 71 6c 69 74 65 33 52 65 73 75    ** sqlite3Resu
24070 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20  ltSetOfSelect() 
24080 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 69 74  routine makes it
24090 20 73 6f 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65   so. */.    asse
240a0 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  rt( (p->selFlags
240b0 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d   & SF_NestedFrom
240c0 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c  )==0.          |
240d0 7c 20 28 28 66 6c 61 67 73 20 26 20 53 51 4c 49  | ((flags & SQLI
240e0 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
240f0 3d 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20  ==0 &&.         
24100 20 20 20 20 20 28 66 6c 61 67 73 20 26 20 53 51       (flags & SQ
24110 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
24120 65 73 29 21 3d 30 29 20 29 3b 0a 0a 20 20 20 20  es)!=0) );..    
24130 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
24140 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
24150 20 20 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e        pE = a[k].
24160 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 52 69  pExpr;.      pRi
24170 67 68 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74  ght = pE->pRight
24180 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
24190 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
241a0 7c 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20  | pRight!=0 );. 
241b0 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21       if( pE->op!
241c0 3d 54 4b 5f 41 4c 4c 20 26 26 20 28 70 45 2d 3e  =TK_ALL && (pE->
241d0 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52  op!=TK_DOT || pR
241e0 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  ight->op!=TK_ALL
241f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
24200 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20  This particular 
24210 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20  expression does 
24220 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65  not need to be e
24230 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20  xpanded..       
24240 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
24250 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
24260 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
24270 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70   pNew, a[k].pExp
24280 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
24290 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
242a0 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
242b0 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d  nExpr-1].zName =
242c0 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20   a[k].zName;.   
242d0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70         pNew->a[p
242e0 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53  New->nExpr-1].zS
242f0 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e  pan = a[k].zSpan
24300 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d  ;.          a[k]
24310 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  .zName = 0;.    
24320 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e        a[k].zSpan
24330 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
24340 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78          a[k].pEx
24350 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  pr = 0;.      }e
24360 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
24370 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  This expression 
24380 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54  is a "*" or a "T
24390 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64  ABLE.*" and need
243a0 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20  s to be.        
243b0 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a  ** expanded. */.
243c0 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c          int tabl
243d0 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20  eSeen = 0;      
243e0 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e  /* Set to 1 when
243f0 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a   TABLE matches *
24400 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  /.        char *
24410 7a 54 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  zTName = 0;     
24420 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d    /* text of nam
24430 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20  e of TABLE */.  
24440 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
24450 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20  ==TK_DOT ){.    
24460 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
24470 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20  ->pLeft!=0 );.  
24480 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
24490 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
244a0 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49  (pE->pLeft, EP_I
244b0 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
244c0 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70        zTName = p
244d0 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b  E->pLeft->u.zTok
244e0 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  en;.        }.  
244f0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70        for(i=0, p
24500 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
24510 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
24520 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
24530 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62  ){.          Tab
24540 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
24550 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
24560 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d    Select *pSub =
24570 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
24580 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
24590 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f  *zTabName = pFro
245a0 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20  m->zAlias;.     
245b0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
245c0 2a 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 30  *zSchemaName = 0
245d0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
245e0 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69  iDb;.          i
245f0 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29  f( zTabName==0 )
24600 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54  {.            zT
24610 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a  abName = pTab->z
24620 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
24630 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
24640 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
24650 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
24660 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20      if( pSub==0 
24670 7c 7c 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61  || (pSub->selFla
24680 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72  gs & SF_NestedFr
24690 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  om)==0 ){.      
246a0 20 20 20 20 20 20 70 53 75 62 20 3d 20 30 3b 0a        pSub = 0;.
246b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
246c0 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65  zTName && sqlite
246d0 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c  3StrICmp(zTName,
246e0 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b   zTabName)!=0 ){
246f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
24700 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
24710 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
24720 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
24730 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
24740 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
24750 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 53  ;.            zS
24760 63 68 65 6d 61 4e 61 6d 65 20 3d 20 69 44 62 3e  chemaName = iDb>
24770 3d 30 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62  =0 ? db->aDb[iDb
24780 5d 2e 7a 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a 20  ].zName : "*";. 
24790 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
247a0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
247b0 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  pTab->nCol; j++)
247c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  {.            ch
247d0 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62  ar *zName = pTab
247e0 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ->aCol[j].zName;
247f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
24800 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a  r *zColname;  /*
24810 20 54 68 65 20 63 6f 6d 70 75 74 65 64 20 63 6f   The computed co
24820 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  lumn name */.   
24830 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
24840 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c  ToFree;   /* Mal
24850 6c 6f 63 65 64 20 73 74 72 69 6e 67 20 74 68 61  loced string tha
24860 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72  t needs to be fr
24870 65 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  eed */.         
24880 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d     Token sColnam
24890 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20  e;  /* Computed 
248a0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61  column name as a
248b0 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20   token */..     
248c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a         assert( z
248d0 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Name );.        
248e0 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26      if( zTName &
248f0 26 20 70 53 75 62 0a 20 20 20 20 20 20 20 20 20  & pSub.         
24900 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 4d 61      && sqlite3Ma
24910 74 63 68 53 70 61 6e 4e 61 6d 65 28 70 53 75 62  tchSpanName(pSub
24920 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  ->pEList->a[j].z
24930 53 70 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c  Span, 0, zTName,
24940 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20   0)==0.         
24950 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
24960 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
24970 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
24980 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61           /* If a
24990 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65   column is marke
249a0 64 20 61 73 20 27 68 69 64 64 65 6e 27 20 28 63  d as 'hidden' (c
249b0 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f  urrently only po
249c0 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 20  ssible.         
249d0 20 20 20 2a 2a 20 66 6f 72 20 76 69 72 74 75 61     ** for virtua
249e0 6c 20 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f  l tables), do no
249f0 74 20 69 6e 63 6c 75 64 65 20 69 74 20 69 6e 20  t include it in 
24a00 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20  the expanded.   
24a10 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75           ** resu
24a20 6c 74 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20 20  lt-set list..   
24a30 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
24a40 20 20 20 20 20 20 20 20 69 66 28 20 49 73 48 69          if( IsHi
24a50 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62  ddenColumn(&pTab
24a60 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20  ->aCol[j]) ){.  
24a70 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
24a80 72 74 28 49 73 56 69 72 74 75 61 6c 28 70 54 61  rt(IsVirtual(pTa
24a90 62 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  b));.           
24aa0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
24ab0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24ac0 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e         tableSeen
24ad0 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20   = 1;..         
24ae0 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a 54     if( i>0 && zT
24af0 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
24b00 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 46           if( (pF
24b10 72 6f 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  rom->jointype & 
24b20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20  JT_NATURAL)!=0. 
24b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
24b40 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e  & tableAndColumn
24b50 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2c 20  Index(pTabList, 
24b60 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a  i, zName, 0, 0).
24b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 7b                ){
24b80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24b90 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c   /* In a NATURAL
24ba0 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20   join, omit the 
24bb0 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  join columns fro
24bc0 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20  m the .         
24bd0 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
24be0 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20  to the right of 
24bf0 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20  the join */.    
24c00 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
24c10 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
24c20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
24c30 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
24c40 64 4c 69 73 74 49 6e 64 65 78 28 70 46 72 6f 6d  dListIndex(pFrom
24c50 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29  ->pUsing, zName)
24c60 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
24c70 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a         /* In a j
24c80 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47  oin with a USING
24c90 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f   clause, omit co
24ca0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20  lumns in the.   
24cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
24cc0 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f  using clause fro
24cd0 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74  m the table on t
24ce0 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20  he right. */.   
24cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
24d00 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
24d10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
24d20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
24d30 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65   pRight = sqlite
24d40 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c  3Expr(db, TK_ID,
24d50 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
24d60 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20       zColname = 
24d70 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
24d80 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a     zToFree = 0;.
24d90 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
24da0 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61  longNames || pTa
24db0 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b  bList->nSrc>1 ){
24dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45  .              E
24dd0 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20  xpr *pLeft;.    
24de0 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20            pLeft 
24df0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
24e00 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d  , TK_ID, zTabNam
24e10 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
24e20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
24e30 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
24e40 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52  K_DOT, pLeft, pR
24e50 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
24e60 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63 68          if( zSch
24e70 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  emaName ){.     
24e80 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
24e90 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
24ea0 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d  b, TK_ID, zSchem
24eb0 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  aName);.        
24ec0 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
24ed0 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
24ee0 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65  rse, TK_DOT, pLe
24ef0 66 74 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  ft, pExpr, 0);. 
24f00 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
24f10 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
24f20 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20   longNames ){.  
24f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43                zC
24f40 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  olname = sqlite3
24f50 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
24f60 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a  %s", zTabName, z
24f70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
24f80 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d         zToFree =
24f90 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20   zColname;.     
24fa0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24fb0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
24fc0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
24fd0 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20  r = pRight;.    
24fe0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24ff0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
25000 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
25010 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c  nd(pParse, pNew,
25020 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
25030 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 7a 20       sColname.z 
25040 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20  = zColname;.    
25050 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65          sColname
25060 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  .n = sqlite3Strl
25070 65 6e 33 30 28 7a 43 6f 6c 6e 61 6d 65 29 3b 0a  en30(zColname);.
25080 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
25090 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61  te3ExprListSetNa
250a0 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c  me(pParse, pNew,
250b0 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a   &sColname, 0);.
250c0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
250d0 70 4e 65 77 20 26 26 20 28 70 2d 3e 73 65 6c 46  pNew && (p->selF
250e0 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64  lags & SF_Nested
250f0 46 72 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20  From)!=0 ){.    
25100 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
25110 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
25120 70 58 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e  pX = &pNew->a[pN
25130 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  ew->nExpr-1];.  
25140 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
25150 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pSub ){.        
25160 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61          pX->zSpa
25170 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  n = sqlite3DbStr
25180 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 45  Dup(db, pSub->pE
25190 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e  List->a[j].zSpan
251a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
251b0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d     testcase( pX-
251c0 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20  >zSpan==0 );.   
251d0 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
251e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
251f0 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71    pX->zSpan = sq
25200 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
25210 20 22 25 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20   "%s.%s.%s",.   
25220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25240 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e          zSchemaN
25250 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a  ame, zTabName, z
25260 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  Colname);.      
25270 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
25280 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30  se( pX->zSpan==0
25290 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
252a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
252b0 20 20 70 58 2d 3e 62 53 70 61 6e 49 73 54 61 62    pX->bSpanIsTab
252c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
252d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
252e0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
252f0 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20  , zToFree);.    
25300 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25310 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 74  }.        if( !t
25320 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20  ableSeen ){.    
25330 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
25340 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
25350 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
25360 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
25370 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e   table: %s", zTN
25380 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
25390 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
253a0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
253b0 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74  sg(pParse, "no t
253c0 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22  ables specified"
253d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
253e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
253f0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
25400 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
25410 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  (db, pEList);.  
25420 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e    p->pEList = pN
25430 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49  ew;.  }.#if SQLI
25440 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20  TE_MAX_COLUMN.  
25450 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26  if( p->pEList &&
25460 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
25470 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  r>db->aLimit[SQL
25480 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
25490 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
254a0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
254b0 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d   "too many colum
254c0 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  ns in result set
254d0 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ");.  }.#endif. 
254e0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
254f0 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e  inue;.}../*.** N
25500 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72  o-op routine for
25510 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65 20   the parse-tree 
25520 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68  walker..**.** Wh
25530 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
25540 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45  is the Walker.xE
25550 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e  xprCallback then
25560 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
25570 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20  s.** are walked 
25580 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69  without any acti
25590 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20  ons being taken 
255a0 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50  at each node.  P
255b0 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68  resumably,.** wh
255c0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
255d0 69 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b  is used for Walk
255e0 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  er.xExprCallback
255f0 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72   then .** Walker
25600 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
25610 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f   is set to do so
25620 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66  mething useful f
25630 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62  or every .** sub
25640 71 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72  query in the par
25650 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61  ser tree..*/.sta
25660 74 69 63 20 69 6e 74 20 65 78 70 72 57 61 6c 6b  tic int exprWalk
25670 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74  Noop(Walker *Not
25680 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55  Used, Expr *NotU
25690 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
256a0 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
256b0 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
256c0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
256d0 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  inue;.}../*.** T
256e0 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70  his routine "exp
256f0 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20 73  ands" a SELECT s
25700 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c  tatement and all
25710 20 6f 66 20 69 74 73 20 73 75 62 71 75 65 72 69   of its subqueri
25720 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74  es..** For addit
25730 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
25740 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61  n on what it mea
25750 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61  ns to "expand" a
25760 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
25770 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f  ment, see the co
25780 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c  mment on the sel
25790 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72  ectExpand worker
257a0 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e   callback above.
257b0 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67  .**.** Expanding
257c0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
257d0 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74  ent is the first
257e0 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73   step in process
257f0 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20  ing a.** SELECT 
25800 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
25810 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
25820 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65   must be expande
25830 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65  d before.** name
25840 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70   resolution is p
25850 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20  erformed..**.** 
25860 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  If anything goes
25870 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72   wrong, an error
25880 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74   message is writ
25890 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e  ten into pParse.
258a0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
258b0 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74  function can det
258c0 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ect the problem 
258d0 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50  by looking at pP
258e0 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e  arse->nErr.** an
258f0 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d  d/or pParse->db-
25900 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a  >mallocFailed..*
25910 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
25920 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
25930 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  d(Parse *pParse,
25940 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
25950 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
25960 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
25970 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78  izeof(w));.  w.x
25980 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
25990 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77  xprWalkNoop;.  w
259a0 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
259b0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
259c0 68 61 73 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20  hasCompound ){. 
259d0 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c     w.xSelectCall
259e0 62 61 63 6b 20 3d 20 63 6f 6e 76 65 72 74 43 6f  back = convertCo
259f0 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75  mpoundSelectToSu
25a00 62 71 75 65 72 79 3b 0a 20 20 20 20 73 71 6c 69  bquery;.    sqli
25a10 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
25a20 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a  , pSelect);.  }.
25a30 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
25a40 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70 61  ack = selectExpa
25a50 6e 64 65 72 3b 0a 20 20 77 2e 78 53 65 6c 65 63  nder;.  w.xSelec
25a60 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c  tCallback2 = sel
25a70 65 63 74 50 6f 70 57 69 74 68 3b 0a 20 20 73 71  ectPopWith;.  sq
25a80 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
25a90 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a  &w, pSelect);.}.
25aa0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
25ab0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
25ac0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57  *.** This is a W
25ad0 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c  alker.xSelectCal
25ae0 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66  lback callback f
25af0 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 53 65  or the sqlite3Se
25b00 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a  lectTypeInfo().*
25b10 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a  * interface..**.
25b20 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d  ** For each FROM
25b30 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79  -clause subquery
25b40 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79  , add Column.zTy
25b50 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43  pe and Column.zC
25b60 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  oll.** informati
25b70 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20  on to the Table 
25b80 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
25b90 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65  epresents the re
25ba0 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74  sult set.** of t
25bb0 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a  hat subquery..**
25bc0 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74  .** The Table st
25bd0 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70  ructure that rep
25be0 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75  resents the resu
25bf0 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74  lt set was const
25c00 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c  ructed.** by sel
25c10 65 63 74 45 78 70 61 6e 64 65 72 28 29 20 62 75  ectExpander() bu
25c20 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 63  t the type and c
25c30 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61  ollation informa
25c40 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64  tion was omitted
25c50 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e  .** at that poin
25c60 74 20 62 65 63 61 75 73 65 20 69 64 65 6e 74 69  t because identi
25c70 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65  fiers had not ye
25c80 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e  t been resolved.
25c90 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
25ca0 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  e is called afte
25cb0 72 20 69 64 65 6e 74 69 66 69 65 72 20 72 65 73  r identifier res
25cc0 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  olution..*/.stat
25cd0 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64  ic void selectAd
25ce0 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66  dSubqueryTypeInf
25cf0 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  o(Walker *pWalke
25d00 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  r, Select *p){. 
25d10 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a   Parse *pParse;.
25d20 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69    int i;.  SrcLi
25d30 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20  st *pTabList;.  
25d40 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
25d50 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61  tem *pFrom;..  a
25d60 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61  ssert( p->selFla
25d70 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64  gs & SF_Resolved
25d80 20 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65   );.  if( (p->se
25d90 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54  lFlags & SF_HasT
25da0 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20  ypeInfo)==0 ){. 
25db0 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c     p->selFlags |
25dc0 3d 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  = SF_HasTypeInfo
25dd0 3b 0a 20 20 20 20 70 50 61 72 73 65 20 3d 20 70  ;.    pParse = p
25de0 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
25df0 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70      pTabList = p
25e00 2d 3e 70 53 72 63 3b 0a 20 20 20 20 66 6f 72 28  ->pSrc;.    for(
25e10 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
25e20 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
25e30 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
25e40 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 54  From++){.      T
25e50 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72  able *pTab = pFr
25e60 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  om->pTab;.      
25e70 69 66 28 20 41 4c 57 41 59 53 28 70 54 61 62 21  if( ALWAYS(pTab!
25e80 3d 30 29 20 26 26 20 28 70 54 61 62 2d 3e 74 61  =0) && (pTab->ta
25e90 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65  bFlags & TF_Ephe
25ea0 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20  meral)!=0 ){.   
25eb0 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75       /* A sub-qu
25ec0 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ery in the FROM 
25ed0 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
25ee0 43 54 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65  CT */.        Se
25ef0 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72  lect *pSel = pFr
25f00 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
25f10 20 20 20 20 20 69 66 28 20 70 53 65 6c 20 29 7b       if( pSel ){
25f20 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
25f30 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29  ( pSel->pPrior )
25f40 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50   pSel = pSel->pP
25f50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rior;.          
25f60 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  selectAddColumnT
25f70 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
25f80 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53  pParse, pTab, pS
25f90 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  el);.        }. 
25fa0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
25fb0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
25fc0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
25fd0 64 64 73 20 64 61 74 61 74 79 70 65 20 61 6e 64  dds datatype and
25fe0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
25ff0 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nce information 
26000 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20  to.** the Table 
26010 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c  structures of al
26020 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  l FROM-clause su
26030 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a  bqueries in a.**
26040 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
26050 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69  t..**.** Use thi
26060 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20  s routine after 
26070 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e  name resolution.
26080 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
26090 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
260a0 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a  TypeInfo(Parse *
260b0 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
260c0 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65  pSelect){.#ifnde
260d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
260e0 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20  BQUERY.  Walker 
260f0 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  w;.  memset(&w, 
26100 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
26110 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
26120 63 6b 32 20 3d 20 73 65 6c 65 63 74 41 64 64 53  ck2 = selectAddS
26130 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b  ubqueryTypeInfo;
26140 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
26150 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f  ck = exprWalkNoo
26160 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20  p;.  w.pParse = 
26170 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65  pParse;.  sqlite
26180 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
26190 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66  pSelect);.#endif
261a0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
261b0 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20  routine sets up 
261c0 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
261d0 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  nt for processin
261e0 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f  g.  The.** follo
261f0 77 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69  wing is accompli
26200 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  shed:.**.**     
26210 2a 20 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e  *  VDBE Cursor n
26220 75 6d 62 65 72 73 20 61 72 65 20 61 73 73 69 67  umbers are assig
26230 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d  ned to all FROM-
26240 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
26250 20 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61       *  Ephemera
26260 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20  l Table objects 
26270 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20  are created for 
26280 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
26290 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20  subqueries..**  
262a0 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49     *  ON and USI
262b0 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 73  NG clauses are s
262c0 68 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52  hifted into WHER
262d0 45 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  E statements.** 
262e0 20 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73      *  Wildcards
262f0 20 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e   "*" and "TABLE.
26300 2a 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  *" in result set
26310 73 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a  s are expanded..
26320 2a 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69  **     *  Identi
26330 66 69 65 72 73 20 69 6e 20 65 78 70 72 65 73 73  fiers in express
26340 69 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20  ion are matched 
26350 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  to tables..**.**
26360 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
26370 74 73 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f  ts recursively o
26380 6e 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73  n all subqueries
26390 20 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45   within the SELE
263a0 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  CT..*/.void sqli
263b0 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20  te3SelectPrep(. 
263c0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
263d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
263e0 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
263f0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
26400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
26410 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
26420 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
26430 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
26440 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61  *pOuterNC  /* Na
26450 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63  me context for c
26460 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20  ontainer */.){. 
26470 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
26480 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
26490 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d  ) return;.  db =
264a0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
264b0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
264c0 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
264d0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
264e0 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  & SF_HasTypeInfo
264f0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
26500 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
26510 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69  (pParse, p);.  i
26520 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
26530 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
26540 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
26550 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65  sqlite3ResolveSe
26560 6c 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65  lectNames(pParse
26570 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a  , p, pOuterNC);.
26580 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
26590 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
265a0 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
265b0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
265c0 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72  AddTypeInfo(pPar
265d0 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  se, p);.}../*.**
265e0 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65   Reset the aggre
265f0 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
26600 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72  ..**.** The aggr
26610 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
26620 72 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65  r is a set of me
26630 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20  mory cells that 
26640 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64  hold.** intermed
26650 69 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69  iate results whi
26660 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61  le calculating a
26670 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68  n aggregate.  Th
26680 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65  is.** routine ge
26690 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61  nerates code tha
266a0 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69  t stores NULLs i
266b0 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d  n all of those m
266c0 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a  emory.** cells..
266d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
266e0 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
266f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
26700 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
26710 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
26720 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
26730 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
26740 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
26750 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20  unc;.  int nReg 
26760 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  = pAggInfo->nFun
26770 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  c + pAggInfo->nC
26780 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65  olumn;.  if( nRe
26790 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23  g==0 ) return;.#
267a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
267b0 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  UG.  /* Verify t
267c0 68 61 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20  hat all AggInfo 
267d0 72 65 67 69 73 74 65 72 73 20 61 72 65 20 77 69  registers are wi
267e0 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20 73  thin the range s
267f0 70 65 63 69 66 69 65 64 20 62 79 0a 20 20 2a 2a  pecified by.  **
26800 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e   AggInfo.mnReg..
26810 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f  AggInfo.mxReg */
26820 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 67 3d  .  assert( nReg=
26830 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67  =pAggInfo->mxReg
26840 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67  -pAggInfo->mnReg
26850 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  +1 );.  for(i=0;
26860 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f   i<pAggInfo->nCo
26870 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
26880 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f  assert( pAggInfo
26890 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d  ->aCol[i].iMem>=
268a0 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a  pAggInfo->mnReg.
268b0 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67           && pAgg
268c0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d  Info->aCol[i].iM
268d0 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78  em<=pAggInfo->mx
268e0 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  Reg );.  }.  for
268f0 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
26900 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20  ->nFunc; i++){. 
26910 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49     assert( pAggI
26920 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d  nfo->aFunc[i].iM
26930 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e  em>=pAggInfo->mn
26940 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20  Reg.         && 
26950 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
26960 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66  i].iMem<=pAggInf
26970 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a  o->mxReg );.  }.
26980 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
26990 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
269a0 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e  _Null, 0, pAggIn
269b0 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49  fo->mnReg, pAggI
269c0 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66  nfo->mxReg);.  f
269d0 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66  or(pFunc=pAggInf
269e0 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69  o->aFunc, i=0; i
269f0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
26a00 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b  ; i++, pFunc++){
26a10 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  .    if( pFunc->
26a20 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
26a30 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
26a40 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20   pFunc->pExpr;. 
26a50 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
26a60 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
26a70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
26a80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  );.      if( pE-
26a90 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  >x.pList==0 || p
26aa0 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  E->x.pList->nExp
26ab0 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  r!=1 ){.        
26ac0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
26ad0 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43  pParse, "DISTINC
26ae0 54 20 61 67 67 72 65 67 61 74 65 73 20 6d 75 73  T aggregates mus
26af0 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f  t have exactly o
26b00 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ne ".           
26b10 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20  "argument");.   
26b20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73       pFunc->iDis
26b30 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
26b40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26b50 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
26b60 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
26b70 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
26b80 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c   pE->x.pList, 0,
26b90 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
26ba0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
26bb0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
26bc0 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74  al, pFunc->iDist
26bd0 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20  inct, 0, 0,.    
26be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bf0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
26c00 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
26c10 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  O);.      }.    
26c20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
26c30 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67  nvoke the OP_Agg
26c40 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20  Finalize opcode 
26c50 66 6f 72 20 65 76 65 72 79 20 61 67 67 72 65 67  for every aggreg
26c60 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ate function.** 
26c70 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73  in the AggInfo s
26c80 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
26c90 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a  tic void finaliz
26ca0 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61  eAggFunctions(Pa
26cb0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
26cc0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
26cd0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
26ce0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
26cf0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
26d00 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a  gInfo_func *pF;.
26d10 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41    for(i=0, pF=pA
26d20 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69  ggInfo->aFunc; i
26d30 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
26d40 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20  ; i++, pF++){.  
26d50 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
26d60 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78  t = pF->pExpr->x
26d70 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65  .pList;.    asse
26d80 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
26d90 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20  erty(pF->pExpr, 
26da0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
26db0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
26dc0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67  AddOp4(v, OP_Agg
26dd0 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c  Final, pF->iMem,
26de0 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e   pList ? pList->
26df0 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20  nExpr : 0, 0,.  
26e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e10 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70      (void*)pF->p
26e20 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46  Func, P4_FUNCDEF
26e30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
26e40 55 70 64 61 74 65 20 74 68 65 20 61 63 63 75 6d  Update the accum
26e50 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65  ulator memory ce
26e60 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65  lls for an aggre
26e70 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  gate based on.**
26e80 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
26e90 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f  sor position..*/
26ea0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70 64  .static void upd
26eb0 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50  ateAccumulator(P
26ec0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
26ed0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
26ee0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
26ef0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
26f00 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 65 67 48  nt i;.  int regH
26f10 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64  it = 0;.  int ad
26f20 64 72 48 69 74 54 65 73 74 20 3d 20 30 3b 0a 20  drHitTest = 0;. 
26f30 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
26f40 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75  func *pF;.  stru
26f50 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
26f60 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d  pC;..  pAggInfo-
26f70 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b  >directMode = 1;
26f80 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70  .  for(i=0, pF=p
26f90 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20  AggInfo->aFunc; 
26fa0 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
26fb0 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20  c; i++, pF++){. 
26fc0 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20     int nArg;.   
26fd0 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20   int addrNext = 
26fe0 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67  0;.    int regAg
26ff0 67 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  g;.    ExprList 
27000 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78  *pList = pF->pEx
27010 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
27020 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
27030 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45  sProperty(pF->pE
27040 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
27050 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
27060 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72  ist ){.      nAr
27070 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  g = pList->nExpr
27080 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d  ;.      regAgg =
27090 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
270a0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72  ange(pParse, nAr
270b0 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
270c0 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
270d0 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  t(pParse, pList,
270e0 20 72 65 67 41 67 67 2c 20 53 51 4c 49 54 45 5f   regAgg, SQLITE_
270f0 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20 7d  ECEL_DUP);.    }
27100 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67  else{.      nArg
27110 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41   = 0;.      regA
27120 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  gg = 0;.    }.  
27130 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69    if( pF->iDisti
27140 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  nct>=0 ){.      
27150 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74  addrNext = sqlit
27160 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
27170 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  v);.      assert
27180 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20  ( nArg==1 );.   
27190 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28     codeDistinct(
271a0 70 50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69 73  pParse, pF->iDis
271b0 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c  tinct, addrNext,
271c0 20 31 2c 20 72 65 67 41 67 67 29 3b 0a 20 20 20   1, regAgg);.   
271d0 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70   }.    if( pF->p
271e0 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20  Func->funcFlags 
271f0 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
27200 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20  EDCOLL ){.      
27210 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
27220 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74   0;.      struct
27230 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
27240 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74  pItem;.      int
27250 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   j;.      assert
27260 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f  ( pList!=0 );  /
27270 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46  * pList!=0 if pF
27280 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45 44  ->pFunc has NEED
27290 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f  COLL */.      fo
272a0 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(j=0, pItem=pLi
272b0 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26  st->a; !pColl &&
272c0 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49   j<nArg; j++, pI
272d0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
272e0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
272f0 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
27300 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  e, pItem->pExpr)
27310 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27320 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
27330 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50        pColl = pP
27340 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
27350 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
27360 20 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d 30     if( regHit==0
27370 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41   && pAggInfo->nA
27380 63 63 75 6d 75 6c 61 74 6f 72 20 29 20 72 65 67  ccumulator ) reg
27390 48 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Hit = ++pParse->
273a0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
273b0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
273c0 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72 65 67   OP_CollSeq, reg
273d0 48 69 74 2c 20 30 2c 20 30 2c 20 28 63 68 61 72  Hit, 0, 0, (char
273e0 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c   *)pColl, P4_COL
273f0 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20  LSEQ);.    }.   
27400 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
27410 70 34 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70  p4(v, OP_AggStep
27420 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46 2d  , 0, regAgg, pF-
27430 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20  >iMem,.         
27440 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
27450 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50  id*)pF->pFunc, P
27460 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  4_FUNCDEF);.    
27470 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
27480 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67 29  eP5(v, (u8)nArg)
27490 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
274a0 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
274b0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
274c0 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20  Agg, nArg);.    
274d0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
274e0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
274f0 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20  regAgg, nArg);. 
27500 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74 20     if( addrNext 
27510 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
27520 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
27530 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20  (v, addrNext);. 
27540 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
27550 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
27560 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
27570 20 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70 75 6c   /* Before popul
27580 61 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75  ating the accumu
27590 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 2c  lator registers,
275a0 20 63 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d   clear the colum
275b0 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f 74  n cache..  ** Ot
275c0 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 79 20  herwise, if any 
275d0 6f 66 20 74 68 65 20 72 65 71 75 69 72 65 64 20  of the required 
275e0 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61 72  column values ar
275f0 65 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e  e already presen
27600 74 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69 73  t .  ** in regis
27610 74 65 72 73 2c 20 73 71 6c 69 74 65 33 45 78 70  ters, sqlite3Exp
27620 72 43 6f 64 65 28 29 20 6d 61 79 20 75 73 65 20  rCode() may use 
27630 4f 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70 79  OP_SCopy to copy
27640 20 74 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20   the value.  ** 
27650 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75 74  to pC->iMem. But
27660 20 62 79 20 74 68 65 20 74 69 6d 65 20 74 68 65   by the time the
27670 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 2c 20   value is used, 
27680 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 72 65 67  the original reg
27690 69 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20 68  ister.  ** may h
276a0 61 76 65 20 62 65 65 6e 20 75 73 65 64 2c 20 69  ave been used, i
276b0 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20  nvalidating the 
276c0 75 6e 64 65 72 6c 79 69 6e 67 20 62 75 66 66 65  underlying buffe
276d0 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20  r holding the.  
276e0 2a 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 20  ** text or blob 
276f0 76 61 6c 75 65 2e 20 53 65 65 20 74 69 63 6b 65  value. See ticke
27700 74 20 5b 38 38 33 30 33 34 64 63 62 35 5d 2e 0a  t [883034dcb5]..
27710 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68 65    **.  ** Anothe
27720 72 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c 64  r solution would
27730 20 62 65 20 74 6f 20 63 68 61 6e 67 65 20 74 68   be to change th
27740 65 20 4f 50 5f 53 43 6f 70 79 20 75 73 65 64 20  e OP_SCopy used 
27750 74 6f 20 63 6f 70 79 20 63 61 63 68 65 64 0a 20  to copy cached. 
27760 20 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20 61 6e   ** values to an
27770 20 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20   OP_Copy..  */. 
27780 20 69 66 28 20 72 65 67 48 69 74 20 29 7b 0a 20   if( regHit ){. 
27790 20 20 20 61 64 64 72 48 69 74 54 65 73 74 20 3d     addrHitTest =
277a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
277b0 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p1(v, OP_If, reg
277c0 48 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  Hit); VdbeCovera
277d0 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ge(v);.  }.  sql
277e0 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
277f0 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f  ar(pParse);.  fo
27800 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e  r(i=0, pC=pAggIn
27810 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67  fo->aCol; i<pAgg
27820 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74  Info->nAccumulat
27830 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a  or; i++, pC++){.
27840 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
27850 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e  ode(pParse, pC->
27860 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29  pExpr, pC->iMem)
27870 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f  ;.  }.  pAggInfo
27880 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30  ->directMode = 0
27890 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
278a0 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
278b0 29 3b 0a 20 20 69 66 28 20 61 64 64 72 48 69 74  );.  if( addrHit
278c0 54 65 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Test ){.    sqli
278d0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
278e0 76 2c 20 61 64 64 72 48 69 74 54 65 73 74 29 3b  v, addrHitTest);
278f0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
27900 64 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78  d a single OP_Ex
27910 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f  plain instructio
27920 6e 20 74 6f 20 74 68 65 20 56 44 42 45 20 74 6f  n to the VDBE to
27930 20 65 78 70 6c 61 69 6e 20 61 20 73 69 6d 70 6c   explain a simpl
27940 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71 75  e.** count(*) qu
27950 65 72 79 20 28 22 53 45 4c 45 43 54 20 63 6f 75  ery ("SELECT cou
27960 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54 61 62 22  nt(*) FROM pTab"
27970 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  )..*/.#ifndef SQ
27980 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
27990 4e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  N.static void ex
279a0 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74  plainSimpleCount
279b0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
279c0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
279d0 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
279e0 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
279f0 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *pTab,          
27a00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
27a10 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  le being queried
27a20 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
27a30 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x               
27a40 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75        /* Index u
27a50 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  sed to optimize 
27a60 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  scan, or NULL */
27a70 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  .){.  if( pParse
27a80 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
27a90 20 20 20 20 63 68 61 72 20 2a 7a 45 71 70 20 3d      char *zEqp =
27aa0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
27ab0 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 53 43 41  pParse->db, "SCA
27ac0 4e 20 54 41 42 4c 45 20 25 73 25 73 25 73 22 2c  N TABLE %s%s%s",
27ad0 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  .        pTab->z
27ae0 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70  Name, .        p
27af0 49 64 78 20 3f 20 22 20 55 53 49 4e 47 20 43 4f  Idx ? " USING CO
27b00 56 45 52 49 4e 47 20 49 4e 44 45 58 20 22 20 3a  VERING INDEX " :
27b10 20 22 22 2c 0a 20 20 20 20 20 20 20 20 70 49 64   "",.        pId
27b20 78 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20  x ? pIdx->zName 
27b30 3a 20 22 22 0a 20 20 20 20 29 3b 0a 20 20 20 20  : "".    );.    
27b40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
27b50 34 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  4(.        pPars
27b60 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 45 78 70  e->pVdbe, OP_Exp
27b70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53  lain, pParse->iS
27b80 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a  electId, 0, 0, z
27b90 45 71 70 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a  Eqp, P4_DYNAMIC.
27ba0 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c      );.  }.}.#el
27bb0 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  se.# define expl
27bc0 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61  ainSimpleCount(a
27bd0 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,b,c).#endif../*
27be0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
27bf0 65 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43 54  e for the SELECT
27c00 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e   statement given
27c10 20 69 6e 20 74 68 65 20 70 20 61 72 67 75 6d 65   in the p argume
27c20 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nt.  .**.** The 
27c30 72 65 73 75 6c 74 73 20 61 72 65 20 72 65 74 75  results are retu
27c40 72 6e 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74  rned according t
27c50 6f 20 74 68 65 20 53 65 6c 65 63 74 44 65 73 74  o the SelectDest
27c60 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 53   structure..** S
27c70 65 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 73  ee comments in s
27c80 71 6c 69 74 65 49 6e 74 2e 68 20 66 6f 72 20 66  qliteInt.h for f
27c90 75 72 74 68 65 72 20 69 6e 66 6f 72 6d 61 74 69  urther informati
27ca0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  on..**.** This r
27cb0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
27cc0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
27cd0 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72  ors.  If any err
27ce0 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75  ors are.** encou
27cf0 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20  ntered, then an 
27d00 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
27d10 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66  r message is lef
27d20 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e  t in.** pParse->
27d30 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54  zErrMsg..**.** T
27d40 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
27d50 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65   NOT free the Se
27d60 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70  lect structure p
27d70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a  assed in.  The.*
27d80 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * calling functi
27d90 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74  on needs to do t
27da0 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  hat..*/.int sqli
27db0 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72  te3Select(.  Par
27dc0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
27dd0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
27de0 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
27df0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
27e00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
27e10 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
27e20 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20  ing coded. */.  
27e30 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
27e40 74 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  t      /* What t
27e50 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 71 75  o do with the qu
27e60 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
27e70 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
27e80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
27e90 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
27ea0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
27eb0 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72  fo;     /* Retur
27ec0 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68  n from sqlite3Wh
27ed0 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20  ereBegin() */.  
27ee0 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
27ef0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
27f00 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e  rtual machine un
27f10 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
27f20 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b   */.  int isAgg;
27f30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27f40 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20  True for select 
27f50 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e  lists like "coun
27f60 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c  t(*)" */.  ExprL
27f70 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
27f80 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c    /* List of col
27f90 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e  umns to extract.
27fa0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
27fb0 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20  TabList;     /* 
27fc0 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74  List of tables t
27fd0 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f  o select from */
27fe0 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
27ff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
28000 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
28010 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
28020 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75   ExprList *pGrou
28030 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47  pBy;    /* The G
28040 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
28050 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
28060 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b    Expr *pHaving;
28070 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
28080 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20  HAVING clause.  
28090 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
280a0 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20   int rc = 1;    
280b0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
280c0 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20   to return from 
280d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
280e0 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 73  .  DistinctCtx s
280f0 44 69 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66  Distinct; /* Inf
28100 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65  o on how to code
28110 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
28120 79 77 6f 72 64 20 2a 2f 0a 20 20 53 6f 72 74 43  yword */.  SortC
28130 74 78 20 73 53 6f 72 74 3b 20 20 20 20 20 20 20  tx sSort;       
28140 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77    /* Info on how
28150 20 74 6f 20 63 6f 64 65 20 74 68 65 20 4f 52 44   to code the ORD
28160 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
28170 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e    AggInfo sAggIn
28180 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f  fo;      /* Info
28190 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20  rmation used by 
281a0 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
281b0 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b  s */.  int iEnd;
281c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
281d0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
281e0 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72 79  end of the query
281f0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
28200 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b;           /* 
28210 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
28220 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e  nection */..#ifn
28230 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
28240 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 52  EXPLAIN.  int iR
28250 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64 20 3d  estoreSelectId =
28260 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
28270 49 64 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 53  Id;.  pParse->iS
28280 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73 65  electId = pParse
28290 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 2b  ->iNextSelectId+
282a0 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 20  +;.#endif..  db 
282b0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
282c0 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e  if( p==0 || db->
282d0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
282e0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
282f0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
28300 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  }.  if( sqlite3A
28310 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
28320 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20   SQLITE_SELECT, 
28330 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  0, 0, 0) ) retur
28340 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  n 1;.  memset(&s
28350 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  AggInfo, 0, size
28360 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a  of(sAggInfo));..
28370 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
28380 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73  derBy==0 || pDes
28390 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69  t->eDest!=SRT_Di
283a0 73 74 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65  stFifo );.  asse
283b0 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
283c0 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  =0 || pDest->eDe
283d0 73 74 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a  st!=SRT_Fifo );.
283e0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
283f0 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73  derBy==0 || pDes
28400 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69  t->eDest!=SRT_Di
28410 73 74 51 75 65 75 65 20 29 3b 0a 20 20 61 73 73  stQueue );.  ass
28420 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
28430 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ==0 || pDest->eD
28440 65 73 74 21 3d 53 52 54 5f 51 75 65 75 65 20 29  est!=SRT_Queue )
28450 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c  ;.  if( Ignorabl
28460 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20  eOrderby(pDest) 
28470 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70 44  ){.    assert(pD
28480 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
28490 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d  Exists || pDest-
284a0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f  >eDest==SRT_Unio
284b0 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  n || .          
284c0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
284d0 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65  RT_Except || pDe
284e0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44  st->eDest==SRT_D
284f0 69 73 63 61 72 64 20 7c 7c 0a 20 20 20 20 20 20  iscard ||.      
28500 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73       pDest->eDes
28510 74 3d 3d 53 52 54 5f 51 75 65 75 65 20 20 7c 7c  t==SRT_Queue  ||
28520 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
28530 52 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20  RT_DistFifo ||. 
28540 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d            pDest-
28550 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74  >eDest==SRT_Dist
28560 51 75 65 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e  Queue || pDest->
28570 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29  eDest==SRT_Fifo)
28580 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52 44 45  ;.    /* If ORDE
28590 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69  R BY makes no di
285a0 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65 20  fference in the 
285b0 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65 69 74  output then neit
285c0 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20  her does.    ** 
285d0 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74 20 63  DISTINCT so it c
285e0 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20 74 6f  an be removed to
285f0 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  o. */.    sqlite
28600 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
28610 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  db, p->pOrderBy)
28620 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
28630 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65  y = 0;.    p->se
28640 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69  lFlags &= ~SF_Di
28650 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71  stinct;.  }.  sq
28660 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
28670 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20  pParse, p, 0);. 
28680 20 6d 65 6d 73 65 74 28 26 73 53 6f 72 74 2c 20   memset(&sSort, 
28690 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f 72 74 29  0, sizeof(sSort)
286a0 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f 72 64 65  );.  sSort.pOrde
286b0 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
286c0 79 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  y;.  pTabList = 
286d0 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  p->pSrc;.  pELis
286e0 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
286f0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
28700 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
28710 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
28720 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
28730 7d 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d 3e  }.  isAgg = (p->
28740 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
28750 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 61  gregate)!=0;.  a
28760 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
28770 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20   );..  /* Begin 
28780 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e  generating code.
28790 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
287a0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
287b0 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
287c0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
287d0 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69  ;..  /* If writi
287e0 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20  ng to memory or 
287f0 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74  generating a set
28800 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e  .  ** only a sin
28810 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62  gle column may b
28820 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23  e output..  */.#
28830 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
28840 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66  IT_SUBQUERY.  if
28850 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43  ( checkForMultiC
28860 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72  olumnSelectError
28870 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20  (pParse, pDest, 
28880 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  pEList->nExpr) )
28890 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  {.    goto selec
288a0 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69  t_end;.  }.#endi
288b0 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  f..  /* Generate
288c0 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75   code for all su
288d0 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  b-queries in the
288e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a   FROM clause.  *
288f0 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
28900 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
28910 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
28920 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
28930 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70  W).  for(i=0; !p
28940 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54  ->pPrior && i<pT
28950 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
28960 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
28970 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
28980 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
28990 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74  a[i];.    Select
289a0 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53  Dest dest;.    S
289b0 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49  elect *pSub = pI
289c0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
289d0 20 20 69 6e 74 20 69 73 41 67 67 53 75 62 3b 0a    int isAggSub;.
289e0 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30  .    if( pSub==0
289f0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
28a00 20 20 2f 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74    /* Sometimes t
28a10 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 75  he code for a su
28a20 62 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20 67  bquery will be g
28a30 65 6e 65 72 61 74 65 64 20 6d 6f 72 65 20 74 68  enerated more th
28a40 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63 65 2c 20  an.    ** once, 
28a50 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
28a60 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 57  is part of the W
28a70 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 61  HERE clause in a
28a80 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20 20 20 20   LEFT JOIN,.    
28a90 2a 2a 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20  ** for example. 
28aa0 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64   In that case, d
28ab0 6f 20 6e 6f 74 20 72 65 67 65 6e 65 72 61 74 65  o not regenerate
28ac0 20 74 68 65 20 63 6f 64 65 20 74 6f 20 6d 61 6e   the code to man
28ad0 69 66 65 73 74 0a 20 20 20 20 2a 2a 20 61 20 76  ifest.    ** a v
28ae0 69 65 77 20 6f 72 20 74 68 65 20 63 6f 2d 72 6f  iew or the co-ro
28af0 75 74 69 6e 65 20 74 6f 20 69 6d 70 6c 65 6d 65  utine to impleme
28b00 6e 74 20 61 20 76 69 65 77 2e 20 20 54 68 65 20  nt a view.  The 
28b10 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65 0a 20  first instance. 
28b20 20 20 20 2a 2a 20 69 73 20 73 75 66 66 69 63 69     ** is suffici
28b30 65 6e 74 2c 20 74 68 6f 75 67 68 20 74 68 65 20  ent, though the 
28b40 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61  subroutine to ma
28b50 6e 69 66 65 73 74 20 74 68 65 20 76 69 65 77 20  nifest the view 
28b60 64 6f 65 73 20 6e 65 65 64 0a 20 20 20 20 2a 2a  does need.    **
28b70 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 61   to be invoked a
28b80 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  gain. */.    if(
28b90 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
28ba0 53 75 62 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Sub ){.      if(
28bb0 20 70 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75   pItem->viaCorou
28bc0 74 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tine==0 ){.     
28bd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
28be0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
28bf0 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
28c00 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  rn, pItem->addrF
28c10 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 20 20 7d  illSub);.      }
28c20 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
28c30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
28c40 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e  ncrement Parse.n
28c50 48 65 69 67 68 74 20 62 79 20 74 68 65 20 68 65  Height by the he
28c60 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61 72 67  ight of the larg
28c70 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  est expression. 
28c80 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66 65 72     ** tree refer
28c90 72 65 64 20 74 6f 20 62 79 20 74 68 69 73 2c 20  red to by this, 
28ca0 74 68 65 20 70 61 72 65 6e 74 20 73 65 6c 65 63  the parent selec
28cb0 74 2e 20 54 68 65 20 63 68 69 6c 64 20 73 65 6c  t. The child sel
28cc0 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63  ect.    ** may c
28cd0 6f 6e 74 61 69 6e 20 65 78 70 72 65 73 73 69 6f  ontain expressio
28ce0 6e 20 74 72 65 65 73 20 6f 66 20 61 74 20 6d 6f  n trees of at mo
28cf0 73 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49 54  st.    ** (SQLIT
28d00 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
28d10 2d 50 61 72 73 65 2e 6e 48 65 69 67 68 74 29 20  -Parse.nHeight) 
28d20 68 65 69 67 68 74 2e 20 54 68 69 73 20 69 73 20  height. This is 
28d30 61 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72  a bit.    ** mor
28d40 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 74  e conservative t
28d50 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2c 20 62  han necessary, b
28d60 75 74 20 6d 75 63 68 20 65 61 73 69 65 72 20 74  ut much easier t
28d70 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20  han enforcing.  
28d80 20 20 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c 69    ** an exact li
28d90 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mit..    */.    
28da0 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20  pParse->nHeight 
28db0 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  += sqlite3Select
28dc0 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 0a  ExprHeight(p);..
28dd0 20 20 20 20 69 73 41 67 67 53 75 62 20 3d 20 28      isAggSub = (
28de0 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
28df0 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d   SF_Aggregate)!=
28e00 30 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74  0;.    if( flatt
28e10 65 6e 53 75 62 71 75 65 72 79 28 70 50 61 72 73  enSubquery(pPars
28e20 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67 2c 20  e, p, i, isAgg, 
28e30 69 73 41 67 67 53 75 62 29 20 29 7b 0a 20 20 20  isAggSub) ){.   
28e40 20 20 20 2f 2a 20 54 68 69 73 20 73 75 62 71 75     /* This subqu
28e50 65 72 79 20 63 61 6e 20 62 65 20 61 62 73 6f 72  ery can be absor
28e60 62 65 64 20 69 6e 74 6f 20 69 74 73 20 70 61 72  bed into its par
28e70 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ent. */.      if
28e80 28 20 69 73 41 67 67 53 75 62 20 29 7b 0a 20 20  ( isAggSub ){.  
28e90 20 20 20 20 20 20 69 73 41 67 67 20 3d 20 31 3b        isAgg = 1;
28ea0 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46  .        p->selF
28eb0 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65  lags |= SF_Aggre
28ec0 67 61 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  gate;.      }.  
28ed0 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20      i = -1;.    
28ee0 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 4c 69  }else if( pTabLi
28ef0 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20  st->nSrc==1.    
28f00 20 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69         && Optimi
28f10 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
28f20 2c 20 53 51 4c 49 54 45 5f 53 75 62 71 43 6f 72  , SQLITE_SubqCor
28f30 6f 75 74 69 6e 65 29 0a 20 20 20 20 29 7b 0a 20  outine).    ){. 
28f40 20 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e       /* Implemen
28f50 74 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74  t a co-routine t
28f60 68 61 74 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  hat will return 
28f70 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
28f80 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20  the result.     
28f90 20 2a 2a 20 73 65 74 20 6f 6e 20 65 61 63 68 20   ** set on each 
28fa0 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20  invocation..    
28fb0 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61    */.      int a
28fc0 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ddrTop = sqlite3
28fd0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
28fe0 76 29 2b 31 3b 0a 20 20 20 20 20 20 70 49 74 65  v)+1;.      pIte
28ff0 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  m->regReturn = +
29000 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
29010 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
29020 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69  AddOp3(v, OP_Ini
29030 74 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65  tCoroutine, pIte
29040 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 30 2c  m->regReturn, 0,
29050 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 20   addrTop);.     
29060 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
29070 20 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54   "%s", pItem->pT
29080 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ab->zName));.   
29090 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69     pItem->addrFi
290a0 6c 6c 53 75 62 20 3d 20 61 64 64 72 54 6f 70 3b  llSub = addrTop;
290b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
290c0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
290d0 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st, SRT_Coroutin
290e0 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  e, pItem->regRet
290f0 75 72 6e 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  urn);.      expl
29100 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 49  ainSetInteger(pI
29110 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  tem->iSelectId, 
29120 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e 65 78  (u8)pParse->iNex
29130 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
29140 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
29150 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64  pParse, pSub, &d
29160 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65  est);.      pIte
29170 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67  m->pTab->nRowLog
29180 45 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Est = sqlite3Log
29190 45 73 74 28 70 53 75 62 2d 3e 6e 53 65 6c 65 63  Est(pSub->nSelec
291a0 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 70 49 74  tRow);.      pIt
291b0 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65  em->viaCoroutine
291c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65   = 1;.      pIte
291d0 6d 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 64  m->regResult = d
291e0 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 20 20 20  est.iSdst;.     
291f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
29200 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f  p1(v, OP_EndCoro
29210 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65  utine, pItem->re
29220 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
29230 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
29240 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 2d 31  ere(v, addrTop-1
29250 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
29260 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
29270 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  e(pParse);.    }
29280 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 47  else{.      /* G
29290 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
292a0 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 66  tine that will f
292b0 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ill an ephemeral
292c0 20 74 61 62 6c 65 20 77 69 74 68 0a 20 20 20 20   table with.    
292d0 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74    ** the content
292e0 20 6f 66 20 74 68 69 73 20 73 75 62 71 75 65 72   of this subquer
292f0 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  y.  pItem->addrF
29300 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f 69 6e  illSub will poin
29310 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68  t.      ** to th
29320 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
29330 20 67 65 6e 65 72 61 74 65 64 20 73 75 62 72 6f   generated subro
29340 75 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d 3e 72  utine.  pItem->r
29350 65 67 52 65 74 75 72 6e 0a 20 20 20 20 20 20 2a  egReturn.      *
29360 2a 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20  * is a register 
29370 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c  allocated to hol
29380 64 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  d the subroutine
29390 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 0a   return address.
293a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
293b0 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20 20 20 20  nt topAddr;.    
293c0 20 20 69 6e 74 20 6f 6e 63 65 41 64 64 72 20 3d    int onceAddr =
293d0 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65   0;.      int re
293e0 74 41 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73  tAddr;.      ass
293f0 65 72 74 28 20 70 49 74 65 6d 2d 3e 61 64 64 72  ert( pItem->addr
29400 46 69 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20  FillSub==0 );.  
29410 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65      pItem->regRe
29420 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  turn = ++pParse-
29430 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70  >nMem;.      top
29440 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
29450 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
29460 6e 74 65 67 65 72 2c 20 30 2c 20 70 49 74 65 6d  nteger, 0, pItem
29470 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
29480 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46      pItem->addrF
29490 69 6c 6c 53 75 62 20 3d 20 74 6f 70 41 64 64 72  illSub = topAddr
294a0 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  +1;.      if( pI
294b0 74 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65  tem->isCorrelate
294c0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
294d0 2f 2a 20 49 66 20 74 68 65 20 73 75 62 71 75 65  /* If the subque
294e0 72 79 20 69 73 20 6e 6f 74 20 63 6f 72 72 65 6c  ry is not correl
294f0 61 74 65 64 20 61 6e 64 20 69 66 20 77 65 20 61  ated and if we a
29500 72 65 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66  re not inside of
29510 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72  .        ** a tr
29520 69 67 67 65 72 2c 20 74 68 65 6e 20 77 65 20 6f  igger, then we o
29530 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70  nly need to comp
29540 75 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ute the value of
29550 20 74 68 65 20 73 75 62 71 75 65 72 79 0a 20 20   the subquery.  
29560 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a        ** once. *
29570 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 41 64  /.        onceAd
29580 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  dr = sqlite3Code
29590 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56 64  Once(pParse); Vd
295a0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
295b0 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
295c0 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c  nt((v, "material
295d0 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74  ize \"%s\"", pIt
295e0 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
295f0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
29600 20 20 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70          VdbeNoop
29610 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74  Comment((v, "mat
29620 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22  erialize \"%s\""
29630 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
29640 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Name));.      }.
29650 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
29660 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
29670 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c  t, SRT_EphemTab,
29680 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
29690 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
296a0 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d  etInteger(pItem-
296b0 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29  >iSelectId, (u8)
296c0 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
296d0 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71  ectId);.      sq
296e0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
296f0 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
29700 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70  ;.      pItem->p
29710 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
29720 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
29730 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  pSub->nSelectRow
29740 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63  );.      if( onc
29750 65 41 64 64 72 20 29 20 73 71 6c 69 74 65 33 56  eAddr ) sqlite3V
29760 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f  dbeJumpHere(v, o
29770 6e 63 65 41 64 64 72 29 3b 0a 20 20 20 20 20 20  nceAddr);.      
29780 72 65 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65  retAddr = sqlite
29790 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
297a0 50 5f 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d  P_Return, pItem-
297b0 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
297c0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
297d0 76 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49 74  v, "end %s", pIt
297e0 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
297f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
29800 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20  VdbeChangeP1(v, 
29810 74 6f 70 41 64 64 72 2c 20 72 65 74 41 64 64 72  topAddr, retAddr
29820 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
29830 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
29840 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  e(pParse);.    }
29850 0a 20 20 20 20 69 66 28 20 2f 2a 70 50 61 72 73  .    if( /*pPars
29860 65 2d 3e 6e 45 72 72 20 7c 7c 2a 2f 20 64 62 2d  e->nErr ||*/ db-
29870 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
29880 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
29890 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
298a0 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68    pParse->nHeigh
298b0 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  t -= sqlite3Sele
298c0 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b  ctExprHeight(p);
298d0 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20  .    pTabList = 
298e0 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28  p->pSrc;.    if(
298f0 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72   !IgnorableOrder
29900 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20  by(pDest) ){.   
29910 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42     sSort.pOrderB
29920 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
29930 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c  .    }.  }.  pEL
29940 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
29950 0a 23 65 6e 64 69 66 0a 20 20 70 57 68 65 72 65  .#endif.  pWhere
29960 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
29970 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
29980 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e  roupBy;.  pHavin
29990 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a  g = p->pHaving;.
299a0 20 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e    sDistinct.isTn
299b0 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ct = (p->selFlag
299c0 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
299d0 21 3d 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  !=0;..#ifndef SQ
299e0 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
299f0 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49  ND_SELECT.  /* I
29a00 66 20 74 68 65 72 65 20 69 73 20 61 72 65 20 61  f there is are a
29a10 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65   sequence of que
29a20 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72  ries, do the ear
29a30 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e  lier ones first.
29a40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
29a50 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 63 20  Prior ){.    rc 
29a60 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50  = multiSelect(pP
29a70 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b  arse, p, pDest);
29a80 0a 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49  .    explainSetI
29a90 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69  nteger(pParse->i
29aa0 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f  SelectId, iResto
29ab0 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  reSelectId);.   
29ac0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
29ad0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
29ae0 74 68 65 20 71 75 65 72 79 20 69 73 20 44 49 53  the query is DIS
29af0 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f 52  TINCT with an OR
29b00 44 45 52 20 42 59 20 62 75 74 20 69 73 20 6e 6f  DER BY but is no
29b10 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c 20  t an aggregate, 
29b20 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68 65  and .  ** if the
29b30 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73 20   select-list is 
29b40 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
29b50 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20 74  ORDER BY list, t
29b60 68 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a 20  hen this query. 
29b70 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69   ** can be rewri
29b80 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50 20  tten as a GROUP 
29b90 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  BY. In other wor
29ba0 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ds, this:.  **. 
29bb0 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 44   **     SELECT D
29bc0 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d  ISTINCT xyz FROM
29bd0 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78 79   ... ORDER BY xy
29be0 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74  z.  **.  ** is t
29bf0 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20  ransformed to:. 
29c00 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
29c10 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e  ECT xyz FROM ...
29c20 20 47 52 4f 55 50 20 42 59 20 78 79 7a 0a 20 20   GROUP BY xyz.  
29c30 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f  **.  ** The seco
29c40 6e 64 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65  nd form is prefe
29c50 72 72 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65  rred as a single
29c60 20 69 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d   index (or temp-
29c70 74 61 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20  table) may be . 
29c80 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74   ** used for bot
29c90 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 61  h the ORDER BY a
29ca0 6e 64 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63  nd DISTINCT proc
29cb0 65 73 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69  essing. As origi
29cc0 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74  nally .  ** writ
29cd0 74 65 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75  ten the query mu
29ce0 73 74 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61  st use a temp-ta
29cf0 62 6c 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74  ble for at least
29d00 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45   one of the ORDE
29d10 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44  R .  ** BY and D
29d20 49 53 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20  ISTINCT, and an 
29d30 69 6e 64 65 78 20 6f 72 20 73 65 70 61 72 61 74  index or separat
29d40 65 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72  e temp-table for
29d50 20 74 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f   the other..  */
29d60 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
29d70 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
29d80 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
29d90 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a  )==SF_Distinct .
29da0 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
29db0 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 73 53 6f  rListCompare(sSo
29dc0 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 70 2d 3e  rt.pOrderBy, p->
29dd0 70 45 4c 69 73 74 2c 20 2d 31 29 3d 3d 30 0a 20  pEList, -1)==0. 
29de0 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c   ){.    p->selFl
29df0 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69  ags &= ~SF_Disti
29e00 6e 63 74 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f  nct;.    p->pGro
29e10 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
29e20 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
29e30 3e 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20  >pEList, 0);.   
29e40 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
29e50 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 53 6f  GroupBy;.    sSo
29e60 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  rt.pOrderBy = 0;
29e70 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74  .    /* Notice t
29e80 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74  hat even thought
29e90 20 53 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73   SF_Distinct has
29ea0 20 62 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72   been cleared fr
29eb0 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a  om p->selFlags,.
29ec0 20 20 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74      ** the sDist
29ed0 69 6e 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73  inct.isTnct is s
29ee0 74 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65  till set.  Hence
29ef0 2c 20 69 73 54 6e 63 74 20 72 65 70 72 65 73 65  , isTnct represe
29f00 6e 74 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f  nts the.    ** o
29f10 72 69 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20  riginal setting 
29f20 6f 66 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e  of the SF_Distin
29f30 63 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65  ct flag, not the
29f40 20 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67   current setting
29f50 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
29f60 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
29f70 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   );.  }..  /* If
29f80 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
29f90 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
29fa0 65 6e 20 74 68 69 73 20 73 6f 72 74 69 6e 67 0a  en this sorting.
29fb0 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67 68 74    ** index might
29fc0 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 75 6e   end up being un
29fd0 75 73 65 64 20 69 66 20 74 68 65 20 64 61 74 61  used if the data
29fe0 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78   can be .  ** ex
29ff0 74 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73  tracted in pre-s
2a000 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20 49 66  orted order.  If
2a010 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73   that is the cas
2a020 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  e, then the.  **
2a030 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
2a040 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69  l instruction wi
2a050 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f  ll be changed to
2a060 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65   an OP_Noop once
2a070 0a 20 20 2a 2a 20 77 65 20 66 69 67 75 72 65 20  .  ** we figure 
2a080 6f 75 74 20 74 68 61 74 20 74 68 65 20 73 6f 72  out that the sor
2a090 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 6e 6f  ting index is no
2a0a0 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20 61  t needed.  The a
2a0b0 64 64 72 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a  ddrSortIndex.  *
2a0c0 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  * variable is us
2a0d0 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  ed to facilitate
2a0e0 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20   that change..  
2a0f0 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70  */.  if( sSort.p
2a100 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b  OrderBy ){.    K
2a110 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
2a120 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
2a130 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
2a140 4c 69 73 74 28 70 50 61 72 73 65 2c 20 73 53 6f  List(pParse, sSo
2a150 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c 20  rt.pOrderBy, 0, 
2a160 30 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 69 45  0);.    sSort.iE
2a170 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
2a180 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 53 6f  >nTab++;.    sSo
2a190 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
2a1a0 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   =.      sqlite3
2a1b0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
2a1c0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a  _OpenEphemeral,.
2a1d0 20 20 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e            sSort.
2a1e0 69 45 43 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e  iECursor, sSort.
2a1f0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b  pOrderBy->nExpr+
2a200 31 2b 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  1+pEList->nExpr,
2a210 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 28 63   0,.          (c
2a220 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
2a230 34 5f 4b 45 59 49 4e 46 4f 0a 20 20 20 20 20 20  4_KEYINFO.      
2a240 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2a250 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2a260 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  dex = -1;.  }.. 
2a270 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75   /* If the outpu
2a280 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f  t is destined fo
2a290 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  r a temporary ta
2a2a0 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74  ble, open that t
2a2b0 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
2a2c0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
2a2d0 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20  RT_EphemTab ){. 
2a2e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2a2f0 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
2a300 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d  phemeral, pDest-
2a310 3e 69 53 44 50 61 72 6d 2c 20 70 45 4c 69 73 74  >iSDParm, pEList
2a320 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20  ->nExpr);.  }.. 
2a330 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69   /* Set the limi
2a340 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64  ter..  */.  iEnd
2a350 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
2a360 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 2d  keLabel(v);.  p-
2a370 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 4c 41  >nSelectRow = LA
2a380 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20 63  RGEST_INT64;.  c
2a390 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
2a3a0 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
2a3b0 69 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e  iEnd);.  if( p->
2a3c0 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20 73 53 6f  iLimit==0 && sSo
2a3d0 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
2a3e0 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
2a3f0 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 73  e3VdbeGetOp(v, s
2a400 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
2a410 65 78 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  ex)->opcode = OP
2a420 5f 53 6f 72 74 65 72 4f 70 65 6e 3b 0a 20 20 20  _SorterOpen;.   
2a430 20 73 53 6f 72 74 2e 73 6f 72 74 46 6c 61 67 73   sSort.sortFlags
2a440 20 7c 3d 20 53 4f 52 54 46 4c 41 47 5f 55 73 65   |= SORTFLAG_Use
2a450 53 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f  Sorter;.  }..  /
2a460 2a 20 4f 70 65 6e 20 61 20 76 69 72 74 75 61 6c  * Open a virtual
2a470 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f   index to use fo
2a480 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73  r the distinct s
2a490 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
2a4a0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2a4b0 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
2a4c0 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63  sDistinct.tabTnc
2a4d0 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
2a4e0 2b 2b 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63  ++;.    sDistinc
2a4f0 74 2e 61 64 64 72 54 6e 63 74 20 3d 20 73 71 6c  t.addrTnct = sql
2a500 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2a510 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
2a520 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  al,.            
2a530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a540 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61      sDistinct.ta
2a550 62 54 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20  bTnct, 0, 0,.   
2a560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a570 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
2a580 61 72 2a 29 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  ar*)keyInfoFromE
2a590 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
2a5a0 70 2d 3e 70 45 4c 69 73 74 2c 30 2c 30 29 2c 0a  p->pEList,0,0),.
2a5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5d0 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
2a5e0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2a5f0 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e  geP5(v, BTREE_UN
2a600 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 73 44  ORDERED);.    sD
2a610 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70  istinct.eTnctTyp
2a620 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  e = WHERE_DISTIN
2a630 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a 20 20  CT_UNORDERED;.  
2a640 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44 69 73 74  }else{.    sDist
2a650 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d  inct.eTnctType =
2a660 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
2a670 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  NOOP;.  }..  if(
2a680 20 21 69 73 41 67 67 20 26 26 20 70 47 72 6f 75   !isAgg && pGrou
2a690 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pBy==0 ){.    /*
2a6a0 20 4e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75   No aggregate fu
2a6b0 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 20 47  nctions and no G
2a6c0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a  ROUP BY clause *
2a6d0 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72 6c 46  /.    u16 wctrlF
2a6e0 6c 61 67 73 20 3d 20 28 73 44 69 73 74 69 6e 63  lags = (sDistinc
2a6f0 74 2e 69 73 54 6e 63 74 20 3f 20 57 48 45 52 45  t.isTnct ? WHERE
2a700 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 3a  _WANT_DISTINCT :
2a710 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67   0);..    /* Beg
2a720 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2a730 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 70 57 49  scan. */.    pWI
2a740 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
2a750 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
2a760 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
2a770 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  , sSort.pOrderBy
2a780 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2a790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7a0 20 70 2d 3e 70 45 4c 69 73 74 2c 20 77 63 74 72   p->pEList, wctr
2a7b0 6c 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20  lFlags, 0);.    
2a7c0 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
2a7d0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
2a7e0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2a7f0 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f  WhereOutputRowCo
2a800 75 6e 74 28 70 57 49 6e 66 6f 29 20 3c 20 70 2d  unt(pWInfo) < p-
2a810 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20  >nSelectRow ){. 
2a820 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
2a830 6f 77 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  ow = sqlite3Wher
2a840 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28  eOutputRowCount(
2a850 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20  pWInfo);.    }. 
2a860 20 20 20 69 66 28 20 73 44 69 73 74 69 6e 63 74     if( sDistinct
2a870 2e 69 73 54 6e 63 74 20 26 26 20 73 71 6c 69 74  .isTnct && sqlit
2a880 65 33 57 68 65 72 65 49 73 44 69 73 74 69 6e 63  e3WhereIsDistinc
2a890 74 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20  t(pWInfo) ){.   
2a8a0 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e     sDistinct.eTn
2a8b0 63 74 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33  ctType = sqlite3
2a8c0 57 68 65 72 65 49 73 44 69 73 74 69 6e 63 74 28  WhereIsDistinct(
2a8d0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20  pWInfo);.    }. 
2a8e0 20 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72     if( sSort.pOr
2a8f0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73  derBy ){.      s
2a900 53 6f 72 74 2e 6e 4f 42 53 61 74 20 3d 20 73 71  Sort.nOBSat = sq
2a910 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65  lite3WhereIsOrde
2a920 72 65 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  red(pWInfo);.   
2a930 20 20 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f 42     if( sSort.nOB
2a940 53 61 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64 65  Sat==sSort.pOrde
2a950 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  rBy->nExpr ){.  
2a960 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64        sSort.pOrd
2a970 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
2a980 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
2a990 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  If sorting index
2a9a0 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74 65   that was create
2a9b0 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f  d by a prior OP_
2a9c0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20  OpenEphemeral . 
2a9d0 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f     ** instructio
2a9e0 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62  n ended up not b
2a9f0 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65  eing needed, the
2aa00 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f  n change the OP_
2aa10 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20  OpenEphemeral.  
2aa20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f    ** into an OP_
2aa30 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Noop..    */.   
2aa40 20 69 66 28 20 73 53 6f 72 74 2e 61 64 64 72 53   if( sSort.addrS
2aa50 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 73  ortIndex>=0 && s
2aa60 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d 30  Sort.pOrderBy==0
2aa70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2aa80 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
2aa90 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53  p(v, sSort.addrS
2aaa0 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d  ortIndex);.    }
2aab0 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65  ..    /* Use the
2aac0 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20   standard inner 
2aad0 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 73 65 6c  loop. */.    sel
2aae0 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
2aaf0 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20  rse, p, pEList, 
2ab00 2d 31 2c 20 26 73 53 6f 72 74 2c 20 26 73 44 69  -1, &sSort, &sDi
2ab10 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20  stinct, pDest,. 
2ab20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab30 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43     sqlite3WhereC
2ab40 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 70 57 49  ontinueLabel(pWI
2ab50 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20  nfo),.          
2ab60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2ab70 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c  3WhereBreakLabel
2ab80 28 70 57 49 6e 66 6f 29 29 3b 0a 0a 20 20 20 20  (pWInfo));..    
2ab90 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62  /* End the datab
2aba0 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  ase scan loop.. 
2abb0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
2abc0 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
2abd0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2abe0 2f 2a 20 54 68 69 73 20 63 61 73 65 20 77 68 65  /* This case whe
2abf0 6e 20 74 68 65 72 65 20 65 78 69 73 74 20 61 67  n there exist ag
2ac00 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
2ac10 73 20 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20  s or a GROUP BY 
2ac20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 6f 72  clause.    ** or
2ac30 20 62 6f 74 68 20 2a 2f 0a 20 20 20 20 4e 61 6d   both */.    Nam
2ac40 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20  eContext sNC;   
2ac50 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
2ac60 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20   for processing 
2ac70 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d  aggregate inform
2ac80 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  ation */.    int
2ac90 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20   iAMem;         
2aca0 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64   /* First Mem ad
2acb0 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e  dress for storin
2acc0 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  g current GROUP 
2acd0 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42  BY */.    int iB
2ace0 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem;          /*
2acf0 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65   First Mem addre
2ad00 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20  ss for previous 
2ad10 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20  GROUP BY */.    
2ad20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20  int iUseFlag;   
2ad30 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65      /* Mem addre
2ad40 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20  ss holding flag 
2ad50 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
2ad60 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20  at least.       
2ad70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad80 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74   ** one row of t
2ad90 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20  he input to the 
2ada0 61 67 67 72 65 67 61 74 6f 72 20 68 61 73 20 62  aggregator has b
2adb0 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  een.            
2adc0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
2add0 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20  rocessed */.    
2ade0 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20  int iAbortFlag; 
2adf0 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65      /* Mem addre
2ae00 73 73 20 77 68 69 63 68 20 63 61 75 73 65 73 20  ss which causes 
2ae10 71 75 65 72 79 20 61 62 6f 72 74 20 69 66 20 70  query abort if p
2ae20 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69  ositive */.    i
2ae30 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20  nt groupBySort; 
2ae40 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20     /* Rows come 
2ae50 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47  from source in G
2ae60 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f  ROUP BY order */
2ae70 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64  .    int addrEnd
2ae80 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  ;        /* End 
2ae90 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  of processing fo
2aea0 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f  r this SELECT */
2aeb0 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 50 54 61  .    int sortPTa
2aec0 62 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73 65 75  b = 0;   /* Pseu
2aed0 64 6f 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20  dotable used to 
2aee0 64 65 63 6f 64 65 20 73 6f 72 74 69 6e 67 20 72  decode sorting r
2aef0 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 69 6e  esults */.    in
2af00 74 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b 20 20  t sortOut = 0;  
2af10 20 20 2f 2a 20 4f 75 74 70 75 74 20 72 65 67 69    /* Output regi
2af20 73 74 65 72 20 66 72 6f 6d 20 74 68 65 20 73 6f  ster from the so
2af30 72 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rter */.    int 
2af40 6f 72 64 65 72 42 79 47 72 70 20 3d 20 30 3b 20  orderByGrp = 0; 
2af50 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 47  /* True if the G
2af60 52 4f 55 50 20 42 59 20 61 6e 64 20 4f 52 44 45  ROUP BY and ORDE
2af70 52 20 42 59 20 61 72 65 20 74 68 65 20 73 61 6d  R BY are the sam
2af80 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d  e */..    /* Rem
2af90 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20  ove any and all 
2afa0 61 6c 69 61 73 65 73 20 62 65 74 77 65 65 6e 20  aliases between 
2afb0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
2afc0 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52  nd the.    ** GR
2afd0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  OUP BY clause.. 
2afe0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47     */.    if( pG
2aff0 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
2b000 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20  int k;          
2b010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b020 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
2b030 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
2b040 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
2b050 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  em;  /* For loop
2b060 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65 73 73  ing over express
2b070 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f  ion in a list */
2b080 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d  ..      for(k=p-
2b090 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
2b0a0 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d  pItem=p->pEList-
2b0b0 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49  >a; k>0; k--, pI
2b0c0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
2b0d0 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61  pItem->u.x.iAlia
2b0e0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 0;.      }. 
2b0f0 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f 75       for(k=pGrou
2b100 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  pBy->nExpr, pIte
2b110 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 6b  m=pGroupBy->a; k
2b120 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; k--, pItem++
2b130 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d  ){.        pItem
2b140 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30  ->u.x.iAlias = 0
2b150 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2b160 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  if( p->nSelectRo
2b170 77 3e 31 30 30 20 29 20 70 2d 3e 6e 53 65 6c 65  w>100 ) p->nSele
2b180 63 74 52 6f 77 20 3d 20 31 30 30 3b 0a 20 20 20  ctRow = 100;.   
2b190 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
2b1a0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 31 3b  >nSelectRow = 1;
2b1b0 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 20  .    }...    /* 
2b1c0 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68  If there is both
2b1d0 20 61 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20   a GROUP BY and 
2b1e0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
2b1f0 73 65 20 61 6e 64 20 74 68 65 79 20 61 72 65 0a  se and they are.
2b200 20 20 20 20 2a 2a 20 69 64 65 6e 74 69 63 61 6c      ** identical
2b210 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 62 65  , then it may be
2b220 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 69 73   possible to dis
2b230 61 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20 42  able the ORDER B
2b240 59 20 63 6c 61 75 73 65 20 0a 20 20 20 20 2a 2a  Y clause .    **
2b250 20 6f 6e 20 74 68 65 20 67 72 6f 75 6e 64 73 20   on the grounds 
2b260 74 68 61 74 20 74 68 65 20 47 52 4f 55 50 20 42  that the GROUP B
2b270 59 20 77 69 6c 6c 20 63 61 75 73 65 20 65 6c 65  Y will cause ele
2b280 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75  ments to come ou
2b290 74 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  t .    ** in the
2b2a0 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2e 20   correct order. 
2b2b0 49 74 20 61 6c 73 6f 20 6d 61 79 20 6e 6f 74 20  It also may not 
2b2c0 2d 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 6d  - the GROUP BY m
2b2d0 61 79 20 75 73 65 20 61 0a 20 20 20 20 2a 2a 20  ay use a.    ** 
2b2e0 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 74  database index t
2b2f0 68 61 74 20 63 61 75 73 65 73 20 72 6f 77 73 20  hat causes rows 
2b300 74 6f 20 62 65 20 67 72 6f 75 70 65 64 20 74 6f  to be grouped to
2b310 67 65 74 68 65 72 20 61 73 20 72 65 71 75 69 72  gether as requir
2b320 65 64 0a 20 20 20 20 2a 2a 20 62 75 74 20 6e 6f  ed.    ** but no
2b330 74 20 61 63 74 75 61 6c 6c 79 20 73 6f 72 74 65  t actually sorte
2b340 64 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 72  d. Either way, r
2b350 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
2b360 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f  hat the.    ** O
2b370 52 44 45 52 20 42 59 20 61 6e 64 20 47 52 4f 55  RDER BY and GROU
2b380 50 20 42 59 20 63 6c 61 75 73 65 73 20 61 72 65  P BY clauses are
2b390 20 74 68 65 20 73 61 6d 65 20 62 79 20 73 65 74   the same by set
2b3a0 74 69 6e 67 20 74 68 65 20 6f 72 64 65 72 42 79  ting the orderBy
2b3b0 47 72 70 0a 20 20 20 20 2a 2a 20 76 61 72 69 61  Grp.    ** varia
2b3c0 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ble.  */.    if(
2b3d0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2b3e0 43 6f 6d 70 61 72 65 28 70 47 72 6f 75 70 42 79  Compare(pGroupBy
2b3f0 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  , sSort.pOrderBy
2b400 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , -1)==0 ){.    
2b410 20 20 6f 72 64 65 72 42 79 47 72 70 20 3d 20 31    orderByGrp = 1
2b420 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a  ;.    }. .    /*
2b430 20 43 72 65 61 74 65 20 61 20 6c 61 62 65 6c 20   Create a label 
2b440 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20  to jump to when 
2b450 77 65 20 77 61 6e 74 20 74 6f 20 61 62 6f 72 74  we want to abort
2b460 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20   the query */.  
2b470 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69    addrEnd = sqli
2b480 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
2b490 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e  (v);..    /* Con
2b4a0 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e  vert TK_COLUMN n
2b4b0 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47  odes into TK_AGG
2b4c0 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65  _COLUMN and make
2b4d0 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20   entries in.    
2b4e0 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20  ** sAggInfo for 
2b4f0 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  all TK_AGG_FUNCT
2b500 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70  ION nodes in exp
2b510 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a  ressions of the.
2b520 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74      ** SELECT st
2b530 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a  atement..    */.
2b540 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c      memset(&sNC,
2b550 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
2b560 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65  ;.    sNC.pParse
2b570 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73   = pParse;.    s
2b580 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54  NC.pSrcList = pT
2b590 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e  abList;.    sNC.
2b5a0 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67 67  pAggInfo = &sAgg
2b5b0 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e  Info;.    sAggIn
2b5c0 66 6f 2e 6d 6e 52 65 67 20 3d 20 70 50 61 72 73  fo.mnReg = pPars
2b5d0 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 73  e->nMem+1;.    s
2b5e0 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67  AggInfo.nSorting
2b5f0 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42  Column = pGroupB
2b600 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  y ? pGroupBy->nE
2b610 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 73 41 67  xpr : 0;.    sAg
2b620 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d  gInfo.pGroupBy =
2b630 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73   pGroupBy;.    s
2b640 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
2b650 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70  eAggList(&sNC, p
2b660 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
2b670 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2b680 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 53 6f 72  gList(&sNC, sSor
2b690 74 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  t.pOrderBy);.   
2b6a0 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a   if( pHaving ){.
2b6b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2b6c0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
2b6d0 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67  es(&sNC, pHaving
2b6e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67  );.    }.    sAg
2b6f0 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74  gInfo.nAccumulat
2b700 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43  or = sAggInfo.nC
2b710 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69  olumn;.    for(i
2b720 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
2b730 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Func; i++){.    
2b740 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2b750 61 73 50 72 6f 70 65 72 74 79 28 73 41 67 67 49  asProperty(sAggI
2b760 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78  nfo.aFunc[i].pEx
2b770 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
2b780 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e  ) );.      sNC.n
2b790 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41  cFlags |= NC_InA
2b7a0 67 67 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71  ggFunc;.      sq
2b7b0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
2b7c0 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41  AggList(&sNC, sA
2b7d0 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e  ggInfo.aFunc[i].
2b7e0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b  pExpr->x.pList);
2b7f0 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61  .      sNC.ncFla
2b800 67 73 20 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46  gs &= ~NC_InAggF
2b810 75 6e 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  unc;.    }.    s
2b820 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 3d 20  AggInfo.mxReg = 
2b830 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2b840 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
2b850 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65  Failed ) goto se
2b860 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f  lect_end;..    /
2b870 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  * Processing for
2b880 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68   aggregates with
2b890 20 47 52 4f 55 50 20 42 59 20 69 73 20 76 65 72   GROUP BY is ver
2b8a0 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a  y different and.
2b8b0 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65      ** much more
2b8c0 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67   complex than ag
2b8d0 67 72 65 67 61 74 65 73 20 77 69 74 68 6f 75 74  gregates without
2b8e0 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20   a GROUP BY..   
2b8f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f   */.    if( pGro
2b900 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65  upBy ){.      Ke
2b910 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
2b920 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f    /* Keying info
2b930 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
2b940 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20  group by clause 
2b950 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 3b  */.      int j1;
2b960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b970 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69  A-vs-B comparisi
2b980 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20  on jump */.     
2b990 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52   int addrOutputR
2b9a0 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66  ow;  /* Start of
2b9b0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
2b9c0 20 6f 75 74 70 75 74 73 20 61 20 72 65 73 75 6c   outputs a resul
2b9d0 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69  t row */.      i
2b9e0 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b  nt regOutputRow;
2b9f0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64     /* Return add
2ba00 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
2ba10 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  r output subrout
2ba20 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ine */.      int
2ba30 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20   addrSetAbort;  
2ba40 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72   /* Set the abor
2ba50 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72  t flag and retur
2ba60 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  n */.      int a
2ba70 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f  ddrTopOfLoop;  /
2ba80 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70  * Top of the inp
2ba90 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  ut loop */.     
2baa0 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67   int addrSorting
2bab0 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f  Idx; /* The OP_O
2bac0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72  penEphemeral for
2bad0 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
2bae0 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ex */.      int 
2baf0 61 64 64 72 52 65 73 65 74 3b 20 20 20 20 20 20  addrReset;      
2bb00 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f  /* Subroutine fo
2bb10 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20  r resetting the 
2bb20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20  accumulator */. 
2bb30 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 73 65       int regRese
2bb40 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75  t;       /* Retu
2bb50 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73  rn address regis
2bb60 74 65 72 20 66 6f 72 20 72 65 73 65 74 20 73 75  ter for reset su
2bb70 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20  broutine */..   
2bb80 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
2bb90 73 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  s a GROUP BY cla
2bba0 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65  use we might nee
2bbb0 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  d a sorting inde
2bbc0 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d  x to.      ** im
2bbd0 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c  plement it.  All
2bbe0 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72 74 69  ocate that sorti
2bbf0 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49  ng index now.  I
2bc00 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20  f it turns out. 
2bc10 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
2bc20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61  do not need it a
2bc30 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50  fter all, the OP
2bc40 5f 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74  _SorterOpen inst
2bc50 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ruction.      **
2bc60 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74   will be convert
2bc70 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20  ed into a Noop. 
2bc80 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
2bc90 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
2bca0 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e  gIdx = pParse->n
2bcb0 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65  Tab++;.      pKe
2bcc0 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
2bcd0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
2bce0 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c  se, pGroupBy, 0,
2bcf0 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53   0);.      addrS
2bd00 6f 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69  ortingIdx = sqli
2bd10 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
2bd20 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20   OP_SorterOpen, 
2bd30 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49  .          sAggI
2bd40 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
2bd50 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e  sAggInfo.nSortin
2bd60 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20  gColumn, .      
2bd70 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b      0, (char*)pK
2bd80 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
2bd90 46 4f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  FO);..      /* I
2bda0 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79  nitialize memory
2bdb0 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20   locations used 
2bdc0 62 79 20 47 52 4f 55 50 20 42 59 20 61 67 67 72  by GROUP BY aggr
2bdd0 65 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67  egate processing
2bde0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2bdf0 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61  iUseFlag = ++pPa
2be00 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2be10 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b   iAbortFlag = ++
2be20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2be30 20 20 20 20 72 65 67 4f 75 74 70 75 74 52 6f 77      regOutputRow
2be40 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2be50 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74  m;.      addrOut
2be60 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  putRow = sqlite3
2be70 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
2be80 3b 0a 20 20 20 20 20 20 72 65 67 52 65 73 65 74  ;.      regReset
2be90 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2bea0 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 52 65 73  m;.      addrRes
2beb0 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  et = sqlite3Vdbe
2bec0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
2bed0 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72      iAMem = pPar
2bee0 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20  se->nMem + 1;.  
2bef0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
2bf00 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45   += pGroupBy->nE
2bf10 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d  xpr;.      iBMem
2bf20 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
2bf30 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73  + 1;.      pPars
2bf40 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75  e->nMem += pGrou
2bf50 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
2bf60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2bf70 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
2bf80 72 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67  r, 0, iAbortFlag
2bf90 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2bfa0 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65 61 72 20  ment((v, "clear 
2bfb0 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
2bfc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2bfd0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
2bfe0 65 67 65 72 2c 20 30 2c 20 69 55 73 65 46 6c 61  eger, 0, iUseFla
2bff0 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
2c000 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63  mment((v, "indic
2c010 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
2c020 65 6d 70 74 79 22 29 29 3b 0a 20 20 20 20 20 20  empty"));.      
2c030 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2c040 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  3(v, OP_Null, 0,
2c050 20 69 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47   iAMem, iAMem+pG
2c060 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29  roupBy->nExpr-1)
2c070 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69  ;..      /* Begi
2c080 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69  n a loop that wi
2c090 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73  ll extract all s
2c0a0 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52  ource rows in GR
2c0b0 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20  OUP BY order..  
2c0c0 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68      ** This migh
2c0d0 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65  t involve two se
2c0e0 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74  parate loops wit
2c0f0 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20  h an OP_Sort in 
2c100 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20  between, or.    
2c110 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65    ** it might be
2c120 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74   a single loop t
2c130 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65  hat uses an inde
2c140 78 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66  x to extract inf
2c150 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  ormation.      *
2c160 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f  * in the right o
2c170 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69  rder to begin wi
2c180 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  th..      */.   
2c190 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2c1a0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
2c1b0 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72  , regReset, addr
2c1c0 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57  Reset);.      pW
2c1d0 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
2c1e0 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
2c1f0 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
2c200 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 0a  e, pGroupBy, 0,.
2c210 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
2c220 47 52 4f 55 50 42 59 20 7c 20 28 6f 72 64 65 72  GROUPBY | (order
2c230 42 79 47 72 70 20 3f 20 57 48 45 52 45 5f 53 4f  ByGrp ? WHERE_SO
2c240 52 54 42 59 47 52 4f 55 50 20 3a 20 30 29 2c 20  RTBYGROUP : 0), 
2c250 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  0.      );.     
2c260 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
2c270 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
2c280 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
2c290 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65  te3WhereIsOrdere
2c2a0 64 28 70 57 49 6e 66 6f 29 3d 3d 70 47 72 6f 75  d(pWInfo)==pGrou
2c2b0 70 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  pBy->nExpr ){.  
2c2c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74        /* The opt
2c2d0 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74  imizer is able t
2c2e0 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69  o deliver rows i
2c2f0 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72  n group by order
2c300 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   so.        ** w
2c310 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f  e do not have to
2c320 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f   sort.  The OP_O
2c330 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 61 62  penEphemeral tab
2c340 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  le will be.     
2c350 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20     ** cancelled 
2c360 6c 61 74 65 72 20 62 65 63 61 75 73 65 20 77 65  later because we
2c370 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75   still need to u
2c380 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a  se the pKeyInfo.
2c390 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2c3a0 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d     groupBySort =
2c3b0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
2c3c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73  .        /* Rows
2c3d0 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20   are coming out 
2c3e0 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20  in undetermined 
2c3f0 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76 65 20  order.  We have 
2c400 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20 20  to push.        
2c410 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f  ** each row into
2c420 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
2c430 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  , terminate the 
2c440 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20  first loop,.    
2c450 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70      ** then loop
2c460 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e   over the sortin
2c470 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72  g index in order
2c480 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70   to get the outp
2c490 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  ut.        ** in
2c4a0 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20   sorted order.  
2c4b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2c4c0 20 69 6e 74 20 72 65 67 42 61 73 65 3b 0a 20 20   int regBase;.  
2c4d0 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 63        int regRec
2c4e0 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ord;.        int
2c4f0 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69   nCol;.        i
2c500 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20  nt nGroupBy;..  
2c510 20 20 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d        explainTem
2c520 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 0a  pTable(pParse, .
2c530 20 20 20 20 20 20 20 20 20 20 20 20 28 73 44 69              (sDi
2c540 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26  stinct.isTnct &&
2c550 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46   (p->selFlags&SF
2c560 5f 44 69 73 74 69 6e 63 74 29 3d 3d 30 29 20 3f  _Distinct)==0) ?
2c570 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c580 20 20 20 20 20 22 44 49 53 54 49 4e 43 54 22 20       "DISTINCT" 
2c590 3a 20 22 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a  : "GROUP BY");..
2c5a0 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53          groupByS
2c5b0 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ort = 1;.       
2c5c0 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f   nGroupBy = pGro
2c5d0 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
2c5e0 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f       nCol = nGro
2c5f0 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 6a 20  upBy;.        j 
2c600 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  = nGroupBy;.    
2c610 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
2c620 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
2c630 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
2c640 20 69 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43   if( sAggInfo.aC
2c650 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c  ol[i].iSorterCol
2c660 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20  umn>=j ){.      
2c670 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20        nCol++;.  
2c680 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20            j++;. 
2c690 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c6a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67     }.        reg
2c6b0 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65  Base = sqlite3Ge
2c6c0 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
2c6d0 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, nCol);.      
2c6e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
2c6f0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
2c700 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2c710 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
2c720 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
2c730 79 2c 20 72 65 67 42 61 73 65 2c 20 30 29 3b 0a  y, regBase, 0);.
2c740 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f          j = nGro
2c750 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f  upBy;.        fo
2c760 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
2c770 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  o.nColumn; i++){
2c780 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
2c790 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
2c7a0 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e  Col = &sAggInfo.
2c7b0 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20  aCol[i];.       
2c7c0 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f     if( pCol->iSo
2c7d0 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b  rterColumn>=j ){
2c7e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
2c7f0 20 72 31 20 3d 20 6a 20 2b 20 72 65 67 42 61 73   r1 = j + regBas
2c800 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e;.            i
2c810 6e 74 20 72 32 3b 0a 0a 20 20 20 20 20 20 20 20  nt r2;..        
2c820 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
2c830 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
2c840 6e 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  n(pParse, .     
2c850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c860 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
2c870 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c  pTab, pCol->iCol
2c880 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c  umn, pCol->iTabl
2c890 65 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20  e, r1, 0);.     
2c8a0 20 20 20 20 20 20 20 69 66 28 20 72 31 21 3d 72         if( r1!=r
2c8b0 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  2 ){.           
2c8c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2c8d0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
2c8e0 2c 20 72 32 2c 20 72 31 29 3b 0a 20 20 20 20 20  , r2, r1);.     
2c8f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c900 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
2c910 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2c920 20 20 20 20 20 20 20 20 72 65 67 52 65 63 6f 72          regRecor
2c930 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
2c940 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
2c950 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2c960 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
2c970 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61  akeRecord, regBa
2c980 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 52 65 63  se, nCol, regRec
2c990 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ord);.        sq
2c9a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2c9b0 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65  v, OP_SorterInse
2c9c0 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  rt, sAggInfo.sor
2c9d0 74 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63 6f  tingIdx, regReco
2c9e0 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rd);.        sql
2c9f0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
2ca00 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
2ca10 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73  cord);.        s
2ca20 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
2ca30 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
2ca40 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20  egBase, nCol);. 
2ca50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
2ca60 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
2ca70 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
2ca80 2e 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62 20  .sortingIdxPTab 
2ca90 3d 20 73 6f 72 74 50 54 61 62 20 3d 20 70 50 61  = sortPTab = pPa
2caa0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
2cab0 20 20 20 20 20 73 6f 72 74 4f 75 74 20 3d 20 73       sortOut = s
2cac0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
2cad0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
2cae0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2caf0 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73  Op3(v, OP_OpenPs
2cb00 65 75 64 6f 2c 20 73 6f 72 74 50 54 61 62 2c 20  eudo, sortPTab, 
2cb10 73 6f 72 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a  sortOut, nCol);.
2cb20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2cb30 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2cb40 53 6f 72 74 65 72 53 6f 72 74 2c 20 73 41 67 67  SorterSort, sAgg
2cb50 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
2cb60 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20   addrEnd);.     
2cb70 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2cb80 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f 72  v, "GROUP BY sor
2cb90 74 22 29 29 3b 20 56 64 62 65 43 6f 76 65 72 61  t")); VdbeCovera
2cba0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
2cbb0 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69  AggInfo.useSorti
2cbc0 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20  ngIdx = 1;.     
2cbd0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
2cbe0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
2cbf0 3b 0a 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  ;..      }..    
2cc00 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65    /* If the inde
2cc10 78 20 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 74  x or temporary t
2cc20 61 62 6c 65 20 75 73 65 64 20 62 79 20 74 68 65  able used by the
2cc30 20 47 52 4f 55 50 20 42 59 20 73 6f 72 74 0a 20   GROUP BY sort. 
2cc40 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 6e 61 74       ** will nat
2cc50 75 72 61 6c 6c 79 20 64 65 6c 69 76 65 72 20 72  urally deliver r
2cc60 6f 77 73 20 69 6e 20 74 68 65 20 6f 72 64 65 72  ows in the order
2cc70 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
2cc80 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20 20 20   ORDER BY.      
2cc90 2a 2a 20 63 6c 61 75 73 65 2c 20 63 61 6e 63 65  ** clause, cance
2cca0 6c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  l the ephemeral 
2ccb0 74 61 62 6c 65 20 6f 70 65 6e 20 63 6f 64 65 64  table open coded
2ccc0 20 65 61 72 6c 69 65 72 2e 0a 20 20 20 20 20 20   earlier..      
2ccd0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  **.      ** This
2cce0 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
2ccf0 69 6f 6e 20 2d 20 74 68 65 20 63 6f 72 72 65 63  ion - the correc
2cd00 74 20 61 6e 73 77 65 72 20 73 68 6f 75 6c 64 20  t answer should 
2cd10 72 65 73 75 6c 74 20 72 65 67 61 72 64 6c 65 73  result regardles
2cd20 73 2e 0a 20 20 20 20 20 20 2a 2a 20 55 73 65 20  s..      ** Use 
2cd30 74 68 65 20 53 51 4c 49 54 45 5f 47 72 6f 75 70  the SQLITE_Group
2cd40 42 79 4f 72 64 65 72 20 66 6c 61 67 20 77 69 74  ByOrder flag wit
2cd50 68 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  h SQLITE_TESTCTR
2cd60 4c 5f 4f 50 54 49 4d 49 5a 45 52 20 74 6f 20 0a  L_OPTIMIZER to .
2cd70 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65        ** disable
2cd80 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
2cd90 6f 6e 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70  on for testing p
2cda0 75 72 70 6f 73 65 73 2e 20 20 2a 2f 0a 20 20 20  urposes.  */.   
2cdb0 20 20 20 69 66 28 20 6f 72 64 65 72 42 79 47 72     if( orderByGr
2cdc0 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f  p && Optimizatio
2cdd0 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  nEnabled(db, SQL
2cde0 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72  ITE_GroupByOrder
2cdf0 29 20 0a 20 20 20 20 20 20 20 26 26 20 28 67 72  ) .       && (gr
2ce00 6f 75 70 42 79 53 6f 72 74 20 7c 7c 20 73 71 6c  oupBySort || sql
2ce10 69 74 65 33 57 68 65 72 65 49 73 53 6f 72 74 65  ite3WhereIsSorte
2ce20 64 28 70 57 49 6e 66 6f 29 29 0a 20 20 20 20 20  d(pWInfo)).     
2ce30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 53 6f 72   ){.        sSor
2ce40 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  t.pOrderBy = 0;.
2ce50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2ce60 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
2ce70 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  v, sSort.addrSor
2ce80 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 7d  tIndex);.      }
2ce90 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75  ..      /* Evalu
2cea0 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ate the current 
2ceb0 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61  GROUP BY terms a
2cec0 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c 20  nd store in b0, 
2ced0 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20  b1, b2....      
2cee0 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72 79  ** (b0 is memory
2cef0 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b   location iBMem+
2cf00 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b 31  0, b1 is iBMem+1
2cf10 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a  , and so forth).
2cf20 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f        ** Then co
2cf30 6d 70 61 72 65 20 74 68 65 20 63 75 72 72 65 6e  mpare the curren
2cf40 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73  t GROUP BY terms
2cf50 20 61 67 61 69 6e 73 74 20 74 68 65 20 47 52 4f   against the GRO
2cf60 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20 20  UP BY terms.    
2cf70 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 72    ** from the pr
2cf80 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72 65  evious row curre
2cf90 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61  ntly stored in a
2cfa0 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20  0, a1, a2....   
2cfb0 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
2cfc0 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69  TopOfLoop = sqli
2cfd0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2cfe0 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
2cff0 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
2d000 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
2d010 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72    if( groupBySor
2d020 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
2d030 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2d040 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c  , OP_SorterData,
2d050 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
2d060 67 49 64 78 2c 20 73 6f 72 74 4f 75 74 29 3b 0a  gIdx, sortOut);.
2d070 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
2d080 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42  r(j=0; j<pGroupB
2d090 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  y->nExpr; j++){.
2d0a0 20 20 20 20 20 20 20 20 69 66 28 20 67 72 6f 75          if( grou
2d0b0 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  pBySort ){.     
2d0c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2d0d0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
2d0e0 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c 20 6a  umn, sortPTab, j
2d0f0 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20  , iBMem+j);.    
2d100 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29        if( j==0 )
2d110 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2d120 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 43  geP5(v, OPFLAG_C
2d130 4c 45 41 52 43 41 43 48 45 29 3b 0a 20 20 20 20  LEARCACHE);.    
2d140 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d150 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69       sAggInfo.di
2d160 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  rectMode = 1;.  
2d170 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2d180 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
2d190 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70  pGroupBy->a[j].p
2d1a0 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a  Expr, iBMem+j);.
2d1b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d1c0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
2d1d0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
2d1e0 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20  Compare, iAMem, 
2d1f0 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d  iBMem, pGroupBy-
2d200 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
2d210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d220 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33    (char*)sqlite3
2d230 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49  KeyInfoRef(pKeyI
2d240 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  nfo), P4_KEYINFO
2d250 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20 73 71  );.      j1 = sq
2d260 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
2d270 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
2d280 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2d290 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 31 2b  (v, OP_Jump, j1+
2d2a0 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 20 56 64 62  1, 0, j1+1); Vdb
2d2b0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
2d2c0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
2d2d0 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20   code that runs 
2d2e0 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f  whenever the GRO
2d2f0 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20  UP BY changes.. 
2d300 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73 20       ** Changes 
2d310 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  in the GROUP BY 
2d320 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20  are detected by 
2d330 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64  the previous cod
2d340 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  e.      ** block
2d350 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65  .  If there were
2d360 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69   no changes, thi
2d370 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70  s block is skipp
2d380 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
2d390 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20     ** This code 
2d3a0 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20 67  copies current g
2d3b0 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e  roup by terms in
2d3c0 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20   b0,b1,b2,....  
2d3d0 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61      ** over to a
2d3e0 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65  0,a1,a2.  It the
2d3f0 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70  n calls the outp
2d400 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20  ut subroutine.  
2d410 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74      ** and reset
2d420 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  s the aggregate 
2d430 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69  accumulator regi
2d440 73 74 65 72 73 20 69 6e 20 70 72 65 70 61 72 61  sters in prepara
2d450 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f  tion.      ** fo
2d460 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50  r the next GROUP
2d470 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20   BY batch..     
2d480 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2d490 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
2d4a0 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d  arse, iBMem, iAM
2d4b0 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  em, pGroupBy->nE
2d4c0 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
2d4d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2d4e0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
2d4f0 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74  tputRow, addrOut
2d500 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
2d510 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2d520 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29  output one row")
2d530 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2d540 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2d550 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c  _IfPos, iAbortFl
2d560 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 20 56 64  ag, addrEnd); Vd
2d570 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2d580 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2d590 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72  ((v, "check abor
2d5a0 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
2d5b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2d5c0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
2d5d0 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65  regReset, addrRe
2d5e0 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  set);.      Vdbe
2d5f0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73  Comment((v, "res
2d600 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29  et accumulator")
2d610 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64  );..      /* Upd
2d620 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74  ate the aggregat
2d630 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62  e accumulators b
2d640 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ased on the cont
2d650 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ent of.      ** 
2d660 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a  the current row.
2d670 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
2d680 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
2d690 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20  re(v, j1);.     
2d6a0 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
2d6b0 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
2d6c0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c  Info);.      sql
2d6d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2d6e0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
2d6f0 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20   iUseFlag);.    
2d700 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2d710 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61 74 61  , "indicate data
2d720 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22   in accumulator"
2d730 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e  ));..      /* En
2d740 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20  d of the loop.  
2d750 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
2d760 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
2d770 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2d780 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2d790 53 6f 72 74 65 72 4e 65 78 74 2c 20 73 41 67 67  SorterNext, sAgg
2d7a0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
2d7b0 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b   addrTopOfLoop);
2d7c0 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
2d7d0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
2d7e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
2d7f0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
2d800 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
2d810 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2d820 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53  eToNoop(v, addrS
2d830 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20 20 20 20  ortingIdx);.    
2d840 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75    }..      /* Ou
2d850 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20 72  tput the final r
2d860 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20 20  ow of result.   
2d870 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
2d880 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2d890 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
2d8a0 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74  tputRow, addrOut
2d8b0 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
2d8c0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2d8d0 6f 75 74 70 75 74 20 66 69 6e 61 6c 20 72 6f 77  output final row
2d8e0 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a  "));..      /* J
2d8f0 75 6d 70 20 6f 76 65 72 20 74 68 65 20 73 75 62  ump over the sub
2d900 72 6f 75 74 69 6e 65 73 0a 20 20 20 20 20 20 2a  routines.      *
2d910 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
2d920 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2d930 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6e 64  Goto, 0, addrEnd
2d940 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
2d950 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
2d960 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
2d970 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
2d980 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20  the result.     
2d990 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20 73   ** set.  This s
2d9a0 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20  ubroutine first 
2d9b0 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55 73  looks at the iUs
2d9c0 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65 46  eFlag.  If iUseF
2d9d0 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  lag.      ** is 
2d9e0 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
2d9f0 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20  al to zero, the 
2da00 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61 20  subroutine is a 
2da10 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20 20  no-op.  If.     
2da20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 69   ** the processi
2da30 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65  ng calls for the
2da40 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74 2c   query to abort,
2da50 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
2da60 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d  .      ** increm
2da70 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74 46  ents the iAbortF
2da80 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  lag memory locat
2da90 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72  ion before retur
2daa0 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a  ning in.      **
2dab0 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61 6c   order to signal
2dac0 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61   the caller to a
2dad0 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  bort..      */. 
2dae0 20 20 20 20 20 61 64 64 72 53 65 74 41 62 6f 72       addrSetAbor
2daf0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
2db00 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
2db10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2db20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
2db30 65 67 65 72 2c 20 31 2c 20 69 41 62 6f 72 74 46  eger, 1, iAbortF
2db40 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
2db50 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65 74  Comment((v, "set
2db60 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
2db70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2db80 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
2db90 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52  turn, regOutputR
2dba0 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ow);.      sqlit
2dbb0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2dbc0 65 6c 28 76 2c 20 61 64 64 72 4f 75 74 70 75 74  el(v, addrOutput
2dbd0 52 6f 77 29 3b 0a 20 20 20 20 20 20 61 64 64 72  Row);.      addr
2dbe0 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69  OutputRow = sqli
2dbf0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2dc00 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
2dc10 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2dc20 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73 65  , OP_IfPos, iUse
2dc30 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75 74  Flag, addrOutput
2dc40 52 6f 77 2b 32 29 3b 20 56 64 62 65 43 6f 76 65  Row+2); VdbeCove
2dc50 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56  rage(v);.      V
2dc60 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2dc70 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67  Groupby result g
2dc80 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70  enerator entry p
2dc90 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73  oint"));.      s
2dca0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
2dcb0 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
2dcc0 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
2dcd0 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46      finalizeAggF
2dce0 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c  unctions(pParse,
2dcf0 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
2dd00 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
2dd10 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48  False(pParse, pH
2dd20 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75  aving, addrOutpu
2dd30 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a  tRow+1, SQLITE_J
2dd40 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
2dd50 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
2dd60 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
2dd70 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26 73 53 6f  pEList, -1, &sSo
2dd80 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rt,.            
2dd90 20 20 20 20 20 20 20 20 20 20 26 73 44 69 73 74            &sDist
2dda0 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20  inct, pDest,.   
2ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ddc0 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
2ddd0 2b 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72 74  +1, addrSetAbort
2dde0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2ddf0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2de00 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70  _Return, regOutp
2de10 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64  utRow);.      Vd
2de20 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  beComment((v, "e
2de30 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73 75 6c  nd groupby resul
2de40 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a  t generator"));.
2de50 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
2de60 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
2de70 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65 74 20  that will reset 
2de80 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61 63 63  the group-by acc
2de90 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a  umulator.      *
2dea0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
2deb0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
2dec0 76 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  v, addrReset);. 
2ded0 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75       resetAccumu
2dee0 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
2def0 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
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 52 65 73 65 74 29 3b 0a 20 20 20 20 20  regReset);.     
2df30 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20  .    } /* endif 
2df40 70 47 72 6f 75 70 42 79 2e 20 20 42 65 67 69 6e  pGroupBy.  Begin
2df50 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69   aggregate queri
2df60 65 73 20 77 69 74 68 6f 75 74 20 47 52 4f 55 50  es without GROUP
2df70 20 42 59 3a 20 2a 2f 0a 20 20 20 20 65 6c 73 65   BY: */.    else
2df80 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
2df90 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 23 69 66  t *pDel = 0;.#if
2dfa0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2dfb0 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20 20 20 20  _BTREECOUNT.    
2dfc0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
2dfd0 20 20 20 20 20 69 66 28 20 28 70 54 61 62 20 3d       if( (pTab =
2dfe0 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70   isSimpleCount(p
2dff0 2c 20 26 73 41 67 67 49 6e 66 6f 29 29 21 3d 30  , &sAggInfo))!=0
2e000 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
2e010 66 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28  f isSimpleCount(
2e020 29 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  ) returns a poin
2e030 74 65 72 20 74 6f 20 61 20 54 61 62 6c 65 20 73  ter to a Table s
2e040 74 72 75 63 74 75 72 65 2c 20 74 68 65 6e 0a 20  tructure, then. 
2e050 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51         ** the SQ
2e060 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f  L statement is o
2e070 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 20 20  f the form:.    
2e080 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2e090 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  *   SELECT count
2e0a0 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20  (*) FROM <tbl>. 
2e0b0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2e0c0 20 20 2a 2a 20 77 68 65 72 65 20 74 68 65 20 54    ** where the T
2e0d0 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 72  able structure r
2e0e0 65 74 75 72 6e 65 64 20 72 65 70 72 65 73 65 6e  eturned represen
2e0f0 74 73 20 74 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a  ts table <tbl>..
2e100 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2e110 20 20 20 2a 2a 20 54 68 69 73 20 73 74 61 74 65     ** This state
2e120 6d 65 6e 74 20 69 73 20 73 6f 20 63 6f 6d 6d 6f  ment is so commo
2e130 6e 20 74 68 61 74 20 69 74 20 69 73 20 6f 70 74  n that it is opt
2e140 69 6d 69 7a 65 64 20 73 70 65 63 69 61 6c 6c 79  imized specially
2e150 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  . The.        **
2e160 20 4f 50 5f 43 6f 75 6e 74 20 69 6e 73 74 72 75   OP_Count instru
2e170 63 74 69 6f 6e 20 69 73 20 65 78 65 63 75 74 65  ction is execute
2e180 64 20 65 69 74 68 65 72 20 6f 6e 20 74 68 65 20  d either on the 
2e190 69 6e 74 6b 65 79 20 74 61 62 6c 65 20 74 68 61  intkey table tha
2e1a0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e  t.        ** con
2e1b0 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 20 66  tains the data f
2e1c0 6f 72 20 74 61 62 6c 65 20 3c 74 62 6c 3e 20 6f  or table <tbl> o
2e1d0 72 20 6f 6e 20 6f 6e 65 20 6f 66 20 69 74 73 20  r on one of its 
2e1e0 69 6e 64 65 78 65 73 2e 20 49 74 0a 20 20 20 20  indexes. It.    
2e1f0 20 20 20 20 2a 2a 20 69 73 20 62 65 74 74 65 72      ** is better
2e200 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
2e210 6f 70 20 6f 6e 20 61 6e 20 69 6e 64 65 78 2c 20  op on an index, 
2e220 61 73 20 69 6e 64 65 78 65 73 20 61 72 65 20 61  as indexes are a
2e230 6c 6d 6f 73 74 0a 20 20 20 20 20 20 20 20 2a 2a  lmost.        **
2e240 20 61 6c 77 61 79 73 20 73 70 72 65 61 64 20 61   always spread a
2e250 63 72 6f 73 73 20 6c 65 73 73 20 70 61 67 65 73  cross less pages
2e260 20 74 68 61 6e 20 74 68 65 69 72 20 63 6f 72 72   than their corr
2e270 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 73  esponding tables
2e280 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2e290 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
2e2a0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
2e2b0 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
2e2c0 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
2e2d0 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  ema);.        co
2e2e0 6e 73 74 20 69 6e 74 20 69 43 73 72 20 3d 20 70  nst int iCsr = p
2e2f0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
2e300 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20     /* Cursor to 
2e310 73 63 61 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 20  scan b-tree */. 
2e320 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49         Index *pI
2e330 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
2e340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2e350 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
2e360 20 2a 2f 0a 20 20 20 20 20 20 20 20 4b 65 79 49   */.        KeyI
2e370 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
2e380 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2e390 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20   /* Keyinfo for 
2e3a0 73 63 61 6e 6e 65 64 20 69 6e 64 65 78 20 2a 2f  scanned index */
2e3b0 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a  .        Index *
2e3c0 70 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20  pBest = 0;      
2e3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e3e0 20 42 65 73 74 20 69 6e 64 65 78 20 66 6f 75 6e   Best index foun
2e3f0 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20  d so far */.    
2e400 20 20 20 20 69 6e 74 20 69 52 6f 6f 74 20 3d 20      int iRoot = 
2e410 70 54 61 62 2d 3e 74 6e 75 6d 3b 20 20 20 20 20  pTab->tnum;     
2e420 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
2e430 20 70 61 67 65 20 6f 66 20 73 63 61 6e 6e 65 64   page of scanned
2e440 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20   b-tree */..    
2e450 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
2e460 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
2e470 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
2e480 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
2e490 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
2e4a0 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
2e4b0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
2e4c0 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20        /* Search 
2e4d0 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 74 68  for the index th
2e4e0 61 74 20 68 61 73 20 74 68 65 20 6c 6f 77 65 73  at has the lowes
2e4f0 74 20 73 63 61 6e 20 63 6f 73 74 2e 0a 20 20 20  t scan cost..   
2e500 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2e510 2a 2a 20 28 32 30 31 31 2d 30 34 2d 31 35 29 20  ** (2011-04-15) 
2e520 44 6f 20 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c  Do not do a full
2e530 20 73 63 61 6e 20 6f 66 20 61 6e 20 75 6e 6f 72   scan of an unor
2e540 64 65 72 65 64 20 69 6e 64 65 78 2e 0a 20 20 20  dered index..   
2e550 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2e560 2a 2a 20 28 32 30 31 33 2d 31 30 2d 30 33 29 20  ** (2013-10-03) 
2e570 44 6f 20 6e 6f 74 20 63 6f 75 6e 74 20 74 68 65  Do not count the
2e580 20 65 6e 74 72 69 65 73 20 69 6e 20 61 20 70 61   entries in a pa
2e590 72 74 69 61 6c 20 69 6e 64 65 78 2e 0a 20 20 20  rtial index..   
2e5a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2e5b0 2a 2a 20 49 6e 20 70 72 61 63 74 69 63 65 20 74  ** In practice t
2e5c0 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
2e5d0 74 75 72 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ture will not be
2e5e0 20 75 73 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c   used. It is onl
2e5f0 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  y .        ** pa
2e600 73 73 65 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f  ssed to keep OP_
2e610 4f 70 65 6e 52 65 61 64 20 68 61 70 70 79 2e 0a  OpenRead happy..
2e620 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2e630 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64     if( !HasRowid
2e640 28 70 54 61 62 29 20 29 20 70 42 65 73 74 20 3d  (pTab) ) pBest =
2e650 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
2e660 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
2e670 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d         for(pIdx=
2e680 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
2e690 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
2e6a0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20  Next){.         
2e6b0 20 69 66 28 20 70 49 64 78 2d 3e 62 55 6e 6f 72   if( pIdx->bUnor
2e6c0 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20  dered==0.       
2e6d0 20 20 20 20 26 26 20 70 49 64 78 2d 3e 73 7a 49      && pIdx->szI
2e6e0 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61  dxRow<pTab->szTa
2e6f0 62 52 6f 77 0a 20 20 20 20 20 20 20 20 20 20 20  bRow.           
2e700 26 26 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64  && pIdx->pPartId
2e710 78 57 68 65 72 65 3d 3d 30 0a 20 20 20 20 20 20  xWhere==0.      
2e720 20 20 20 20 20 26 26 20 28 21 70 42 65 73 74 20       && (!pBest 
2e730 7c 7c 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f  || pIdx->szIdxRo
2e740 77 3c 70 42 65 73 74 2d 3e 73 7a 49 64 78 52 6f  w<pBest->szIdxRo
2e750 77 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  w).          ){.
2e760 20 20 20 20 20 20 20 20 20 20 20 20 70 42 65 73              pBes
2e770 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20  t = pIdx;.      
2e780 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2e790 20 20 20 20 20 20 20 20 69 66 28 20 70 42 65 73          if( pBes
2e7a0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  t ){.          i
2e7b0 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e  Root = pBest->tn
2e7c0 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b  um;.          pK
2e7d0 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
2e7e0 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70  KeyInfoOfIndex(p
2e7f0 50 61 72 73 65 2c 20 70 42 65 73 74 29 3b 0a 20  Parse, pBest);. 
2e800 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2e810 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61 64    /* Open a read
2e820 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 65 78  -only cursor, ex
2e830 65 63 75 74 65 20 74 68 65 20 4f 50 5f 43 6f 75  ecute the OP_Cou
2e840 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65 20 63 75  nt, close the cu
2e850 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rsor. */.       
2e860 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2e870 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e  p4Int(v, OP_Open
2e880 52 65 61 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f  Read, iCsr, iRoo
2e890 74 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20  t, iDb, 1);.    
2e8a0 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
2e8b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2e8c0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2e8d0 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a  4(v, -1, (char *
2e8e0 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
2e8f0 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20  YINFO);.        
2e900 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
2e910 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2e920 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73  P_Count, iCsr, s
2e930 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d  AggInfo.aFunc[0]
2e940 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20  .iMem);.        
2e950 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2e960 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  1(v, OP_Close, i
2e970 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20 65 78  Csr);.        ex
2e980 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74  plainSimpleCount
2e990 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
2e9a0 42 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Best);.      }el
2e9b0 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  se.#endif /* SQL
2e9c0 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f  ITE_OMIT_BTREECO
2e9d0 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20  UNT */.      {. 
2e9e0 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
2e9f0 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  if the query is 
2ea00 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  of one of the fo
2ea10 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20  llowing forms:. 
2ea20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2ea30 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 69    **   SELECT mi
2ea40 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20  n(x) FROM ....  
2ea50 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
2ea60 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e  T max(x) FROM ..
2ea70 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
2ea80 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73       ** If it is
2ea90 2c 20 74 68 65 6e 20 61 73 6b 20 74 68 65 20 63  , then ask the c
2eaa0 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 74  ode in where.c t
2eab0 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73 6f 72  o attempt to sor
2eac0 74 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20  t results.      
2ead0 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65 72 65    ** as if there
2eae0 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52 20 4f   was an "ORDER O
2eaf0 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52 20 4f  N x" or "ORDER O
2eb00 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75 73 65  N x DESC" clause
2eb10 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66  . .        ** If
2eb20 20 77 68 65 72 65 2e 63 20 69 73 20 61 62 6c 65   where.c is able
2eb30 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65 73 75   to produce resu
2eb40 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20 74 68  lts sorted in th
2eb50 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20  is order, then. 
2eb60 20 20 20 20 20 20 20 2a 2a 20 61 64 64 20 76 64         ** add vd
2eb70 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65 61 6b  be code to break
2eb80 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72 6f 63   out of the proc
2eb90 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65  essing loop afte
2eba0 72 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  r the .        *
2ebb0 2a 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  * first iteratio
2ebc0 6e 20 28 73 69 6e 63 65 20 74 68 65 20 66 69 72  n (since the fir
2ebd0 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  st iteration of 
2ebe0 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20  the loop is .   
2ebf0 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65       ** guarante
2ec00 65 64 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  ed to operate on
2ec10 20 74 68 65 20 72 6f 77 20 77 69 74 68 20 74 68   the row with th
2ec20 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78  e minimum or max
2ec30 69 6d 75 6d 20 0a 20 20 20 20 20 20 20 20 2a 2a  imum .        **
2ec40 20 76 61 6c 75 65 20 6f 66 20 78 2c 20 74 68 65   value of x, the
2ec50 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75 69 72   only row requir
2ec60 65 64 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ed)..        **.
2ec70 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73 70 65          ** A spe
2ec80 63 69 61 6c 20 66 6c 61 67 20 6d 75 73 74 20 62  cial flag must b
2ec90 65 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  e passed to sqli
2eca0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
2ecb0 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20  to slightly.    
2ecc0 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65      ** modify be
2ecd0 68 61 76 69 6f 72 20 61 73 20 66 6f 6c 6c 6f 77  havior as follow
2ece0 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  s:.        **.  
2ecf0 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 49 66 20        **   + If 
2ed00 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20 22  the query is a "
2ed10 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c 20  SELECT min(x)", 
2ed20 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f  then the loop co
2ed30 64 65 64 20 62 79 0a 20 20 20 20 20 20 20 20 2a  ded by.        *
2ed40 2a 20 20 20 20 20 77 68 65 72 65 2e 63 20 73 68  *     where.c sh
2ed50 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72 61 74 65  ould not iterate
2ed60 20 6f 76 65 72 20 61 6e 79 20 76 61 6c 75 65 73   over any values
2ed70 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c   with a NULL val
2ed80 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ue.        **   
2ed90 20 20 66 6f 72 20 78 2e 0a 20 20 20 20 20 20 20    for x..       
2eda0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
2edb0 20 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72   + The optimizer
2edc0 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63   code in where.c
2edd0 20 28 74 68 65 20 74 68 69 6e 67 20 74 68 61 74   (the thing that
2ede0 20 64 65 63 69 64 65 73 20 77 68 69 63 68 0a 20   decides which. 
2edf0 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e         **     in
2ee00 64 65 78 20 6f 72 20 69 6e 64 69 63 65 73 20 74  dex or indices t
2ee10 6f 20 75 73 65 29 20 73 68 6f 75 6c 64 20 70 6c  o use) should pl
2ee20 61 63 65 20 61 20 64 69 66 66 65 72 65 6e 74 20  ace a different 
2ee30 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20  priority on .   
2ee40 20 20 20 20 20 2a 2a 20 20 20 20 20 73 61 74 69       **     sati
2ee50 73 66 79 69 6e 67 20 74 68 65 20 27 4f 52 44 45  sfying the 'ORDE
2ee60 52 20 42 59 27 20 63 6c 61 75 73 65 20 74 68 61  R BY' clause tha
2ee70 6e 20 69 74 20 64 6f 65 73 20 69 6e 20 6f 74 68  n it does in oth
2ee80 65 72 20 63 61 73 65 73 2e 0a 20 20 20 20 20 20  er cases..      
2ee90 20 20 2a 2a 20 20 20 20 20 52 65 66 65 72 20 74    **     Refer t
2eea0 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65  o code and comme
2eeb0 6e 74 73 20 69 6e 20 77 68 65 72 65 2e 63 20 66  nts in where.c f
2eec0 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 20 20  or details..    
2eed0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 45      */.        E
2eee0 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78  xprList *pMinMax
2eef0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38   = 0;.        u8
2ef00 20 66 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f 52   flag = WHERE_OR
2ef10 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  DERBY_NORMAL;.  
2ef20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 61        .        a
2ef30 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70  ssert( p->pGroup
2ef40 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  By==0 );.       
2ef50 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30   assert( flag==0
2ef60 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2ef70 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 7b  p->pHaving==0 ){
2ef80 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20  .          flag 
2ef90 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 26 73  = minMaxQuery(&s
2efa0 41 67 67 49 6e 66 6f 2c 20 26 70 4d 69 6e 4d 61  AggInfo, &pMinMa
2efb0 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  x);.        }.  
2efc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c        assert( fl
2efd0 61 67 3d 3d 30 20 7c 7c 20 28 70 4d 69 6e 4d 61  ag==0 || (pMinMa
2efe0 78 21 3d 30 20 26 26 20 70 4d 69 6e 4d 61 78 2d  x!=0 && pMinMax-
2eff0 3e 6e 45 78 70 72 3d 3d 31 29 20 29 3b 0a 0a 20  >nExpr==1) );.. 
2f000 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 20         if( flag 
2f010 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 69  ){.          pMi
2f020 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 45 78  nMax = sqlite3Ex
2f030 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4d  prListDup(db, pM
2f040 69 6e 4d 61 78 2c 20 30 29 3b 0a 20 20 20 20 20  inMax, 0);.     
2f050 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e       pDel = pMin
2f060 4d 61 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Max;.          i
2f070 66 28 20 70 4d 69 6e 4d 61 78 20 26 26 20 21 64  f( pMinMax && !d
2f080 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2f090 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
2f0a0 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72  MinMax->a[0].sor
2f0b0 74 4f 72 64 65 72 20 3d 20 66 6c 61 67 21 3d 57  tOrder = flag!=W
2f0c0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
2f0d0 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20 20 20   ?1:0;.         
2f0e0 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d     pMinMax->a[0]
2f0f0 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f  .pExpr->op = TK_
2f100 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20  COLUMN;.        
2f110 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2f120 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
2f130 20 63 61 73 65 20 72 75 6e 73 20 69 66 20 74 68   case runs if th
2f140 65 20 61 67 67 72 65 67 61 74 65 20 68 61 73 20  e aggregate has 
2f150 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  no GROUP BY clau
2f160 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20  se.  The.       
2f170 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69   ** processing i
2f180 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73  s much simpler s
2f190 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e  ince there is on
2f1a0 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a  ly a single row.
2f1b0 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75          ** of ou
2f1c0 74 70 75 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  tput..        */
2f1d0 0a 20 20 20 20 20 20 20 20 72 65 73 65 74 41 63  .        resetAc
2f1e0 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
2f1f0 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
2f200 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73        pWInfo = s
2f210 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2f220 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
2f230 74 2c 20 70 57 68 65 72 65 2c 20 70 4d 69 6e 4d  t, pWhere, pMinM
2f240 61 78 2c 30 2c 66 6c 61 67 2c 30 29 3b 0a 20 20  ax,0,flag,0);.  
2f250 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
2f260 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2f270 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2f280 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29  Delete(db, pDel)
2f290 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
2f2a0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
2f2b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75       }.        u
2f2c0 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
2f2d0 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
2f2e0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  fo);.        ass
2f2f0 65 72 74 28 20 70 4d 69 6e 4d 61 78 3d 3d 30 20  ert( pMinMax==0 
2f300 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70  || pMinMax->nExp
2f310 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  r==1 );.        
2f320 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
2f330 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f  IsOrdered(pWInfo
2f340 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  )>0 ){.         
2f350 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f360 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
2f370 2c 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72  , sqlite3WhereBr
2f380 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29  eakLabel(pWInfo)
2f390 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
2f3a0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
2f3b0 28 29 20 62 79 20 69 6e 64 65 78 22 2c 0a 20 20  () by index",.  
2f3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 66                (f
2f3d0 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52  lag==WHERE_ORDER
2f3e0 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61  BY_MIN?"min":"ma
2f3f0 78 22 29 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  x")));.        }
2f400 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f410 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
2f420 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c 69  ;.        finali
2f430 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70  zeAggFunctions(p
2f440 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
2f450 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
2f460 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
2f470 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
2f480 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
2f490 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20  Parse, pHaving, 
2f4a0 61 64 64 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f  addrEnd, SQLITE_
2f4b0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
2f4c0 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
2f4d0 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
2f4e0 3e 70 45 4c 69 73 74 2c 20 2d 31 2c 20 30 2c 20  >pEList, -1, 0, 
2f4f0 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
2f500 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2c            pDest,
2f510 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45 6e   addrEnd, addrEn
2f520 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
2f530 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
2f540 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d  db, pDel);.    }
2f550 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2f560 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
2f570 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20  addrEnd);.    . 
2f580 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67 67 72   } /* endif aggr
2f590 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a  egate query */..
2f5a0 20 20 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e    if( sDistinct.
2f5b0 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52 45  eTnctType==WHERE
2f5c0 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45  _DISTINCT_UNORDE
2f5d0 52 45 44 20 29 7b 0a 20 20 20 20 65 78 70 6c 61  RED ){.    expla
2f5e0 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72  inTempTable(pPar
2f5f0 73 65 2c 20 22 44 49 53 54 49 4e 43 54 22 29 3b  se, "DISTINCT");
2f600 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
2f610 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
2f620 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
2f630 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20  we need to sort 
2f640 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a  the results.  **
2f650 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74   and send them t
2f660 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f  o the callback o
2f670 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  ne by one..  */.
2f680 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64    if( sSort.pOrd
2f690 65 72 42 79 20 29 7b 0a 20 20 20 20 65 78 70 6c  erBy ){.    expl
2f6a0 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61  ainTempTable(pPa
2f6b0 72 73 65 2c 20 73 53 6f 72 74 2e 6e 4f 42 53 61  rse, sSort.nOBSa
2f6c0 74 3e 30 20 3f 20 22 52 49 47 48 54 20 50 41 52  t>0 ? "RIGHT PAR
2f6d0 54 20 4f 46 20 4f 52 44 45 52 20 42 59 22 3a 22  T OF ORDER BY":"
2f6e0 4f 52 44 45 52 20 42 59 22 29 3b 0a 20 20 20 20  ORDER BY");.    
2f6f0 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
2f700 28 70 50 61 72 73 65 2c 20 70 2c 20 26 73 53 6f  (pParse, p, &sSo
2f710 72 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rt, pEList->nExp
2f720 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a  r, pDest);.  }..
2f730 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
2f740 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75 65 72  o skip this quer
2f750 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  y.  */.  sqlite3
2f760 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
2f770 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a  (v, iEnd);..  /*
2f780 20 54 68 65 20 53 45 4c 45 43 54 20 77 61 73 20   The SELECT was 
2f790 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64  successfully cod
2f7a0 65 64 2e 20 20 20 53 65 74 20 74 68 65 20 72 65  ed.   Set the re
2f7b0 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20  turn code to 0. 
2f7c0 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
2f7d0 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a  no errors..  */.
2f7e0 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20    rc = 0;..  /* 
2f7f0 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f  Control jumps to
2f800 20 68 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f   here if an erro
2f810 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
2f820 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a   above, or upon.
2f830 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20    ** successful 
2f840 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45  coding of the SE
2f850 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63  LECT..  */.selec
2f860 74 5f 65 6e 64 3a 0a 20 20 65 78 70 6c 61 69 6e  t_end:.  explain
2f870 53 65 74 49 6e 74 65 67 65 72 28 70 50 61 72 73  SetInteger(pPars
2f880 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52  e->iSelectId, iR
2f890 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b  estoreSelectId);
2f8a0 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20  ..  /* Identify 
2f8b0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20  column names if 
2f8c0 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 53  results of the S
2f8d0 45 4c 45 43 54 20 61 72 65 20 74 6f 20 62 65 20  ELECT are to be 
2f8e0 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69  output..  */.  i
2f8f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2f900 20 26 26 20 70 44 65 73 74 2d 3e 65 44 65 73 74   && pDest->eDest
2f910 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
2f920 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
2f930 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
2f940 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
2f950 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
2f960 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67  3DbFree(db, sAgg
2f970 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71  Info.aCol);.  sq
2f980 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2f990 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b  sAggInfo.aFunc);
2f9a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2f9b0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
2f9c0 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f  ITE_ENABLE_TREE_
2f9d0 45 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47  EXPLAIN)./*.** G
2f9e0 65 6e 65 72 61 74 65 20 61 20 68 75 6d 61 6e 2d  enerate a human-
2f9f0 72 65 61 64 61 62 6c 65 20 64 65 73 63 72 69 70  readable descrip
2fa00 74 69 6f 6e 20 6f 66 20 61 20 74 68 65 20 53 65  tion of a the Se
2fa10 6c 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  lect object..*/.
2fa20 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
2fa30 61 69 6e 4f 6e 65 53 65 6c 65 63 74 28 56 64 62  ainOneSelect(Vdb
2fa40 65 20 2a 70 56 64 62 65 2c 20 53 65 6c 65 63 74  e *pVdbe, Select
2fa50 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 45   *p){.  sqlite3E
2fa60 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
2fa70 62 65 2c 20 22 53 45 4c 45 43 54 20 22 29 3b 0a  be, "SELECT ");.
2fa80 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
2fa90 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
2faa0 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 20 29  |SF_Aggregate) )
2fab0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c  {.    if( p->sel
2fac0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
2fad0 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  nct ){.      sql
2fae0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
2faf0 66 28 70 56 64 62 65 2c 20 22 44 49 53 54 49 4e  f(pVdbe, "DISTIN
2fb00 43 54 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  CT ");.    }.   
2fb10 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
2fb20 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 20   & SF_Aggregate 
2fb30 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2fb40 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
2fb50 64 62 65 2c 20 22 61 67 67 5f 66 6c 61 67 20 22  dbe, "agg_flag "
2fb60 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2fb70 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56  ite3ExplainNL(pV
2fb80 64 62 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dbe);.    sqlite
2fb90 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
2fba0 56 64 62 65 2c 20 22 20 20 20 22 29 3b 0a 20 20  Vdbe, "   ");.  
2fbb0 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61  }.  sqlite3Expla
2fbc0 69 6e 45 78 70 72 4c 69 73 74 28 70 56 64 62 65  inExprList(pVdbe
2fbd0 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
2fbe0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c  sqlite3ExplainNL
2fbf0 28 70 56 64 62 65 29 3b 0a 20 20 69 66 28 20 70  (pVdbe);.  if( p
2fc00 2d 3e 70 53 72 63 20 26 26 20 70 2d 3e 70 53 72  ->pSrc && p->pSr
2fc10 63 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 69  c->nSrc ){.    i
2fc20 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65  nt i;.    sqlite
2fc30 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
2fc40 56 64 62 65 2c 20 22 46 52 4f 4d 20 22 29 3b 0a  Vdbe, "FROM ");.
2fc50 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2fc60 69 6e 50 75 73 68 28 70 56 64 62 65 29 3b 0a 20  inPush(pVdbe);. 
2fc70 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
2fc80 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  >pSrc->nSrc; i++
2fc90 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
2fca0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
2fcb0 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e  tem = &p->pSrc->
2fcc0 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  a[i];.      sqli
2fcd0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2fce0 28 70 56 64 62 65 2c 20 22 7b 25 64 2c 2a 7d 20  (pVdbe, "{%d,*} 
2fcf0 3d 20 22 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  = ", pItem->iCur
2fd00 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  sor);.      if( 
2fd10 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pItem->pSelect )
2fd20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2fd30 33 45 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 70  3ExplainSelect(p
2fd40 56 64 62 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65  Vdbe, pItem->pSe
2fd50 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 69  lect);.        i
2fd60 66 28 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 29  f( pItem->pTab )
2fd70 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
2fd80 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2fd90 28 70 56 64 62 65 2c 20 22 20 28 74 61 62 6e 61  (pVdbe, " (tabna
2fda0 6d 65 3d 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e  me=%s)", pItem->
2fdb0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
2fdc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
2fdd0 6c 73 65 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a  lse if( pItem->z
2fde0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
2fdf0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2fe00 69 6e 74 66 28 70 56 64 62 65 2c 20 22 25 73 22  intf(pVdbe, "%s"
2fe10 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pItem->zName);
2fe20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2fe30 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  f( pItem->zAlias
2fe40 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2fe50 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2fe60 28 70 56 64 62 65 2c 20 22 20 28 41 53 20 25 73  (pVdbe, " (AS %s
2fe70 29 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  )", pItem->zAlia
2fe80 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s);.      }.    
2fe90 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 6a 6f 69    if( pItem->joi
2fea0 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 20  ntype & JT_LEFT 
2feb0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2fec0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2fed0 70 56 64 62 65 2c 20 22 20 4c 45 46 54 2d 4a 4f  pVdbe, " LEFT-JO
2fee0 49 4e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  IN");.      }.  
2fef0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2ff00 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 20  inNL(pVdbe);.   
2ff10 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
2ff20 70 6c 61 69 6e 50 6f 70 28 70 56 64 62 65 29 3b  plainPop(pVdbe);
2ff30 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 57  .  }.  if( p->pW
2ff40 68 65 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  here ){.    sqli
2ff50 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2ff60 28 70 56 64 62 65 2c 20 22 57 48 45 52 45 20 22  (pVdbe, "WHERE "
2ff70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2ff80 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62 65 2c  plainExpr(pVdbe,
2ff90 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20   p->pWhere);.   
2ffa0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
2ffb0 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20  L(pVdbe);.  }.  
2ffc0 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20  if( p->pGroupBy 
2ffd0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
2ffe0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
2fff0 65 2c 20 22 47 52 4f 55 50 42 59 20 22 29 3b 0a  e, "GROUPBY ");.
30000 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
30010 69 6e 45 78 70 72 4c 69 73 74 28 70 56 64 62 65  inExprList(pVdbe
30020 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a  , p->pGroupBy);.
30030 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
30040 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d  inNL(pVdbe);.  }
30050 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e  .  if( p->pHavin
30060 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
30070 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
30080 64 62 65 2c 20 22 48 41 56 49 4e 47 20 22 29 3b  dbe, "HAVING ");
30090 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
300a0 61 69 6e 45 78 70 72 28 70 56 64 62 65 2c 20 70  ainExpr(pVdbe, p
300b0 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20  ->pHaving);.    
300c0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c  sqlite3ExplainNL
300d0 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69  (pVdbe);.  }.  i
300e0 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
300f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
30100 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
30110 2c 20 22 4f 52 44 45 52 42 59 20 22 29 3b 0a 20  , "ORDERBY ");. 
30120 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
30130 6e 45 78 70 72 4c 69 73 74 28 70 56 64 62 65 2c  nExprList(pVdbe,
30140 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
30150 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
30160 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a  nNL(pVdbe);.  }.
30170 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20    if( p->pLimit 
30180 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
30190 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
301a0 65 2c 20 22 4c 49 4d 49 54 20 22 29 3b 0a 20 20  e, "LIMIT ");.  
301b0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
301c0 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70  Expr(pVdbe, p->p
301d0 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69  Limit);.    sqli
301e0 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64  te3ExplainNL(pVd
301f0 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  be);.  }.  if( p
30200 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->pOffset ){.   
30210 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
30220 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 4f 46  rintf(pVdbe, "OF
30230 46 53 45 54 20 22 29 3b 0a 20 20 20 20 73 71 6c  FSET ");.    sql
30240 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
30250 70 56 64 62 65 2c 20 70 2d 3e 70 4f 66 66 73 65  pVdbe, p->pOffse
30260 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
30270 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b  xplainNL(pVdbe);
30280 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
30290 74 65 33 45 78 70 6c 61 69 6e 53 65 6c 65 63 74  te3ExplainSelect
302a0 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53 65  (Vdbe *pVdbe, Se
302b0 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20  lect *p){.  if( 
302c0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  p==0 ){.    sqli
302d0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
302e0 28 70 56 64 62 65 2c 20 22 28 6e 75 6c 6c 2d 73  (pVdbe, "(null-s
302f0 65 6c 65 63 74 29 22 29 3b 0a 20 20 20 20 72 65  elect)");.    re
30300 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
30310 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70  te3ExplainPush(p
30320 56 64 62 65 29 3b 0a 20 20 77 68 69 6c 65 28 20  Vdbe);.  while( 
30330 70 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e  p ){.    explain
30340 4f 6e 65 53 65 6c 65 63 74 28 70 56 64 62 65 2c  OneSelect(pVdbe,
30350 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e   p);.    p = p->
30360 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70  pNext;.    if( p
30370 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
30380 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
30390 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20 73 71  L(pVdbe);.    sq
303a0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
303b0 74 66 28 70 56 64 62 65 2c 20 22 25 73 5c 6e 22  tf(pVdbe, "%s\n"
303c0 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70  , selectOpName(p
303d0 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 20 20 73 71  ->op));.  }.  sq
303e0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
303f0 74 66 28 70 56 64 62 65 2c 20 22 45 4e 44 22 29  tf(pVdbe, "END")
30400 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61  ;.  sqlite3Expla
30410 69 6e 50 6f 70 28 70 56 64 62 65 29 3b 0a 7d 0a  inPop(pVdbe);.}.
30420 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73  ./* End of the s
30430 74 72 75 63 74 75 72 65 20 64 65 62 75 67 20 70  tructure debug p
30440 72 69 6e 74 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a  rinting code.***
30450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64  **********/.#end
304a0 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
304b0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45  LITE_ENABLE_TREE
304c0 5f 45 58 50 4c 41 49 4e 29 20 2a 2f 0a           _EXPLAIN) */.