/ Hex Artifact Content
Login

Artifact f8b0b6c43bee15f4e239ead1c9c9e3009e507e39:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
0210: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
0220: 6e 67 20 6f 62 6a 65 63 74 20 69 73 20 75 73 65  ng object is use
0230: 64 20 74 6f 20 72 65 63 6f 72 64 20 69 6e 66 6f  d to record info
0240: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a  rmation about.**
0250: 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20   how to process 
0260: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
0270: 77 6f 72 64 2c 20 74 6f 20 73 69 6d 70 6c 69 66  word, to simplif
0280: 79 20 70 61 73 73 69 6e 67 20 74 68 61 74 20 69  y passing that i
0290: 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e  nformation.** in
02a0: 74 6f 20 74 68 65 20 73 65 6c 65 63 74 49 6e 6e  to the selectInn
02b0: 65 72 4c 6f 6f 70 28 29 20 72 6f 75 74 69 6e 65  erLoop() routine
02c0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
02d0: 75 63 74 20 44 69 73 74 69 6e 63 74 43 74 78 20  uct DistinctCtx 
02e0: 44 69 73 74 69 6e 63 74 43 74 78 3b 0a 73 74 72  DistinctCtx;.str
02f0: 75 63 74 20 44 69 73 74 69 6e 63 74 43 74 78 20  uct DistinctCtx 
0300: 7b 0a 20 20 75 38 20 69 73 54 6e 63 74 3b 20 20  {.  u8 isTnct;  
0310: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
0320: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
0330: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
0340: 2f 0a 20 20 75 38 20 65 54 6e 63 74 54 79 70 65  /.  u8 eTnctType
0350: 3b 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68  ;   /* One of th
0360: 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
0370: 5f 2a 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  _* operators */.
0380: 20 20 69 6e 74 20 74 61 62 54 6e 63 74 3b 20 20    int tabTnct;  
0390: 20 20 2f 2a 20 45 70 68 65 6d 65 72 61 6c 20 74    /* Ephemeral t
03a0: 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20 44 49  able used for DI
03b0: 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69 6e  STINCT processin
03c0: 67 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  g */.  int addrT
03d0: 6e 63 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73  nct;   /* Addres
03e0: 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65  s of OP_OpenEphe
03f0: 6d 65 72 61 6c 20 6f 70 63 6f 64 65 20 66 6f 72  meral opcode for
0400: 20 74 61 62 54 6e 63 74 20 2a 2f 0a 7d 3b 0a 0a   tabTnct */.};..
0410: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
0420: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
0430: 6e 67 20 6f 62 6a 65 63 74 20 69 73 20 75 73 65  ng object is use
0440: 64 20 74 6f 20 72 65 63 6f 72 64 20 69 6e 66 6f  d to record info
0450: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a  rmation about.**
0460: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 28 6f   the ORDER BY (o
0470: 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c 61 75  r GROUP BY) clau
0480: 73 65 20 6f 66 20 71 75 65 72 79 20 69 73 20 62  se of query is b
0490: 65 69 6e 67 20 63 6f 64 65 64 2e 0a 2a 2f 0a 74  eing coded..*/.t
04a0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53 6f  ypedef struct So
04b0: 72 74 43 74 78 20 53 6f 72 74 43 74 78 3b 0a 73  rtCtx SortCtx;.s
04c0: 74 72 75 63 74 20 53 6f 72 74 43 74 78 20 7b 0a  truct SortCtx {.
04d0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
04e0: 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f  erBy;   /* The O
04f0: 52 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55  RDER BY (or GROU
0500: 50 20 42 59 20 63 6c 61 75 73 65 29 20 2a 2f 0a  P BY clause) */.
0510: 20 20 69 6e 74 20 6e 4f 42 53 61 74 3b 20 20 20    int nOBSat;   
0520: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
0530: 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65  r of ORDER BY te
0540: 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 62 79  rms satisfied by
0550: 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e   indices */.  in
0560: 74 20 69 45 43 75 72 73 6f 72 3b 20 20 20 20 20  t iECursor;     
0570: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
0580: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 73 6f 72  mber for the sor
0590: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ter */.  int reg
05a0: 52 65 74 75 72 6e 3b 20 20 20 20 20 20 20 20 2f  Return;        /
05b0: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
05c0: 6e 67 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20  ng block-output 
05d0: 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 2a  return address *
05e0: 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 42 6b 4f  /.  int labelBkO
05f0: 75 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61  ut;       /* Sta
0600: 72 74 20 6c 61 62 65 6c 20 66 6f 72 20 74 68 65  rt label for the
0610: 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 73 75   block-output su
0620: 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
0630: 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b  t addrSortIndex;
0640: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
0650: 66 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f  f the OP_SorterO
0660: 70 65 6e 20 6f 72 20 4f 50 5f 4f 70 65 6e 45 70  pen or OP_OpenEp
0670: 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 75 38 20  hemeral */.  u8 
0680: 73 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20 20  sortFlags;      
0690: 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f     /* Zero or mo
06a0: 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62 69  re SORTFLAG_* bi
06b0: 74 73 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65  ts */.};.#define
06c0: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
06d0: 74 65 72 20 20 30 78 30 31 20 20 20 2f 2a 20 55  ter  0x01   /* U
06e0: 73 65 20 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e  se SorterOpen in
06f0: 73 74 65 61 64 20 6f 66 20 4f 70 65 6e 45 70 68  stead of OpenEph
0700: 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  emeral */../*.**
0710: 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68 65 20   Delete all the 
0720: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53 65 6c  content of a Sel
0730: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 62 75  ect structure bu
0740: 74 20 64 6f 20 6e 6f 74 20 64 65 61 6c 6c 6f 63  t do not dealloc
0750: 61 74 65 0a 2a 2a 20 74 68 65 20 73 65 6c 65 63  ate.** the selec
0760: 74 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  t structure itse
0770: 6c 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  lf..*/.static vo
0780: 69 64 20 63 6c 65 61 72 53 65 6c 65 63 74 28 73  id clearSelect(s
0790: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65  qlite3 *db, Sele
07a0: 63 74 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  ct *p){.  sqlite
07b0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
07c0: 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  db, p->pEList);.
07d0: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
07e0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53  Delete(db, p->pS
07f0: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  rc);.  sqlite3Ex
0800: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
0810: 70 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74  pWhere);.  sqlit
0820: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
0830: 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
0840: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
0850: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 48  Delete(db, p->pH
0860: 61 76 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65  aving);.  sqlite
0870: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
0880: 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  db, p->pOrderBy)
0890: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
08a0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
08b0: 50 72 69 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65  Prior);.  sqlite
08c0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
08d0: 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 73 71  p->pLimit);.  sq
08e0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
08f0: 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
0900: 0a 20 20 73 71 6c 69 74 65 33 57 69 74 68 44 65  .  sqlite3WithDe
0910: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69 74  lete(db, p->pWit
0920: 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  h);.}../*.** Ini
0930: 74 69 61 6c 69 7a 65 20 61 20 53 65 6c 65 63 74  tialize a Select
0940: 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a  Dest structure..
0950: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
0960: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 53 65  electDestInit(Se
0970: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c  lectDest *pDest,
0980: 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20   int eDest, int 
0990: 69 50 61 72 6d 29 7b 0a 20 20 70 44 65 73 74 2d  iParm){.  pDest-
09a0: 3e 65 44 65 73 74 20 3d 20 28 75 38 29 65 44 65  >eDest = (u8)eDe
09b0: 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53 44  st;.  pDest->iSD
09c0: 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20 20  Parm = iParm;.  
09d0: 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20 3d  pDest->affSdst =
09e0: 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53 64   0;.  pDest->iSd
09f0: 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d  st = 0;.  pDest-
0a00: 3e 6e 53 64 73 74 20 3d 20 30 3b 0a 7d 0a 0a 0a  >nSdst = 0;.}...
0a10: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
0a20: 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74 72 75   new Select stru
0a30: 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e  cture and return
0a40: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
0a50: 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  at.** structure.
0a60: 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  .*/.Select *sqli
0a70: 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a 20 20  te3SelectNew(.  
0a80: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
0a90: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
0aa0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
0ab0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
0ac0: 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c      /* which col
0ad0: 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64 65 20  umns to include 
0ae0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
0af0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
0b00: 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20  ,        /* the 
0b10: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77  FROM clause -- w
0b20: 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f 20 73  hich tables to s
0b30: 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  can */.  Expr *p
0b40: 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
0b50: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
0b60: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
0b70: 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a   *pGroupBy,   /*
0b80: 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
0b90: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
0ba0: 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20 20 20  pHaving,        
0bb0: 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  /* the HAVING cl
0bc0: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
0bd0: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
0be0: 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  /* the ORDER BY 
0bf0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20  clause */.  u16 
0c00: 73 65 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20  selFlags,       
0c10: 20 20 2f 2a 20 46 6c 61 67 20 70 61 72 61 6d 65    /* Flag parame
0c20: 74 65 72 73 2c 20 73 75 63 68 20 61 73 20 53 46  ters, such as SF
0c30: 5f 44 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 45  _Distinct */.  E
0c40: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20  xpr *pLimit,    
0c50: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61       /* LIMIT va
0c60: 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73  lue.  NULL means
0c70: 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 45   not used */.  E
0c80: 78 70 72 20 2a 70 4f 66 66 73 65 74 20 20 20 20  xpr *pOffset    
0c90: 20 20 20 20 20 2f 2a 20 4f 46 46 53 45 54 20 76       /* OFFSET v
0ca0: 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e  alue.  NULL mean
0cb0: 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29  s no offset */.)
0cc0: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
0cd0: 3b 0a 20 20 53 65 6c 65 63 74 20 73 74 61 6e 64  ;.  Select stand
0ce0: 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  in;.  sqlite3 *d
0cf0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
0d00: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
0d10: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
0d20: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
0d30: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
0d40: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
0d50: 21 70 4f 66 66 73 65 74 20 7c 7c 20 70 4c 69 6d  !pOffset || pLim
0d60: 69 74 20 29 3b 20 2f 2a 20 4f 46 46 53 45 54 20  it ); /* OFFSET 
0d70: 69 6d 70 6c 69 65 73 20 4c 49 4d 49 54 20 2a 2f  implies LIMIT */
0d80: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
0d90: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
0da0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
0db0: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 26 73 74  ;.    pNew = &st
0dc0: 61 6e 64 69 6e 3b 0a 20 20 20 20 6d 65 6d 73 65  andin;.    memse
0dd0: 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f  t(pNew, 0, sizeo
0de0: 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 7d 0a 20  f(*pNew));.  }. 
0df0: 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29   if( pEList==0 )
0e00: 7b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73  {.    pEList = s
0e10: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
0e20: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
0e30: 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 54  sqlite3Expr(db,T
0e40: 4b 5f 41 4c 4c 2c 30 29 29 3b 0a 20 20 7d 0a 20  K_ALL,0));.  }. 
0e50: 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20   pNew->pEList = 
0e60: 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 53  pEList;.  if( pS
0e70: 72 63 3d 3d 30 20 29 20 70 53 72 63 20 3d 20 73  rc==0 ) pSrc = s
0e80: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
0e90: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
0ea0: 53 72 63 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  Src));.  pNew->p
0eb0: 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 70 4e  Src = pSrc;.  pN
0ec0: 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68  ew->pWhere = pWh
0ed0: 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72  ere;.  pNew->pGr
0ee0: 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79  oupBy = pGroupBy
0ef0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e  ;.  pNew->pHavin
0f00: 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 70  g = pHaving;.  p
0f10: 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  New->pOrderBy = 
0f20: 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 4e 65 77  pOrderBy;.  pNew
0f30: 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 73 65 6c  ->selFlags = sel
0f40: 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 6f  Flags;.  pNew->o
0f50: 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20  p = TK_SELECT;. 
0f60: 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20   pNew->pLimit = 
0f70: 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d 3e  pLimit;.  pNew->
0f80: 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
0f90: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 66  t;.  assert( pOf
0fa0: 66 73 65 74 3d 3d 30 20 7c 7c 20 70 4c 69 6d 69  fset==0 || pLimi
0fb0: 74 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e  t!=0 );.  pNew->
0fc0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
0fd0: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
0fe0: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
0ff0: 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  -1;.  if( db->ma
1000: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a 20  llocFailed ) {. 
1010: 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64     clearSelect(d
1020: 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 69 66  b, pNew);.    if
1030: 28 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e  ( pNew!=&standin
1040: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
1050: 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  (db, pNew);.    
1060: 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  pNew = 0;.  }els
1070: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
1080: 4e 65 77 2d 3e 70 53 72 63 21 3d 30 20 7c 7c 20  New->pSrc!=0 || 
1090: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29  pParse->nErr>0 )
10a0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
10b0: 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e 20 29  pNew!=&standin )
10c0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
10d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
10e0: 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63   the given Selec
10f0: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
1100: 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74  all of its subst
1110: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69  ructures..*/.voi
1120: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  d sqlite3SelectD
1130: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
1140: 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  b, Select *p){. 
1150: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63 6c   if( p ){.    cl
1160: 65 61 72 53 65 6c 65 63 74 28 64 62 2c 20 70 29  earSelect(db, p)
1170: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
1180: 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  ree(db, p);.  }.
1190: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11a0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
11b0: 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
11c0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
11d0: 61 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f 0a 73  a compound..*/.s
11e0: 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 66 69  tatic Select *fi
11f0: 6e 64 52 69 67 68 74 6d 6f 73 74 28 53 65 6c 65  ndRightmost(Sele
1200: 63 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28  ct *p){.  while(
1210: 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 20 3d 20   p->pNext ) p = 
1220: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65 74 75  p->pNext;.  retu
1230: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn p;.}../*.** G
1240: 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e  iven 1 to 3 iden
1250: 74 69 66 69 65 72 73 20 70 72 65 63 65 64 69 6e  tifiers precedin
1260: 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f  g the JOIN keywo
1270: 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68  rd, determine th
1280: 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69  e.** type of joi
1290: 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
12a0: 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74  teger constant t
12b0: 68 61 74 20 65 78 70 72 65 73 73 65 73 20 74 68  hat expresses th
12c0: 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65  at type.** in te
12d0: 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  rms of the follo
12e0: 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a  wing bit values:
12f0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e  .**.**     JT_IN
1300: 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52  NER.**     JT_CR
1310: 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55  OSS.**     JT_OU
1320: 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41  TER.**     JT_NA
1330: 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f  TURAL.**     JT_
1340: 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52  LEFT.**     JT_R
1350: 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c  IGHT.**.** A ful
1360: 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20  l outer join is 
1370: 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  the combination 
1380: 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a  of JT_LEFT and J
1390: 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49  T_RIGHT..**.** I
13a0: 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20  f an illegal or 
13b0: 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e  unsupported join
13c0: 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74   type is seen, t
13d0: 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e  hen still return
13e0: 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c  .** a join type,
13f0: 20 62 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f   but put an erro
1400: 72 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  r in the pParse 
1410: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e  structure..*/.in
1420: 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70  t sqlite3JoinTyp
1430: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1440: 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65   Token *pA, Toke
1450: 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43  n *pB, Token *pC
1460: 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70  ){.  int jointyp
1470: 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a  e = 0;.  Token *
1480: 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65  apAll[3];.  Toke
1490: 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 20 20  n *p;.          
14a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b0: 20 20 20 2f 2a 20 20 20 30 31 32 33 34 35 36 37     /*   01234567
14c0: 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32 33  89 123456789 123
14d0: 34 35 36 37 38 39 20 31 32 33 20 2a 2f 0a 20 20  456789 123 */.  
14e0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
14f0: 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22  r zKeyText[] = "
1500: 6e 61 74 75 72 61 6c 65 66 74 6f 75 74 65 72 69  naturaleftouteri
1510: 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73  ghtfullinnercros
1520: 73 22 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  s";.  static con
1530: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
1540: 75 38 20 69 3b 20 20 20 20 20 20 20 20 2f 2a 20  u8 i;        /* 
1550: 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79  Beginning of key
1560: 77 6f 72 64 20 74 65 78 74 20 69 6e 20 7a 4b 65  word text in zKe
1570: 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75  yText[] */.    u
1580: 38 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c  8 nChar;    /* L
1590: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b 65 79  ength of the key
15a0: 77 6f 72 64 20 69 6e 20 63 68 61 72 61 63 74 65  word in characte
15b0: 72 73 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64  rs */.    u8 cod
15c0: 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74  e;     /* Join t
15d0: 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20  ype mask */.  } 
15e0: 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20  aKeyword[] = {. 
15f0: 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f     /* natural */
1600: 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54   { 0,  7, JT_NAT
1610: 55 52 41 4c 20 20 20 20 20 20 20 20 20 20 20 20  URAL            
1620: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65      },.    /* le
1630: 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34  ft    */ { 6,  4
1640: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54  , JT_LEFT|JT_OUT
1650: 45 52 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  ER          },. 
1660: 20 20 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f     /* outer   */
1670: 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54   { 10, 5, JT_OUT
1680: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ER              
1690: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69      },.    /* ri
16a0: 67 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35  ght   */ { 14, 5
16b0: 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  , JT_RIGHT|JT_OU
16c0: 54 45 52 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  TER         },. 
16d0: 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f     /* full    */
16e0: 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46   { 19, 4, JT_LEF
16f0: 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  T|JT_RIGHT|JT_OU
1700: 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e  TER },.    /* in
1710: 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35  ner   */ { 23, 5
1720: 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20 20  , JT_INNER      
1730: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
1740: 20 20 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f     /* cross   */
1750: 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e   { 28, 5, JT_INN
1760: 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20 20  ER|JT_CROSS     
1770: 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e      },.  };.  in
1780: 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b  t i, j;.  apAll[
1790: 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c  0] = pA;.  apAll
17a0: 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c  [1] = pB;.  apAl
17b0: 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72  l[2] = pC;.  for
17c0: 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41  (i=0; i<3 && apA
17d0: 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll[i]; i++){.   
17e0: 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20   p = apAll[i];. 
17f0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72     for(j=0; j<Ar
1800: 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64  raySize(aKeyword
1810: 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); j++){.      i
1820: 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72  f( p->n==aKeywor
1830: 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20  d[j].nChar .    
1840: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
1850: 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29  StrNICmp((char*)
1860: 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b  p->z, &zKeyText[
1870: 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20  aKeyword[j].i], 
1880: 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  p->n)==0 ){.    
1890: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20      jointype |= 
18a0: 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65  aKeyword[j].code
18b0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
18c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18d0: 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
18e0: 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d  0 || j==1 || j==
18f0: 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d  2 || j==3 || j==
1900: 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d  4 || j==5 || j==
1910: 36 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d  6 );.    if( j>=
1920: 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f  ArraySize(aKeywo
1930: 72 64 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69  rd) ){.      joi
1940: 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f  ntype |= JT_ERRO
1950: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
1960: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a      }.  }.  if(.
1970: 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26       (jointype &
1980: 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55   (JT_INNER|JT_OU
1990: 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52  TER))==(JT_INNER
19a0: 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20  |JT_OUTER) ||.  
19b0: 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a     (jointype & J
19c0: 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b  T_ERROR)!=0.  ){
19d0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
19e0: 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20 20 20  *zSp = " ";.    
19f0: 61 73 73 65 72 74 28 20 70 42 21 3d 30 20 29 3b  assert( pB!=0 );
1a00: 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29  .    if( pC==0 )
1a10: 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73  { zSp++; }.    s
1a20: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1a30: 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20  Parse, "unknown 
1a40: 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a  or unsupported j
1a50: 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20  oin type: ".    
1a60: 20 20 20 22 25 54 20 25 54 25 73 25 54 22 2c 20     "%T %T%s%T", 
1a70: 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43 29  pA, pB, zSp, pC)
1a80: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
1a90: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c   JT_INNER;.  }el
1aa0: 73 65 20 69 66 28 20 28 6a 6f 69 6e 74 79 70 65  se if( (jointype
1ab0: 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
1ac0: 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 6a 6f  .         && (jo
1ad0: 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46  intype & (JT_LEF
1ae0: 54 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a 54  T|JT_RIGHT))!=JT
1af0: 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 73 71 6c  _LEFT ){.    sql
1b00: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1b10: 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49 47  rse, .      "RIG
1b20: 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45  HT and FULL OUTE
1b30: 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20  R JOINs are not 
1b40: 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72  currently suppor
1b50: 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74  ted");.    joint
1b60: 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a  ype = JT_INNER;.
1b70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69    }.  return joi
1b80: 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ntype;.}../*.** 
1b90: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
1ba0: 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   of a column in 
1bb0: 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  a table.  Return
1bc0: 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75 6d   -1 if the colum
1bd0: 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74  n.** is not cont
1be0: 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62  ained in the tab
1bf0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1c00: 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61  t columnIndex(Ta
1c10: 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74  ble *pTab, const
1c20: 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20   char *zCol){.  
1c30: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1c40: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
1c50: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
1c60: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54 61  lite3StrICmp(pTa
1c70: 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  b->aCol[i].zName
1c80: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74  , zCol)==0 ) ret
1c90: 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
1ca0: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
1cb0: 20 53 65 61 72 63 68 20 74 68 65 20 66 69 72 73   Search the firs
1cc0: 74 20 4e 20 74 61 62 6c 65 73 20 69 6e 20 70 53  t N tables in pS
1cd0: 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  rc, from left to
1ce0: 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20   right, looking 
1cf0: 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74  for a.** table t
1d00: 68 61 74 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e  hat has a column
1d10: 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a   named zCol.  .*
1d20: 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c  *.** When found,
1d30: 20 73 65 74 20 2a 70 69 54 61 62 20 61 6e 64 20   set *piTab and 
1d40: 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65 20 74 61  *piCol to the ta
1d50: 62 6c 65 20 69 6e 64 65 78 20 61 6e 64 20 63 6f  ble index and co
1d60: 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66  lumn index.** of
1d70: 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f   the matching co
1d80: 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e 20  lumn and return 
1d90: 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  TRUE..**.** If n
1da0: 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  ot found, return
1db0: 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69   FALSE..*/.stati
1dc0: 63 20 69 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f  c int tableAndCo
1dd0: 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72 63  lumnIndex(.  Src
1de0: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
1df0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 61    /* Array of ta
1e00: 62 6c 65 73 20 74 6f 20 73 65 61 72 63 68 20 2a  bles to search *
1e10: 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
1e20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1e30: 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
1e40: 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61  pSrc->a[] to sea
1e50: 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  rch */.  const c
1e60: 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a  har *zCol,    /*
1e70: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   Name of the col
1e80: 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69  umn we are looki
1e90: 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ng for */.  int 
1ea0: 2a 70 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  *piTab,         
1eb0: 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20   /* Write index 
1ec0: 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72  of pSrc->a[] her
1ed0: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f  e */.  int *piCo
1ee0: 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  l           /* W
1ef0: 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53  rite index of pS
1f00: 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54  rc->a[*piTab].pT
1f10: 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20  ab->aCol[] here 
1f20: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f40: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
1f50: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 20   tables in pSrc 
1f60: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  */.  int iCol;  
1f70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1f80: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74  ex of column mat
1f90: 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20  ching zCol */.. 
1fa0: 20 61 73 73 65 72 74 28 20 28 70 69 54 61 62 3d   assert( (piTab=
1fb0: 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20  =0)==(piCol==0) 
1fc0: 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e  );  /* Both or n
1fd0: 65 69 74 68 65 72 20 61 72 65 20 4e 55 4c 4c 20  either are NULL 
1fe0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
1ff0: 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f  N; i++){.    iCo
2000: 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  l = columnIndex(
2010: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c  pSrc->a[i].pTab,
2020: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20   zCol);.    if( 
2030: 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iCol>=0 ){.     
2040: 20 69 66 28 20 70 69 54 61 62 20 29 7b 0a 20 20   if( piTab ){.  
2050: 20 20 20 20 20 20 2a 70 69 54 61 62 20 3d 20 69        *piTab = i
2060: 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c  ;.        *piCol
2070: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d   = iCol;.      }
2080: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2090: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
20a0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
20b0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
20c0: 20 75 73 65 64 20 74 6f 20 61 64 64 20 74 65 72   used to add ter
20d0: 6d 73 20 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f  ms implied by JO
20e0: 49 4e 20 73 79 6e 74 61 78 20 74 6f 20 74 68 65  IN syntax to the
20f0: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
2100: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 61   expression of a
2110: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2120: 74 2e 20 54 68 65 20 6e 65 77 20 74 65 72 6d 2c  t. The new term,
2130: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44   which.** is AND
2140: 65 64 20 77 69 74 68 20 74 68 65 20 65 78 69 73  ed with the exis
2150: 74 69 6e 67 20 57 48 45 52 45 20 63 6c 61 75 73  ting WHERE claus
2160: 65 2c 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  e, is of the for
2170: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62  m:.**.**    (tab
2180: 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f  1.col1 = tab2.co
2190: 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  l2).**.** where 
21a0: 74 61 62 31 20 69 73 20 74 68 65 20 69 53 72 63  tab1 is the iSrc
21b0: 27 74 68 20 74 61 62 6c 65 20 69 6e 20 53 72 63  'th table in Src
21c0: 4c 69 73 74 20 70 53 72 63 20 61 6e 64 20 74 61  List pSrc and ta
21d0: 62 32 20 69 73 20 74 68 65 20 0a 2a 2a 20 28 69  b2 is the .** (i
21e0: 53 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d  Src+1)'th. Colum
21f0: 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e  n col1 is column
2200: 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62   iColLeft of tab
2210: 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a  1, and col2 is.*
2220: 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67  * column iColRig
2230: 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73  ht of tab2..*/.s
2240: 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57 68  tatic void addWh
2250: 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65  ereTerm(.  Parse
2260: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2270: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2280: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
2290: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
22a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22b0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61     /* List of ta
22c0: 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61  bles in FROM cla
22d0: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  use */.  int iLe
22e0: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
22f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2300: 78 20 6f 66 20 66 69 72 73 74 20 74 61 62 6c 65  x of first table
2310: 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63   to join in pSrc
2320: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65   */.  int iColLe
2330: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
2340: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
2350: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73  f column in firs
2360: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  t table */.  int
2370: 20 69 52 69 67 68 74 2c 20 20 20 20 20 20 20 20   iRight,        
2380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2390: 49 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e 64 20  Index of second 
23a0: 74 61 62 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f  table in pSrc */
23b0: 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69 67 68 74  .  int iColRight
23c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23d0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
23e0: 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20  olumn in second 
23f0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
2400: 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20  sOuterJoin,     
2410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2420: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e  ue if this is an
2430: 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20   OUTER join */. 
2440: 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65 20   Expr **ppWhere 
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2460: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20   /* IN/OUT: The 
2470: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
2480: 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73  add to */.){.  s
2490: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
24a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20  rse->db;.  Expr 
24b0: 2a 70 45 31 3b 0a 20 20 45 78 70 72 20 2a 70 45  *pE1;.  Expr *pE
24c0: 32 3b 0a 20 20 45 78 70 72 20 2a 70 45 71 3b 0a  2;.  Expr *pEq;.
24d0: 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 66 74  .  assert( iLeft
24e0: 3c 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73  <iRight );.  ass
24f0: 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e  ert( pSrc->nSrc>
2500: 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65  iRight );.  asse
2510: 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66  rt( pSrc->a[iLef
2520: 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61 73 73  t].pTab );.  ass
2530: 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 52 69  ert( pSrc->a[iRi
2540: 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20  ght].pTab );..  
2550: 70 45 31 20 3d 20 73 71 6c 69 74 65 33 43 72 65  pE1 = sqlite3Cre
2560: 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62  ateColumnExpr(db
2570: 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69  , pSrc, iLeft, i
2580: 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32 20  ColLeft);.  pE2 
2590: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43  = sqlite3CreateC
25a0: 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53  olumnExpr(db, pS
25b0: 72 63 2c 20 69 52 69 67 68 74 2c 20 69 43 6f 6c  rc, iRight, iCol
25c0: 52 69 67 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d  Right);..  pEq =
25d0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
25e0: 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31  arse, TK_EQ, pE1
25f0: 2c 20 70 45 32 2c 20 30 29 3b 0a 20 20 69 66 28  , pE2, 0);.  if(
2600: 20 70 45 71 20 26 26 20 69 73 4f 75 74 65 72 4a   pEq && isOuterJ
2610: 6f 69 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53  oin ){.    ExprS
2620: 65 74 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20  etProperty(pEq, 
2630: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20  EP_FromJoin);.  
2640: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2650: 61 73 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20  asProperty(pEq, 
2660: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
2670: 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
2680: 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72  ExprSetVVAProper
2690: 74 79 28 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64  ty(pEq, EP_NoRed
26a0: 75 63 65 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69  uce);.    pEq->i
26b0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d  RightJoinTable =
26c0: 20 28 69 31 36 29 70 45 32 2d 3e 69 54 61 62 6c   (i16)pE2->iTabl
26d0: 65 3b 0a 20 20 7d 0a 20 20 2a 70 70 57 68 65 72  e;.  }.  *ppWher
26e0: 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  e = sqlite3ExprA
26f0: 6e 64 28 64 62 2c 20 2a 70 70 57 68 65 72 65 2c  nd(db, *ppWhere,
2700: 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pEq);.}../*.** 
2710: 53 65 74 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a  Set the EP_FromJ
2720: 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e 20  oin property on 
2730: 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
2740: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
2750: 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74 20 74 68  n..** And set th
2760: 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69  e Expr.iRightJoi
2770: 6e 54 61 62 6c 65 20 74 6f 20 69 54 61 62 6c 65  nTable to iTable
2780: 20 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20   for every term 
2790: 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  in the.** expres
27a0: 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sion..**.** The 
27b0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70  EP_FromJoin prop
27c0: 65 72 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20  erty is used on 
27d0: 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72  terms of an expr
27e0: 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a  ession to tell.*
27f0: 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52  * the LEFT OUTER
2800: 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67   JOIN processing
2810: 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68 69 73   logic that this
2820: 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66   term is part of
2830: 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73   the.** join res
2840: 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69  triction specifi
2850: 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  ed in the ON or 
2860: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64  USING clause and
2870: 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f   not a part.** o
2880: 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72  f the more gener
2890: 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  al WHERE clause.
28a0: 20 20 54 68 65 73 65 20 74 65 72 6d 73 20 61 72    These terms ar
28b0: 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20  e moved over to 
28c0: 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  the.** WHERE cla
28d0: 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20  use during join 
28e0: 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77  processing but w
28f0: 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62  e need to rememb
2900: 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20  er that they.** 
2910: 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68  originated in th
2920: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
2930: 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ause..**.** The 
2940: 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
2950: 61 62 6c 65 20 74 65 6c 6c 73 20 74 68 65 20 57  able tells the W
2960: 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
2970: 65 73 73 69 6e 67 20 74 68 61 74 20 74 68 65 0a  essing that the.
2980: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65  ** expression de
2990: 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c 65 20 69  pends on table i
29a0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65  RightJoinTable e
29b0: 76 65 6e 20 69 66 20 74 68 61 74 20 74 61 62 6c  ven if that tabl
29c0: 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c  e is not.** expl
29d0: 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64  icitly mentioned
29e0: 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   in the expressi
29f0: 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66 6f 72 6d  on.  That inform
2a00: 61 74 69 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a  ation is needed.
2a10: 2a 2a 20 66 6f 72 20 63 61 73 65 73 20 6c 69 6b  ** for cases lik
2a20: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
2a30: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2a40: 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f  1 LEFT JOIN t2 O
2a50: 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20  N t1.a=t2.b AND 
2a60: 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65  t1.x=5.**.** The
2a70: 20 77 68 65 72 65 20 63 6c 61 75 73 65 20 6e 65   where clause ne
2a80: 65 64 73 20 74 6f 20 64 65 66 65 72 20 74 68 65  eds to defer the
2a90: 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65   handling of the
2aa0: 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20   t1.x=5.** term 
2ab0: 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68 65 20  until after the 
2ac0: 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a  t2 loop of the j
2ad0: 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74 20 77 61  oin.  In that wa
2ae0: 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20  y, a.** NULL t2 
2af0: 72 6f 77 20 77 69 6c 6c 20 62 65 20 69 6e 73 65  row will be inse
2b00: 72 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 31  rted whenever t1
2b10: 2e 78 21 3d 35 2e 20 20 49 66 20 77 65 20 64 6f  .x!=5.  If we do
2b20: 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72 20 74 68   not.** defer th
2b30: 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31  e handling of t1
2b40: 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c 20 62 65  .x=5, it will be
2b50: 20 70 72 6f 63 65 73 73 65 64 20 69 6d 6d 65 64   processed immed
2b60: 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20  iately.** after 
2b70: 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20  the t1 loop and 
2b80: 72 6f 77 73 20 77 69 74 68 20 74 31 2e 78 21 3d  rows with t1.x!=
2b90: 35 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 70 70  5 will never app
2ba0: 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75  ear in.** the ou
2bb0: 74 70 75 74 2c 20 77 68 69 63 68 20 69 73 20 69  tput, which is i
2bc0: 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61  ncorrect..*/.sta
2bd0: 74 69 63 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e  tic void setJoin
2be0: 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e  Expr(Expr *p, in
2bf0: 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 77 68 69  t iTable){.  whi
2c00: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70  le( p ){.    Exp
2c10: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20  rSetProperty(p, 
2c20: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20  EP_FromJoin);.  
2c30: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2c40: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
2c50: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
2c60: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78  duced) );.    Ex
2c70: 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
2c80: 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29  (p, EP_NoReduce)
2c90: 3b 0a 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a  ;.    p->iRightJ
2ca0: 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29  oinTable = (i16)
2cb0: 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 65 74 4a  iTable;.    setJ
2cc0: 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74  oinExpr(p->pLeft
2cd0: 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70  , iTable);.    p
2ce0: 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20   = p->pRight;.  
2cf0: 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  } .}../*.** This
2d00: 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73   routine process
2d10: 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f  es the join info
2d20: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45  rmation for a SE
2d30: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
2d40: 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  ** ON and USING 
2d50: 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76  clauses are conv
2d60: 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61  erted into extra
2d70: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
2d80: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e  ERE clause..** N
2d90: 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73  ATURAL joins als
2da0: 6f 20 63 72 65 61 74 65 20 65 78 74 72 61 20 57  o create extra W
2db0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
2dc0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72  s..**.** The ter
2dd0: 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61  ms of a FROM cla
2de0: 75 73 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  use are containe
2df0: 64 20 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e  d in the Select.
2e00: 70 53 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a  pSrc structure..
2e10: 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74  ** The left most
2e20: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 66 69   table is the fi
2e30: 72 73 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c  rst entry in Sel
2e40: 65 63 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72  ect.pSrc.  The r
2e50: 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62  ight-most.** tab
2e60: 6c 65 20 69 73 20 74 68 65 20 6c 61 73 74 20 65  le is the last e
2e70: 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20  ntry.  The join 
2e80: 6f 70 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64  operator is held
2e90: 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f   in the entry to
2ea0: 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54  .** the left.  T
2eb0: 68 75 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74  hus entry 0 cont
2ec0: 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ains the join op
2ed0: 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a  erator for the j
2ee0: 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65  oin between.** e
2ef0: 6e 74 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20  ntries 0 and 1. 
2f00: 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47   Any ON or USING
2f10: 20 63 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61   clauses associa
2f20: 74 65 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69  ted with the joi
2f30: 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74  n are.** also at
2f40: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65  tached to the le
2f50: 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20  ft entry..**.** 
2f60: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
2f70: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
2f80: 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e  of errors encoun
2f90: 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  tered..*/.static
2fa0: 20 69 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65   int sqliteProce
2fb0: 73 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50  ssJoin(Parse *pP
2fc0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
2fd0: 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
2fe0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2ff0: 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65      /* All table
3000: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
3010: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ause */.  int i,
3020: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
3030: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
3040: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
3050: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
3060: 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20  tem *pLeft;     
3070: 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65  /* Left table be
3080: 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20  ing joined */.  
3090: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
30a0: 74 65 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20  tem *pRight;    
30b0: 2f 2a 20 52 69 67 68 74 20 74 61 62 6c 65 20 62  /* Right table b
30c0: 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a  eing joined */..
30d0: 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
30e0: 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72  ;.  pLeft = &pSr
30f0: 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68  c->a[0];.  pRigh
3100: 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20  t = &pLeft[1];. 
3110: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
3120: 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70  ->nSrc-1; i++, p
3130: 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b  Right++, pLeft++
3140: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c  ){.    Table *pL
3150: 65 66 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e  eftTab = pLeft->
3160: 70 54 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20  pTab;.    Table 
3170: 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70 52 69  *pRightTab = pRi
3180: 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  ght->pTab;.    i
3190: 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20  nt isOuter;..   
31a0: 20 69 66 28 20 4e 45 56 45 52 28 70 4c 65 66 74   if( NEVER(pLeft
31b0: 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74  Tab==0 || pRight
31c0: 54 61 62 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e  Tab==0) ) contin
31d0: 75 65 3b 0a 20 20 20 20 69 73 4f 75 74 65 72 20  ue;.    isOuter 
31e0: 3d 20 28 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74  = (pRight->joint
31f0: 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
3200: 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e  =0;..    /* When
3210: 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
3220: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c  word is present,
3230: 20 61 64 64 20 57 48 45 52 45 20 63 6c 61 75 73   add WHERE claus
3240: 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20  e terms for.    
3250: 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  ** every column 
3260: 74 68 61 74 20 74 68 65 20 74 77 6f 20 74 61 62  that the two tab
3270: 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d  les have in comm
3280: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
3290: 66 28 20 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74  f( pRight->joint
32a0: 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
32b0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52   ){.      if( pR
32c0: 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69  ight->pOn || pRi
32d0: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
32e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
32f0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3300: 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d  a NATURAL join m
3310: 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20  ay not have ".  
3320: 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20           "an ON 
3330: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22  or USING clause"
3340: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65  , 0);.        re
3350: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
3360: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
3370: 3c 70 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c  <pRightTab->nCol
3380: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
3390: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f  char *zName;   /
33a0: 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e  * Name of column
33b0: 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 74 61   in the right ta
33c0: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ble */.        i
33d0: 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a  nt iLeft;     /*
33e0: 20 4d 61 74 63 68 69 6e 67 20 6c 65 66 74 20 74   Matching left t
33f0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
3400: 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f  int iLeftCol;  /
3410: 2a 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  * Matching colum
3420: 6e 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61  n in the left ta
3430: 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ble */..        
3440: 7a 4e 61 6d 65 20 3d 20 70 52 69 67 68 74 54 61  zName = pRightTa
3450: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
3460: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 61  ;.        if( ta
3470: 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65  bleAndColumnInde
3480: 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61  x(pSrc, i+1, zNa
3490: 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65  me, &iLeft, &iLe
34a0: 66 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20  ftCol) ){.      
34b0: 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d      addWhereTerm
34c0: 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69  (pParse, pSrc, i
34d0: 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20  Left, iLeftCol, 
34e0: 69 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20  i+1, j,.        
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
3500: 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65  sOuter, &p->pWhe
3510: 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  re);.        }. 
3520: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
3530: 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f    /* Disallow bo
3540: 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  th ON and USING 
3550: 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73  clauses in the s
3560: 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a  ame join.    */.
3570: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
3580: 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70  pOn && pRight->p
3590: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73  Using ){.      s
35a0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
35b0: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68  Parse, "cannot h
35c0: 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20  ave both ON and 
35d0: 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20  USING ".        
35e0: 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20  "clauses in the 
35f0: 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20  same join");.   
3600: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3610: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74   }..    /* Add t
3620: 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20  he ON clause to 
3630: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
3640: 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e  HERE clause, con
3650: 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a  nected by.    **
3660: 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
3670: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
3680: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a   pRight->pOn ){.
3690: 20 20 20 20 20 20 69 66 28 20 69 73 4f 75 74 65        if( isOute
36a0: 72 20 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28  r ) setJoinExpr(
36b0: 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69  pRight->pOn, pRi
36c0: 67 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  ght->iCursor);. 
36d0: 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d       p->pWhere =
36e0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
36f0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
3700: 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70  Where, pRight->p
3710: 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68  On);.      pRigh
3720: 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20  t->pOn = 0;.    
3730: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  }..    /* Create
3740: 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20   extra terms on 
3750: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3760: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
3770: 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e   named.    ** in
3780: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
3790: 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20  e.  Example: If 
37a0: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74  the two tables t
37b0: 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20  o be joined are 
37c0: 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20  .    ** A and B 
37d0: 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c  and the USING cl
37e0: 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c  ause names X, Y,
37f0: 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64   and Z, then add
3800: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20   this.    ** to 
3810: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3820: 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44  :    A.X=B.X AND
3830: 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a   A.Y=B.Y AND A.Z
3840: 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f  =B.Z.    ** Repo
3850: 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61  rt an error if a
3860: 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f  ny column mentio
3870: 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47  ned in the USING
3880: 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a   clause is.    *
3890: 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  * not contained 
38a0: 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74  in both tables t
38b0: 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20  o be joined..   
38c0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
38d0: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
38e0: 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73      IdList *pLis
38f0: 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69  t = pRight->pUsi
3900: 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  ng;.      for(j=
3910: 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; j<pList->nId;
3920: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
3930: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
3940: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
3950: 65 72 6d 20 69 6e 20 74 68 65 20 55 53 49 4e 47  erm in the USING
3960: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
3970: 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20     int iLeft;   
3980: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e 20      /* Table on 
3990: 74 68 65 20 6c 65 66 74 20 77 69 74 68 20 6d 61  the left with ma
39a0: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61  tching column na
39b0: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  me */.        in
39c0: 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20 2f  t iLeftCol;    /
39d0: 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  * Column number 
39e0: 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  of matching colu
39f0: 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a  mn on the left *
3a00: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52  /.        int iR
3a10: 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f  ightCol;   /* Co
3a20: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d  lumn number of m
3a30: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f  atching column o
3a40: 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 0a  n the right */..
3a50: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
3a60: 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d  pList->a[j].zNam
3a70: 65 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67 68  e;.        iRigh
3a80: 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64  tCol = columnInd
3a90: 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e  ex(pRightTab, zN
3aa0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
3ab0: 28 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20 20  ( iRightCol<0.  
3ac0: 20 20 20 20 20 20 20 7c 7c 20 21 74 61 62 6c 65         || !table
3ad0: 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  AndColumnIndex(p
3ae0: 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c  Src, i+1, zName,
3af0: 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43   &iLeft, &iLeftC
3b00: 6f 6c 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ol).        ){. 
3b10: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
3b20: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3b30: 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73   "cannot join us
3b40: 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20  ing column %s - 
3b50: 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20  column ".       
3b60: 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e       "not presen
3b70: 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73  t in both tables
3b80: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
3b90: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
3ba0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3bb0: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 50   addWhereTerm(pP
3bc0: 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66  arse, pSrc, iLef
3bd0: 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31  t, iLeftCol, i+1
3be0: 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20 20  , iRightCol,.   
3bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c00: 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70    isOuter, &p->p
3c10: 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Where);.      }.
3c20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
3c30: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  rn 0;.}../* Forw
3c40: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
3c50: 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20  .static KeyInfo 
3c60: 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  *keyInfoFromExpr
3c70: 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
3c80: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
3c90: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
3ca0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
3cb0: 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72  List,     /* For
3cc0: 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62  m the KeyInfo ob
3cd0: 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73 20 45  ject from this E
3ce0: 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  xprList */.  int
3cf0: 20 69 53 74 61 72 74 2c 20 20 20 20 20 20 20 20   iStart,        
3d00: 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74 68 20    /* Begin with 
3d10: 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70  this column of p
3d20: 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  List */.  int nE
3d30: 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20 2f  xtra           /
3d40: 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20  * Add this many 
3d50: 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f  extra columns to
3d60: 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 3b 0a 0a   the end */.);..
3d70: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
3d80: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 70 75  ode that will pu
3d90: 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e  sh the record in
3da0: 20 72 65 67 69 73 74 65 72 73 20 72 65 67 44 61   registers regDa
3db0: 74 61 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72 65  ta.** through re
3dc0: 67 44 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f 6e  gData+nData-1 on
3dd0: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a  to the sorter..*
3de0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75  /.static void pu
3df0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
3e00: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
3e10: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72         /* Parser
3e20: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f   context */.  So
3e30: 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20  rtCtx *pSort,   
3e40: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
3e50: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 4f 52  ion about the OR
3e60: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
3e70: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
3e80: 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ct,       /* The
3e90: 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74   whole SELECT st
3ea0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
3eb0: 20 72 65 67 44 61 74 61 2c 20 20 20 20 20 20 20   regData,       
3ec0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67      /* First reg
3ed0: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61  ister holding da
3ee0: 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20  ta to be sorted 
3ef0: 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20  */.  int nData, 
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3f10: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
3f20: 73 20 69 6e 20 74 68 65 20 64 61 74 61 20 61 72  s in the data ar
3f30: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72  ray */.  int nPr
3f40: 65 66 69 78 52 65 67 20 20 20 20 20 20 20 20 20  efixReg         
3f50: 2f 2a 20 4e 6f 2e 20 6f 66 20 72 65 67 20 70 72  /* No. of reg pr
3f60: 69 6f 72 20 74 6f 20 72 65 67 44 61 74 61 20 61  ior to regData a
3f70: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
3f80: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
3f90: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
3fa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6d            /* Stm
3fc0: 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
3fd0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 53  tion */.  int bS
3fe0: 65 71 20 3d 20 28 28 70 53 6f 72 74 2d 3e 73 6f  eq = ((pSort->so
3ff0: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
4000: 41 47 5f 55 73 65 53 6f 72 74 65 72 29 3d 3d 30  AG_UseSorter)==0
4010: 29 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d  );.  int nExpr =
4020: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
4030: 2d 3e 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20  ->nExpr;        
4040: 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20        /* No. of 
4050: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a  ORDER BY terms *
4060: 2f 0a 20 20 69 6e 74 20 6e 42 61 73 65 20 3d 20  /.  int nBase = 
4070: 6e 45 78 70 72 20 2b 20 62 53 65 71 20 2b 20 6e  nExpr + bSeq + n
4080: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
4090: 20 20 20 20 20 2f 2a 20 46 69 65 6c 64 73 20 69       /* Fields i
40a0: 6e 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  n sorter record 
40b0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65  */.  int regBase
40c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
40d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40e0: 20 20 20 20 20 20 2f 2a 20 52 65 67 73 20 66 6f        /* Regs fo
40f0: 72 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  r sorter record 
4100: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  */.  int regReco
4110: 72 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rd = ++pParse->n
4120: 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
4130: 20 20 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c        /* Assembl
4140: 65 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  ed sorter record
4150: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74   */.  int nOBSat
4160: 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74   = pSort->nOBSat
4170: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4180: 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20         /* ORDER 
4190: 42 59 20 74 65 72 6d 73 20 74 6f 20 73 6b 69 70  BY terms to skip
41a0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f           /* Opco
41d0: 64 65 20 74 6f 20 61 64 64 20 73 6f 72 74 65 72  de to add sorter
41e0: 20 72 65 63 6f 72 64 20 74 6f 20 73 6f 72 74 65   record to sorte
41f0: 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
4200: 62 53 65 71 3d 3d 30 20 7c 7c 20 62 53 65 71 3d  bSeq==0 || bSeq=
4210: 3d 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 72 65  =1 );.  if( nPre
4220: 66 69 78 52 65 67 20 29 7b 0a 20 20 20 20 61 73  fixReg ){.    as
4230: 73 65 72 74 28 20 6e 50 72 65 66 69 78 52 65 67  sert( nPrefixReg
4240: 3d 3d 6e 45 78 70 72 2b 62 53 65 71 20 29 3b 0a  ==nExpr+bSeq );.
4250: 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 72 65      regBase = re
4260: 67 44 61 74 61 20 2d 20 6e 45 78 70 72 20 2d 20  gData - nExpr - 
4270: 62 53 65 71 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  bSeq;.  }else{. 
4280: 20 20 20 72 65 67 42 61 73 65 20 3d 20 70 50 61     regBase = pPa
4290: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
42a0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
42b0: 2b 3d 20 6e 42 61 73 65 3b 0a 20 20 7d 0a 20 20  += nBase;.  }.  
42c0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
42d0: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
42e0: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c  pSort->pOrderBy,
42f0: 20 72 65 67 42 61 73 65 2c 20 53 51 4c 49 54 45   regBase, SQLITE
4300: 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20 69 66  _ECEL_DUP);.  if
4310: 28 20 62 53 65 71 20 29 7b 0a 20 20 20 20 73 71  ( bSeq ){.    sq
4320: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
4330: 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20  v, OP_Sequence, 
4340: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c  pSort->iECursor,
4350: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b   regBase+nExpr);
4360: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 72 65 66  .  }.  if( nPref
4370: 69 78 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ixReg==0 ){.    
4380: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4390: 33 28 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20 72 65  3(v, OP_Move, re
43a0: 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e  gData, regBase+n
43b0: 45 78 70 72 2b 62 53 65 71 2c 20 6e 44 61 74 61  Expr+bSeq, nData
43c0: 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
43d0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
43e0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
43f0: 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42  gBase+nOBSat, nB
4400: 61 73 65 2d 6e 4f 42 53 61 74 2c 20 72 65 67 52  ase-nOBSat, regR
4410: 65 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 6e 4f  ecord);.  if( nO
4420: 42 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e  BSat>0 ){.    in
4430: 74 20 72 65 67 50 72 65 76 4b 65 79 3b 20 20 20  t regPrevKey;   
4440: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 6e 4f 42  /* The first nOB
4450: 53 61 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  Sat columns of t
4460: 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20  he previous row 
4470: 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 46  */.    int addrF
4480: 69 72 73 74 3b 20 20 20 20 2f 2a 20 41 64 64 72  irst;    /* Addr
4490: 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 49 66  ess of the OP_If
44a0: 4e 6f 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  Not opcode */.  
44b0: 20 20 69 6e 74 20 61 64 64 72 4a 6d 70 3b 20 20    int addrJmp;  
44c0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
44d0: 66 20 74 68 65 20 4f 50 5f 4a 75 6d 70 20 6f 70  f the OP_Jump op
44e0: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 56 64 62 65  code */.    Vdbe
44f0: 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 2f 2a  Op *pOp;      /*
4500: 20 4f 70 63 6f 64 65 20 74 68 61 74 20 6f 70 65   Opcode that ope
4510: 6e 73 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f  ns the sorter */
4520: 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20  .    int nKey;  
4530: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4540: 20 6f 66 20 73 6f 72 74 69 6e 67 20 6b 65 79 20   of sorting key 
4550: 63 6f 6c 75 6d 6e 73 2c 20 69 6e 63 6c 75 64 69  columns, includi
4560: 6e 67 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 2a  ng OP_Sequence *
4570: 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  /.    KeyInfo *p
4580: 4b 49 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  KI;     /* Origi
4590: 6e 61 6c 20 4b 65 79 49 6e 66 6f 20 6f 6e 20 74  nal KeyInfo on t
45a0: 68 65 20 73 6f 72 74 65 72 20 74 61 62 6c 65 20  he sorter table 
45b0: 2a 2f 0a 0a 20 20 20 20 72 65 67 50 72 65 76 4b  */..    regPrevK
45c0: 65 79 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ey = pParse->nMe
45d0: 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
45e0: 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e  >nMem += pSort->
45f0: 6e 4f 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65 79  nOBSat;.    nKey
4600: 20 3d 20 6e 45 78 70 72 20 2d 20 70 53 6f 72 74   = nExpr - pSort
4610: 2d 3e 6e 4f 42 53 61 74 20 2b 20 62 53 65 71 3b  ->nOBSat + bSeq;
4620: 0a 20 20 20 20 69 66 28 20 62 53 65 71 20 29 7b  .    if( bSeq ){
4630: 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73 74  .      addrFirst
4640: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
4650: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
4660: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29  , regBase+nExpr)
4670: 3b 20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ; .    }else{.  
4680: 20 20 20 20 61 64 64 72 46 69 72 73 74 20 3d 20      addrFirst = 
4690: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
46a0: 31 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  1(v, OP_Sequence
46b0: 54 65 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43  Test, pSort->iEC
46c0: 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20  ursor);.    }.  
46d0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
46e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
46f0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
4700: 6f 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76 4b  ompare, regPrevK
4710: 65 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53 6f  ey, regBase, pSo
4720: 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20  rt->nOBSat);.   
4730: 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
4740: 62 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74  beGetOp(v, pSort
4750: 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  ->addrSortIndex)
4760: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  ;.    if( pParse
4770: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
4780: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ed ) return;.   
4790: 20 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79 20   pOp->p2 = nKey 
47a0: 2b 20 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b 49  + nData;.    pKI
47b0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49   = pOp->p4.pKeyI
47c0: 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  nfo;.    memset(
47d0: 70 4b 49 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c  pKI->aSortOrder,
47e0: 20 30 2c 20 70 4b 49 2d 3e 6e 46 69 65 6c 64 29   0, pKI->nField)
47f0: 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50 5f 4a 75  ; /* Makes OP_Ju
4800: 6d 70 20 62 65 6c 6f 77 20 74 65 73 74 61 62 6c  mp below testabl
4810: 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  e */.    sqlite3
4820: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
4830: 2d 31 2c 20 28 63 68 61 72 2a 29 70 4b 49 2c 20  -1, (char*)pKI, 
4840: 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
4850: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
4860: 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
4870: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
4880: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c  pSort->pOrderBy,
4890: 20 6e 4f 42 53 61 74 2c 20 31 29 3b 0a 20 20 20   nOBSat, 1);.   
48a0: 20 61 64 64 72 4a 6d 70 20 3d 20 73 71 6c 69 74   addrJmp = sqlit
48b0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
48c0: 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(v);.    sqlite
48d0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
48e0: 50 5f 4a 75 6d 70 2c 20 61 64 64 72 4a 6d 70 2b  P_Jump, addrJmp+
48f0: 31 2c 20 30 2c 20 61 64 64 72 4a 6d 70 2b 31 29  1, 0, addrJmp+1)
4900: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
4910: 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e 6c 61  );.    pSort->la
4920: 62 65 6c 42 6b 4f 75 74 20 3d 20 73 71 6c 69 74  belBkOut = sqlit
4930: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
4940: 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e 72  v);.    pSort->r
4950: 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
4960: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
4970: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
4980: 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53  (v, OP_Gosub, pS
4990: 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  ort->regReturn, 
49a0: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
49b0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
49c0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
49d0: 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70 53 6f  ResetSorter, pSo
49e0: 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20  rt->iECursor);. 
49f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
4a00: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 46 69  mpHere(v, addrFi
4a10: 72 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rst);.    sqlite
4a20: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4a30: 50 5f 4d 6f 76 65 2c 20 72 65 67 42 61 73 65 2c  P_Move, regBase,
4a40: 20 72 65 67 50 72 65 76 4b 65 79 2c 20 70 53 6f   regPrevKey, pSo
4a50: 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20  rt->nOBSat);.   
4a60: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
4a70: 48 65 72 65 28 76 2c 20 61 64 64 72 4a 6d 70 29  Here(v, addrJmp)
4a80: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72  ;.  }.  if( pSor
4a90: 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53  t->sortFlags & S
4aa0: 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65  ORTFLAG_UseSorte
4ab0: 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50  r ){.    op = OP
4ac0: 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 3b 0a 20  _SorterInsert;. 
4ad0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d   }else{.    op =
4ae0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 3b 0a 20   OP_IdxInsert;. 
4af0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
4b00: 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 70 53  AddOp2(v, op, pS
4b10: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72  ort->iECursor, r
4b20: 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 69 66 28  egRecord);.  if(
4b30: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
4b40: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
4b50: 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 69 6e  1, addr2;.    in
4b60: 74 20 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69 66  t iLimit;.    if
4b70: 28 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73  ( pSelect->iOffs
4b80: 65 74 20 29 7b 0a 20 20 20 20 20 20 69 4c 69 6d  et ){.      iLim
4b90: 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f  it = pSelect->iO
4ba0: 66 66 73 65 74 2b 31 3b 0a 20 20 20 20 7d 65 6c  ffset+1;.    }el
4bb0: 73 65 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74  se{.      iLimit
4bc0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d   = pSelect->iLim
4bd0: 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64  it;.    }.    ad
4be0: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
4bf0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
4c00: 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29 3b 20 56  Zero, iLimit); V
4c10: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
4c20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4c30: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
4c40: 6d 6d 2c 20 69 4c 69 6d 69 74 2c 20 2d 31 29 3b  mm, iLimit, -1);
4c50: 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c  .    addr2 = sql
4c60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
4c70: 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20  , OP_Goto);.    
4c80: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
4c90: 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
4ca0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4cb0: 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73 74 2c  dOp1(v, OP_Last,
4cc0: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
4cd0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4ce0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44  beAddOp1(v, OP_D
4cf0: 65 6c 65 74 65 2c 20 70 53 6f 72 74 2d 3e 69 45  elete, pSort->iE
4d00: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c  Cursor);.    sql
4d10: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
4d20: 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 7d 0a  (v, addr2);.  }.
4d30: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64  }../*.** Add cod
4d40: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
4d50: 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61  he OFFSET.*/.sta
4d60: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66  tic void codeOff
4d70: 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  set(.  Vdbe *v, 
4d80: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
4d90: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
4da0: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
4db0: 69 4f 66 66 73 65 74 2c 20 20 20 20 20 20 2f 2a  iOffset,      /*
4dc0: 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
4dd0: 67 20 74 68 65 20 6f 66 66 73 65 74 20 63 6f 75  g the offset cou
4de0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43  nter */.  int iC
4df0: 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a  ontinue     /* J
4e00: 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
4e10: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63   the current rec
4e20: 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ord */.){.  if( 
4e30: 69 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20  iOffset>0 ){.   
4e40: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 61   int addr;.    a
4e50: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
4e60: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
4e70: 4e 65 67 2c 20 69 4f 66 66 73 65 74 2c 20 30 2c  Neg, iOffset, 0,
4e80: 20 2d 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61   -1); VdbeCovera
4e90: 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
4ea0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4eb0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e  OP_Goto, 0, iCon
4ec0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65  tinue);.    Vdbe
4ed0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69  Comment((v, "ski
4ee0: 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72 64 73  p OFFSET records
4ef0: 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
4f00: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
4f10: 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  addr);.  }.}../*
4f20: 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61  .** Add code tha
4f30: 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20  t will check to 
4f40: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20  make sure the N 
4f50: 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
4f60: 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f  ng at iMem.** fo
4f70: 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e  rm a distinct en
4f80: 74 72 79 2e 20 20 69 54 61 62 20 69 73 20 61 20  try.  iTab is a 
4f90: 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68  sorting index th
4fa0: 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75  at holds previou
4fb0: 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62  sly.** seen comb
4fc0: 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  inations of the 
4fd0: 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77  N values.  A new
4fe0: 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69   entry is made i
4ff0: 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65  n iTab.** if the
5000: 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65   current N value
5010: 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a  s are new..**.**
5020: 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52   A jump to addrR
5030: 65 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e  epeat is made an
5040: 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73  d the N+1 values
5050: 20 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d   are popped from
5060: 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66   the.** stack if
5070: 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65   the top N eleme
5080: 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74  nts are not dist
5090: 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  inct..*/.static 
50a0: 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63  void codeDistinc
50b0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
50c0: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
50d0: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
50e0: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
50f0: 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20  /.  int iTab,   
5100: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74         /* A sort
5110: 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74  ing index used t
5120: 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69  o test for disti
5130: 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74  nctness */.  int
5140: 20 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20   addrRepeat,    
5150: 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20  /* Jump to here 
5160: 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20  if not distinct 
5170: 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  */.  int N,     
5180: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5190: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  r of elements */
51a0: 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20  .  int iMem     
51b0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65        /* First e
51c0: 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56  lement */.){.  V
51d0: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31  dbe *v;.  int r1
51e0: 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  ;..  v = pParse-
51f0: 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73  >pVdbe;.  r1 = s
5200: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
5210: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
5220: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
5230: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54  (v, OP_Found, iT
5240: 61 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20  ab, addrRepeat, 
5250: 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65 43 6f  iMem, N); VdbeCo
5260: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
5270: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5280: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
5290: 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20   iMem, N, r1);. 
52a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
52b0: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
52c0: 72 74 2c 20 69 54 61 62 2c 20 72 31 29 3b 0a 20  rt, iTab, r1);. 
52d0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
52e0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
52f0: 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  1);.}..#ifndef S
5300: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
5310: 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  ERY./*.** Genera
5320: 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  te an error mess
5330: 61 67 65 20 77 68 65 6e 20 61 20 53 45 4c 45 43  age when a SELEC
5340: 54 20 69 73 20 75 73 65 64 20 77 69 74 68 69 6e  T is used within
5350: 20 61 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e   a subexpression
5360: 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a 20 20 22  .** (example:  "
5370: 61 20 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46  a IN (SELECT * F
5380: 52 4f 4d 20 74 61 62 6c 65 29 22 29 20 62 75 74  ROM table)") but
5390: 20 69 74 20 68 61 73 20 6d 6f 72 65 20 74 68 61   it has more tha
53a0: 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a 20 63 6f  n 1 result.** co
53b0: 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20 74 68 69  lumn.  We do thi
53c0: 73 20 69 6e 20 61 20 73 75 62 72 6f 75 74 69 6e  s in a subroutin
53d0: 65 20 62 65 63 61 75 73 65 20 74 68 65 20 65 72  e because the er
53e0: 72 6f 72 20 75 73 65 64 20 74 6f 20 6f 63 63 75  ror used to occu
53f0: 72 0a 2a 2a 20 69 6e 20 6d 75 6c 74 69 70 6c 65  r.** in multiple
5400: 20 70 6c 61 63 65 73 2e 20 20 28 54 68 65 20 65   places.  (The e
5410: 72 72 6f 72 20 6f 6e 6c 79 20 6f 63 63 75 72 73  rror only occurs
5420: 20 69 6e 20 6f 6e 65 20 70 6c 61 63 65 20 6e 6f   in one place no
5430: 77 2c 20 62 75 74 20 77 65 0a 2a 2a 20 72 65 74  w, but we.** ret
5440: 61 69 6e 20 74 68 65 20 73 75 62 72 6f 75 74 69  ain the subrouti
5450: 6e 65 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 63  ne to minimize c
5460: 6f 64 65 20 64 69 73 72 75 70 74 69 6f 6e 2e 29  ode disruption.)
5470: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
5480: 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75  heckForMultiColu
5490: 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 0a 20  mnSelectError(. 
54a0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
54b0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
54c0: 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20 53 65 6c  ontext. */.  Sel
54d0: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
54e0: 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e    /* Destination
54f0: 20 6f 66 20 53 45 4c 45 43 54 20 72 65 73 75 6c   of SELECT resul
5500: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70  ts */.  int nExp
5510: 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r            /* 
5520: 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  Number of result
5530: 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65   columns returne
5540: 64 20 62 79 20 53 45 4c 45 43 54 20 2a 2f 0a 29  d by SELECT */.)
5550: 7b 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20  {.  int eDest = 
5560: 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20  pDest->eDest;.  
5570: 69 66 28 20 6e 45 78 70 72 3e 31 20 26 26 20 28  if( nExpr>1 && (
5580: 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c  eDest==SRT_Mem |
5590: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74  | eDest==SRT_Set
55a0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
55b0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
55c0: 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20   "only a single 
55d0: 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66  result allowed f
55e0: 6f 72 20 22 0a 20 20 20 20 20 20 20 22 61 20 53  or ".       "a S
55f0: 45 4c 45 43 54 20 74 68 61 74 20 69 73 20 70 61  ELECT that is pa
5600: 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
5610: 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ion");.    retur
5620: 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n 1;.  }else{.  
5630: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
5640: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
5650: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
5660: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
5670: 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f  for the inside o
5680: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
5690: 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e  .** of a SELECT.
56a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62  .**.** If srcTab
56b0: 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
56c0: 65 6e 20 74 68 65 20 70 45 4c 69 73 74 20 65 78  en the pEList ex
56d0: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65  pressions.** are
56e0: 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72   evaluated in or
56f0: 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 64  der to get the d
5700: 61 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77  ata for this row
5710: 2e 20 20 49 66 20 73 72 63 54 61 62 20 69 73 0a  .  If srcTab is.
5720: 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 2c  ** zero or more,
5730: 20 74 68 65 6e 20 64 61 74 61 20 69 73 20 70 75   then data is pu
5740: 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62  lled from srcTab
5750: 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75   and pEList is u
5760: 73 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20  sed only .** to 
5770: 67 65 74 20 6e 75 6d 62 65 72 20 63 6f 6c 75 6d  get number colum
5780: 6e 73 20 61 6e 64 20 74 68 65 20 64 61 74 61 74  ns and the datat
5790: 79 70 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  ype for each col
57a0: 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  umn..*/.static v
57b0: 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  oid selectInnerL
57c0: 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  oop(.  Parse *pP
57d0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
57e0: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
57f0: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
5800: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
5810: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74    /* The complet
5820: 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
5830: 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  nt being coded *
5840: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
5850: 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c  List,       /* L
5860: 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20 62 65  ist of values be
5870: 69 6e 67 20 65 78 74 72 61 63 74 65 64 20 2a 2f  ing extracted */
5880: 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20  .  int srcTab,  
5890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75             /* Pu
58a0: 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69  ll data from thi
58b0: 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 6f 72  s table */.  Sor
58c0: 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20  tCtx *pSort,    
58d0: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
58e0: 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77  ULL, info on how
58f0: 20 74 6f 20 70 72 6f 63 65 73 73 20 4f 52 44 45   to process ORDE
5900: 52 20 42 59 20 2a 2f 0a 20 20 44 69 73 74 69 6e  R BY */.  Distin
5910: 63 74 43 74 78 20 2a 70 44 69 73 74 69 6e 63 74  ctCtx *pDistinct
5920: 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c  , /* If not NULL
5930: 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  , info on how to
5940: 20 70 72 6f 63 65 73 73 20 44 49 53 54 49 4e 43   process DISTINC
5950: 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  T */.  SelectDes
5960: 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f  t *pDest,      /
5970: 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
5980: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   of the results 
5990: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  */.  int iContin
59a0: 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ue,          /* 
59b0: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e  Jump here to con
59c0: 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20  tinue with next 
59d0: 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72  row */.  int iBr
59e0: 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  eak             
59f0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
5a00: 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
5a10: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a  e inner loop */.
5a20: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
5a30: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
5a40: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73  int i;.  int has
5a50: 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  Distinct;       
5a60: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
5a70: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
5a80: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
5a90: 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b 20   int regResult; 
5aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5ab0: 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20  Start of memory 
5ac0: 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 73  holding result s
5ad0: 65 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  et */.  int eDes
5ae0: 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74  t = pDest->eDest
5af0: 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69  ;   /* How to di
5b00: 73 70 6f 73 65 20 6f 66 20 72 65 73 75 6c 74 73  spose of results
5b10: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20   */.  int iParm 
5b20: 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  = pDest->iSDParm
5b30: 3b 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d  ; /* First argum
5b40: 65 6e 74 20 74 6f 20 64 69 73 70 6f 73 61 6c 20  ent to disposal 
5b50: 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20  method */.  int 
5b60: 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20  nResultCol;     
5b70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5b80: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
5b90: 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72  mns */.  int nPr
5ba0: 65 66 69 78 52 65 67 20 3d 20 30 3b 20 20 20 20  efixReg = 0;    
5bb0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5bc0: 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  f extra register
5bd0: 73 20 62 65 66 6f 72 65 20 72 65 67 52 65 73 75  s before regResu
5be0: 6c 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  lt */..  assert(
5bf0: 20 76 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20   v );.  assert( 
5c00: 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 68  pEList!=0 );.  h
5c10: 61 73 44 69 73 74 69 6e 63 74 20 3d 20 70 44 69  asDistinct = pDi
5c20: 73 74 69 6e 63 74 20 3f 20 70 44 69 73 74 69 6e  stinct ? pDistin
5c30: 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 3a 20  ct->eTnctType : 
5c40: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e  WHERE_DISTINCT_N
5c50: 4f 4f 50 3b 0a 20 20 69 66 28 20 70 53 6f 72 74  OOP;.  if( pSort
5c60: 20 26 26 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65   && pSort->pOrde
5c70: 72 42 79 3d 3d 30 20 29 20 70 53 6f 72 74 20 3d  rBy==0 ) pSort =
5c80: 20 30 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 3d   0;.  if( pSort=
5c90: 3d 30 20 26 26 20 21 68 61 73 44 69 73 74 69 6e  =0 && !hasDistin
5ca0: 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ct ){.    assert
5cb0: 28 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29  ( iContinue!=0 )
5cc0: 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74  ;.    codeOffset
5cd0: 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  (v, p->iOffset, 
5ce0: 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a  iContinue);.  }.
5cf0: 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72  .  /* Pull the r
5d00: 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73  equested columns
5d10: 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65 73 75 6c 74  ..  */.  nResult
5d20: 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  Col = pEList->nE
5d30: 78 70 72 3b 0a 0a 20 20 69 66 28 20 70 44 65 73  xpr;..  if( pDes
5d40: 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20  t->iSdst==0 ){. 
5d50: 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a     if( pSort ){.
5d60: 20 20 20 20 20 20 6e 50 72 65 66 69 78 52 65 67        nPrefixReg
5d70: 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72   = pSort->pOrder
5d80: 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
5d90: 20 69 66 28 20 21 28 70 53 6f 72 74 2d 3e 73 6f   if( !(pSort->so
5da0: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
5db0: 41 47 5f 55 73 65 53 6f 72 74 65 72 29 20 29 20  AG_UseSorter) ) 
5dc0: 6e 50 72 65 66 69 78 52 65 67 2b 2b 3b 0a 20 20  nPrefixReg++;.  
5dd0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
5de0: 20 2b 3d 20 6e 50 72 65 66 69 78 52 65 67 3b 0a   += nPrefixReg;.
5df0: 20 20 20 20 7d 0a 20 20 20 20 70 44 65 73 74 2d      }.    pDest-
5e00: 3e 69 53 64 73 74 20 3d 20 70 50 61 72 73 65 2d  >iSdst = pParse-
5e10: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
5e20: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
5e30: 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65  sultCol;.  }else
5e40: 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73   if( pDest->iSds
5e50: 74 2b 6e 52 65 73 75 6c 74 43 6f 6c 20 3e 20 70  t+nResultCol > p
5e60: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20  Parse->nMem ){. 
5e70: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e     /* This is an
5e80: 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e   error condition
5e90: 20 74 68 61 74 20 63 61 6e 20 72 65 73 75 6c 74   that can result
5ea0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77  , for example, w
5eb0: 68 65 6e 20 61 20 53 45 4c 45 43 54 0a 20 20 20  hen a SELECT.   
5ec0: 20 2a 2a 20 6f 6e 20 74 68 65 20 72 69 67 68 74   ** on the right
5ed0: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 6e  -hand side of an
5ee0: 20 49 4e 53 45 52 54 20 63 6f 6e 74 61 69 6e 73   INSERT contains
5ef0: 20 6d 6f 72 65 20 72 65 73 75 6c 74 20 63 6f 6c   more result col
5f00: 75 6d 6e 73 20 74 68 61 6e 0a 20 20 20 20 2a 2a  umns than.    **
5f10: 20 74 68 65 72 65 20 61 72 65 20 63 6f 6c 75 6d   there are colum
5f20: 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ns in the table 
5f30: 6f 6e 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68  on the left.  Th
5f40: 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20  e error will be 
5f50: 63 61 75 67 68 74 0a 20 20 20 20 2a 2a 20 61 6e  caught.    ** an
5f60: 64 20 72 65 70 6f 72 74 65 64 20 6c 61 74 65 72  d reported later
5f70: 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 20 74  .  But we need t
5f80: 6f 20 6d 61 6b 65 20 73 75 72 65 20 65 6e 6f 75  o make sure enou
5f90: 67 68 20 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c  gh memory is all
5fa0: 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 74 6f  ocated.    ** to
5fb0: 20 61 76 6f 69 64 20 6f 74 68 65 72 20 73 70 75   avoid other spu
5fc0: 72 69 6f 75 73 20 65 72 72 6f 72 73 20 69 6e 20  rious errors in 
5fd0: 74 68 65 20 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f  the meantime. */
5fe0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
5ff0: 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  m += nResultCol;
6000: 0a 20 20 7d 0a 20 20 70 44 65 73 74 2d 3e 6e 53  .  }.  pDest->nS
6010: 64 73 74 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  dst = nResultCol
6020: 3b 0a 20 20 72 65 67 52 65 73 75 6c 74 20 3d 20  ;.  regResult = 
6030: 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20  pDest->iSdst;.  
6040: 69 66 28 20 73 72 63 54 61 62 3e 3d 30 20 29 7b  if( srcTab>=0 ){
6050: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
6060: 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29  nResultCol; i++)
6070: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
6080: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6090: 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20  Column, srcTab, 
60a0: 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 29 3b  i, regResult+i);
60b0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
60c0: 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 45 4c  nt((v, "%s", pEL
60d0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
60e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
60f0: 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f   if( eDest!=SRT_
6100: 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a  Exists ){.    /*
6110: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
6120: 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53  ion is an EXISTS
6130: 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
6140: 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20  , the actual.   
6150: 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72   ** values retur
6160: 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43  ned by the SELEC
6170: 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72  T are not requir
6180: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
6190: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
61a0: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
61b0: 45 4c 69 73 74 2c 20 72 65 67 52 65 73 75 6c 74  EList, regResult
61c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
61d0: 20 20 20 20 28 65 44 65 73 74 3d 3d 53 52 54 5f      (eDest==SRT_
61e0: 4f 75 74 70 75 74 7c 7c 65 44 65 73 74 3d 3d 53  Output||eDest==S
61f0: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 29 3f 53 51  RT_Coroutine)?SQ
6200: 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 3a 30 29  LITE_ECEL_DUP:0)
6210: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
6220: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
6230: 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74 20  ord was present 
6240: 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  on the SELECT st
6250: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64  atement.  ** and
6260: 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62 65   this row has be
6270: 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20  en seen before, 
6280: 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65  then do not make
6290: 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70   this row.  ** p
62a0: 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c  art of the resul
62b0: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61  t..  */.  if( ha
62c0: 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
62d0: 20 73 77 69 74 63 68 28 20 70 44 69 73 74 69 6e   switch( pDistin
62e0: 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 29 7b  ct->eTnctType ){
62f0: 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
6300: 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
6310: 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64  ED: {.        Vd
6320: 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20  beOp *pOp;      
6330: 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67        /* No long
6340: 65 72 20 72 65 71 75 69 72 65 64 20 4f 70 65 6e  er required Open
6350: 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e  Ephemeral instr.
6360: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
6370: 69 4a 75 6d 70 3b 20 20 20 20 20 20 20 20 20 20  iJump;          
6380: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74      /* Jump dest
6390: 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ination */.     
63a0: 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20     int regPrev; 
63b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
63c0: 65 76 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74 65  evious row conte
63d0: 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f  nt */..        /
63e0: 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
63f0: 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75   for the previou
6400: 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20  s row */.       
6410: 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72 73   regPrev = pPars
6420: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20  e->nMem+1;.     
6430: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
6440: 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a  += nResultCol;..
6450: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67          /* Chang
6460: 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  e the OP_OpenEph
6470: 65 6d 65 72 61 6c 20 63 6f 64 65 64 20 65 61 72  emeral coded ear
6480: 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e 75  lier to an OP_Nu
6490: 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  ll.        ** se
64a0: 74 73 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61 72  ts the MEM_Clear
64b0: 65 64 20 62 69 74 20 6f 6e 20 74 68 65 20 66 69  ed bit on the fi
64c0: 72 73 74 20 72 65 67 69 73 74 65 72 20 6f 66 20  rst register of 
64d0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  the.        ** p
64e0: 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e 20 20  revious value.  
64f0: 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20  This will cause 
6500: 74 68 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77 20  the OP_Ne below 
6510: 74 6f 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20  to always.      
6520: 20 20 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68 65    ** fail on the
6530: 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
6540: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 65 76 65   of the loop eve
6550: 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20  n if the first. 
6560: 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 69 73         ** row is
6570: 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20 20   all NULLs..    
6580: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
6590: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
65a0: 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69  ToNoop(v, pDisti
65b0: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
65c0: 20 20 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71          pOp = sq
65d0: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
65e0: 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64  , pDistinct->add
65f0: 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20  rTnct);.        
6600: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
6610: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  _Null;.        p
6620: 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20 20  Op->p1 = 1;.    
6630: 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72 65      pOp->p2 = re
6640: 67 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 20 20  gPrev;..        
6650: 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56  iJump = sqlite3V
6660: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
6670: 29 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a  ) + nResultCol;.
6680: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
6690: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69   i<nResultCol; i
66a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 43  ++){.          C
66b0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
66c0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
66d0: 65 71 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  eq(pParse, pELis
66e0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
66f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
6700: 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 20 29 7b 0a  nResultCol-1 ){.
6710: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
6720: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6730: 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73 75 6c   OP_Ne, regResul
6740: 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65 67 50  t+i, iJump, regP
6750: 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20  rev+i);.        
6760: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
6770: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  (v);.          }
6780: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
6790: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
67a0: 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65  Op3(v, OP_Eq, re
67b0: 67 52 65 73 75 6c 74 2b 69 2c 20 69 43 6f 6e 74  gResult+i, iCont
67c0: 69 6e 75 65 2c 20 72 65 67 50 72 65 76 2b 69 29  inue, regPrev+i)
67d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64  ;.            Vd
67e0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
67f0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6800: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6810: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
6820: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
6830: 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
6840: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
6850: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
6860: 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  (v, SQLITE_NULLE
6870: 51 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  Q);.        }.  
6880: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
6890: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
68a0: 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d 70 20 7c  Addr(v)==iJump |
68b0: 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
68c0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
68d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
68e0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
68f0: 70 79 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72  py, regResult, r
6900: 65 67 50 72 65 76 2c 20 6e 52 65 73 75 6c 74 43  egPrev, nResultC
6910: 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 62  ol-1);.        b
6920: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
6930: 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
6940: 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a  DISTINCT_UNIQUE:
6950: 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
6960: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
6970: 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d  op(v, pDistinct-
6980: 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20  >addrTnct);.    
6990: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
69a0: 20 7d 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c   }..      defaul
69b0: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 61 73 73  t: {.        ass
69c0: 65 72 74 28 20 70 44 69 73 74 69 6e 63 74 2d 3e  ert( pDistinct->
69d0: 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52 45  eTnctType==WHERE
69e0: 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45  _DISTINCT_UNORDE
69f0: 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 63  RED );.        c
6a00: 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72  odeDistinct(pPar
6a10: 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 74  se, pDistinct->t
6a20: 61 62 54 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75  abTnct, iContinu
6a30: 65 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72  e, nResultCol, r
6a40: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
6a50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6a60: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
6a70: 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pSort==0 ){.    
6a80: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
6a90: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e  p->iOffset, iCon
6aa0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20  tinue);.    }.  
6ab0: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  }..  switch( eDe
6ac0: 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  st ){.    /* In 
6ad0: 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65  this mode, write
6ae0: 20 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75   each query resu
6af0: 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66  lt to the key of
6b00: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
6b10: 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72     ** table iPar
6b20: 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  m..    */.#ifnde
6b30: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
6b40: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
6b50: 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e    case SRT_Union
6b60: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
6b70: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
6b80: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
6b90: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
6ba0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6bb0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
6bc0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
6bd0: 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a 20 20  sultCol, r1);.  
6be0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6bf0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
6c00: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
6c10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6c20: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
6c30: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
6c40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
6c50: 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74      /* Construct
6c60: 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74   a record from t
6c70: 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c  he query result,
6c80: 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   but instead of.
6c90: 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68      ** saving th
6ca0: 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69  at record, use i
6cb0: 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65  t as a key to de
6cc0: 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72  lete elements fr
6cd0: 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65  om.    ** the te
6ce0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
6cf0: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  arm..    */.    
6d00: 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a  case SRT_Except:
6d10: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
6d20: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6d30: 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 50 61 72  _IdxDelete, iPar
6d40: 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  m, regResult, nR
6d50: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
6d60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
6d70: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
6d80: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
6d90: 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ECT */..    /* S
6da0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
6db0: 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20  as data using a 
6dc0: 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20  unique key..    
6dd0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
6de0: 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20 53  Fifo:.    case S
6df0: 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a 20 20 20  RT_DistFifo:.   
6e00: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
6e10: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
6e20: 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
6e30: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
6e40: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
6e50: 72 73 65 2c 20 6e 50 72 65 66 69 78 52 65 67 2b  rse, nPrefixReg+
6e60: 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
6e70: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54  se( eDest==SRT_T
6e80: 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65  able );.      te
6e90: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
6ea0: 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20  RT_EphemTab );. 
6eb0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6ec0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
6ed0: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
6ee0: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20  lt, nResultCol, 
6ef0: 72 31 2b 6e 50 72 65 66 69 78 52 65 67 29 3b 0a  r1+nPrefixReg);.
6f00: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6f10: 4d 49 54 5f 43 54 45 0a 20 20 20 20 20 20 69 66  MIT_CTE.      if
6f20: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
6f30: 74 46 69 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  tFifo ){.       
6f40: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
6f50: 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74 46 69  nation is DistFi
6f60: 66 6f 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20  fo, then cursor 
6f70: 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65  (iParm+1) is ope
6f80: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20  n.        ** on 
6f90: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  an ephemeral ind
6fa0: 65 78 2e 20 49 66 20 74 68 65 20 63 75 72 72 65  ex. If the curre
6fb0: 6e 74 20 72 6f 77 20 69 73 20 61 6c 72 65 61 64  nt row is alread
6fc0: 79 20 70 72 65 73 65 6e 74 0a 20 20 20 20 20 20  y present.      
6fd0: 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65    ** in the inde
6fe0: 78 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  x, do not write 
6ff0: 69 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  it to the output
7000: 2e 20 49 66 20 6e 6f 74 2c 20 61 64 64 20 74 68  . If not, add th
7010: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72  e.        ** cur
7020: 72 65 6e 74 20 72 6f 77 20 74 6f 20 74 68 65 20  rent row to the 
7030: 69 6e 64 65 78 20 61 6e 64 20 70 72 6f 63 65 65  index and procee
7040: 64 20 77 69 74 68 20 77 72 69 74 69 6e 67 20 69  d with writing i
7050: 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  t to the.       
7060: 20 2a 2a 20 6f 75 74 70 75 74 20 74 61 62 6c 65   ** output table
7070: 20 61 73 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20   as well.  */.  
7080: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
7090: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
70a0: 65 6e 74 41 64 64 72 28 76 29 20 2b 20 34 3b 0a  entAddr(v) + 4;.
70b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
70c0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
70d0: 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b  OP_Found, iParm+
70e0: 31 2c 20 61 64 64 72 2c 20 72 31 2c 20 30 29 3b  1, addr, r1, 0);
70f0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
7100: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7110: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7120: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
7130: 72 6d 2b 31 2c 20 72 31 29 3b 0a 20 20 20 20 20  rm+1, r1);.     
7140: 20 20 20 61 73 73 65 72 74 28 20 70 53 6f 72 74     assert( pSort
7150: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23  ==0 );.      }.#
7160: 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
7170: 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  pSort ){.       
7180: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
7190: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70  pParse, pSort, p
71a0: 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65 67 2c  , r1+nPrefixReg,
71b0: 20 31 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b   1, nPrefixReg);
71c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
71d0: 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73        int r2 = s
71e0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
71f0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
7200: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7210: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
7220: 69 64 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a  id, iParm, r2);.
7230: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7240: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
7250: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
7260: 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20  1, r2);.        
7270: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
7280: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
7290: 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73  PEND);.        s
72a0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
72b0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
72c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
72d0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
72e0: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
72f0: 72 31 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31  r1, nPrefixReg+1
7300: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7310: 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
7320: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
7330: 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  ERY.    /* If we
7340: 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20   are creating a 
7350: 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72  set for an "expr
7360: 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
7370: 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20  " construct,.   
7380: 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73   ** then there s
7390: 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c  hould be a singl
73a0: 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74  e item on the st
73b0: 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73  ack.  Write this
73c0: 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74  .    ** item int
73d0: 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20  o the set table 
73e0: 77 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e  with bogus data.
73f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
7400: 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
7410: 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c    assert( nResul
7420: 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20  tCol==1 );.     
7430: 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20   pDest->affSdst 
7440: 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
7450: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61      sqlite3Compa
7460: 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c 69 73  reAffinity(pELis
7470: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70  t->a[0].pExpr, p
7480: 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a  Dest->affSdst);.
7490: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
74a0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74  ){.        /* At
74b0: 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f   first glance yo
74c0: 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65  u would think we
74d0: 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20   could optimize 
74e0: 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20 20 20  out the.        
74f0: 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74  ** ORDER BY in t
7500: 68 69 73 20 63 61 73 65 20 73 69 6e 63 65 20 74  his case since t
7510: 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72  he order of entr
7520: 69 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20  ies in the set. 
7530: 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e         ** does n
7540: 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20  ot matter.  But 
7550: 74 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 61  there might be a
7560: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69   LIMIT clause, i
7570: 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20  n which.        
7580: 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64 65  ** case the orde
7590: 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f  r does matter */
75a0: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
75b0: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
75c0: 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73  pSort, p, regRes
75d0: 75 6c 74 2c 20 31 2c 20 6e 50 72 65 66 69 78 52  ult, 1, nPrefixR
75e0: 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
75f0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31  {.        int r1
7600: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7610: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
7620: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7630: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
7640: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
7650: 75 6c 74 2c 31 2c 72 31 2c 20 26 70 44 65 73 74  ult,1,r1, &pDest
7660: 2d 3e 61 66 66 53 64 73 74 2c 20 31 29 3b 0a 20  ->affSdst, 1);. 
7670: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
7680: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
7690: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
76a0: 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20  gResult, 1);.   
76b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
76c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
76d0: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
76e0: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
76f0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
7700: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
7710: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
7720: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
7730: 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69  * If any row exi
7740: 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  st in the result
7750: 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61   set, record tha
7760: 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74  t fact and abort
7770: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
7780: 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a  e SRT_Exists: {.
7790: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
77a0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
77b0: 74 65 67 65 72 2c 20 31 2c 20 69 50 61 72 6d 29  teger, 1, iParm)
77c0: 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;.      /* The L
77d0: 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c  IMIT clause will
77e0: 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
77f0: 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
7800: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7810: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
7820: 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c   is a scalar sel
7830: 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74  ect that is part
7840: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
7850: 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73  n, then.    ** s
7860: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
7870: 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69   in the appropri
7880: 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  ate memory cell 
7890: 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20  and break out.  
78a0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e    ** of the scan
78b0: 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
78c0: 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
78d0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
78e0: 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b  nResultCol==1 );
78f0: 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74  .      if( pSort
7900: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68   ){.        push
7910: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
7920: 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67  e, pSort, p, reg
7930: 52 65 73 75 6c 74 2c 20 31 2c 20 6e 50 72 65 66  Result, 1, nPref
7940: 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65  ixReg);.      }e
7950: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
7960: 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
7970: 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75  (pParse, regResu
7980: 6c 74 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  lt, iParm, 1);. 
7990: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49         /* The LI
79a0: 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
79b0: 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20  jump out of the 
79c0: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
79d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
79e0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
79f0: 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
7a00: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
7a10: 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20 53 52   */..    case SR
7a20: 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 20 20 20  T_Coroutine:    
7a30: 20 20 20 2f 2a 20 53 65 6e 64 20 64 61 74 61 20     /* Send data 
7a40: 74 6f 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  to a co-routine 
7a50: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
7a60: 4f 75 74 70 75 74 3a 20 7b 20 20 20 20 20 20 20  Output: {       
7a70: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72   /* Return the r
7a80: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20  esults */.      
7a90: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
7aa0: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
7ab0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7ac0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
7ad0: 70 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  put );.      if(
7ae0: 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20   pSort ){.      
7af0: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
7b00: 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20  (pParse, pSort, 
7b10: 70 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  p, regResult, nR
7b20: 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72 65 66 69  esultCol, nPrefi
7b30: 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xReg);.      }el
7b40: 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  se if( eDest==SR
7b50: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20  T_Coroutine ){. 
7b60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7b70: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
7b80: 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44  ield, pDest->iSD
7b90: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Parm);.      }el
7ba0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
7bb0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
7bc0: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72   OP_ResultRow, r
7bd0: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
7be0: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  tCol);.        s
7bf0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
7c00: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
7c10: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
7c20: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
7c30: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
7c40: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
7c50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
7c60: 45 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  E.    /* Write t
7c70: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20  he results into 
7c80: 61 20 70 72 69 6f 72 69 74 79 20 71 75 65 75 65  a priority queue
7c90: 20 74 68 61 74 20 69 73 20 6f 72 64 65 72 20 61   that is order a
7ca0: 63 63 6f 72 64 69 6e 67 20 74 6f 0a 20 20 20 20  ccording to.    
7cb0: 2a 2a 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72  ** pDest->pOrder
7cc0: 42 79 20 28 69 6e 20 70 53 4f 29 2e 20 20 70 44  By (in pSO).  pD
7cd0: 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 28 69 6e  est->iSDParm (in
7ce0: 20 69 50 61 72 6d 29 20 69 73 20 74 68 65 20 63   iParm) is the c
7cf0: 75 72 73 6f 72 20 66 6f 72 20 61 6e 0a 20 20 20  ursor for an.   
7d00: 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 70   ** index with p
7d10: 53 4f 2d 3e 6e 45 78 70 72 2b 32 20 63 6f 6c 75  SO->nExpr+2 colu
7d20: 6d 6e 73 2e 20 20 42 75 69 6c 64 20 61 20 6b 65  mns.  Build a ke
7d30: 79 20 75 73 69 6e 67 20 70 53 4f 20 66 6f 72 20  y using pSO for 
7d40: 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 2a 2a  the first.    **
7d50: 20 70 53 4f 2d 3e 6e 45 78 70 72 20 63 6f 6c 75   pSO->nExpr colu
7d60: 6d 6e 73 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  mns, then make s
7d70: 75 72 65 20 61 6c 6c 20 6b 65 79 73 20 61 72 65  ure all keys are
7d80: 20 75 6e 69 71 75 65 20 62 79 20 61 64 64 69 6e   unique by addin
7d90: 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6e 61 6c  g a.    ** final
7da0: 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 63 6f 6c   OP_Sequence col
7db0: 75 6d 6e 2e 20 20 54 68 65 20 6c 61 73 74 20 63  umn.  The last c
7dc0: 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 72 65 63  olumn is the rec
7dd0: 6f 72 64 20 61 73 20 61 20 62 6c 6f 62 2e 0a 20  ord as a blob.. 
7de0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
7df0: 52 54 5f 44 69 73 74 51 75 65 75 65 3a 0a 20 20  RT_DistQueue:.  
7e00: 20 20 63 61 73 65 20 53 52 54 5f 51 75 65 75 65    case SRT_Queue
7e10: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b  : {.      int nK
7e20: 65 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  ey;.      int r1
7e30: 2c 20 72 32 2c 20 72 33 3b 0a 20 20 20 20 20 20  , r2, r3;.      
7e40: 69 6e 74 20 61 64 64 72 54 65 73 74 20 3d 20 30  int addrTest = 0
7e50: 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  ;.      ExprList
7e60: 20 2a 70 53 4f 3b 0a 20 20 20 20 20 20 70 53 4f   *pSO;.      pSO
7e70: 20 3d 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72   = pDest->pOrder
7e80: 42 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  By;.      assert
7e90: 28 20 70 53 4f 20 29 3b 0a 20 20 20 20 20 20 6e  ( pSO );.      n
7ea0: 4b 65 79 20 3d 20 70 53 4f 2d 3e 6e 45 78 70 72  Key = pSO->nExpr
7eb0: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
7ec0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
7ed0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 32  Parse);.      r2
7ee0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7ef0: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
7f00: 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 72 33  Key+2);.      r3
7f10: 20 3d 20 72 32 2b 6e 4b 65 79 2b 31 3b 0a 20 20   = r2+nKey+1;.  
7f20: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
7f30: 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a  RT_DistQueue ){.
7f40: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
7f50: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73  e destination is
7f60: 20 44 69 73 74 51 75 65 75 65 2c 20 74 68 65 6e   DistQueue, then
7f70: 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31   cursor (iParm+1
7f80: 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20  ) is open.      
7f90: 20 20 2a 2a 20 6f 6e 20 61 20 73 65 63 6f 6e 64    ** on a second
7fa0: 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
7fb0: 20 74 68 61 74 20 68 6f 6c 64 73 20 61 6c 6c 20   that holds all 
7fc0: 76 61 6c 75 65 73 20 65 76 65 72 79 20 70 72 65  values every pre
7fd0: 76 69 6f 75 73 6c 79 0a 20 20 20 20 20 20 20 20  viously.        
7fe0: 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ** added to the 
7ff0: 71 75 65 75 65 2e 20 2a 2f 0a 20 20 20 20 20 20  queue. */.      
8000: 20 20 61 64 64 72 54 65 73 74 20 3d 20 73 71 6c    addrTest = sql
8010: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
8020: 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69  t(v, OP_Found, i
8030: 50 61 72 6d 2b 31 2c 20 30 2c 20 0a 20 20 20 20  Parm+1, 0, .    
8040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8060: 20 20 20 20 72 65 67 52 65 73 75 6c 74 2c 20 6e      regResult, n
8070: 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20  ResultCol);.    
8080: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
8090: 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (v);.      }.   
80a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
80b0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
80c0: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
80d0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 33  , nResultCol, r3
80e0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  );.      if( eDe
80f0: 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75  st==SRT_DistQueu
8100: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
8110: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8120: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
8130: 69 50 61 72 6d 2b 31 2c 20 72 33 29 3b 0a 20 20  iParm+1, r3);.  
8140: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8150: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
8160: 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c  LAG_USESEEKRESUL
8170: 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T);.      }.    
8180: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4b 65    for(i=0; i<nKe
8190: 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; i++){.       
81a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
81b0: 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 0a  p2(v, OP_SCopy,.
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81d0: 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73            regRes
81e0: 75 6c 74 20 2b 20 70 53 4f 2d 3e 61 5b 69 5d 2e  ult + pSO->a[i].
81f0: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
8200: 2d 20 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  - 1,.           
8210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
8220: 32 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  2+i);.      }.  
8230: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8240: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75  ddOp2(v, OP_Sequ
8250: 65 6e 63 65 2c 20 69 50 61 72 6d 2c 20 72 32 2b  ence, iParm, r2+
8260: 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 73 71 6c  nKey);.      sql
8270: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8280: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
8290: 20 72 32 2c 20 6e 4b 65 79 2b 32 2c 20 72 31 29   r2, nKey+2, r1)
82a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
82b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
82c0: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
82d0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 69 66 28  , r1);.      if(
82e0: 20 61 64 64 72 54 65 73 74 20 29 20 73 71 6c 69   addrTest ) sqli
82f0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
8300: 76 2c 20 61 64 64 72 54 65 73 74 29 3b 0a 20 20  v, addrTest);.  
8310: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
8320: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
8330: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
8340: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
8350: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 32 2c  ange(pParse, r2,
8360: 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20   nKey+2);.      
8370: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
8380: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
8390: 49 54 5f 43 54 45 20 2a 2f 0a 0a 0a 0a 23 69 66  IT_CTE */....#if
83a0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
83b0: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20  _OMIT_TRIGGER). 
83c0: 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68     /* Discard th
83d0: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73  e results.  This
83e0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c   is used for SEL
83f0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ECT statements i
8400: 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65  nside.    ** the
8410: 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47   body of a TRIGG
8420: 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65  ER.  The purpose
8430: 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73   of such selects
8440: 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20   is to call.    
8450: 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  ** user-defined 
8460: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68  functions that h
8470: 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73  ave side effects
8480: 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72  .  We do not car
8490: 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74  e.    ** about t
84a0: 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74  he actual result
84b0: 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  s of the select.
84c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
84d0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
84e0: 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ert( eDest==SRT_
84f0: 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20  Discard );.     
8500: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
8510: 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a  ndif.  }..  /* J
8520: 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ump to the end o
8530: 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68  f the loop if th
8540: 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68  e LIMIT is reach
8550: 65 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66 0a  ed.  Except, if.
8560: 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20    ** there is a 
8570: 73 6f 72 74 65 72 2c 20 69 6e 20 77 68 69 63 68  sorter, in which
8580: 20 63 61 73 65 20 74 68 65 20 73 6f 72 74 65 72   case the sorter
8590: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6c 69 6d   has already lim
85a0: 69 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 6f 75  ited.  ** the ou
85b0: 74 70 75 74 20 66 6f 72 20 75 73 2e 0a 20 20 2a  tput for us..  *
85c0: 2f 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30  /.  if( pSort==0
85d0: 20 26 26 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b   && p->iLimit ){
85e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
85f0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a  AddOp3(v, OP_IfZ
8600: 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
8610: 69 42 72 65 61 6b 2c 20 2d 31 29 3b 20 56 64 62  iBreak, -1); Vdb
8620: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
8630: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
8640: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62  ate a KeyInfo ob
8650: 6a 65 63 74 20 73 75 66 66 69 63 69 65 6e 74 20  ject sufficient 
8660: 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 66 20  for an index of 
8670: 4e 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61 6e  N key columns an
8680: 64 0a 2a 2a 20 58 20 65 78 74 72 61 20 63 6f 6c  d.** X extra col
8690: 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f  umns..*/.KeyInfo
86a0: 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f   *sqlite3KeyInfo
86b0: 41 6c 6c 6f 63 28 73 71 6c 69 74 65 33 20 2a 64  Alloc(sqlite3 *d
86c0: 62 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20 58 29  b, int N, int X)
86d0: 7b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 20 3d  {.  KeyInfo *p =
86e0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
86f0: 5a 65 72 6f 28 30 2c 20 0a 20 20 20 20 20 20 20  Zero(0, .       
8700: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
8710: 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 28 4e  of(KeyInfo) + (N
8720: 2b 58 29 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c  +X)*(sizeof(Coll
8730: 53 65 71 2a 29 2b 31 29 29 3b 0a 20 20 69 66 28  Seq*)+1));.  if(
8740: 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f   p ){.    p->aSo
8750: 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
8760: 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20  p->aColl[N+X];. 
8770: 20 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 28     p->nField = (
8780: 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e 6e 58  u16)N;.    p->nX
8790: 46 69 65 6c 64 20 3d 20 28 75 31 36 29 58 3b 0a  Field = (u16)X;.
87a0: 20 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45 4e 43      p->enc = ENC
87b0: 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20  (db);.    p->db 
87c0: 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  = db;.    p->nRe
87d0: 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  f = 1;.  }else{.
87e0: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
87f0: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  iled = 1;.  }.  
8800: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
8810: 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20  ** Deallocate a 
8820: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a  KeyInfo object.*
8830: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4b 65  /.void sqlite3Ke
8840: 79 49 6e 66 6f 55 6e 72 65 66 28 4b 65 79 49 6e  yInfoUnref(KeyIn
8850: 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  fo *p){.  if( p 
8860: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
8870: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
8880: 70 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69  p->nRef--;.    i
8890: 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 20  f( p->nRef==0 ) 
88a0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
88b0: 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   p);.  }.}../*.*
88c0: 2a 20 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f 69  * Make a new poi
88d0: 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66  nter to a KeyInf
88e0: 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49  o object.*/.KeyI
88f0: 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49  nfo *sqlite3KeyI
8900: 6e 66 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a  nfoRef(KeyInfo *
8910: 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
8920: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52     assert( p->nR
8930: 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e  ef>0 );.    p->n
8940: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  Ref++;.  }.  ret
8950: 75 72 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66  urn p;.}..#ifdef
8960: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
8970: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
8980: 69 66 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a  if a KeyInfo obj
8990: 65 63 74 20 63 61 6e 20 62 65 20 63 68 61 6e 67  ect can be chang
89a0: 65 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20  e.  The KeyInfo 
89b0: 6f 62 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e  object.** can on
89c0: 6c 79 20 62 65 20 63 68 61 6e 67 65 64 20 69 66  ly be changed if
89d0: 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 61 20   this is just a 
89e0: 73 69 6e 67 6c 65 20 72 65 66 65 72 65 6e 63 65  single reference
89f0: 20 74 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a   to the object..
8a00: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
8a10: 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  ne is used only 
8a20: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
8a30: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  () statements..*
8a40: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4b 65 79  /.int sqlite3Key
8a50: 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
8a60: 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74  KeyInfo *p){ ret
8a70: 75 72 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20  urn p->nRef==1; 
8a80: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
8a90: 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a  TE_DEBUG */../*.
8aa0: 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72  ** Given an expr
8ab0: 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e  ession list, gen
8ac0: 65 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  erate a KeyInfo 
8ad0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
8ae0: 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f  ecords.** the co
8af0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
8b00: 20 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 73   for each expres
8b10: 73 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70  sion in that exp
8b20: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
8b30: 0a 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c  .** If the ExprL
8b40: 69 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ist is an ORDER 
8b50: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
8b60: 6c 61 75 73 65 20 74 68 65 6e 20 74 68 65 20 72  lause then the r
8b70: 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49  esulting.** KeyI
8b80: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
8b90: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
8ba0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20   initializing a 
8bb0: 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f  virtual index to
8bc0: 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  .** implement th
8bd0: 61 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74  at clause.  If t
8be0: 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 74  he ExprList is t
8bf0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
8c00: 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65   a SELECT.** the
8c10: 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  n the KeyInfo st
8c20: 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f  ructure is appro
8c30: 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69  priate for initi
8c40: 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61  alizing a virtua
8c50: 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d  l.** index to im
8c60: 70 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e  plement a DISTIN
8c70: 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53  CT test..**.** S
8c80: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
8c90: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
8ca0: 72 65 20 69 73 20 6f 62 74 61 69 6e 20 66 72 6f  re is obtain fro
8cb0: 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63  m malloc.  The c
8cc0: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
8cd0: 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  on is responsibl
8ce0: 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61  e for seeing tha
8cf0: 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  t this structure
8d00: 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a   is eventually.*
8d10: 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74  * freed..*/.stat
8d20: 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49  ic KeyInfo *keyI
8d30: 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
8d40: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
8d50: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
8d60: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
8d70: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
8d80: 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65       /* Form the
8d90: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20   KeyInfo object 
8da0: 66 72 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69  from this ExprLi
8db0: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61  st */.  int iSta
8dc0: 72 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rt,          /* 
8dd0: 42 65 67 69 6e 20 77 69 74 68 20 74 68 69 73 20  Begin with this 
8de0: 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20  column of pList 
8df0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  */.  int nExtra 
8e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
8e10: 20 74 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61   this many extra
8e20: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20   columns to the 
8e30: 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  end */.){.  int 
8e40: 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f  nExpr;.  KeyInfo
8e50: 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63   *pInfo;.  struc
8e60: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
8e70: 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65  *pItem;.  sqlite
8e80: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
8e90: 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  db;.  int i;..  
8ea0: 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e  nExpr = pList->n
8eb0: 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20  Expr;.  pInfo = 
8ec0: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
8ed0: 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2b 6e 45  loc(db, nExpr+nE
8ee0: 78 74 72 61 2d 69 53 74 61 72 74 2c 20 31 29 3b  xtra-iStart, 1);
8ef0: 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a  .  if( pInfo ){.
8f00: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
8f10: 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
8f20: 65 61 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a  eable(pInfo) );.
8f30: 20 20 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74      for(i=iStart
8f40: 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
8f50: 2b 69 53 74 61 72 74 3b 20 69 3c 6e 45 78 70 72  +iStart; i<nExpr
8f60: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
8f70: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
8f80: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f  pColl;.      pCo
8f90: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
8fa0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
8fb0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
8fc0: 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
8fd0: 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
8fe0: 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70  fltColl;.      p
8ff0: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53  Info->aColl[i-iS
9000: 74 61 72 74 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20  tart] = pColl;. 
9010: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72       pInfo->aSor
9020: 74 4f 72 64 65 72 5b 69 2d 69 53 74 61 72 74 5d  tOrder[i-iStart]
9030: 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72   = pItem->sortOr
9040: 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  der;.    }.  }. 
9050: 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d   return pInfo;.}
9060: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
9070: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
9080: 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65  ELECT./*.** Name
9090: 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
90a0: 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65  on operator, use
90b0: 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  d for error mess
90c0: 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ages..*/.static 
90d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65  const char *sele
90e0: 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29  ctOpName(int id)
90f0: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73  {.  char *z;.  s
9100: 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20  witch( id ){.   
9110: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20   case TK_ALL:   
9120: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41      z = "UNION A
9130: 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  LL";   break;.  
9140: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53    case TK_INTERS
9150: 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53  ECT: z = "INTERS
9160: 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ECT";   break;. 
9170: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
9180: 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50  T:    z = "EXCEP
9190: 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T";      break;.
91a0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
91b0: 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f         z = "UNIO
91c0: 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  N";       break;
91d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b  .  }.  return z;
91e0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
91f0: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
9200: 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66  D_SELECT */..#if
9210: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9220: 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55  _EXPLAIN./*.** U
9230: 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49  nless an "EXPLAI
9240: 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f  N QUERY PLAN" co
9250: 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70  mmand is being p
9260: 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20 66  rocessed, this f
9270: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20  unction.** is a 
9280: 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
9290: 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e 67  , it adds a sing
92a0: 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74  le row of output
92b0: 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73 75   to the EQP resu
92c0: 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65  lt,.** where the
92d0: 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 74   caption is of t
92e0: 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
92f0: 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45   "USE TEMP B-TRE
9300: 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a  E FOR xxx".**.**
9310: 20 77 68 65 72 65 20 78 78 78 20 69 73 20 6f 6e   where xxx is on
9320: 65 20 6f 66 20 22 44 49 53 54 49 4e 43 54 22 2c  e of "DISTINCT",
9330: 20 22 4f 52 44 45 52 20 42 59 22 20 6f 72 20 22   "ORDER BY" or "
9340: 47 52 4f 55 50 20 42 59 22 2e 20 45 78 61 63 74  GROUP BY". Exact
9350: 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64  ly which.** is d
9360: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
9370: 20 7a 55 73 61 67 65 20 61 72 67 75 6d 65 6e 74   zUsage argument
9380: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9390: 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
93a0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
93b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73   const char *zUs
93c0: 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72  age){.  if( pPar
93d0: 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
93e0: 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  {.    Vdbe *v = 
93f0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
9400: 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20     char *zMsg = 
9410: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70  sqlite3MPrintf(p
9420: 50 61 72 73 65 2d 3e 64 62 2c 20 22 55 53 45 20  Parse->db, "USE 
9430: 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20  TEMP B-TREE FOR 
9440: 25 73 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20 20  %s", zUsage);.  
9450: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9460: 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69  Op4(v, OP_Explai
9470: 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  n, pParse->iSele
9480: 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67  ctId, 0, 0, zMsg
9490: 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
94a0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69   }.}../*.** Assi
94b0: 67 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62 20  gn expression b 
94c0: 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41 20 73  to lvalue a. A s
94d0: 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65  econd, no-op, ve
94e0: 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61  rsion of this ma
94f0: 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64  cro.** is provid
9500: 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f  ed when SQLITE_O
9510: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 64  MIT_EXPLAIN is d
9520: 65 66 69 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c  efined. This all
9530: 6f 77 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20  ows the code.** 
9540: 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  in sqlite3Select
9550: 28 29 20 74 6f 20 61 73 73 69 67 6e 20 76 61 6c  () to assign val
9560: 75 65 73 20 74 6f 20 73 74 72 75 63 74 75 72 65  ues to structure
9570: 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65   member variable
9580: 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65  s that.** only e
9590: 78 69 73 74 20 69 66 20 53 51 4c 49 54 45 5f 4f  xist if SQLITE_O
95a0: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e  MIT_EXPLAIN is n
95b0: 6f 74 20 64 65 66 69 6e 65 64 20 77 69 74 68 6f  ot defined witho
95c0: 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65  ut polluting the
95d0: 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 20 23 69  .** code with #i
95e0: 66 6e 64 65 66 20 64 69 72 65 63 74 69 76 65 73  fndef directives
95f0: 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78  ..*/.# define ex
9600: 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
9610: 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c  a, b) a = b..#el
9620: 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73  se./* No-op vers
9630: 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c  ions of the expl
9640: 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f  ainXXX() functio
9650: 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a  ns and macros. *
9660: 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  /.# define expla
9670: 69 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29  inTempTable(y,z)
9680: 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
9690: 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c 7a 29  nSetInteger(y,z)
96a0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
96b0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
96c0: 54 5f 45 58 50 4c 41 49 4e 29 20 26 26 20 21 64  T_EXPLAIN) && !d
96d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
96e0: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
96f0: 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73  CT)./*.** Unless
9700: 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45   an "EXPLAIN QUE
9710: 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64  RY PLAN" command
9720: 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73   is being proces
9730: 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  sed, this functi
9740: 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  on.** is a no-op
9750: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
9760: 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  adds a single ro
9770: 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74  w of output to t
9780: 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a  he EQP result,.*
9790: 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70 74  * where the capt
97a0: 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66  ion is of one of
97b0: 20 74 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a 0a   the two forms:.
97c0: 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49  **.**   "COMPOSI
97d0: 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69 53  TE SUBQUERIES iS
97e0: 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 28 6f  ub1 and iSub2 (o
97f0: 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53  p)".**   "COMPOS
9800: 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69  ITE SUBQUERIES i
9810: 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 55  Sub1 and iSub2 U
9820: 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45  SING TEMP B-TREE
9830: 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65   (op)".**.** whe
9840: 72 65 20 69 53 75 62 31 20 61 6e 64 20 69 53 75  re iSub1 and iSu
9850: 62 32 20 61 72 65 20 74 68 65 20 69 6e 74 65 67  b2 are the integ
9860: 65 72 73 20 70 61 73 73 65 64 20 61 73 20 74 68  ers passed as th
9870: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
9880: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61  ** function para
9890: 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f 70 20 69  meters, and op i
98a0: 73 20 74 68 65 20 74 65 78 74 20 72 65 70 72 65  s the text repre
98b0: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
98c0: 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66   parameter.** of
98d0: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
98e0: 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 6f  The parameter "o
98f0: 70 22 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  p" must be one o
9900: 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45  f TK_UNION, TK_E
9910: 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54  XCEPT,.** TK_INT
9920: 45 52 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c 4c  ERSECT or TK_ALL
9930: 2e 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d  . The first form
9940: 20 69 73 20 75 73 65 64 20 69 66 20 61 72 67 75   is used if argu
9950: 6d 65 6e 74 20 62 55 73 65 54 6d 70 20 69 73 20  ment bUseTmp is 
9960: 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74 68  .** false, or th
9970: 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 66  e second form if
9980: 20 69 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a   it is true..*/.
9990: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
99a0: 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20 20  ainComposite(.  
99b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
99c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99d0: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
99e0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
99f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a00: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
9a10: 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43  TK_UNION, TK_EXC
9a20: 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e  EPT etc. */.  in
9a30: 74 20 69 53 75 62 31 2c 20 20 20 20 20 20 20 20  t iSub1,        
9a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9a50: 20 53 75 62 71 75 65 72 79 20 69 64 20 31 20 2a   Subquery id 1 *
9a60: 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 2c 20 20  /.  int iSub2,  
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a80: 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20      /* Subquery 
9a90: 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62 55  id 2 */.  int bU
9aa0: 73 65 54 6d 70 20 20 20 20 20 20 20 20 20 20 20  seTmp           
9ab0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
9ac0: 65 20 69 66 20 61 20 74 65 6d 70 20 74 61 62 6c  e if a temp tabl
9ad0: 65 20 77 61 73 20 75 73 65 64 20 2a 2f 0a 29 7b  e was used */.){
9ae0: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  .  assert( op==T
9af0: 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54  K_UNION || op==T
9b00: 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d  K_EXCEPT || op==
9b10: 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c 20  TK_INTERSECT || 
9b20: 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20  op==TK_ALL );.  
9b30: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
9b40: 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64  ain==2 ){.    Vd
9b50: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
9b60: 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20  pVdbe;.    char 
9b70: 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d  *zMsg = sqlite3M
9b80: 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
9b90: 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f 4d  pParse->db, "COM
9ba0: 50 4f 55 4e 44 20 53 55 42 51 55 45 52 49 45 53  POUND SUBQUERIES
9bb0: 20 25 64 20 41 4e 44 20 25 64 20 25 73 28 25 73   %d AND %d %s(%s
9bc0: 29 22 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32  )", iSub1, iSub2
9bd0: 2c 0a 20 20 20 20 20 20 20 20 62 55 73 65 54 6d  ,.        bUseTm
9be0: 70 3f 22 55 53 49 4e 47 20 54 45 4d 50 20 42 2d  p?"USING TEMP B-
9bf0: 54 52 45 45 20 22 3a 22 22 2c 20 73 65 6c 65 63  TREE ":"", selec
9c00: 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20 20  tOpName(op).    
9c10: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
9c20: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
9c30: 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e  xplain, pParse->
9c40: 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c  iSelectId, 0, 0,
9c50: 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
9c60: 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  C);.  }.}.#else.
9c70: 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e  /* No-op version
9c80: 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e  s of the explain
9c90: 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  XXX() functions 
9ca0: 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23  and macros. */.#
9cb0: 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 43   define explainC
9cc0: 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c 79  omposite(v,w,x,y
9cd0: 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,z).#endif../*.*
9ce0: 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  * If the inner l
9cf0: 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74 65  oop was generate
9d00: 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75  d using a non-nu
9d10: 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67 75  ll pOrderBy argu
9d20: 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  ment,.** then th
9d30: 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20 70  e results were p
9d40: 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65  laced in a sorte
9d50: 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f  r.  After the lo
9d60: 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64  op is terminated
9d70: 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72  .** we need to r
9d80: 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e  un the sorter an
9d90: 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65 73  d output the res
9da0: 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  ults.  The follo
9db0: 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  wing.** routine 
9dc0: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
9dd0: 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20  de needed to do 
9de0: 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  that..*/.static 
9df0: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72  void generateSor
9e00: 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a  tTail(.  Parse *
9e10: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
9e20: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
9e30: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
9e40: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
9e50: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
9e60: 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74    SortCtx *pSort
9e70: 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69  ,   /* Informati
9e80: 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20  on on the ORDER 
9e90: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
9ea0: 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt nColumn,     
9eb0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
9ec0: 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f  lumns of data */
9ed0: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
9ee0: 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68  Dest /* Write th
9ef0: 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73  e sorted results
9f00: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 64   here */.){.  Vd
9f10: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
9f20: 70 56 64 62 65 3b 20 20 20 20 20 20 20 20 20 20  pVdbe;          
9f30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
9f40: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
9f50: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ment */.  int ad
9f60: 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65  drBreak = sqlite
9f70: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
9f80: 29 3b 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68  );     /* Jump h
9f90: 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70  ere to exit loop
9fa0: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f   */.  int addrCo
9fb0: 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
9fc0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
9fd0: 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  ;  /* Jump here 
9fe0: 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20 2a  for next cycle *
9ff0: 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20  /.  int addr;.  
a000: 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20 30  int addrOnce = 0
a010: 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20  ;.  int iTab;.  
a020: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
a030: 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64  By = pSort->pOrd
a040: 65 72 42 79 3b 0a 20 20 69 6e 74 20 65 44 65 73  erBy;.  int eDes
a050: 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74  t = pDest->eDest
a060: 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20  ;.  int iParm = 
a070: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 0a  pDest->iSDParm;.
a080: 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20    int regRow;.  
a090: 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 20 20  int regRowid;.  
a0a0: 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20  int nKey;.  int 
a0b0: 69 53 6f 72 74 54 61 62 3b 20 20 20 20 20 20 20  iSortTab;       
a0c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a0d0: 6f 72 74 65 72 20 63 75 72 73 6f 72 20 74 6f 20  orter cursor to 
a0e0: 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  read from */.  i
a0f0: 6e 74 20 6e 53 6f 72 74 44 61 74 61 3b 20 20 20  nt nSortData;   
a100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a110: 2a 20 54 72 61 69 6c 69 6e 67 20 76 61 6c 75 65  * Trailing value
a120: 73 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 73  s to read from s
a130: 6f 72 74 65 72 20 2a 2f 0a 20 20 75 38 20 70 35  orter */.  u8 p5
a140: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a150: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 35             /* p5
a160: 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 31   parameter for 1
a170: 73 74 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2a 2f 0a  st OP_Column */.
a180: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62    int i;.  int b
a190: 53 65 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  Seq;            
a1a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
a1b0: 75 65 20 69 66 20 73 6f 72 74 65 72 20 72 65 63  ue if sorter rec
a1c0: 6f 72 64 20 69 6e 63 6c 75 64 65 73 20 73 65 71  ord includes seq
a1d0: 2e 20 6e 6f 2e 20 2a 2f 0a 23 69 66 64 65 66 20  . no. */.#ifdef 
a1e0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
a1f0: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20  PLAIN_COMMENTS. 
a200: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
a210: 5f 69 74 65 6d 20 2a 61 4f 75 74 45 78 20 3d 20  _item *aOutEx = 
a220: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 23 65  p->pEList->a;.#e
a230: 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 53 6f 72  ndif..  if( pSor
a240: 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b  t->labelBkOut ){
a250: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a260: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
a270: 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65  ub, pSort->regRe
a280: 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61 62  turn, pSort->lab
a290: 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73 71  elBkOut);.    sq
a2a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
a2b0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
a2c0: 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 73  ddrBreak);.    s
a2d0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
a2e0: 65 4c 61 62 65 6c 28 76 2c 20 70 53 6f 72 74 2d  eLabel(v, pSort-
a2f0: 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20  >labelBkOut);.  
a300: 7d 0a 20 20 69 54 61 62 20 3d 20 70 53 6f 72 74  }.  iTab = pSort
a310: 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 69 66  ->iECursor;.  if
a320: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
a330: 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  put || eDest==SR
a340: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20  T_Coroutine ){. 
a350: 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b     regRowid = 0;
a360: 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20 70 44  .    regRow = pD
a370: 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20 20 20  est->iSdst;.    
a380: 6e 53 6f 72 74 44 61 74 61 20 3d 20 6e 43 6f 6c  nSortData = nCol
a390: 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  umn;.  }else{.  
a3a0: 20 20 72 65 67 52 6f 77 69 64 20 3d 20 73 71 6c    regRowid = sql
a3b0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
a3c0: 50 61 72 73 65 29 3b 0a 20 20 20 20 72 65 67 52  Parse);.    regR
a3d0: 6f 77 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ow = sqlite3GetT
a3e0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
a3f0: 20 20 20 20 6e 53 6f 72 74 44 61 74 61 20 3d 20      nSortData = 
a400: 31 3b 0a 20 20 7d 0a 20 20 6e 4b 65 79 20 3d 20  1;.  }.  nKey = 
a410: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
a420: 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b  - pSort->nOBSat;
a430: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f  .  if( pSort->so
a440: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
a450: 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a  AG_UseSorter ){.
a460: 20 20 20 20 69 6e 74 20 72 65 67 53 6f 72 74 4f      int regSortO
a470: 75 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ut = ++pParse->n
a480: 4d 65 6d 3b 0a 20 20 20 20 69 53 6f 72 74 54 61  Mem;.    iSortTa
a490: 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
a4a0: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72  ++;.    if( pSor
a4b0: 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b  t->labelBkOut ){
a4c0: 0a 20 20 20 20 20 20 61 64 64 72 4f 6e 63 65 20  .      addrOnce 
a4d0: 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63  = sqlite3CodeOnc
a4e0: 65 28 70 50 61 72 73 65 29 3b 20 56 64 62 65 43  e(pParse); VdbeC
a4f0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
a500: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
a510: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
a520: 65 6e 50 73 65 75 64 6f 2c 20 69 53 6f 72 74 54  enPseudo, iSortT
a530: 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c 20  ab, regSortOut, 
a540: 6e 4b 65 79 2b 31 2b 6e 53 6f 72 74 44 61 74 61  nKey+1+nSortData
a550: 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4f  );.    if( addrO
a560: 6e 63 65 20 29 20 73 71 6c 69 74 65 33 56 64 62  nce ) sqlite3Vdb
a570: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
a580: 72 4f 6e 63 65 29 3b 0a 20 20 20 20 61 64 64 72  rOnce);.    addr
a590: 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64   = 1 + sqlite3Vd
a5a0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
a5b0: 6f 72 74 65 72 53 6f 72 74 2c 20 69 54 61 62 2c  orterSort, iTab,
a5c0: 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20   addrBreak);.   
a5d0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
a5e0: 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74  ;.    codeOffset
a5f0: 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  (v, p->iOffset, 
a600: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
a610: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a620: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
a630: 72 44 61 74 61 2c 20 69 54 61 62 2c 20 72 65 67  rData, iTab, reg
a640: 53 6f 72 74 4f 75 74 29 3b 0a 20 20 20 20 70 35  SortOut);.    p5
a650: 20 3d 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43   = OPFLAG_CLEARC
a660: 41 43 48 45 3b 0a 20 20 20 20 62 53 65 71 20 3d  ACHE;.    bSeq =
a670: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
a680: 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69   addr = 1 + sqli
a690: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a6a0: 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20   OP_Sort, iTab, 
a6b0: 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65  addrBreak); Vdbe
a6c0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
a6d0: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
a6e0: 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43  ->iOffset, addrC
a6f0: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 69 53  ontinue);.    iS
a700: 6f 72 74 54 61 62 20 3d 20 69 54 61 62 3b 0a 20  ortTab = iTab;. 
a710: 20 20 20 70 35 20 3d 20 30 3b 0a 20 20 20 20 62     p5 = 0;.    b
a720: 53 65 71 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66  Seq = 1;.  }.  f
a730: 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 6f 72 74 44  or(i=0; i<nSortD
a740: 61 74 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ata; i++){.    s
a750: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
a760: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
a770: 53 6f 72 74 54 61 62 2c 20 6e 4b 65 79 2b 62 53  SortTab, nKey+bS
a780: 65 71 2b 69 2c 20 72 65 67 52 6f 77 2b 69 29 3b  eq+i, regRow+i);
a790: 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 20  .    if( i==0 ) 
a7a0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
a7b0: 65 50 35 28 76 2c 20 70 35 29 3b 0a 20 20 20 20  eP5(v, p5);.    
a7c0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
a7d0: 22 25 73 22 2c 20 61 4f 75 74 45 78 5b 69 5d 2e  "%s", aOutEx[i].
a7e0: 7a 4e 61 6d 65 20 3f 20 61 4f 75 74 45 78 5b 69  zName ? aOutEx[i
a7f0: 5d 2e 7a 4e 61 6d 65 20 3a 20 61 4f 75 74 45 78  ].zName : aOutEx
a800: 5b 69 5d 2e 7a 53 70 61 6e 29 29 3b 0a 20 20 7d  [i].zSpan));.  }
a810: 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74  .  switch( eDest
a820: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54   ){.    case SRT
a830: 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65  _Table:.    case
a840: 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b   SRT_EphemTab: {
a850: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
a860: 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c   eDest==SRT_Tabl
a870: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
a880: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
a890: 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20  EphemTab );.    
a8a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a8b0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
a8c0: 69 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f  id, iParm, regRo
a8d0: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
a8e0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
a8f0: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72   OP_Insert, iPar
a900: 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f  m, regRow, regRo
a910: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
a920: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
a930: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
a940: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a950: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
a960: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
a970: 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  RY.    case SRT_
a980: 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Set: {.      ass
a990: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  ert( nColumn==1 
a9a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
a9b0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
a9c0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
a9d0: 52 6f 77 2c 20 31 2c 20 72 65 67 52 6f 77 69 64  Row, 1, regRowid
a9e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a9f0: 20 20 20 20 20 20 20 20 20 20 26 70 44 65 73 74            &pDest
aa00: 2d 3e 61 66 66 53 64 73 74 2c 20 31 29 3b 0a 20  ->affSdst, 1);. 
aa10: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
aa20: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
aa30: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
aa40: 6f 77 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  ow, 1);.      sq
aa50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
aa60: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
aa70: 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64   iParm, regRowid
aa80: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
aa90: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
aaa0: 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
aab0: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
aac0: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
aad0: 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
aae0: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20  pParse, regRow, 
aaf0: 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20  iParm, 1);.     
ab00: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
ab10: 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e  ause will termin
ab20: 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72  ate the loop for
ab30: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
ab40: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
ab50: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
ab60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44        assert( eD
ab70: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
ab80: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  || eDest==SRT_Co
ab90: 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20 20 20  routine ); .    
aba0: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
abb0: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
abc0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
abd0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
abe0: 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 69  utine );.      i
abf0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  f( eDest==SRT_Ou
ac00: 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tput ){.        
ac10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ac20: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
ac30: 77 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c  w, pDest->iSdst,
ac40: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
ac50: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
ac60: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
ac70: 65 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2d  e(pParse, pDest-
ac80: 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29  >iSdst, nColumn)
ac90: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
aca0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
acb0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
acc0: 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44  ield, pDest->iSD
acd0: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Parm);.      }. 
ace0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
acf0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67 52  }.  }.  if( regR
ad00: 6f 77 69 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  owid ){.    sqli
ad10: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
ad20: 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  g(pParse, regRow
ad30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
ad40: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
ad50: 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  rse, regRowid);.
ad60: 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74    }.  /* The bot
ad70: 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a  tom of the loop.
ad80: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
ad90: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
ada0: 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b  , addrContinue);
adb0: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f  .  if( pSort->so
adc0: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
add0: 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a  AG_UseSorter ){.
ade0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
adf0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
ae00: 65 72 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  erNext, iTab, ad
ae10: 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  dr); VdbeCoverag
ae20: 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  e(v);.  }else{. 
ae30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ae40: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
ae50: 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64   iTab, addr); Vd
ae60: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
ae70: 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e   }.  if( pSort->
ae80: 72 65 67 52 65 74 75 72 6e 20 29 20 73 71 6c 69  regReturn ) sqli
ae90: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
aea0: 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 53 6f 72   OP_Return, pSor
aeb0: 74 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  t->regReturn);. 
aec0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
aed0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
aee0: 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Break);.}../*.**
aef0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
af00: 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f  r to a string co
af10: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65  ntaining the 'de
af20: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20  claration type' 
af30: 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  of the.** expres
af40: 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20  sion pExpr. The 
af50: 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72  string may be tr
af60: 65 61 74 65 64 20 61 73 20 73 74 61 74 69 63 20  eated as static 
af70: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  by the caller..*
af80: 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74 6f  *.** Also try to
af90: 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 73 69   estimate the si
afa0: 7a 65 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e  ze of the return
afb0: 65 64 20 76 61 6c 75 65 20 61 6e 64 20 72 65 74  ed value and ret
afc0: 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73 75  urn that.** resu
afd0: 6c 74 20 69 6e 20 2a 70 45 73 74 57 69 64 74 68  lt in *pEstWidth
afe0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c  ..**.** The decl
aff0: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20  aration type is 
b000: 74 68 65 20 65 78 61 63 74 20 64 61 74 61 74 79  the exact dataty
b010: 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78  pe definition ex
b020: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
b030: 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45  .** original CRE
b040: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
b050: 65 6e 74 20 69 66 20 74 68 65 20 65 78 70 72 65  ent if the expre
b060: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
b070: 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72  n. The.** declar
b080: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
b090: 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20   ROWID field is 
b0a0: 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79  INTEGER. Exactly
b0b0: 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73   when an express
b0c0: 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  ion.** is consid
b0d0: 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61  ered a column ca
b0e0: 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20  n be complex in 
b0f0: 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20  the presence of 
b100: 73 75 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a  subqueries. The.
b110: 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78  ** result-set ex
b120: 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20  pression in all 
b130: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
b140: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
b150: 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64  ts is .** consid
b160: 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79  ered a column by
b170: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
b180: 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63  **.**   SELECT c
b190: 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20  ol FROM tbl;.** 
b1a0: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
b1b0: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a   col FROM tbl;.*
b1c0: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
b1d0: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29  CT col FROM tbl)
b1e0: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62  ;.**   SELECT ab
b1f0: 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63  c FROM (SELECT c
b200: 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74  ol AS abc FROM t
b210: 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  bl);.** .** The 
b220: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
b230: 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73   for any express
b240: 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ion other than a
b250: 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e   column is NULL.
b260: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
b270: 69 6e 65 20 68 61 73 20 65 69 74 68 65 72 20 33  ine has either 3
b280: 20 6f 72 20 36 20 70 61 72 61 6d 65 74 65 72 73   or 6 parameters
b290: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
b2a0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20  ether or not.** 
b2b0: 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  the SQLITE_ENABL
b2c0: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
b2d0: 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  A compile-time o
b2e0: 70 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a  ption is used..*
b2f0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
b300: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
b310: 54 41 44 41 54 41 0a 23 20 64 65 66 69 6e 65 20  TADATA.# define 
b320: 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43  columnType(A,B,C
b330: 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54 79  ,D,E,F) columnTy
b340: 70 65 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c 45  peImpl(A,B,C,D,E
b350: 2c 46 29 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  ,F).static const
b360: 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70   char *columnTyp
b370: 65 49 6d 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e  eImpl(.  NameCon
b380: 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78  text *pNC, .  Ex
b390: 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e  pr *pExpr,.  con
b3a0: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67  st char **pzOrig
b3b0: 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db,.  const char
b3c0: 20 2a 2a 70 7a 4f 72 69 67 54 61 62 2c 0a 20 20   **pzOrigTab,.  
b3d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
b3e0: 72 69 67 43 6f 6c 2c 0a 20 20 75 38 20 2a 70 45  rigCol,.  u8 *pE
b3f0: 73 74 57 69 64 74 68 0a 29 7b 0a 20 20 63 68 61  stWidth.){.  cha
b400: 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 44 62  r const *zOrigDb
b410: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e   = 0;.  char con
b420: 73 74 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30  st *zOrigTab = 0
b430: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
b440: 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 23 65  zOrigCol = 0;.#e
b450: 6c 73 65 20 2f 2a 20 69 66 20 21 64 65 66 69 6e  lse /* if !defin
b460: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
b470: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
b480: 29 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 63 6f  ) */.# define co
b490: 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44  lumnType(A,B,C,D
b4a0: 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70 65  ,E,F) columnType
b4b0: 49 6d 70 6c 28 41 2c 42 2c 46 29 0a 73 74 61 74  Impl(A,B,F).stat
b4c0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  ic const char *c
b4d0: 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20  olumnTypeImpl(. 
b4e0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
b4f0: 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70  C, .  Expr *pExp
b500: 72 2c 0a 20 20 75 38 20 2a 70 45 73 74 57 69 64  r,.  u8 *pEstWid
b510: 74 68 0a 29 7b 0a 23 65 6e 64 69 66 20 2f 2a 20  th.){.#endif /* 
b520: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
b530: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
b540: 54 41 44 41 54 41 29 20 2a 2f 0a 20 20 63 68 61  TADATA) */.  cha
b550: 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d  r const *zType =
b560: 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 75   0;.  int j;.  u
b570: 38 20 65 73 74 57 69 64 74 68 20 3d 20 31 3b 0a  8 estWidth = 1;.
b580: 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 45 78  .  if( NEVER(pEx
b590: 70 72 3d 3d 30 29 20 7c 7c 20 70 4e 43 2d 3e 70  pr==0) || pNC->p
b5a0: 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  SrcList==0 ) ret
b5b0: 75 72 6e 20 30 3b 0a 20 20 73 77 69 74 63 68 28  urn 0;.  switch(
b5c0: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
b5d0: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
b5e0: 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
b5f0: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
b600: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
b610: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  ion is a column.
b620: 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c   Locate the tabl
b630: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  e the column is 
b640: 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65  being.      ** e
b650: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e  xtracted from in
b660: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72   NameContext.pSr
b670: 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c  cList. This tabl
b680: 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20  e may be real.  
b690: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
b6a0: 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75  table or a subqu
b6b0: 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ery..      */.  
b6c0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
b6d0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
b6e0: 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  /* Table structu
b6f0: 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74  re column is ext
b700: 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20  racted from */. 
b710: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20       Select *pS 
b720: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
b730: 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63   /* Select the c
b740: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
b750: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
b760: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70   int iCol = pExp
b770: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20  r->iColumn;  /* 
b780: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
b790: 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20  in pTab */.     
b7a0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
b7b0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
b7c0: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  UMN );.      tes
b7d0: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
b7e0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
b7f0: 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20       while( pNC 
b800: 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20  && !pTab ){.    
b810: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61      SrcList *pTa
b820: 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  bList = pNC->pSr
b830: 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66  cList;.        f
b840: 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73  or(j=0;j<pTabLis
b850: 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c  t->nSrc && pTabL
b860: 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f  ist->a[j].iCurso
b870: 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  r!=pExpr->iTable
b880: 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69  ;j++);.        i
b890: 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  f( j<pTabList->n
b8a0: 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Src ){.         
b8b0: 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
b8c0: 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[j].pTab;.   
b8d0: 20 20 20 20 20 20 20 70 53 20 3d 20 70 54 61 62         pS = pTab
b8e0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65  List->a[j].pSele
b8f0: 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ct;.        }els
b900: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43  e{.          pNC
b910: 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20   = pNC->pNext;. 
b920: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
b930: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ..      if( pTab
b940: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
b950: 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63  * At one time, c
b960: 6f 64 65 20 73 75 63 68 20 61 73 20 22 53 45 4c  ode such as "SEL
b970: 45 43 54 20 6e 65 77 2e 78 22 20 77 69 74 68 69  ECT new.x" withi
b980: 6e 20 61 20 74 72 69 67 67 65 72 20 77 6f 75 6c  n a trigger woul
b990: 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75  d.        ** cau
b9a0: 73 65 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f  se this conditio
b9b0: 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65  n to run.  Since
b9c0: 20 74 68 65 6e 2c 20 77 65 20 68 61 76 65 20 72   then, we have r
b9d0: 65 73 74 72 75 63 74 75 72 65 64 20 68 6f 77 0a  estructured how.
b9e0: 20 20 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67          ** trigg
b9f0: 65 72 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72  er code is gener
ba00: 61 74 65 64 20 61 6e 64 20 73 6f 20 74 68 69 73  ated and so this
ba10: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f   condition is no
ba20: 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20 20 20   longer .       
ba30: 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f   ** possible. Ho
ba40: 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20 73 74  wever, it can st
ba50: 69 6c 6c 20 62 65 20 74 72 75 65 20 66 6f 72 20  ill be true for 
ba60: 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a  statements like.
ba70: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66          ** the f
ba80: 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20  ollowing:.      
ba90: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
baa0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
bab0: 31 28 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a  1(col INTEGER);.
bac0: 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
bad0: 45 43 54 20 28 53 45 4c 45 43 54 20 74 31 2e 63  ECT (SELECT t1.c
bae0: 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31  ol) FROM FROM t1
baf0: 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ;.        **.   
bb00: 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c       ** when col
bb10: 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c  umnType() is cal
bb20: 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65  led on the expre
bb30: 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69  ssion "t1.col" i
bb40: 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  n the .        *
bb50: 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e  * sub-select. In
bb60: 20 74 68 69 73 20 63 61 73 65 2c 20 73 65 74 20   this case, set 
bb70: 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20  the column type 
bb80: 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20  to NULL, even.  
bb90: 20 20 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20        ** though 
bba0: 69 74 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79  it should really
bbb0: 20 62 65 20 22 49 4e 54 45 47 45 52 22 2e 0a 20   be "INTEGER".. 
bbc0: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
bbd0: 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74    ** This is not
bbe0: 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74   a problem, as t
bbf0: 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f  he column type o
bc00: 66 20 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65  f "t1.col" is ne
bc10: 76 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 75  ver.        ** u
bc20: 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e  sed. When column
bc30: 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64  Type() is called
bc40: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
bc50: 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22  on .        ** "
bc60: 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22  (SELECT t1.col)"
bc70: 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 74 79  , the correct ty
bc80: 70 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 28  pe is returned (
bc90: 73 65 65 20 74 68 65 20 54 4b 5f 53 45 4c 45 43  see the TK_SELEC
bca0: 54 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 72 61  T.        ** bra
bcb0: 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20  nch below.  */. 
bcc0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bcd0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
bce0: 65 72 74 28 20 70 54 61 62 20 26 26 20 70 45 78  ert( pTab && pEx
bcf0: 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20 29  pr->pTab==pTab )
bd00: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 20 29  ;.      if( pS )
bd10: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
bd20: 20 22 74 61 62 6c 65 22 20 69 73 20 61 63 74 75   "table" is actu
bd30: 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63  ally a sub-selec
bd40: 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74  t or a view in t
bd50: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
bd60: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
bd70: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
bd80: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  t. Return the de
bd90: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61  claration type a
bda0: 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20  nd origin.      
bdb0: 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68    ** data for th
bdc0: 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c  e result-set col
bdd0: 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73  umn of the sub-s
bde0: 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a  elect..        *
bdf0: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  /.        if( iC
be00: 6f 6c 3e 3d 30 20 26 26 20 41 4c 57 41 59 53 28  ol>=0 && ALWAYS(
be10: 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d  iCol<pS->pEList-
be20: 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  >nExpr) ){.     
be30: 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20       /* If iCol 
be40: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
be50: 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72  o, then the expr
be60: 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74 73 20  ession requests 
be70: 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
be80: 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 73 75   rowid of the su
be90: 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77  b-select or view
bea0: 2e 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f  . This expressio
beb0: 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65 65 20  n is legal (see 
bec0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65  .          ** te
bed0: 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e 32 2e  st case misc2.2.
bee0: 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73 20 65  2) - it always e
bef0: 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
bf00: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
bf10: 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e           NameCon
bf20: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20  text sNC;.      
bf30: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53      Expr *p = pS
bf40: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c  ->pEList->a[iCol
bf50: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
bf60: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
bf70: 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20  = pS->pSrc;.    
bf80: 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20        sNC.pNext 
bf90: 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 20 20 20  = pNC;.         
bfa0: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e   sNC.pParse = pN
bfb0: 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20  C->pParse;.     
bfc0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c       zType = col
bfd0: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
bfe0: 26 7a 4f 72 69 67 44 62 2c 26 7a 4f 72 69 67 54  &zOrigDb,&zOrigT
bff0: 61 62 2c 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65  ab,&zOrigCol, &e
c000: 73 74 57 69 64 74 68 29 3b 20 0a 20 20 20 20 20  stWidth); .     
c010: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
c020: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 63 68 65   if( pTab->pSche
c030: 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ma ){.        /*
c040: 20 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f   A real table */
c050: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c060: 20 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20   !pS );.        
c070: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
c080: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
c090: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c0a0: 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43   iCol==-1 || (iC
c0b0: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
c0c0: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 23 69 66  ab->nCol) );.#if
c0d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
c0e0: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
c0f0: 41 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  A.        if( iC
c100: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
c110: 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47    zType = "INTEG
c120: 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ER";.          z
c130: 4f 72 69 67 43 6f 6c 20 3d 20 22 72 6f 77 69 64  OrigCol = "rowid
c140: 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ";.        }else
c150: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
c160: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  e = pTab->aCol[i
c170: 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20  Col].zType;.    
c180: 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d        zOrigCol =
c190: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
c1a0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
c1b0: 20 20 20 65 73 74 57 69 64 74 68 20 3d 20 70 54     estWidth = pT
c1c0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73  ab->aCol[iCol].s
c1d0: 7a 45 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  zEst;.        }.
c1e0: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 54 61 62          zOrigTab
c1f0: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
c200: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d          if( pNC-
c210: 3e 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20 20  >pParse ){.     
c220: 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73       int iDb = s
c230: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
c240: 64 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d  dex(pNC->pParse-
c250: 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
c260: 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ma);.          z
c270: 4f 72 69 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50  OrigDb = pNC->pP
c280: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
c290: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b].zName;.      
c2a0: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20    }.#else.      
c2b0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
c2c0: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
c2d0: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
c2e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c2f0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54        zType = pT
c300: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
c310: 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Type;.          
c320: 65 73 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d  estWidth = pTab-
c330: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73  >aCol[iCol].szEs
c340: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  t;.        }.#en
c350: 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
c360: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
c370: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
c380: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
c390: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
c3a0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
c3b0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73  xpression is a s
c3c0: 75 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72  ub-select. Retur
c3d0: 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  n the declaratio
c3e0: 6e 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20  n type and.     
c3f0: 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20   ** origin info 
c400: 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63  for the single c
c410: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73  olumn in the res
c420: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
c430: 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73  ELECT.      ** s
c440: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
c450: 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e  */.      NameCon
c460: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20  text sNC;.      
c470: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78  Select *pS = pEx
c480: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20  pr->x.pSelect;. 
c490: 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70       Expr *p = p
c4a0: 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  S->pEList->a[0].
c4b0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
c4c0: 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
c4d0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
c4e0: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
c4f0: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
c500: 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20  = pS->pSrc;.    
c510: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e    sNC.pNext = pN
c520: 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61  C;.      sNC.pPa
c530: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
c540: 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  e;.      zType =
c550: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
c560: 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26  , p, &zOrigDb, &
c570: 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67  zOrigTab, &zOrig
c580: 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68 29 3b  Col, &estWidth);
c590: 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
c5a0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
c5b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
c5c0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
c5d0: 41 44 41 54 41 20 20 0a 20 20 69 66 28 20 70 7a  ADATA  .  if( pz
c5e0: 4f 72 69 67 44 62 20 29 7b 0a 20 20 20 20 61 73  OrigDb ){.    as
c5f0: 73 65 72 74 28 20 70 7a 4f 72 69 67 54 61 62 20  sert( pzOrigTab 
c600: 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a  && pzOrigCol );.
c610: 20 20 20 20 2a 70 7a 4f 72 69 67 44 62 20 3d 20      *pzOrigDb = 
c620: 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20 2a 70 7a  zOrigDb;.    *pz
c630: 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72 69 67 54  OrigTab = zOrigT
c640: 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 43  ab;.    *pzOrigC
c650: 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20  ol = zOrigCol;. 
c660: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
c670: 70 45 73 74 57 69 64 74 68 20 29 20 2a 70 45 73  pEstWidth ) *pEs
c680: 74 57 69 64 74 68 20 3d 20 65 73 74 57 69 64 74  tWidth = estWidt
c690: 68 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70  h;.  return zTyp
c6a0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  e;.}../*.** Gene
c6b0: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
c6c0: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
c6d0: 45 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  E the declaratio
c6e0: 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d  n types of colum
c6f0: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
c700: 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  ult set..*/.stat
c710: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
c720: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50  ColumnTypes(.  P
c730: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
c740: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
c750: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
c760: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
c770: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
c780: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
c790: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
c7a0: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
c7b0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
c7c0: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
c7d0: 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
c7e0: 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  PE.  Vdbe *v = p
c7f0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
c800: 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
c810: 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e  text sNC;.  sNC.
c820: 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
c830: 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73  ist;.  sNC.pPars
c840: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66 6f  e = pParse;.  fo
c850: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
c860: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
c870: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69    Expr *p = pELi
c880: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
c890: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
c8a0: 7a 54 79 70 65 3b 0a 23 69 66 64 65 66 20 53 51  zType;.#ifdef SQ
c8b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
c8c0: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20  MN_METADATA.    
c8d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
c8e0: 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  gDb = 0;.    con
c8f0: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54 61  st char *zOrigTa
c900: 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  b = 0;.    const
c910: 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20   char *zOrigCol 
c920: 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d  = 0;.    zType =
c930: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
c940: 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26  , p, &zOrigDb, &
c950: 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67  zOrigTab, &zOrig
c960: 43 6f 6c 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  Col, 0);..    /*
c970: 20 54 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d   The vdbe must m
c980: 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79  ake its own copy
c990: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74   of the column-t
c9a0: 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20  ype and other . 
c9b0: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65     ** column spe
c9c0: 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69  cific strings, i
c9d0: 6e 20 63 61 73 65 20 74 68 65 20 73 63 68 65 6d  n case the schem
c9e0: 61 20 69 73 20 72 65 73 65 74 20 62 65 66 6f 72  a is reset befor
c9f0: 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69  e this.    ** vi
ca00: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73  rtual machine is
ca10: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
ca20: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
ca30: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
ca40: 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53   COLNAME_DATABAS
ca50: 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49  E, zOrigDb, SQLI
ca60: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
ca70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
ca80: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
ca90: 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f  OLNAME_TABLE, zO
caa0: 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45 5f 54  rigTab, SQLITE_T
cab0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
cac0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
cad0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
cae0: 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67  ME_COLUMN, zOrig
caf0: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Col, SQLITE_TRAN
cb00: 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20  SIENT);.#else.  
cb10: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
cb20: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c  Type(&sNC, p, 0,
cb30: 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69   0, 0, 0);.#endi
cb40: 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  f.    sqlite3Vdb
cb50: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
cb60: 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59  , COLNAME_DECLTY
cb70: 50 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49 54  PE, zType, SQLIT
cb80: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
cb90: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
cba0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
cbb0: 5f 44 45 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a  _DECLTYPE) */.}.
cbc0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
cbd0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74  code that will t
cbe0: 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65  ell the VDBE the
cbf0: 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e   names of column
cc00: 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75  s.** in the resu
cc10: 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20 69 6e  lt set.  This in
cc20: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
cc30: 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65  d to provide the
cc40: 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75  .** azCol[] valu
cc50: 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61  es in the callba
cc60: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
cc70: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
cc80: 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20  nNames(.  Parse 
cc90: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
cca0: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
ccb0: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
ccc0: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
ccd0: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
cce0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
ccf0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
cd00: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
cd10: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
cd20: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
cd30: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
cd40: 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65  t i, j;.  sqlite
cd50: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
cd60: 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61  db;.  int fullNa
cd70: 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b  mes, shortNames;
cd80: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
cd90: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
cda0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
cdb0: 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74   EXPLAIN, skip t
cdc0: 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69 66  his step */.  if
cdd0: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
cde0: 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  n ){.    return;
cdf0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
ce00: 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61  f( pParse->colNa
ce10: 6d 65 73 53 65 74 20 7c 7c 20 4e 45 56 45 52 28  mesSet || NEVER(
ce20: 76 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c  v==0) || db->mal
ce30: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
ce40: 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f  rn;.  pParse->co
ce50: 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20  lNamesSet = 1;. 
ce60: 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62   fullNames = (db
ce70: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
ce80: 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
ce90: 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20  0;.  shortNames 
cea0: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
ceb0: 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
cec0: 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74  mes)!=0;.  sqlit
ced0: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
cee0: 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  (v, pEList->nExp
cef0: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
cf00: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
cf10: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
cf20: 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73  p;.    p = pELis
cf30: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
cf40: 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d     if( NEVER(p==
cf50: 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  0) ) continue;. 
cf60: 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61     if( pEList->a
cf70: 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  [i].zName ){.   
cf80: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
cf90: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
cfa0: 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ame;.      sqlit
cfb0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
cfc0: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
cfd0: 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49  AME, zName, SQLI
cfe0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
cff0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d     }else if( (p-
d000: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op==TK_COLUMN |
d010: 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  | p->op==TK_AGG_
d020: 43 4f 4c 55 4d 4e 29 20 26 26 20 70 54 61 62 4c  COLUMN) && pTabL
d030: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62  ist ){.      Tab
d040: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
d050: 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20  char *zCol;.    
d060: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
d070: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66  iColumn;.      f
d080: 6f 72 28 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a  or(j=0; ALWAYS(j
d090: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 29  <pTabList->nSrc)
d0a0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
d0b0: 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  if( pTabList->a[
d0c0: 6a 5d 2e 69 43 75 72 73 6f 72 3d 3d 70 2d 3e 69  j].iCursor==p->i
d0d0: 54 61 62 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20  Table ) break;. 
d0e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
d0f0: 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d  ert( j<pTabList-
d100: 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70  >nSrc );.      p
d110: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
d120: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
d130: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
d140: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
d150: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d160: 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f  iCol==-1 || (iCo
d170: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
d180: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20  b->nCol) );.    
d190: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
d1a0: 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22          zCol = "
d1b0: 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65  rowid";.      }e
d1c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  lse{.        zCo
d1d0: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
d1e0: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
d1f0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73    }.      if( !s
d200: 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75  hortNames && !fu
d210: 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20  llNames ){.     
d220: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
d230: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
d240: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20  OLNAME_NAME, .  
d250: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d260: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 45  3DbStrDup(db, pE
d270: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
d280: 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  ), SQLITE_DYNAMI
d290: 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  C);.      }else 
d2a0: 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 29 7b  if( fullNames ){
d2b0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
d2c0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
d2d0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
d2e0: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
d2f0: 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  .%s", pTab->zNam
d300: 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, zCol);.      
d310: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
d320: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
d330: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d  LNAME_NAME, zNam
d340: 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  e, SQLITE_DYNAMI
d350: 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  C);.      }else{
d360: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d370: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
d380: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
d390: 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f  E, zCol, SQLITE_
d3a0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
d3b0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
d3c0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
d3d0: 2a 7a 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  *z = pEList->a[i
d3e0: 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7a  ].zSpan;.      z
d3f0: 20 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c 69 74 65   = z==0 ? sqlite
d400: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 63 6f  3MPrintf(db, "co
d410: 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 20 3a 20  lumn%d", i+1) : 
d420: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
d430: 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71  db, z);.      sq
d440: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
d450: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
d460: 45 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c 49 54  E_NAME, z, SQLIT
d470: 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  E_DYNAMIC);.    
d480: 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65  }.  }.  generate
d490: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72  ColumnTypes(pPar
d4a0: 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
d4b0: 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
d4c0: 47 69 76 65 6e 20 61 20 61 6e 20 65 78 70 72 65  Given a an expre
d4d0: 73 73 69 6f 6e 20 6c 69 73 74 20 28 77 68 69 63  ssion list (whic
d4e0: 68 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20  h is really the 
d4f0: 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  list of expressi
d500: 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d  ons.** that form
d510: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
d520: 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
d530: 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65 20 61  ement) compute a
d540: 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f  ppropriate.** co
d550: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61  lumn names for a
d560: 20 74 61 62 6c 65 20 74 68 61 74 20 77 6f 75 6c   table that woul
d570: 64 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65  d hold the expre
d580: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
d590: 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d  * All column nam
d5a0: 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 69 71 75  es will be uniqu
d5b0: 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68  e..**.** Only th
d5c0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
d5d0: 72 65 20 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f  re computed.  Co
d5e0: 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75  lumn.zType, Colu
d5f0: 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64  mn.zColl,.** and
d600: 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66   other fields of
d610: 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f   Column are zero
d620: 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
d630: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
d640: 63 63 65 73 73 2e 20 20 49 66 20 61 20 6d 65 6d  ccess.  If a mem
d650: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
d660: 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  rror occurs,.** 
d670: 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70  store NULL in *p
d680: 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70  aCol and 0 in *p
d690: 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e 20  nCol and return 
d6a0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f  SQLITE_NOMEM..*/
d6b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65  .static int sele
d6c0: 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  ctColumnsFromExp
d6d0: 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
d6e0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
d6f0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
d700: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
d710: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20  t *pEList,      
d720: 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66 72   /* Expr list fr
d730: 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72 69  om which to deri
d740: 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ve column names 
d750: 2a 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c 2c  */.  i16 *pnCol,
d760: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d770: 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
d780: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65   of columns here
d790: 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70   */.  Column **p
d7a0: 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a  aCol          /*
d7b0: 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20 63   Write the new c
d7c0: 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65 20  olumn list here 
d7d0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
d7e0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
d7f0: 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ;   /* Database 
d800: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
d810: 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
d820: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
d830: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
d840: 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d860: 20 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f 20   Index added to 
d870: 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75 6e  make the name un
d880: 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e  ique */.  Column
d890: 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20   *aCol, *pCol;  
d8a0: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
d8b0: 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c 74  ping over result
d8c0: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
d8d0: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
d8e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
d8f0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
d900: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
d910: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 3b 20 20   */.  Expr *p;  
d920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d930: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
d940: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 72 65 73  for a single res
d950: 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ult column */.  
d960: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
d970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
d980: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
d990: 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
d9a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
d9b0: 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a  ize of name in z
d9c0: 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a 20 20 69 66 28  Name[] */..  if(
d9d0: 20 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e   pEList ){.    n
d9e0: 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  Col = pEList->nE
d9f0: 78 70 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20  xpr;.    aCol = 
da00: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
da10: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61  ero(db, sizeof(a
da20: 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20  Col[0])*nCol);. 
da30: 20 20 20 74 65 73 74 63 61 73 65 28 20 61 43 6f     testcase( aCo
da40: 6c 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  l==0 );.  }else{
da50: 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20  .    nCol = 0;. 
da60: 20 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d     aCol = 0;.  }
da70: 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c  .  *pnCol = nCol
da80: 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43 6f  ;.  *paCol = aCo
da90: 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  l;..  for(i=0, p
daa0: 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c  Col=aCol; i<nCol
dab0: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
dac0: 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70      /* Get an ap
dad0: 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66  propriate name f
dae0: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20  or the column.  
daf0: 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c    */.    p = sql
db00: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
db10: 61 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  ate(pEList->a[i]
db20: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
db30: 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74   (zName = pEList
db40: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30  ->a[i].zName)!=0
db50: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
db60: 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61  the column conta
db70: 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65  ins an "AS <name
db80: 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c  >" phrase, use <
db90: 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d  name> as the nam
dba0: 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65  e */.      zName
dbb0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
dbc0: 75 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  up(db, zName);. 
dbd0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
dbe0: 45 78 70 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d  Expr *pColExpr =
dbf0: 20 70 3b 20 20 2f 2a 20 54 68 65 20 65 78 70 72   p;  /* The expr
dc00: 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 74  ession that is t
dc10: 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  he result column
dc20: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 54   name */.      T
dc30: 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
dc40: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 61 73 73      /* Table ass
dc50: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
dc60: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  s expression */.
dc70: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 43 6f        while( pCo
dc80: 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  lExpr->op==TK_DO
dc90: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  T ){.        pCo
dca0: 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45 78 70 72  lExpr = pColExpr
dcb0: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
dcc0: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45 78    assert( pColEx
dcd0: 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  pr!=0 );.      }
dce0: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 45  .      if( pColE
dcf0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
dd00: 4d 4e 20 26 26 20 41 4c 57 41 59 53 28 70 43 6f  MN && ALWAYS(pCo
dd10: 6c 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 29 20  lExpr->pTab!=0) 
dd20: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ){.        /* Fo
dd30: 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68  r columns use th
dd40: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61  e column name na
dd50: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  me */.        in
dd60: 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70  t iCol = pColExp
dd70: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
dd80: 20 20 20 20 70 54 61 62 20 3d 20 70 43 6f 6c 45      pTab = pColE
dd90: 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
dda0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
ddb0: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
ddc0: 65 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  ey;.        zNam
ddd0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
dde0: 74 66 28 64 62 2c 20 22 25 73 22 2c 0a 20 20 20  tf(db, "%s",.   
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43                iC
de00: 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43  ol>=0 ? pTab->aC
de10: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a  ol[iCol].zName :
de20: 20 22 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 20   "rowid");.     
de30: 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c 45   }else if( pColE
de40: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  xpr->op==TK_ID )
de50: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
de60: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
de70: 74 79 28 70 43 6f 6c 45 78 70 72 2c 20 45 50 5f  ty(pColExpr, EP_
de80: 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
de90: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
dea0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
deb0: 22 25 73 22 2c 20 70 43 6f 6c 45 78 70 72 2d 3e  "%s", pColExpr->
dec0: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
ded0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
dee0: 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67 69  /* Use the origi
def0: 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20  nal text of the 
df00: 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f  column expressio
df10: 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f  n as its name */
df20: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
df30: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
df40: 64 62 2c 20 22 25 73 22 2c 20 70 45 4c 69 73 74  db, "%s", pEList
df50: 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20  ->a[i].zSpan);. 
df60: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
df70: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
df80: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 73  ailed ){.      s
df90: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
dfa0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62   zName);.      b
dfb0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
dfc0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
dfd0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73  e column name is
dfe0: 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65   unique.  If the
dff0: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69   name is not uni
e000: 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65  que,.    ** appe
e010: 6e 64 20 61 20 69 6e 74 65 67 65 72 20 74 6f 20  nd a integer to 
e020: 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74  the name so that
e030: 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71   it becomes uniq
e040: 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  ue..    */.    n
e050: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
e060: 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
e070: 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20     for(j=cnt=0; 
e080: 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<i; j++){.     
e090: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
e0a0: 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  Cmp(aCol[j].zNam
e0b0: 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  e, zName)==0 ){.
e0c0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
e0d0: 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  ewName;.        
e0e0: 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 66  int k;.        f
e0f0: 6f 72 28 6b 3d 6e 4e 61 6d 65 2d 31 3b 20 6b 3e  or(k=nName-1; k>
e100: 31 20 26 26 20 73 71 6c 69 74 65 33 49 73 64 69  1 && sqlite3Isdi
e110: 67 69 74 28 7a 4e 61 6d 65 5b 6b 5d 29 3b 20 6b  git(zName[k]); k
e120: 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66  --){}.        if
e130: 28 20 6b 3e 3d 30 20 26 26 20 7a 4e 61 6d 65 5b  ( k>=0 && zName[
e140: 6b 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d 65 20  k]==':' ) nName 
e150: 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  = k;.        zNa
e160: 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20  me[nName] = 0;. 
e170: 20 20 20 20 20 20 20 7a 4e 65 77 4e 61 6d 65 20         zNewName 
e180: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
e190: 28 64 62 2c 20 22 25 73 3a 25 64 22 2c 20 7a 4e  (db, "%s:%d", zN
e1a0: 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20  ame, ++cnt);.   
e1b0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
e1c0: 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ee(db, zName);. 
e1d0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a         zName = z
e1e0: 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  NewName;.       
e1f0: 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20   j = -1;.       
e200: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
e210: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
e220: 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a     }.    pCol->z
e230: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
e240: 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  }.  if( db->mall
e250: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
e260: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b  for(j=0; j<i; j+
e270: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
e280: 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c  3DbFree(db, aCol
e290: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [j].zName);.    
e2a0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
e2b0: 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20  ree(db, aCol);. 
e2c0: 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20     *paCol = 0;. 
e2d0: 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20     *pnCol = 0;. 
e2e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e2f0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65  _NOMEM;.  }.  re
e300: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
e310: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70  }../*.** Add typ
e320: 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  e and collation 
e330: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61  information to a
e340: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73   column list bas
e350: 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43  ed on.** a SELEC
e360: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
e370: 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c  .** The column l
e380: 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63  ist presumably c
e390: 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43  ame from selectC
e3a0: 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78  olumnNamesFromEx
e3b0: 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65  prList()..** The
e3c0: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73   column list has
e3d0: 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74   only names, not
e3e0: 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74   types or collat
e3f0: 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72  ions.  This.** r
e400: 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f  outine goes thro
e410: 75 67 68 20 61 6e 64 20 61 64 64 73 20 74 68 65  ugh and adds the
e420: 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61   types and colla
e430: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tions..**.** Thi
e440: 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72  s routine requir
e450: 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64 65 6e  es that all iden
e460: 74 69 66 69 65 72 73 20 69 6e 20 74 68 65 20 53  tifiers in the S
e470: 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65  ELECT.** stateme
e480: 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  nt be resolved..
e490: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
e4a0: 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
e4b0: 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a  peAndCollation(.
e4c0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
e4d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
e4e0: 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20  ng contexts */. 
e4f0: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
e500: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 63 6f         /* Add co
e510: 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d  lumn type inform
e520: 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 74 61  ation to this ta
e530: 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ble */.  Select 
e540: 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f  *pSelect       /
e550: 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f  * SELECT used to
e560: 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73   determine types
e570: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20   and collations 
e580: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
e590: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
e5a0: 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
e5b0: 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  sNC;.  Column *p
e5c0: 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  Col;.  CollSeq *
e5d0: 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  pColl;.  int i;.
e5e0: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72    Expr *p;.  str
e5f0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
e600: 6d 20 2a 61 3b 0a 20 20 75 36 34 20 73 7a 41 6c  m *a;.  u64 szAl
e610: 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  l = 0;..  assert
e620: 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a  ( pSelect!=0 );.
e630: 20 20 61 73 73 65 72 74 28 20 28 70 53 65 6c 65    assert( (pSele
e640: 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ct->selFlags & S
e650: 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20 29  F_Resolved)!=0 )
e660: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
e670: 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d  ->nCol==pSelect-
e680: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c  >pEList->nExpr |
e690: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
e6a0: 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ed );.  if( db->
e6b0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
e6c0: 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28  eturn;.  memset(
e6d0: 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
e6e0: 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72  sNC));.  sNC.pSr
e6f0: 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  cList = pSelect-
e700: 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65  >pSrc;.  a = pSe
e710: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b  lect->pEList->a;
e720: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c  .  for(i=0, pCol
e730: 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70  =pTab->aCol; i<p
e740: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  Tab->nCol; i++, 
e750: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  pCol++){.    p =
e760: 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20   a[i].pExpr;.   
e770: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73   pCol->zType = s
e780: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
e790: 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73  b, columnType(&s
e7a0: 4e 43 2c 20 70 2c 30 2c 30 2c 30 2c 20 26 70 43  NC, p,0,0,0, &pC
e7b0: 6f 6c 2d 3e 73 7a 45 73 74 29 29 3b 0a 20 20 20  ol->szEst));.   
e7c0: 20 73 7a 41 6c 6c 20 2b 3d 20 70 43 6f 6c 2d 3e   szAll += pCol->
e7d0: 73 7a 45 73 74 3b 0a 20 20 20 20 70 43 6f 6c 2d  szEst;.    pCol-
e7e0: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
e7f0: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
e800: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  p);.    if( pCol
e810: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20 29 20  ->affinity==0 ) 
e820: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
e830: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
e840: 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  ;.    pColl = sq
e850: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
e860: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
e870: 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20   if( pColl ){.  
e880: 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20      pCol->zColl 
e890: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
e8a0: 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  p(db, pColl->zNa
e8b0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
e8c0: 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20   pTab->szTabRow 
e8d0: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
e8e0: 73 7a 41 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a  szAll*4);.}../*.
e8f0: 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43  ** Given a SELEC
e900: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e  T statement, gen
e910: 65 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74  erate a Table st
e920: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
e930: 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65  cribes.** the re
e940: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74  sult set of that
e950: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c   SELECT..*/.Tabl
e960: 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74  e *sqlite3Result
e970: 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73  SetOfSelect(Pars
e980: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
e990: 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54  t *pSelect){.  T
e9a0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71  able *pTab;.  sq
e9b0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
e9c0: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61  se->db;.  int sa
e9d0: 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76  vedFlags;..  sav
e9e0: 65 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c  edFlags = db->fl
e9f0: 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  ags;.  db->flags
ea00: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c   &= ~SQLITE_Full
ea10: 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e  ColNames;.  db->
ea20: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
ea30: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20  ShortColNames;. 
ea40: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72   sqlite3SelectPr
ea50: 65 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ep(pParse, pSele
ea60: 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50  ct, 0);.  if( pP
ea70: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
ea80: 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  urn 0;.  while( 
ea90: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20  pSelect->pPrior 
eaa0: 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  ) pSelect = pSel
eab0: 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64  ect->pPrior;.  d
eac0: 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64  b->flags = saved
ead0: 46 6c 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20  Flags;.  pTab = 
eae0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
eaf0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
eb00: 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70  able) );.  if( p
eb10: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Tab==0 ){.    re
eb20: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a  turn 0;.  }.  /*
eb30: 20 54 68 65 20 73 71 6c 69 74 65 33 52 65 73 75   The sqlite3Resu
eb40: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20  ltSetOfSelect() 
eb50: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63  is only used n c
eb60: 6f 6e 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f  ontexts where lo
eb70: 6f 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20  okaside.  ** is 
eb80: 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73  disabled */.  as
eb90: 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73  sert( db->lookas
eba0: 69 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20  ide.bEnabled==0 
ebb0: 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20  );.  pTab->nRef 
ebc0: 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61  = 1;.  pTab->zNa
ebd0: 6d 65 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e  me = 0;.  pTab->
ebe0: 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30  nRowLogEst = 200
ebf0: 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73  ; assert( 200==s
ec00: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34  qlite3LogEst(104
ec10: 38 35 37 36 29 20 29 3b 0a 20 20 73 65 6c 65 63  8576) );.  selec
ec20: 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  tColumnsFromExpr
ec30: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
ec40: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70  lect->pEList, &p
ec50: 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  Tab->nCol, &pTab
ec60: 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 65 6c 65 63  ->aCol);.  selec
ec70: 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e  tAddColumnTypeAn
ec80: 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73  dCollation(pPars
ec90: 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 65 63 74  e, pTab, pSelect
eca0: 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  );.  pTab->iPKey
ecb0: 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d   = -1;.  if( db-
ecc0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
ecd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
ece0: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  teTable(db, pTab
ecf0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
ed00: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54  .  }.  return pT
ed10: 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  ab;.}../*.** Get
ed20: 20 61 20 56 44 42 45 20 66 6f 72 20 74 68 65 20   a VDBE for the 
ed30: 67 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e  given parser con
ed40: 74 65 78 74 2e 20 20 43 72 65 61 74 65 20 61 20  text.  Create a 
ed50: 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
ed60: 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65  sary..** If an e
ed70: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
ed80: 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61  urn NULL and lea
ed90: 76 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20  ve a message in 
eda0: 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20  pParse..*/.Vdbe 
edb0: 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28  *sqlite3GetVdbe(
edc0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
edd0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
ede0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28  se->pVdbe;.  if(
edf0: 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d   v==0 ){.    v =
ee00: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d   pParse->pVdbe =
ee10: 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61   sqlite3VdbeCrea
ee20: 74 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  te(pParse);.    
ee30: 69 66 28 20 76 20 29 20 73 71 6c 69 74 65 33 56  if( v ) sqlite3V
ee40: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
ee50: 49 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20 70  Init);.    if( p
ee60: 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c  Parse->pToplevel
ee70: 3d 3d 30 0a 20 20 20 20 20 26 26 20 4f 70 74 69  ==0.     && Opti
ee80: 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
ee90: 70 50 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54  pParse->db,SQLIT
eea0: 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74  E_FactorOutConst
eeb0: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70  ).    ){.      p
eec0: 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61  Parse->okConstFa
eed0: 63 74 6f 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ctor = 1;.    }.
eee0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b  .  }.  return v;
eef0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  .}.../*.** Compu
ef00: 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e  te the iLimit an
ef10: 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73  d iOffset fields
ef20: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62   of the SELECT b
ef30: 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70  ased on the.** p
ef40: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
ef50: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  t expressions.  
ef60: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
ef70: 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72  et hold the expr
ef80: 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
ef90: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72  appear in the or
efa0: 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
efb0: 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c  ment after the L
efc0: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
efd0: 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72  ** keywords.  Or
efe0: 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b   NULL if those k
eff0: 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74  eywords are omit
f000: 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20  ted. iLimit and 
f010: 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20  iOffset .** are 
f020: 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f  the integer memo
f030: 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  ry register numb
f040: 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73  ers for counters
f050: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
f060: 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61   .** the limit a
f070: 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74  nd offset.  If t
f080: 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74  here is no limit
f090: 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20   and/or offset, 
f0a0: 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20  then .** iLimit 
f0b0: 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20  and iOffset are 
f0c0: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  negative..**.** 
f0d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61  This routine cha
f0e0: 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20  nges the values 
f0f0: 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  of iLimit and iO
f100: 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a  ffset only if.**
f110: 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73   a limit or offs
f120: 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
f130: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
f140: 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64  set.  iLimit and
f150: 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75  .** iOffset shou
f160: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65  ld have been pre
f170: 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61  set to appropria
f180: 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  te default value
f190: 73 20 28 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f  s (zero).** prio
f1a0: 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
f1b0: 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
f1c0: 20 54 68 65 20 69 4f 66 66 73 65 74 20 72 65 67   The iOffset reg
f1d0: 69 73 74 65 72 20 28 69 66 20 69 74 20 65 78 69  ister (if it exi
f1e0: 73 74 73 29 20 69 73 20 69 6e 69 74 69 61 6c 69  sts) is initiali
f1f0: 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65  zed to the value
f200: 0a 2a 2a 20 6f 66 20 74 68 65 20 4f 46 46 53 45  .** of the OFFSE
f210: 54 2e 20 20 54 68 65 20 69 4c 69 6d 69 74 20 72  T.  The iLimit r
f220: 65 67 69 73 74 65 72 20 69 73 20 69 6e 69 74 69  egister is initi
f230: 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e  alized to LIMIT.
f240: 20 20 52 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f    Register.** iO
f250: 66 66 73 65 74 2b 31 20 69 73 20 69 6e 69 74 69  ffset+1 is initi
f260: 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b  alized to LIMIT+
f270: 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  OFFSET..**.** On
f280: 6c 79 20 69 66 20 70 4c 69 6d 69 74 21 3d 30 20  ly if pLimit!=0 
f290: 6f 72 20 70 4f 66 66 73 65 74 21 3d 30 20 64 6f  or pOffset!=0 do
f2a0: 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73   the limit regis
f2b0: 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65  ters get.** rede
f2c0: 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f  fined.  The UNIO
f2d0: 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75  N ALL operator u
f2e0: 73 65 73 20 74 68 69 73 20 70 72 6f 70 65 72 74  ses this propert
f2f0: 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68  y to force.** th
f300: 65 20 72 65 75 73 65 20 6f 66 20 74 68 65 20 73  e reuse of the s
f310: 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66  ame limit and of
f320: 66 73 65 74 20 72 65 67 69 73 74 65 72 73 20 61  fset registers a
f330: 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a  cross multiple.*
f340: 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
f350: 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nts..*/.static v
f360: 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  oid computeLimit
f370: 52 65 67 69 73 74 65 72 73 28 50 61 72 73 65 20  Registers(Parse 
f380: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
f390: 2a 70 2c 20 69 6e 74 20 69 42 72 65 61 6b 29 7b  *p, int iBreak){
f3a0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a  .  Vdbe *v = 0;.
f3b0: 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30    int iLimit = 0
f3c0: 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b  ;.  int iOffset;
f3d0: 0a 20 20 69 6e 74 20 61 64 64 72 31 2c 20 6e 3b  .  int addr1, n;
f3e0: 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
f3f0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
f400: 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31   .  ** "LIMIT -1
f410: 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61  " always shows a
f420: 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20  ll rows.  There 
f430: 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e  is some.  ** con
f440: 74 72 6f 76 65 72 73 79 20 61 62 6f 75 74 20 77  troversy about w
f450: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
f460: 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20  behavior should 
f470: 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72  be..  ** The cur
f480: 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
f490: 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22  ion interprets "
f4a0: 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e  LIMIT 0" to mean
f4b0: 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20  .  ** no rows.. 
f4c0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
f4d0: 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
f4e0: 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  se);.  assert( p
f4f0: 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20  ->pOffset==0 || 
f500: 70 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a  p->pLimit!=0 );.
f510: 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20    if( p->pLimit 
f520: 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74  ){.    p->iLimit
f530: 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50   = iLimit = ++pP
f540: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
f550: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
f560: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
f570: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
f580: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
f590: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e  xprIsInteger(p->
f5a0: 70 4c 69 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20  pLimit, &n) ){. 
f5b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f5c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
f5d0: 65 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29  eger, n, iLimit)
f5e0: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
f5f0: 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63  ent((v, "LIMIT c
f600: 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20  ounter"));.     
f610: 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
f620: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f630: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
f640: 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20  o, 0, iBreak);. 
f650: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
f660: 3e 3d 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63  >=0 && p->nSelec
f670: 74 52 6f 77 3e 28 75 36 34 29 6e 20 29 7b 0a 20  tRow>(u64)n ){. 
f680: 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63         p->nSelec
f690: 74 52 6f 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20  tRow = n;.      
f6a0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
f6b0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
f6c0: 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c  de(pParse, p->pL
f6d0: 69 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  imit, iLimit);. 
f6e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f6f0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73  AddOp1(v, OP_Mus
f700: 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b  tBeInt, iLimit);
f710: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
f720: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
f730: 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63  ent((v, "LIMIT c
f740: 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20  ounter"));.     
f750: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f760: 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p2(v, OP_IfZero,
f770: 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29   iLimit, iBreak)
f780: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
f790: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
f7a0: 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20   p->pOffset ){. 
f7b0: 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20       p->iOffset 
f7c0: 3d 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50  = iOffset = ++pP
f7d0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
f7e0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b    pParse->nMem++
f7f0: 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ;   /* Allocate 
f800: 61 6e 20 65 78 74 72 61 20 72 65 67 69 73 74 65  an extra registe
f810: 72 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73  r for limit+offs
f820: 65 74 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  et */.      sqli
f830: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
f840: 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20  se, p->pOffset, 
f850: 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  iOffset);.      
f860: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f870: 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  1(v, OP_MustBeIn
f880: 74 2c 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62  t, iOffset); Vdb
f890: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
f8a0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
f8b0: 28 76 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e  (v, "OFFSET coun
f8c0: 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 61 64  ter"));.      ad
f8d0: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
f8e0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
f8f0: 50 6f 73 2c 20 69 4f 66 66 73 65 74 29 3b 20 56  Pos, iOffset); V
f900: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
f910: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f920: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
f930: 74 65 67 65 72 2c 20 30 2c 20 69 4f 66 66 73 65  teger, 0, iOffse
f940: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
f950: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
f960: 20 61 64 64 72 31 29 3b 0a 20 20 20 20 20 20 73   addr1);.      s
f970: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
f980: 28 76 2c 20 4f 50 5f 41 64 64 2c 20 69 4c 69 6d  (v, OP_Add, iLim
f990: 69 74 2c 20 69 4f 66 66 73 65 74 2c 20 69 4f 66  it, iOffset, iOf
f9a0: 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 56  fset+1);.      V
f9b0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
f9c0: 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b  LIMIT+OFFSET"));
f9d0: 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73  .      addr1 = s
f9e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
f9f0: 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4c  (v, OP_IfPos, iL
fa00: 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72  imit); VdbeCover
fa10: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
fa20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
fa30: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d  v, OP_Integer, -
fa40: 31 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20  1, iOffset+1);. 
fa50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fa60: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
fa70: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  1);.    }.  }.}.
fa80: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
fa90: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
faa0: 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  LECT./*.** Retur
fab0: 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
fac0: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
fad0: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f  ence for the iCo
fae0: 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a  l-th column of.*
faf0: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  * the result set
fb00: 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e   for the compoun
fb10: 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  d-select stateme
fb20: 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20  nt "p".  Return 
fb30: 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63  NULL if.** the c
fb40: 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66  olumn has no def
fb50: 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ault collating s
fb60: 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54  equence..**.** T
fb70: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
fb80: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f  uence for the co
fb90: 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73  mpound select is
fba0: 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a   taken from the.
fbb0: 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  ** left-most ter
fbc0: 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  m of the select 
fbd0: 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61  that has a colla
fbe0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
fbf0: 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71  /.static CollSeq
fc00: 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c   *multiSelectCol
fc10: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
fc20: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
fc30: 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c  nt iCol){.  Coll
fc40: 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28  Seq *pRet;.  if(
fc50: 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
fc60: 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65    pRet = multiSe
fc70: 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
fc80: 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69  se, p->pPrior, i
fc90: 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Col);.  }else{. 
fca0: 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d     pRet = 0;.  }
fcb0: 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e  .  assert( iCol>
fcc0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52 65 74  =0 );.  if( pRet
fcd0: 3d 3d 30 20 26 26 20 69 43 6f 6c 3c 70 2d 3e 70  ==0 && iCol<p->p
fce0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
fcf0: 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74      pRet = sqlit
fd00: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
fd10: 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  arse, p->pEList-
fd20: 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b  >a[iCol].pExpr);
fd30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
fd40: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  et;.}../*.** The
fd50: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
fd60: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
fd70: 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
fd80: 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   is a compound S
fd90: 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 61 6e  ELECT.** with an
fda0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
fdb0: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
fdc0: 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20 72 65  allocates and re
fdd0: 74 75 72 6e 73 20 61 20 4b 65 79 49 6e 66 6f 0a  turns a KeyInfo.
fde0: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 73 75 69  ** structure sui
fdf0: 74 61 62 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d  table for implem
fe00: 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52  enting the ORDER
fe10: 20 42 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65   BY..**.** Space
fe20: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79   to hold the Key
fe30: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
fe40: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
fe50: 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 63 61 6c 6c  malloc. The call
fe60: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ing.** function 
fe70: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
fe80: 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74  or ensuring that
fe90: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
fea0: 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a  is eventually.**
feb0: 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69   freed..*/.stati
fec0: 63 20 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c 74 69  c KeyInfo *multi
fed0: 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79  SelectOrderByKey
fee0: 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  Info(Parse *pPar
fef0: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
ff00: 6e 74 20 6e 45 78 74 72 61 29 7b 0a 20 20 45 78  nt nExtra){.  Ex
ff10: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
ff20: 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
ff30: 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 20 3d    int nOrderBy =
ff40: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45   p->pOrderBy->nE
ff50: 78 70 72 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  xpr;.  sqlite3 *
ff60: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
ff70: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 52 65 74  .  KeyInfo *pRet
ff80: 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
ff90: 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65  oAlloc(db, nOrde
ffa0: 72 42 79 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a  rBy+nExtra, 1);.
ffb0: 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
ffc0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
ffd0: 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
ffe0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
fff0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
10000 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4f 72  em *pItem = &pOr
10010 64 65 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20  derBy->a[i];.   
10020 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d 20 3d     Expr *pTerm =
10030 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20   pItem->pExpr;. 
10040 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
10050 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  oll;..      if( 
10060 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45  pTerm->flags & E
10070 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20  P_Collate ){.   
10080 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
10090 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
100a0 70 50 61 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a  pParse, pTerm);.
100b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
100c0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c       pColl = mul
100d0 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
100e0 70 50 61 72 73 65 2c 20 70 2c 20 70 49 74 65 6d  pParse, p, pItem
100f0 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
10100 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  l-1);.        if
10110 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f  ( pColl==0 ) pCo
10120 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
10130 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64  ll;.        pOrd
10140 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
10150 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   =.          sql
10160 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61  ite3ExprAddColla
10170 74 65 53 74 72 69 6e 67 28 70 50 61 72 73 65 2c  teString(pParse,
10180 20 70 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a   pTerm, pColl->z
10190 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
101a0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
101b0 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
101c0 74 65 61 62 6c 65 28 70 52 65 74 29 20 29 3b 0a  teable(pRet) );.
101d0 20 20 20 20 20 20 70 52 65 74 2d 3e 61 43 6f 6c        pRet->aCol
101e0 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  l[i] = pColl;.  
101f0 20 20 20 20 70 52 65 74 2d 3e 61 53 6f 72 74 4f      pRet->aSortO
10200 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72  rder[i] = pOrder
10210 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  By->a[i].sortOrd
10220 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  er;.    }.  }.. 
10230 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
10240 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10250 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54  OMIT_CTE./*.** T
10260 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
10270 72 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20  rates VDBE code 
10280 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63  to compute the c
10290 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 49 54 48  ontent of a WITH
102a0 20 52 45 43 55 52 53 49 56 45 0a 2a 2a 20 71 75   RECURSIVE.** qu
102b0 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  ery of the form:
102c0 0a 2a 2a 0a 2a 2a 20 20 20 3c 72 65 63 75 72 73  .**.**   <recurs
102d0 69 76 65 2d 74 61 62 6c 65 3e 20 41 53 20 28 3c  ive-table> AS (<
102e0 73 65 74 75 70 2d 71 75 65 72 79 3e 20 55 4e 49  setup-query> UNI
102f0 4f 4e 20 5b 41 4c 4c 5d 20 3c 72 65 63 75 72 73  ON [ALL] <recurs
10300 69 76 65 2d 71 75 65 72 79 3e 29 0a 2a 2a 20 20  ive-query>).**  
10310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10320 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f         \________
10330 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 20 20  ___/            
10340 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
10350 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  _/.**           
10360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10370 70 2d 3e 70 50 72 69 6f 72 20 20 20 20 20 20 20  p->pPrior       
10380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
10390 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  .**.**.** There 
103a0 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 72  is exactly one r
103b0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
103c0 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20  recursive-table 
103d0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
103e0 73 65 0a 2a 2a 20 6f 66 20 72 65 63 75 72 73 69  se.** of recursi
103f0 76 65 2d 71 75 65 72 79 2c 20 6d 61 72 6b 65 64  ve-query, marked
10400 20 77 69 74 68 20 74 68 65 20 53 72 63 4c 69 73   with the SrcLis
10410 74 2d 3e 61 5b 5d 2e 69 73 52 65 63 75 72 73 69  t->a[].isRecursi
10420 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54  ve flag..**.** T
10430 68 65 20 73 65 74 75 70 2d 71 75 65 72 79 20 72  he setup-query r
10440 75 6e 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65  uns once to gene
10450 72 61 74 65 20 61 6e 20 69 6e 69 74 69 61 6c 20  rate an initial 
10460 73 65 74 20 6f 66 20 72 6f 77 73 20 74 68 61 74  set of rows that
10470 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75   go.** into a Qu
10480 65 75 65 20 74 61 62 6c 65 2e 20 20 52 6f 77 73  eue table.  Rows
10490 20 61 72 65 20 65 78 74 72 61 63 74 65 64 20 66   are extracted f
104a0 72 6f 6d 20 74 68 65 20 51 75 65 75 65 20 74 61  rom the Queue ta
104b0 62 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e  ble one by.** on
104c0 65 2e 20 20 45 61 63 68 20 72 6f 77 20 65 78 74  e.  Each row ext
104d0 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75  racted from Queu
104e0 65 20 69 73 20 6f 75 74 70 75 74 20 74 6f 20 70  e is output to p
104f0 44 65 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20  Dest.  Then the 
10500 73 69 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63  single.** extrac
10510 74 65 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20  ted row (now in 
10520 74 68 65 20 69 43 75 72 72 65 6e 74 20 74 61 62  the iCurrent tab
10530 6c 65 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20  le) becomes the 
10540 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a  content of the.*
10550 2a 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c  * recursive-tabl
10560 65 20 66 6f 72 20 61 20 72 65 63 75 72 73 69 76  e for a recursiv
10570 65 2d 71 75 65 72 79 20 72 75 6e 2e 20 20 54 68  e-query run.  Th
10580 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20  e output of the 
10590 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 0a  recursive-query.
105a0 2a 2a 20 69 73 20 61 64 64 65 64 20 62 61 63 6b  ** is added back
105b0 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20   into the Queue 
105c0 74 61 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f  table.  Then ano
105d0 74 68 65 72 20 72 6f 77 20 69 73 20 65 78 74 72  ther row is extr
105e0 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65  acted from Queue
105f0 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 74 65 72  .** and the iter
10600 61 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20  ation continues 
10610 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65 20  until the Queue 
10620 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
10630 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d  **.** If the com
10640 70 6f 75 6e 64 20 71 75 65 72 79 20 6f 70 65 72  pound query oper
10650 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74 68  ator is UNION th
10660 65 6e 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 20  en no duplicate 
10670 72 6f 77 73 20 61 72 65 20 65 76 65 72 0a 2a 2a  rows are ever.**
10680 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74   inserted into t
10690 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20  he Queue table. 
106a0 20 54 68 65 20 69 44 69 73 74 69 6e 63 74 20 74   The iDistinct t
106b0 61 62 6c 65 20 6b 65 65 70 73 20 61 20 63 6f 70  able keeps a cop
106c0 79 20 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a  y of all rows.**
106d0 20 74 68 61 74 20 68 61 76 65 20 65 76 65 72 20   that have ever 
106e0 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e  been inserted in
106f0 74 6f 20 51 75 65 75 65 20 61 6e 64 20 63 61 75  to Queue and cau
10700 73 65 73 20 64 75 70 6c 69 63 61 74 65 73 20 74  ses duplicates t
10710 6f 20 62 65 0a 2a 2a 20 64 69 73 63 61 72 64 65  o be.** discarde
10720 64 2e 20 20 49 66 20 74 68 65 20 6f 70 65 72 61  d.  If the opera
10730 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c  tor is UNION ALL
10740 2c 20 74 68 65 6e 20 64 75 70 6c 69 63 61 74 65  , then duplicate
10750 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a  s are allowed..*
10760 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65  * .** If the que
10770 72 79 20 68 61 73 20 61 6e 20 4f 52 44 45 52 20  ry has an ORDER 
10780 42 59 2c 20 74 68 65 6e 20 65 6e 74 72 69 65 73  BY, then entries
10790 20 69 6e 20 74 68 65 20 51 75 65 75 65 20 74 61   in the Queue ta
107a0 62 6c 65 20 61 72 65 20 6b 65 70 74 20 69 6e 0a  ble are kept in.
107b0 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65  ** ORDER BY orde
107c0 72 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  r and the first 
107d0 65 6e 74 72 79 20 69 73 20 65 78 74 72 61 63 74  entry is extract
107e0 65 64 20 66 6f 72 20 65 61 63 68 20 63 79 63 6c  ed for each cycl
107f0 65 2e 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61  e.  Without.** a
10800 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20  n ORDER BY, the 
10810 51 75 65 75 65 20 74 61 62 6c 65 20 69 73 20 6a  Queue table is j
10820 75 73 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a  ust a FIFO..**.*
10830 2a 20 49 66 20 61 20 4c 49 4d 49 54 20 63 6c 61  * If a LIMIT cla
10840 75 73 65 20 69 73 20 70 72 6f 76 69 64 65 64 2c  use is provided,
10850 20 74 68 65 6e 20 74 68 65 20 69 74 65 72 61 74   then the iterat
10860 69 6f 6e 20 73 74 6f 70 73 20 61 66 74 65 72 20  ion stops after 
10870 4c 49 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61  LIMIT rows.** ha
10880 76 65 20 62 65 65 6e 20 6f 75 74 70 75 74 20 74  ve been output t
10890 6f 20 70 44 65 73 74 2e 20 20 41 20 4c 49 4d 49  o pDest.  A LIMI
108a0 54 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20  T of zero means 
108b0 74 6f 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77  to output no row
108c0 73 20 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74  s and a.** negat
108d0 69 76 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20  ive LIMIT means 
108e0 74 6f 20 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f  to output all ro
108f0 77 73 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  ws.  If there is
10900 20 61 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54 20   also an OFFSET 
10910 63 6c 61 75 73 65 0a 2a 2a 20 77 69 74 68 20 61  clause.** with a
10920 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2c   positive value,
10930 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
10940 4f 46 46 53 45 54 20 6f 75 74 70 75 74 73 20 61  OFFSET outputs a
10950 72 65 20 64 69 73 63 61 72 64 65 64 20 72 61 74  re discarded rat
10960 68 65 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e  her.** than bein
10970 67 20 73 65 6e 74 20 74 6f 20 70 44 65 73 74 2e  g sent to pDest.
10980 20 20 54 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e    The LIMIT coun
10990 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e  t does not begin
109a0 20 75 6e 74 69 6c 20 61 66 74 65 72 20 4f 46 46   until after OFF
109b0 53 45 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65  SET.** rows have
109c0 20 62 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a   been skipped..*
109d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
109e0 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73  nerateWithRecurs
109f0 69 76 65 51 75 65 72 79 28 0a 20 20 50 61 72 73  iveQuery(.  Pars
10a00 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
10a10 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
10a20 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
10a30 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
10a40 2f 2a 20 54 68 65 20 72 65 63 75 72 73 69 76 65  /* The recursive
10a50 20 53 45 4c 45 43 54 20 74 6f 20 62 65 20 63 6f   SELECT to be co
10a60 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
10a70 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
10a80 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
10a90 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
10aa0 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20  */.){.  SrcList 
10ab0 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b  *pSrc = p->pSrc;
10ac0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
10ad0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
10ae0 72 65 63 75 72 73 69 76 65 20 71 75 65 72 79 20  recursive query 
10af0 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20  */.  int nCol = 
10b00 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
10b10 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
10b20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
10b30 65 63 75 72 73 69 76 65 20 74 61 62 6c 65 20 2a  ecursive table *
10b40 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  /.  Vdbe *v = pP
10b50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
10b60 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
10b70 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65  d statement unde
10b80 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
10b90 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 74  /.  Select *pSet
10ba0 75 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20  up = p->pPrior; 
10bb0 20 20 2f 2a 20 54 68 65 20 73 65 74 75 70 20 71    /* The setup q
10bc0 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64  uery */.  int ad
10bd0 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20  drTop;          
10be0 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
10bf0 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  f the loop */.  
10c00 69 6e 74 20 61 64 64 72 43 6f 6e 74 2c 20 61 64  int addrCont, ad
10c10 64 72 42 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a  drBreak;      /*
10c20 20 43 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42 52   CONTINUE and BR
10c30 45 41 4b 20 61 64 64 72 65 73 73 65 73 20 2a 2f  EAK addresses */
10c40 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20  .  int iCurrent 
10c50 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
10c60 20 2f 2a 20 54 68 65 20 43 75 72 72 65 6e 74 20   /* The Current 
10c70 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72  table */.  int r
10c80 65 67 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20  egCurrent;      
10c90 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
10ca0 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 43 75 72  ster holding Cur
10cb0 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  rent table */.  
10cc0 69 6e 74 20 69 51 75 65 75 65 3b 20 20 20 20 20  int iQueue;     
10cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10ce0 20 54 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   The Queue table
10cf0 20 2a 2f 0a 20 20 69 6e 74 20 69 44 69 73 74 69   */.  int iDisti
10d00 6e 63 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nct = 0;        
10d10 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65      /* To ensure
10d20 20 75 6e 69 71 75 65 20 72 65 73 75 6c 74 73 20   unique results 
10d30 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e  if UNION */.  in
10d40 74 20 65 44 65 73 74 20 3d 20 53 52 54 5f 46 69  t eDest = SRT_Fi
10d50 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48  fo;         /* H
10d60 6f 77 20 74 6f 20 77 72 69 74 65 20 74 6f 20 51  ow to write to Q
10d70 75 65 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ueue */.  Select
10d80 44 65 73 74 20 64 65 73 74 51 75 65 75 65 3b 20  Dest destQueue; 
10d90 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63          /* Selec
10da0 74 44 65 73 74 20 74 61 72 67 65 74 74 69 6e 67  tDest targetting
10db0 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
10dc0 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
10dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10de0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
10df0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ter */.  int rc;
10e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e10 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
10e20 20 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c   code */.  ExprL
10e30 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
10e40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10e50 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
10e60 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  */.  Expr *pLimi
10e70 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 20 20 20  t, *pOffset;    
10e80 20 20 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49     /* Saved LIMI
10e90 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a  T and OFFSET */.
10ea0 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20    int regLimit, 
10eb0 72 65 67 4f 66 66 73 65 74 3b 20 20 20 20 20 20  regOffset;      
10ec0 2f 2a 20 52 65 67 69 73 74 65 72 73 20 75 73 65  /* Registers use
10ed0 64 20 62 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f  d by LIMIT and O
10ee0 46 46 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f  FFSET */..  /* O
10ef0 62 74 61 69 6e 20 61 75 74 68 6f 72 69 7a 61 74  btain authorizat
10f00 69 6f 6e 20 74 6f 20 64 6f 20 61 20 72 65 63 75  ion to do a recu
10f10 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20  rsive query */. 
10f20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
10f30 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
10f40 4c 49 54 45 5f 52 45 43 55 52 53 49 56 45 2c 20  LITE_RECURSIVE, 
10f50 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  0, 0, 0) ) retur
10f60 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73  n;..  /* Process
10f70 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f   the LIMIT and O
10f80 46 46 53 45 54 20 63 6c 61 75 73 65 73 2c 20 69  FFSET clauses, i
10f90 66 20 74 68 65 79 20 65 78 69 73 74 20 2a 2f 0a  f they exist */.
10fa0 20 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71    addrBreak = sq
10fb0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
10fc0 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65  el(v);.  compute
10fd0 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
10fe0 50 61 72 73 65 2c 20 70 2c 20 61 64 64 72 42 72  Parse, p, addrBr
10ff0 65 61 6b 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d  eak);.  pLimit =
11000 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 70 4f   p->pLimit;.  pO
11010 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
11020 65 74 3b 0a 20 20 72 65 67 4c 69 6d 69 74 20 3d  et;.  regLimit =
11030 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 72 65   p->iLimit;.  re
11040 67 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66  gOffset = p->iOf
11050 66 73 65 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69  fset;.  p->pLimi
11060 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d  t = p->pOffset =
11070 20 30 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20   0;.  p->iLimit 
11080 3d 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30  = p->iOffset = 0
11090 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  ;.  pOrderBy = p
110a0 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f  ->pOrderBy;..  /
110b0 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63 75 72  * Locate the cur
110c0 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
110d0 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e Current table 
110e0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c  */.  for(i=0; AL
110f0 57 41 59 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72  WAYS(i<pSrc->nSr
11100 63 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  c); i++){.    if
11110 28 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 73 52  ( pSrc->a[i].isR
11120 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
11130 20 20 69 43 75 72 72 65 6e 74 20 3d 20 70 53 72    iCurrent = pSr
11140 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b  c->a[i].iCursor;
11150 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11160 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
11170 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 6e  locate cursors n
11180 75 6d 62 65 72 73 20 66 6f 72 20 51 75 65 75 65  umbers for Queue
11190 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 20   and Distinct.  
111a0 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  The cursor numbe
111b0 72 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 44  r for.  ** the D
111c0 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6d 75  istinct table mu
111d0 73 74 20 62 65 20 65 78 61 63 74 6c 79 20 6f 6e  st be exactly on
111e0 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 51  e greater than Q
111f0 75 65 75 65 20 69 6e 20 6f 72 64 65 72 0a 20 20  ueue in order.  
11200 2a 2a 20 66 6f 72 20 74 68 65 20 53 52 54 5f 44  ** for the SRT_D
11210 69 73 74 46 69 66 6f 20 61 6e 64 20 53 52 54 5f  istFifo and SRT_
11220 44 69 73 74 51 75 65 75 65 20 64 65 73 74 69 6e  DistQueue destin
11230 61 74 69 6f 6e 73 20 74 6f 20 77 6f 72 6b 2e 20  ations to work. 
11240 2a 2f 0a 20 20 69 51 75 65 75 65 20 3d 20 70 50  */.  iQueue = pP
11250 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
11260 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  if( p->op==TK_UN
11270 49 4f 4e 20 29 7b 0a 20 20 20 20 65 44 65 73 74  ION ){.    eDest
11280 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52   = pOrderBy ? SR
11290 54 5f 44 69 73 74 51 75 65 75 65 20 3a 20 53 52  T_DistQueue : SR
112a0 54 5f 44 69 73 74 46 69 66 6f 3b 0a 20 20 20 20  T_DistFifo;.    
112b0 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72  iDistinct = pPar
112c0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65  se->nTab++;.  }e
112d0 6c 73 65 7b 0a 20 20 20 20 65 44 65 73 74 20 3d  lse{.    eDest =
112e0 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f   pOrderBy ? SRT_
112f0 51 75 65 75 65 20 3a 20 53 52 54 5f 46 69 66 6f  Queue : SRT_Fifo
11300 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
11310 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
11320 65 73 74 51 75 65 75 65 2c 20 65 44 65 73 74 2c  estQueue, eDest,
11330 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20   iQueue);..  /* 
11340 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73  Allocate cursors
11350 20 66 6f 72 20 43 75 72 72 65 6e 74 2c 20 51 75   for Current, Qu
11360 65 75 65 2c 20 61 6e 64 20 44 69 73 74 69 6e 63  eue, and Distinc
11370 74 2e 20 2a 2f 0a 20 20 72 65 67 43 75 72 72 65  t. */.  regCurre
11380 6e 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  nt = ++pParse->n
11390 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  Mem;.  sqlite3Vd
113a0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
113b0 70 65 6e 50 73 65 75 64 6f 2c 20 69 43 75 72 72  penPseudo, iCurr
113c0 65 6e 74 2c 20 72 65 67 43 75 72 72 65 6e 74 2c  ent, regCurrent,
113d0 20 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 4f   nCol);.  if( pO
113e0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65  rderBy ){.    Ke
113f0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
11400 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  = multiSelectOrd
11410 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72  erByKeyInfo(pPar
11420 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 20 20 73  se, p, 1);.    s
11430 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
11440 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
11450 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 70 4f  eral, iQueue, pO
11460 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c  rderBy->nExpr+2,
11470 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
11480 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
11490 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
114a0 59 49 4e 46 4f 29 3b 0a 20 20 20 20 64 65 73 74  YINFO);.    dest
114b0 51 75 65 75 65 2e 70 4f 72 64 65 72 42 79 20 3d  Queue.pOrderBy =
114c0 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c   pOrderBy;.  }el
114d0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
114e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
114f0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
11500 51 75 65 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  Queue, nCol);.  
11510 7d 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  }.  VdbeComment(
11520 28 76 2c 20 22 51 75 65 75 65 20 74 61 62 6c 65  (v, "Queue table
11530 22 29 29 3b 0a 20 20 69 66 28 20 69 44 69 73 74  "));.  if( iDist
11540 69 6e 63 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61  inct ){.    p->a
11550 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
11560 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11570 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
11580 65 6d 65 72 61 6c 2c 20 69 44 69 73 74 69 6e 63  emeral, iDistinc
11590 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 73 65  t, 0);.    p->se
115a0 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
115b0 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a  sEphemeral;.  }.
115c0 0a 20 20 2f 2a 20 44 65 74 61 63 68 20 74 68 65  .  /* Detach the
115d0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
115e0 20 66 72 6f 6d 20 74 68 65 20 63 6f 6d 70 6f 75   from the compou
115f0 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 70  nd SELECT */.  p
11600 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
11610 0a 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20  .  /* Store the 
11620 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
11630 65 74 75 70 2d 71 75 65 72 79 20 69 6e 20 51 75  etup-query in Qu
11640 65 75 65 2e 20 2a 2f 0a 20 20 70 53 65 74 75 70  eue. */.  pSetup
11650 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 72  ->pNext = 0;.  r
11660 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
11670 74 28 70 50 61 72 73 65 2c 20 70 53 65 74 75 70  t(pParse, pSetup
11680 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b 0a 20  , &destQueue);. 
11690 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d   pSetup->pNext =
116a0 20 70 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67   p;.  if( rc ) g
116b0 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72 65 63 75 72  oto end_of_recur
116c0 73 69 76 65 5f 71 75 65 72 79 3b 0a 0a 20 20 2f  sive_query;..  /
116d0 2a 20 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20  * Find the next 
116e0 72 6f 77 20 69 6e 20 74 68 65 20 51 75 65 75 65  row in the Queue
116f0 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 61 74   and output that
11700 20 72 6f 77 20 2a 2f 0a 20 20 61 64 64 72 54 6f   row */.  addrTo
11710 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
11720 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
11730 6e 64 2c 20 69 51 75 65 75 65 2c 20 61 64 64 72  nd, iQueue, addr
11740 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
11750 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 54  rage(v);..  /* T
11760 72 61 6e 73 66 65 72 20 74 68 65 20 6e 65 78 74  ransfer the next
11770 20 72 6f 77 20 69 6e 20 51 75 65 75 65 20 6f 76   row in Queue ov
11780 65 72 20 74 6f 20 43 75 72 72 65 6e 74 20 2a 2f  er to Current */
11790 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
117a0 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52  dOp1(v, OP_NullR
117b0 6f 77 2c 20 69 43 75 72 72 65 6e 74 29 3b 20 2f  ow, iCurrent); /
117c0 2a 20 54 6f 20 72 65 73 65 74 20 63 6f 6c 75 6d  * To reset colum
117d0 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 69 66 28  n cache */.  if(
117e0 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
117f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11800 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
11810 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42   iQueue, pOrderB
11820 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67 43  y->nExpr+1, regC
11830 75 72 72 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65  urrent);.  }else
11840 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
11850 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
11860 77 44 61 74 61 2c 20 69 51 75 65 75 65 2c 20 72  wData, iQueue, r
11870 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a  egCurrent);.  }.
11880 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11890 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65  Op1(v, OP_Delete
118a0 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a  , iQueue);..  /*
118b0 20 4f 75 74 70 75 74 20 74 68 65 20 73 69 6e 67   Output the sing
118c0 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e  le row in Curren
118d0 74 20 2a 2f 0a 20 20 61 64 64 72 43 6f 6e 74 20  t */.  addrCont 
118e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
118f0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 64  eLabel(v);.  cod
11900 65 4f 66 66 73 65 74 28 76 2c 20 72 65 67 4f 66  eOffset(v, regOf
11910 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 29 3b  fset, addrCont);
11920 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  .  selectInnerLo
11930 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
11940 3e 70 45 4c 69 73 74 2c 20 69 43 75 72 72 65 6e  >pEList, iCurren
11950 74 2c 0a 20 20 20 20 20 20 30 2c 20 30 2c 20 70  t,.      0, 0, p
11960 44 65 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20  Dest, addrCont, 
11970 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66  addrBreak);.  if
11980 28 20 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20  ( regLimit ){.  
11990 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
119a0 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f  Op3(v, OP_IfZero
119b0 2c 20 72 65 67 4c 69 6d 69 74 2c 20 61 64 64 72  , regLimit, addr
119c0 42 72 65 61 6b 2c 20 2d 31 29 3b 0a 20 20 20 20  Break, -1);.    
119d0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
119e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
119f0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
11a00 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a 20 20  , addrCont);..  
11a10 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 72  /* Execute the r
11a20 65 63 75 72 73 69 76 65 20 53 45 4c 45 43 54 20  ecursive SELECT 
11a30 74 61 6b 69 6e 67 20 74 68 65 20 73 69 6e 67 6c  taking the singl
11a40 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74  e row in Current
11a50 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c   as.  ** the val
11a60 75 65 20 66 6f 72 20 74 68 65 20 72 65 63 75 72  ue for the recur
11a70 73 69 76 65 2d 74 61 62 6c 65 2e 20 53 74 6f 72  sive-table. Stor
11a80 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
11a90 20 74 68 65 20 51 75 65 75 65 2e 0a 20 20 2a 2f   the Queue..  */
11aa0 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30  .  p->pPrior = 0
11ab0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
11ac0 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  t(pParse, p, &de
11ad0 73 74 51 75 65 75 65 29 3b 0a 20 20 61 73 73 65  stQueue);.  asse
11ae0 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30  rt( p->pPrior==0
11af0 20 29 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20   );.  p->pPrior 
11b00 3d 20 70 53 65 74 75 70 3b 0a 0a 20 20 2f 2a 20  = pSetup;..  /* 
11b10 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20 74 68 65  Keep running the
11b20 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68 65 20   loop until the 
11b30 51 75 65 75 65 20 69 73 20 65 6d 70 74 79 20 2a  Queue is empty *
11b40 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  /.  sqlite3VdbeA
11b50 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
11b60 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20  , 0, addrTop);. 
11b70 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
11b80 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
11b90 42 72 65 61 6b 29 3b 0a 0a 65 6e 64 5f 6f 66 5f  Break);..end_of_
11ba0 72 65 63 75 72 73 69 76 65 5f 71 75 65 72 79 3a  recursive_query:
11bb0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
11bc0 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  stDelete(pParse-
11bd0 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  >db, p->pOrderBy
11be0 29 3b 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  );.  p->pOrderBy
11bf0 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70   = pOrderBy;.  p
11c00 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
11c10 74 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20  t;.  p->pOffset 
11c20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 72 65 74  = pOffset;.  ret
11c30 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  urn;.}.#endif /*
11c40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
11c50 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20   */../* Forward 
11c60 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 73 74  references */.st
11c70 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
11c80 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50  lectOrderBy(.  P
11c90 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
11ca0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
11cb0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
11cc0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
11cd0 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
11ce0 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
11cf0 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
11d00 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
11d10 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
11d20 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
11d30 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 0a  results */.);...
11d40 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
11d50 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
11d60 70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75  process a compou
11d70 6e 64 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72  nd query form fr
11d80 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72  om.** two or mor
11d90 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72 69  e separate queri
11da0 65 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20  es using UNION, 
11db0 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50  UNION ALL, EXCEP
11dc0 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45  T, or.** INTERSE
11dd0 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69  CT.**.** "p" poi
11de0 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67 68 74  nts to the right
11df0 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f  -most of the two
11e00 20 71 75 65 72 69 65 73 2e 20 20 74 68 65 20 71   queries.  the q
11e10 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c  uery on the.** l
11e20 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72  eft is p->pPrior
11e30 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75 65 72  .  The left quer
11e40 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20  y could also be 
11e50 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
11e60 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73  .** in which cas
11e70 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
11e80 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65  ill be called re
11e90 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a  cursively. .**.*
11ea0 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66  * The results of
11eb0 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79   the total query
11ec0 20 61 72 65 20 74 6f 20 62 65 20 77 72 69 74 74   are to be writt
11ed0 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e  en into a destin
11ee0 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65  ation.** of type
11ef0 20 65 44 65 73 74 20 77 69 74 68 20 70 61 72 61   eDest with para
11f00 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a  meter iParm..**.
11f10 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43  ** Example 1:  C
11f20 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65 65 2d  onsider a three-
11f30 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c  way compound SQL
11f40 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
11f50 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  *     SELECT a F
11f60 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c  ROM t1 UNION SEL
11f70 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e  ECT b FROM t2 UN
11f80 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f  ION SELECT c FRO
11f90 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  M t3.**.** This 
11fa0 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72  statement is par
11fb0 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77  sed up as follow
11fc0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
11fd0 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a  ECT c FROM t3.**
11fe0 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
11ff0 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20  `----->  SELECT 
12000 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20  b FROM t2.**    
12010 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
12020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12030 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54  `------>  SELECT
12040 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a   a FROM t1.**.**
12050 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74   The arrows in t
12060 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65  he diagram above
12070 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 53   represent the S
12080 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69  elect.pPrior poi
12090 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74  nter..** So if t
120a0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
120b0 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71 75  alled with p equ
120c0 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75 65  al to the t3 que
120d0 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69  ry, then.** pPri
120e0 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74  or will be the t
120f0 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20  2 query.  p->op 
12100 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e  will be TK_UNION
12110 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
12120 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74  *.** Notice that
12130 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
12140 77 61 79 20 53 51 4c 69 74 65 20 70 61 72 73 65  way SQLite parse
12150 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  s compound SELEC
12160 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  Ts, the.** indiv
12170 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c  idual selects al
12180 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20  ways group from 
12190 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a  left to right..*
121a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
121b0 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  tiSelect(.  Pars
121c0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
121d0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
121e0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
121f0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
12200 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
12210 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
12220 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
12230 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
12240 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
12250 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
12260 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ults */.){.  int
12270 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12280 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f     /* Success co
12290 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75  de from a subrou
122a0 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tine */.  Select
122b0 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20   *pPrior;       
122c0 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
122d0 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  T immediately to
122e0 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56   our left */.  V
122f0 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
12300 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
12310 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44   code to this VD
12320 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  BE */.  SelectDe
12330 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a  st dest;      /*
12340 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74   Alternative dat
12350 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f  a destination */
12360 0a 20 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65  .  Select *pDele
12370 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69  te = 0;  /* Chai
12380 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65  n of simple sele
12390 63 74 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f  cts to delete */
123a0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
123b0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
123c0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
123d0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
123e0 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
123f0 20 69 6e 74 20 69 53 75 62 31 20 3d 20 30 3b 20   int iSub1 = 0; 
12400 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64         /* EQP id
12410 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75   of left-hand qu
12420 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75  ery */.  int iSu
12430 62 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  b2 = 0;        /
12440 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69 67 68  * EQP id of righ
12450 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a  t-hand query */.
12460 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b  #endif..  /* Mak
12470 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
12480 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c  no ORDER BY or L
12490 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70  IMIT clause on p
124a0 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f  rior SELECTs.  O
124b0 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73  nly.  ** the las
124c0 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53  t (right-most) S
124d0 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72  ELECT in the ser
124e0 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20  ies may have an 
124f0 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
12500 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  T..  */.  assert
12510 28 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72  ( p && p->pPrior
12520 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20   );  /* Calling 
12530 66 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74  function guarant
12540 65 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f  ees this much */
12550 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73  .  assert( (p->s
12560 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63  elFlags & SF_Rec
12570 75 72 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70 2d  ursive)==0 || p-
12580 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70  >op==TK_ALL || p
12590 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
125a0 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
125b0 3e 64 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20  >db;.  pPrior = 
125c0 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 65 73  p->pPrior;.  des
125d0 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66  t = *pDest;.  if
125e0 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  ( pPrior->pOrder
125f0 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
12600 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
12610 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  ,"ORDER BY claus
12620 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
12630 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
12640 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
12650 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
12660 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
12670 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
12680 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28  t_end;.  }.  if(
12690 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
126a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
126b0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c  rorMsg(pParse,"L
126c0 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75  IMIT clause shou
126d0 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
126e0 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
126f0 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
12700 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
12710 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
12720 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
12730 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69  .  }..  v = sqli
12740 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
12750 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  e);.  assert( v!
12760 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56 44  =0 );  /* The VD
12770 42 45 20 61 6c 72 65 61 64 79 20 63 72 65 61 74  BE already creat
12780 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 75  ed by calling fu
12790 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  nction */..  /* 
127a0 43 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69  Create the desti
127b0 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79  nation temporary
127c0 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73   table if necess
127d0 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ary.  */.  if( d
127e0 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45  est.eDest==SRT_E
127f0 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61  phemTab ){.    a
12800 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
12810 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
12820 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12830 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64  OpenEphemeral, d
12840 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e  est.iSDParm, p->
12850 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
12860 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
12870 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45  hangeP5(v, BTREE
12880 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20  _UNORDERED);.   
12890 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52   dest.eDest = SR
128a0 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20  T_Table;.  }..  
128b0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  /* Make sure all
128c0 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20   SELECTs in the 
128d0 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74  statement have t
128e0 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
128f0 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20  f elements.  ** 
12900 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20  in their result 
12910 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sets..  */.  ass
12920 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26  ert( p->pEList &
12930 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  & pPrior->pEList
12940 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c   );.  if( p->pEL
12950 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69  ist->nExpr!=pPri
12960 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  or->pEList->nExp
12970 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  r ){.    if( p->
12980 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61  selFlags & SF_Va
12990 6c 75 65 73 20 29 7b 0a 20 20 20 20 20 20 73 71  lues ){.      sq
129a0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
129b0 61 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45  arse, "all VALUE
129c0 53 20 6d 75 73 74 20 68 61 76 65 20 74 68 65 20  S must have the 
129d0 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  same number of t
129e0 65 72 6d 73 22 29 3b 0a 20 20 20 20 7d 65 6c 73  erms");.    }els
129f0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
12a00 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
12a10 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65   "SELECTs to the
12a20 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
12a30 6f 66 20 25 73 22 0a 20 20 20 20 20 20 20 20 22  of %s".        "
12a40 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65   do not have the
12a50 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
12a60 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c  result columns",
12a70 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
12a80 3e 6f 70 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  >op));.    }.   
12a90 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
12aa0 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
12ab0 6e 64 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  nd;.  }..#ifndef
12ac0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
12ad0 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
12ae0 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
12af0 65 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  e ){.    generat
12b00 65 57 69 74 68 52 65 63 75 72 73 69 76 65 51 75  eWithRecursiveQu
12b10 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ery(pParse, p, &
12b20 64 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  dest);.  }else.#
12b30 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70  endif..  /* Comp
12b40 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74 68 61  ound SELECTs tha
12b50 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  t have an ORDER 
12b60 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 68 61  BY clause are ha
12b70 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79  ndled separately
12b80 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
12b90 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
12ba0 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65  return multiSele
12bb0 63 74 4f 72 64 65 72 42 79 28 70 50 61 72 73 65  ctOrderBy(pParse
12bc0 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d  , p, pDest);.  }
12bd0 65 6c 73 65 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  else..  /* Gener
12be0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
12bf0 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
12c00 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
12c10 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68  s..  */.  switch
12c20 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  ( p->op ){.    c
12c30 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20  ase TK_ALL: {.  
12c40 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 30      int addr = 0
12c50 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d  ;.      int nLim
12c60 69 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  it;.      assert
12c70 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  ( !pPrior->pLimi
12c80 74 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  t );.      pPrio
12c90 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69  r->iLimit = p->i
12ca0 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72  Limit;.      pPr
12cb0 69 6f 72 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70  ior->iOffset = p
12cc0 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->iOffset;.     
12cd0 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
12ce0 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
12cf0 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73     pPrior->pOffs
12d00 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
12d10 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
12d20 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20  tInteger(iSub1, 
12d30 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
12d40 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
12d50 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
12d60 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
12d70 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70   &dest);.      p
12d80 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
12d90 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
12da0 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   0;.      if( rc
12db0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
12dc0 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
12dd0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
12de0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
12df0 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
12e00 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74  = pPrior->iLimit
12e10 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73  ;.      p->iOffs
12e20 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66  et = pPrior->iOf
12e30 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20  fset;.      if( 
12e40 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->iLimit ){.   
12e50 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
12e60 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
12e70 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69   OP_IfZero, p->i
12e80 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65  Limit); VdbeCove
12e90 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
12ea0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
12eb0 20 22 4a 75 6d 70 20 61 68 65 61 64 20 69 66 20   "Jump ahead if 
12ec0 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22 29 29  LIMIT reached"))
12ed0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12ee0 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
12ef0 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d  r(iSub2, pParse-
12f00 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
12f10 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
12f20 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
12f30 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  , p, &dest);.   
12f40 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
12f50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
12f60 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
12f70 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
12f80 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
12f90 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  r;.      p->nSel
12fa0 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72  ectRow += pPrior
12fb0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
12fc0 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e      if( pPrior->
12fd0 70 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 26 26  pLimit.       &&
12fe0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
12ff0 74 65 67 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c  teger(pPrior->pL
13000 69 6d 69 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20  imit, &nLimit). 
13010 20 20 20 20 20 20 26 26 20 6e 4c 69 6d 69 74 3e        && nLimit>
13020 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52  0 && p->nSelectR
13030 6f 77 20 3e 20 28 75 36 34 29 6e 4c 69 6d 69 74  ow > (u64)nLimit
13040 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
13050 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
13060 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = nLimit;.     
13070 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 64 64   }.      if( add
13080 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
13090 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
130a0 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
130b0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
130c0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
130d0 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61  K_EXCEPT:.    ca
130e0 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20  se TK_UNION: {. 
130f0 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61       int unionTa
13100 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  b;    /* Cursor 
13110 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65  number of the te
13120 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f  mporary table ho
13130 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a  lding result */.
13140 20 20 20 20 20 20 75 38 20 6f 70 20 3d 20 30 3b        u8 op = 0;
13150 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
13160 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74   the SRT_ operat
13170 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f  ions to apply to
13180 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69   self */.      i
13190 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20  nt priorOp;     
131a0 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72  /* The SRT_ oper
131b0 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74  ation to apply t
131c0 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20  o prior selects 
131d0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
131e0 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b  Limit, *pOffset;
131f0 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73   /* Saved values
13200 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e   of p->nLimit an
13210 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a  d p->nOffset */.
13220 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
13230 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
13240 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20   uniondest;..   
13250 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
13260 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 3b  op==TK_EXCEPT );
13270 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
13280 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
13290 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 4f   );.      priorO
132a0 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  p = SRT_Union;. 
132b0 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
132c0 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 29 7b 0a  est==priorOp ){.
132d0 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61          /* We ca
132e0 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72  n reuse a tempor
132f0 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61  ary table genera
13300 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20  ted by a SELECT 
13310 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a  to our.        *
13320 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20  * right..       
13330 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
13340 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30  rt( p->pLimit==0
13350 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20   );      /* Not 
13360 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77  allowed on leftw
13370 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a  ard elements */.
13380 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13390 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b  p->pOffset==0 );
133a0 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f       /* Not allo
133b0 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20  wed on leftward 
133c0 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  elements */.    
133d0 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64      unionTab = d
133e0 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20  est.iSDParm;.   
133f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13400 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65    /* We will nee
13410 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20  d to create our 
13420 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  own temporary ta
13430 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ble to hold the.
13440 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72          ** inter
13450 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e  mediate results.
13460 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
13470 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70      unionTab = p
13480 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
13490 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
134a0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
134b0 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
134c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
134d0 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
134e0 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c  meral, unionTab,
134f0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73   0);.        ass
13500 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
13510 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b  Ephm[0] == -1 );
13520 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72  .        p->addr
13530 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64  OpenEphm[0] = ad
13540 64 72 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 64  dr;.        find
13550 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65  Rightmost(p)->se
13560 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
13570 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20  sEphemeral;.    
13580 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
13590 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d  EList );.      }
135a0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
135b0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
135c0 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66  ments to our lef
135d0 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
135e0 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72   assert( !pPrior
135f0 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20  ->pOrderBy );.  
13600 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
13610 74 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e  tDestInit(&union
13620 64 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75  dest, priorOp, u
13630 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20  nionTab);.      
13640 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
13650 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d  r(iSub1, pParse-
13660 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
13670 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
13680 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
13690 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e  , pPrior, &union
136a0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28  dest);.      if(
136b0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
136c0 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
136d0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
136e0 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
136f0 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
13700 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20  statement.      
13710 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  */.      if( p->
13720 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b  op==TK_EXCEPT ){
13730 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52  .        op = SR
13740 54 5f 45 78 63 65 70 74 3b 0a 20 20 20 20 20 20  T_Except;.      
13750 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
13760 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b  ssert( p->op==TK
13770 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  _UNION );.      
13780 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e    op = SRT_Union
13790 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
137a0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
137b0 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
137c0 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
137d0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
137e0 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d      pOffset = p-
137f0 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
13800 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
13810 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e        uniondest.
13820 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20  eDest = op;.    
13830 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
13840 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73  ger(iSub2, pPars
13850 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
13860 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
13870 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
13880 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73  se, p, &uniondes
13890 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
138a0 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
138b0 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75  K );.      /* Qu
138c0 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69  ery flattening i
138d0 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  n sqlite3Select(
138e0 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70  ) might refill p
138f0 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20  ->pOrderBy..    
13900 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20    ** Be sure to 
13910 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72  delete p->pOrder
13920 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74  By, therefore, t
13930 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79  o avoid a memory
13940 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20   leak. */.      
13950 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
13960 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
13970 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 70 44  derBy);.      pD
13980 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
13990 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
139a0 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
139b0 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
139c0 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   0;.      if( p-
139d0 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 20  >op==TK_UNION ) 
139e0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d  p->nSelectRow +=
139f0 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
13a00 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Row;.      sqlit
13a10 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
13a20 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
13a30 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
13a40 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
13a50 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
13a60 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d  t;.      p->iLim
13a70 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  it = 0;.      p-
13a80 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20  >iOffset = 0;.. 
13a90 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20       /* Convert 
13aa0 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20  the data in the 
13ab0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
13ac0 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f  into whatever fo
13ad0 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69  rm.      ** it i
13ae0 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65 6e  s that we curren
13af0 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  tly need..      
13b00 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
13b10 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e   unionTab==dest.
13b20 69 53 44 50 61 72 6d 20 7c 7c 20 64 65 73 74 2e  iSDParm || dest.
13b30 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29  eDest!=priorOp )
13b40 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74  ;.      if( dest
13b50 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20  .eDest!=priorOp 
13b60 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
13b70 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
13b80 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73  tart;.        as
13b90 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
13ba0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  );.        if( d
13bb0 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  est.eDest==SRT_O
13bc0 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20  utput ){.       
13bd0 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73     Select *pFirs
13be0 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20  t = p;.         
13bf0 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e   while( pFirst->
13c00 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20  pPrior ) pFirst 
13c10 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  = pFirst->pPrior
13c20 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e 65  ;.          gene
13c30 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
13c40 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73  pParse, 0, pFirs
13c50 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  t->pEList);.    
13c60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42      }.        iB
13c70 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
13c80 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
13c90 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20          iCont = 
13ca0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
13cb0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
13cc0 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
13cd0 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
13ce0 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
13cf0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13d00 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
13d10 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72  d, unionTab, iBr
13d20 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
13d30 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69  ge(v);.        i
13d40 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
13d50 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
13d60 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63  );.        selec
13d70 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
13d80 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
13d90 20 75 6e 69 6f 6e 54 61 62 2c 0a 20 20 20 20 20   unionTab,.     
13da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13db0 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20     0, 0, &dest, 
13dc0 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a  iCont, iBreak);.
13dd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13de0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
13df0 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
13e00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13e10 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
13e20 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72   unionTab, iStar
13e30 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
13e40 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
13e50 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
13e60 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
13e70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13e80 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13e90 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62  _Close, unionTab
13ea0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
13eb0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
13ec0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73  .    default: as
13ed0 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  sert( p->op==TK_
13ee0 49 4e 54 45 52 53 45 43 54 20 29 3b 20 7b 0a 20  INTERSECT ); {. 
13ef0 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74       int tab1, t
13f00 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  ab2;.      int i
13f10 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
13f20 74 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72  tart;.      Expr
13f30 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73   *pLimit, *pOffs
13f40 65 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  et;.      int ad
13f50 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  dr;.      Select
13f60 44 65 73 74 20 69 6e 74 65 72 73 65 63 74 64 65  Dest intersectde
13f70 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  st;.      int r1
13f80 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45  ;..      /* INTE
13f90 52 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65  RSECT is differe
13fa0 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65  nt from the othe
13fb0 72 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75  rs since it requ
13fc0 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77  ires.      ** tw
13fd0 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
13fe0 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61  es.  Hence it ha
13ff0 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20  s its own case. 
14000 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20   Begin.      ** 
14010 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68  by allocating th
14020 65 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c  e tables we will
14030 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a   need..      */.
14040 20 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61        tab1 = pPa
14050 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
14060 20 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65     tab2 = pParse
14070 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
14080 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
14090 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20  rBy==0 );..     
140a0 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
140b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
140c0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74  OpenEphemeral, t
140d0 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  ab1, 0);.      a
140e0 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
140f0 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20  enEphm[0] == -1 
14100 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72  );.      p->addr
14110 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64  OpenEphm[0] = ad
14120 64 72 3b 0a 20 20 20 20 20 20 66 69 6e 64 52 69  dr;.      findRi
14130 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46  ghtmost(p)->selF
14140 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45  lags |= SF_UsesE
14150 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20  phemeral;.      
14160 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
14170 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  t );..      /* C
14180 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20  ode the SELECTs 
14190 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f  to our left into
141a0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
141b0 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a   "tab1"..      *
141c0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  /.      sqlite3S
141d0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69  electDestInit(&i
141e0 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52  ntersectdest, SR
141f0 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a  T_Union, tab1);.
14200 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
14210 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
14220 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
14230 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
14240 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
14250 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
14260 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b  &intersectdest);
14270 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
14280 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
14290 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
142a0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
142b0 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
142c0 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74  nt SELECT into t
142d0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
142e0 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20  tab2".      */. 
142f0 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
14300 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14310 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
14320 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  l, tab2, 0);.   
14330 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
14340 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d  drOpenEphm[1] ==
14350 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e   -1 );.      p->
14360 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
14370 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d  = addr;.      p-
14380 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
14390 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70     pLimit = p->p
143a0 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
143b0 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
143c0 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70    pOffset = p->p
143d0 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
143e0 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
143f0 20 20 20 20 69 6e 74 65 72 73 65 63 74 64 65 73      intersectdes
14400 74 2e 69 53 44 50 61 72 6d 20 3d 20 74 61 62 32  t.iSDParm = tab2
14410 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
14420 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
14430 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
14440 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
14450 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
14460 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e  t(pParse, p, &in
14470 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20  tersectdest);.  
14480 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
14490 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
144a0 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
144b0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
144c0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
144d0 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  or;.      if( p-
144e0 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50 72 69  >nSelectRow>pPri
144f0 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29  or->nSelectRow )
14500 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
14510 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
14520 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Row;.      sqlit
14530 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
14540 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
14550 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
14560 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
14570 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
14580 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  t;..      /* Gen
14590 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61  erate code to ta
145a0 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74  ke the intersect
145b0 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74  ion of the two t
145c0 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a  emporary.      *
145d0 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20  * tables..      
145e0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
145f0 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
14600 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
14610 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
14620 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  {.        Select
14630 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20   *pFirst = p;.  
14640 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69        while( pFi
14650 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46  rst->pPrior ) pF
14660 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70  irst = pFirst->p
14670 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67  Prior;.        g
14680 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
14690 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46  es(pParse, 0, pF
146a0 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  irst->pEList);. 
146b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72       }.      iBr
146c0 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
146d0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
146e0 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c       iCont = sql
146f0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
14700 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70  l(v);.      comp
14710 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
14720 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72  s(pParse, p, iBr
14730 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
14740 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14750 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31   OP_Rewind, tab1
14760 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43  , iBreak); VdbeC
14770 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
14780 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
14790 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
147a0 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d  ;.      iStart =
147b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
147c0 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c  p2(v, OP_RowKey,
147d0 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20 20   tab1, r1);.    
147e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
147f0 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74  Op4Int(v, OP_Not
14800 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f  Found, tab2, iCo
14810 6e 74 2c 20 72 31 2c 20 30 29 3b 20 56 64 62 65  nt, r1, 0); Vdbe
14820 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
14830 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
14840 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
14850 20 72 31 29 3b 0a 20 20 20 20 20 20 73 65 6c 65   r1);.      sele
14860 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
14870 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
14880 2c 20 74 61 62 31 2c 0a 20 20 20 20 20 20 20 20  , tab1,.        
14890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
148a0 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74   0, &dest, iCont
148b0 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
148c0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
148d0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
148e0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
148f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14900 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53  P_Next, tab1, iS
14910 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65 72  tart); VdbeCover
14920 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
14930 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
14940 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29  Label(v, iBreak)
14950 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
14960 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14970 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b  Close, tab2, 0);
14980 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
14990 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
149a0 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a  lose, tab1, 0);.
149b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
149c0 20 7d 0a 20 20 7d 0a 0a 20 20 65 78 70 6c 61 69   }.  }..  explai
149d0 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73  nComposite(pPars
149e0 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c  e, p->op, iSub1,
149f0 20 69 53 75 62 32 2c 20 70 2d 3e 6f 70 21 3d 54   iSub2, p->op!=T
14a00 4b 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f  K_ALL);..  /* Co
14a10 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20  mpute collating 
14a20 73 65 71 75 65 6e 63 65 73 20 75 73 65 64 20 62  sequences used b
14a30 79 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72  y .  ** temporar
14a40 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20  y tables needed 
14a50 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
14a60 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
14a70 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68  ..  ** Attach th
14a80 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
14a90 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f  ure to all tempo
14aa0 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a  rary tables..  *
14ab0 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74  *.  ** This sect
14ac0 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68  ion is run by th
14ad0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c  e right-most SEL
14ae0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  ECT statement on
14af0 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20  ly..  ** SELECT 
14b00 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68  statements to th
14b10 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b  e left always sk
14b20 69 70 20 74 68 69 73 20 70 61 72 74 2e 20 20 54  ip this part.  T
14b30 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20  he right-most.  
14b40 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20  ** SELECT might 
14b50 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70  also skip this p
14b60 61 72 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f  art if it has no
14b70 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
14b80 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d   and.  ** no tem
14b90 70 20 74 61 62 6c 65 73 20 61 72 65 20 72 65 71  p tables are req
14ba0 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  uired..  */.  if
14bb0 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
14bc0 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
14bd0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20   ){.    int i;  
14be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bf0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
14c00 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79  unter */.    Key
14c10 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20  Info *pKeyInfo; 
14c20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
14c30 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
14c40 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20   for the result 
14c50 73 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63  set */.    Selec
14c60 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  t *pLoop;       
14c70 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
14c80 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20  looping through 
14c90 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
14ca0 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71  s */.    CollSeq
14cb0 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20   **apColl;      
14cc0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
14cd0 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 70 4b  oping through pK
14ce0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20  eyInfo->aColl[] 
14cf0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  */.    int nCol;
14d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d10 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
14d20 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73  f columns in res
14d30 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20  ult set */..    
14d40 61 73 73 65 72 74 28 20 70 2d 3e 70 4e 65 78 74  assert( p->pNext
14d50 3d 3d 30 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20  ==0 );.    nCol 
14d60 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  = p->pEList->nEx
14d70 70 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  pr;.    pKeyInfo
14d80 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
14d90 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c  oAlloc(db, nCol,
14da0 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b   1);.    if( !pK
14db0 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
14dc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
14dd0 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  M;.      goto mu
14de0 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
14df0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
14e00 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e  0, apColl=pKeyIn
14e10 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f  fo->aColl; i<nCo
14e20 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b  l; i++, apColl++
14e30 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c  ){.      *apColl
14e40 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
14e50 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c  llSeq(pParse, p,
14e60 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30   i);.      if( 0
14e70 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  ==*apColl ){.   
14e80 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64       *apColl = d
14e90 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
14ea0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
14eb0 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c   for(pLoop=p; pL
14ec0 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
14ed0 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20  ->pPrior){.     
14ee0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69   for(i=0; i<2; i
14ef0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
14f00 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61   addr = pLoop->a
14f10 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a  ddrOpenEphm[i];.
14f20 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64 72          if( addr
14f30 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
14f40 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e 75  /* If [0] is unu
14f50 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73 20  sed then [1] is 
14f60 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f  also unused.  So
14f70 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20 20   we can.        
14f80 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66 65    ** always safe
14f90 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e  ly abort as soon
14fa0 20 61 73 20 74 68 65 20 66 69 72 73 74 20 75 6e   as the first un
14fb0 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f 75  used slot is fou
14fc0 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  nd */.          
14fd0 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61  assert( pLoop->a
14fe0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30  ddrOpenEphm[1]<0
14ff0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   );.          br
15000 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
15010 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15020 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64  beChangeP2(v, ad
15030 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  dr, nCol);.     
15040 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
15050 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20  angeP4(v, addr, 
15060 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65  (char*)sqlite3Ke
15070 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66  yInfoRef(pKeyInf
15080 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  o),.            
15090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150a0 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
150b0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72       pLoop->addr
150c0 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31  OpenEphm[i] = -1
150d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
150e0 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e      sqlite3KeyIn
150f0 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f  foUnref(pKeyInfo
15100 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65  );.  }..multi_se
15110 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73  lect_end:.  pDes
15120 74 2d 3e 69 53 64 73 74 20 3d 20 64 65 73 74 2e  t->iSdst = dest.
15130 69 53 64 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e  iSdst;.  pDest->
15140 6e 53 64 73 74 20 3d 20 64 65 73 74 2e 6e 53 64  nSdst = dest.nSd
15150 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  st;.  sqlite3Sel
15160 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  ectDelete(db, pD
15170 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75 72 6e  elete);.  return
15180 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
15190 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
151a0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a  POUND_SELECT */.
151b0 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f  ./*.** Code an o
151c0 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
151d0 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e 65   for a coroutine
151e0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
151f0 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  of a.** SELECT s
15200 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  tatment..**.** T
15210 68 65 20 64 61 74 61 20 74 6f 20 62 65 20 6f 75  he data to be ou
15220 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69 6e 65  tput is containe
15230 64 20 69 6e 20 70 49 6e 2d 3e 69 53 64 73 74 2e  d in pIn->iSdst.
15240 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a 20 70    There are.** p
15250 49 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c 75 6d 6e  In->nSdst column
15260 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 20  s to be output. 
15270 20 70 44 65 73 74 20 69 73 20 77 68 65 72 65 20   pDest is where 
15280 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f 75 6c  the output shoul
15290 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a  d.** be sent..**
152a0 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20 69 73  .** regReturn is
152b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
152c0 68 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  he register hold
152d0 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74 69  ing the subrouti
152e0 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64 64  ne.** return add
152f0 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72  ress..**.** If r
15300 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 69 74  egPrev>0 then it
15310 20 69 73 20 74 68 65 20 66 69 72 73 74 20 72 65   is the first re
15320 67 69 73 74 65 72 20 69 6e 20 61 20 76 65 63 74  gister in a vect
15330 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72  or that.** recor
15340 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ds the previous 
15350 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67  output.  mem[reg
15360 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61 67 20  Prev] is a flag 
15370 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a  that is false.**
15380 20 69 66 20 74 68 65 72 65 20 68 61 73 20 62 65   if there has be
15390 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f  en no previous o
153a0 75 74 70 75 74 2e 20 20 49 66 20 72 65 67 50 72  utput.  If regPr
153b0 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65 20 69  ev>0 then code i
153c0 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 74  s.** generated t
153d0 6f 20 73 75 70 70 72 65 73 73 20 64 75 70 6c 69  o suppress dupli
153e0 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f  cates.  pKeyInfo
153f0 20 69 73 20 75 73 65 64 20 66 6f 72 20 63 6f 6d   is used for com
15400 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a  paring.** keys..
15410 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d  **.** If the LIM
15420 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69  IT found in p->i
15430 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68 65 64  Limit is reached
15440 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65  , jump immediate
15450 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e  ly to.** iBreak.
15460 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
15470 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
15480 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72 73 65  routine(.  Parse
15490 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
154a0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
154b0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
154c0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
154d0 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
154e0 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
154f0 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49 6e 2c  SelectDest *pIn,
15500 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75          /* Corou
15510 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67 20 64  tine supplying d
15520 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ata */.  SelectD
15530 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20  est *pDest,     
15540 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 65 6e   /* Where to sen
15550 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  d the data */.  
15560 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c 20 20  int regReturn,  
15570 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
15580 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65  eturn address re
15590 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
155a0 72 65 67 50 72 65 76 2c 20 20 20 20 20 20 20 20  regPrev,        
155b0 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
155c0 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 2e  result register.
155d0 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73 20    No uniqueness 
155e0 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  if 0 */.  KeyInf
155f0 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
15600 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69    /* For compari
15610 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f 75 73  ng with previous
15620 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20   entry */.  int 
15630 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20  iBreak          
15640 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
15650 20 69 66 20 77 65 20 68 69 74 20 74 68 65 20 4c   if we hit the L
15660 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  IMIT */.){.  Vdb
15670 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
15680 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e  Vdbe;.  int iCon
15690 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64 64  tinue;.  int add
156a0 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73 71 6c  r;..  addr = sql
156b0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
156c0 64 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69  ddr(v);.  iConti
156d0 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nue = sqlite3Vdb
156e0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
156f0 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75    /* Suppress du
15700 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49  plicates for UNI
15710 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20  ON, EXCEPT, and 
15720 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a  INTERSECT .  */.
15730 20 20 69 66 28 20 72 65 67 50 72 65 76 20 29 7b    if( regPrev ){
15740 0a 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b  .    int j1, j2;
15750 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65  .    j1 = sqlite
15760 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
15770 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72 65 76  P_IfNot, regPrev
15780 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
15790 76 29 3b 0a 20 20 20 20 6a 32 20 3d 20 73 71 6c  v);.    j2 = sql
157a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
157b0 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49  , OP_Compare, pI
157c0 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65  n->iSdst, regPre
157d0 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c  v+1, pIn->nSdst,
157e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
157f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
15800 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79  char*)sqlite3Key
15810 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f  InfoRef(pKeyInfo
15820 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  ), P4_KEYINFO);.
15830 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15840 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
15850 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75  , j2+2, iContinu
15860 65 2c 20 6a 32 2b 32 29 3b 20 56 64 62 65 43 6f  e, j2+2); VdbeCo
15870 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
15880 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
15890 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 73  re(v, j1);.    s
158a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
158b0 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49 6e  (v, OP_Copy, pIn
158c0 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76  ->iSdst, regPrev
158d0 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d 31  +1, pIn->nSdst-1
158e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
158f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
15900 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 50 72  nteger, 1, regPr
15910 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ev);.  }.  if( p
15920 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
15930 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
15940 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65   0;..  /* Suppre
15950 73 73 20 74 68 65 20 66 69 72 73 74 20 4f 46 46  ss the first OFF
15960 53 45 54 20 65 6e 74 72 69 65 73 20 69 66 20 74  SET entries if t
15970 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45  here is an OFFSE
15980 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  T clause.  */.  
15990 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d  codeOffset(v, p-
159a0 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69  >iOffset, iConti
159b0 6e 75 65 29 3b 0a 0a 20 20 73 77 69 74 63 68 28  nue);..  switch(
159c0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29 7b   pDest->eDest ){
159d0 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68  .    /* Store th
159e0 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61  e result as data
159f0 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20   using a unique 
15a00 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  key..    */.    
15a10 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a  case SRT_Table:.
15a20 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68      case SRT_Eph
15a30 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69  emTab: {.      i
15a40 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
15a50 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
15a60 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20  );.      int r2 
15a70 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
15a80 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
15a90 20 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65     testcase( pDe
15aa0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 54  st->eDest==SRT_T
15ab0 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65  able );.      te
15ac0 73 74 63 61 73 65 28 20 70 44 65 73 74 2d 3e 65  stcase( pDest->e
15ad0 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
15ae0 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ab );.      sqli
15af0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
15b00 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
15b10 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d  pIn->iSdst, pIn-
15b20 3e 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20 20 20  >nSdst, r1);.   
15b30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15b40 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
15b50 77 69 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  wid, pDest->iSDP
15b60 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  arm, r2);.      
15b70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15b80 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
15b90 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
15ba0 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  r1, r2);.      s
15bb0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
15bc0 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
15bd0 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  END);.      sqli
15be0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
15bf0 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
15c00 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
15c10 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
15c20 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
15c30 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
15c40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15c50 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20  SUBQUERY.    /* 
15c60 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69  If we are creati
15c70 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20  ng a set for an 
15c80 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54  "expr IN (SELECT
15c90 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74   ...)" construct
15ca0 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
15cb0 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20  ere should be a 
15cc0 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74  single item on t
15cd0 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65  he stack.  Write
15ce0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65   this.    ** ite
15cf0 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74  m into the set t
15d00 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20  able with bogus 
15d10 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
15d20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
15d30 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  .      int r1;. 
15d40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
15d50 2d 3e 6e 53 64 73 74 3d 3d 31 20 29 3b 0a 20 20  ->nSdst==1 );.  
15d60 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64      pDest->affSd
15d70 73 74 20 3d 20 0a 20 20 20 20 20 20 20 20 20 73  st = .         s
15d80 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
15d90 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d  inity(p->pEList-
15da0 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65  >a[0].pExpr, pDe
15db0 73 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20 20  st->affSdst);.  
15dc0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
15dd0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
15de0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
15df0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
15e00 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49  P_MakeRecord, pI
15e10 6e 2d 3e 69 53 64 73 74 2c 20 31 2c 20 72 31 2c  n->iSdst, 1, r1,
15e20 20 26 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74   &pDest->affSdst
15e30 2c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ,1);.      sqlit
15e40 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
15e50 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
15e60 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31 29  , pIn->iSdst, 1)
15e70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
15e80 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15e90 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74  IdxInsert, pDest
15ea0 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 29 3b 0a  ->iSDParm, r1);.
15eb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
15ec0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
15ed0 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
15ee0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
15ef0 20 30 20 20 2f 2a 20 4e 65 76 65 72 20 6f 63 63   0  /* Never occ
15f00 75 72 73 20 6f 6e 20 61 6e 20 4f 52 44 45 52 20  urs on an ORDER 
15f10 42 59 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  BY query */.    
15f20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78  /* If any row ex
15f30 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ist in the resul
15f40 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68  t set, record th
15f50 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72  at fact and abor
15f60 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  t..    */.    ca
15f70 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b  se SRT_Exists: {
15f80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15f90 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
15fa0 6e 74 65 67 65 72 2c 20 31 2c 20 70 44 65 73 74  nteger, 1, pDest
15fb0 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  ->iSDParm);.    
15fc0 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
15fd0 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69  lause will termi
15fe0 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f  nate the loop fo
15ff0 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
16000 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
16010 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  f..    /* If thi
16020 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65  s is a scalar se
16030 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72  lect that is par
16040 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
16050 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
16060 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
16070 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72  s in the appropr
16080 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iate memory cell
16090 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20   and break out. 
160a0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61     ** of the sca
160b0 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
160c0 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
160d0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
160e0 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 29   pIn->nSdst==1 )
160f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
16100 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
16110 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
16120 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
16130 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  1);.      /* The
16140 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
16150 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74  ll jump out of t
16160 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
16170 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
16180 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23     }.#endif /* #
16190 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
161a0 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
161b0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c      /* The resul
161c0 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ts are stored in
161d0 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
161e0 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20  egisters.    ** 
161f0 73 74 61 72 74 69 6e 67 20 61 74 20 70 44 65 73  starting at pDes
16200 74 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 6e 20  t->iSdst.  Then 
16210 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79  the co-routine y
16220 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ields..    */.  
16230 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75    case SRT_Corou
16240 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66  tine: {.      if
16250 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d  ( pDest->iSdst==
16260 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
16270 73 74 2d 3e 69 53 64 73 74 20 3d 20 73 71 6c 69  st->iSdst = sqli
16280 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
16290 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64  pParse, pIn->nSd
162a0 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65  st);.        pDe
162b0 73 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d  st->nSdst = pIn-
162c0 3e 6e 53 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a  >nSdst;.      }.
162d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
162e0 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
162f0 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44  , pIn->iSdst, pD
16300 65 73 74 2d 3e 69 53 64 73 74 2c 20 70 44 65 73  est->iSdst, pDes
16310 74 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  t->nSdst);.     
16320 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16330 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
16340 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b  pDest->iSDParm);
16350 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16360 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
16370 6f 6e 65 20 6f 66 20 74 68 65 20 61 62 6f 76 65  one of the above
16380 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
16390 74 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75  t destination mu
163a0 73 74 20 62 65 0a 20 20 20 20 2a 2a 20 53 52 54  st be.    ** SRT
163b0 5f 4f 75 74 70 75 74 2e 20 20 54 68 69 73 20 72  _Output.  This r
163c0 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
163d0 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6e 79 20  called with any 
163e0 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 65 73  other.    ** des
163f0 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72 20 74  tination other t
16400 68 61 6e 20 74 68 65 20 6f 6e 65 73 20 68 61 6e  han the ones han
16410 64 6c 65 64 20 61 62 6f 76 65 20 6f 72 20 53 52  dled above or SR
16420 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a  T_Output..    **
16430 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f  .    ** For SRT_
16440 4f 75 74 70 75 74 2c 20 72 65 73 75 6c 74 73 20  Output, results 
16450 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20  are stored in a 
16460 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
16470 73 74 65 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20  sters.  .    ** 
16480 54 68 65 6e 20 74 68 65 20 4f 50 5f 52 65 73 75  Then the OP_Resu
16490 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20 69 73 20  ltRow opcode is 
164a0 75 73 65 64 20 74 6f 20 63 61 75 73 65 20 73 71  used to cause sq
164b0 6c 69 74 65 33 5f 73 74 65 70 28 29 20 74 6f 0a  lite3_step() to.
164c0 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68      ** return th
164d0 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 72 65  e next row of re
164e0 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sult..    */.   
164f0 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
16500 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d    assert( pDest-
16510 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  >eDest==SRT_Outp
16520 75 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ut );.      sqli
16530 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16540 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70   OP_ResultRow, p
16550 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
16560 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
16570 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
16580 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
16590 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  rse, pIn->iSdst,
165a0 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
165b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
165c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
165d0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
165e0 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49  e loop if the LI
165f0 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 0a  MIT is reached..
16600 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c    */.  if( p->iL
16610 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
16620 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
16630 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69   OP_IfZero, p->i
16640 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c 20 2d  Limit, iBreak, -
16650 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
16660 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  (v);.  }..  /* G
16670 65 6e 65 72 61 74 65 20 74 68 65 20 73 75 62 72  enerate the subr
16680 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20  outine return.  
16690 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
166a0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
166b0 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71  iContinue);.  sq
166c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
166d0 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
166e0 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74  gReturn);..  ret
166f0 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
16700 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63  ** Alternative c
16710 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63  ompound select c
16720 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f  ode generator fo
16730 72 20 63 61 73 65 73 20 77 68 65 6e 20 74 68 65  r cases when the
16740 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45  re.** is an ORDE
16750 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  R BY clause..**.
16760 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20 71  ** We assume a q
16770 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c  uery of the foll
16780 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  owing form:.**.*
16790 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e  *      <selectA>
167a0 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73    <operator>  <s
167b0 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42  electB>  ORDER B
167c0 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a  Y <orderbylist>.
167d0 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e  **.** <operator>
167e0 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e   is one of UNION
167f0 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43   ALL, UNION, EXC
16800 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43  EPT, or INTERSEC
16810 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20  T.  The idea.** 
16820 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20  is to code both 
16830 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73  <selectA> and <s
16840 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68 65  electB> with the
16850 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
16860 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e   as.** co-routin
16870 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68  es.  Then run th
16880 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e  e co-routines in
16890 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65   parallel and me
168a0 72 67 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a  rge the results.
168b0 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  ** into the outp
168c0 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e  ut.  In addition
168d0 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f   to the two coro
168e0 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73  utines (called s
168f0 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65  electA and.** se
16900 6c 65 63 74 42 29 20 74 68 65 72 65 20 61 72 65  lectB) there are
16910 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a   7 subroutines:.
16920 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20  **.**    outA:  
16930 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75    Move the outpu
16940 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41  t of the selectA
16950 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20   coroutine into 
16960 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20  the output.**   
16970 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
16980 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e   compound query.
16990 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20  .**.**    outB: 
169a0 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70     Move the outp
169b0 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ut of the select
169c0 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f  B coroutine into
169d0 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20   the output.**  
169e0 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
169f0 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
16a00 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74  .  (Only generat
16a10 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64  ed for UNION and
16a20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
16a30 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45  UNION ALL.  EXCE
16a40 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43  PT and INSERTSEC
16a50 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61  T never output a
16a60 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20   row that.**    
16a70 20 20 20 20 20 20 20 20 20 61 70 70 65 61 72 73           appears
16a80 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a   only in B.).**.
16a90 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43  **    AltB:    C
16aa0 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
16ab0 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f   is data from bo
16ac0 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  th coroutines an
16ad0 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  d A<B..**.**    
16ae0 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  AeqB:    Called 
16af0 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61  when there is da
16b00 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72  ta from both cor
16b10 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42  outines and A==B
16b20 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a  ..**.**    AgtB:
16b30 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
16b40 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72  there is data fr
16b50 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e  om both coroutin
16b60 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a  es and A>B..**.*
16b70 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61  *    EofA:    Ca
16b80 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69  lled when data i
16b90 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d  s exhausted from
16ba0 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20   selectA..**.** 
16bb0 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c     EofB:    Call
16bc0 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20  ed when data is 
16bd0 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73  exhausted from s
16be0 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68  electB..**.** Th
16bf0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
16c00 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20 66   of the latter f
16c10 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20  ive subroutines 
16c20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20  depend on which 
16c30 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69  .** <operator> i
16c40 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a  s used:.**.**.**
16c50 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49               UNI
16c60 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55  ON ALL         U
16c70 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20  NION            
16c80 45 58 43 45 50 54 20 20 20 20 20 20 20 20 20 20  EXCEPT          
16c90 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20  INTERSECT.**    
16ca0 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d        ----------
16cb0 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---  -----------
16cc0 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ------  --------
16cd0 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ------  --------
16ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41  ---------.**   A
16cf0 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78  ltB:   outA, nex
16d00 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  tA      outA, ne
16d10 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20  xtA       outA, 
16d20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65  nextA         ne
16d30 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42  xtA.**.**   AeqB
16d40 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20  :   outA, nextA 
16d50 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20          nextA   
16d60 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20            nextA 
16d70 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65          outA, ne
16d80 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42  xtA.**.**   AgtB
16d90 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20  :   outB, nextB 
16da0 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42       outB, nextB
16db0 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 20            nextB 
16dc0 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42             nextB
16dd0 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20  .**.**   EofA:  
16de0 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
16df0 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
16e00 20 20 20 20 20 20 20 68 61 6c 74 20 20 20 20 20         halt     
16e10 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a          halt.**.
16e20 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74  **   EofB:   out
16e30 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75  A, nextA      ou
16e40 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
16e50 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
16e60 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49      halt.**.** I
16e70 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42  n the AltB, AeqB
16e80 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f  , and AgtB subro
16e90 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f  utines, an EOF o
16ea0 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  n A following ne
16eb0 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e  xtA.** causes an
16ec0 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20   immediate jump 
16ed0 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45  to EofA and an E
16ee0 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e  OF on B followin
16ef0 67 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a  g nextB causes.*
16f00 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a  * an immediate j
16f10 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69  ump to EofB.  Wi
16f20 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f  thin EofA and Eo
16f30 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65  fB, and EOF on e
16f40 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f  ntry or.** follo
16f50 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65  wing nextX cause
16f60 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  s a jump to the 
16f70 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63  end of the selec
16f80 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  t processing..**
16f90 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65  .** Duplicate re
16fa0 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49  moval in the UNI
16fb0 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20  ON, EXCEPT, and 
16fc0 49 4e 54 45 52 53 45 43 54 20 63 61 73 65 73 20  INTERSECT cases 
16fd0 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69  is handled.** wi
16fe0 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20  thin the output 
16ff0 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  subroutine.  The
17000 20 72 65 67 50 72 65 76 20 72 65 67 69 73 74 65   regPrev registe
17010 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20  r set holds the 
17020 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75  previously.** ou
17030 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63  tput value.  A c
17040 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64  omparison is mad
17050 65 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 76  e against this v
17060 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74  alue and the out
17070 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65  put.** is skippe
17080 64 20 69 66 20 74 68 65 20 6e 65 78 74 20 72 65  d if the next re
17090 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74  sults would be t
170a0 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70  he same as the p
170b0 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54  revious..**.** T
170c0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
170d0 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70  n plan is to imp
170e0 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63  lement the two c
170f0 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65  oroutines and se
17100 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e  ven.** subroutin
17110 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70  es first, then p
17120 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c  ut the control l
17130 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f 74 74  ogic at the bott
17140 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a  om.  Like this:.
17150 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67  **.**          g
17160 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20  oto Init.**     
17170 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66  coA: coroutine f
17180 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20 28 41  or left query (A
17190 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f  ).**     coB: co
171a0 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68  routine for righ
171b0 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20  t query (B).**  
171c0 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f    outA: output o
171d0 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20  ne row of A.**  
171e0 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f    outB: output o
171f0 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49  ne row of B (UNI
17200 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c  ON and UNION ALL
17210 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66   only).**    Eof
17220 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66  A: ....**    Eof
17230 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74  B: ....**    Alt
17240 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71  B: ....**    Aeq
17250 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74  B: ....**    Agt
17260 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69  B: ....**    Ini
17270 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f  t: initialize co
17280 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72  routine register
17290 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69  s.**          yi
172a0 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20  eld coA.**      
172b0 20 20 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f      if eof(A) go
172c0 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20  to EofA.**      
172d0 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a      yield coB.**
172e0 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66            if eof
172f0 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a  (B) goto EofB.**
17300 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72      Cmpr: Compar
17310 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20  e A, B.**       
17320 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65     Jump AltB, Ae
17330 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20  qB, AgtB.**     
17340 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57  End: ....**.** W
17350 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71  e call AltB, Aeq
17360 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61  B, AgtB, EofA, a
17370 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74  nd EofB "subrout
17380 69 6e 65 73 22 20 62 75 74 20 74 68 65 79 20 61  ines" but they a
17390 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c  re not.** actual
173a0 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20  ly called using 
173b0 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20 64  Gosub and they d
173c0 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45  o not Return.  E
173d0 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f  ofA and EofB loo
173e0 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64  p.** until all d
173f0 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64  ata is exhausted
17400 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68   then jump to th
17410 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41  e "end" labe.  A
17420 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e  ltB, AeqB,.** an
17430 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65  d AgtB jump to e
17440 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f  ither L2 or to o
17450 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f  ne of EofA or Eo
17460 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  fB..*/.#ifndef S
17470 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
17480 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69  UND_SELECT.stati
17490 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
174a0 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73  tOrderBy(.  Pars
174b0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
174c0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
174d0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
174e0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
174f0 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
17500 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
17510 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
17520 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
17530 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
17540 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
17550 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ults */.){.  int
17560 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
17570 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
17580 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ers */.  Select 
17590 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f  *pPrior;       /
175a0 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54  * Another SELECT
175b0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
175c0 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64  our left */.  Vd
175d0 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
175e0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
175f0 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42  code to this VDB
17600 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  E */.  SelectDes
17610 74 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20  t destA;     /* 
17620 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20  Destination for 
17630 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20  coroutine A */. 
17640 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
17650 42 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e  B;     /* Destin
17660 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74  ation for corout
17670 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72  ine B */.  int r
17680 65 67 41 64 64 72 41 3b 20 20 20 20 20 20 20 20  egAddrA;        
17690 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
176a0 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
176b0 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  A coroutine */. 
176c0 20 69 6e 74 20 72 65 67 41 64 64 72 42 3b 20 20   int regAddrB;  
176d0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
176e0 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  s register for s
176f0 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e  elect-B coroutin
17700 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53  e */.  int addrS
17710 65 6c 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20  electA;      /* 
17720 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73  Address of the s
17730 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e  elect-A coroutin
17740 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53  e */.  int addrS
17750 65 6c 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20  electB;      /* 
17760 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73  Address of the s
17770 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e  elect-B coroutin
17780 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75  e */.  int regOu
17790 74 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tA;          /* 
177a0 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
177b0 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d   for the output-
177c0 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  A subroutine */.
177d0 20 20 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20    int regOutB;  
177e0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
177f0 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
17800 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62  the output-B sub
17810 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
17820 20 61 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20   addrOutA;      
17830 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
17840 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75   the output-A su
17850 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
17860 74 20 61 64 64 72 4f 75 74 42 20 3d 20 30 3b 20  t addrOutB = 0; 
17870 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
17880 66 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73  f the output-B s
17890 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
178a0 6e 74 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20  nt addrEofA;    
178b0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
178c0 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d  of the select-A-
178d0 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75  exhausted subrou
178e0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
178f0 64 72 45 6f 66 41 5f 6e 6f 42 3b 20 20 20 20 20  drEofA_noB;     
17900 2f 2a 20 41 6c 74 65 72 6e 61 74 65 20 61 64 64  /* Alternate add
17910 72 45 6f 66 41 20 69 66 20 42 20 69 73 20 75 6e  rEofA if B is un
17920 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20  initialized */. 
17930 20 69 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20   int addrEofB;  
17940 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
17950 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
17960 42 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72  B-exhausted subr
17970 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
17980 61 64 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20  addrAltB;       
17990 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
179a0 74 68 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69  the A<B subrouti
179b0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
179c0 41 65 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  AeqB;         /*
179d0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
179e0 41 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20  A==B subroutine 
179f0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74  */.  int addrAgt
17a00 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
17a10 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42  dress of the A>B
17a20 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
17a30 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20   int regLimitA; 
17a40 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20         /* Limit 
17a50 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
17a60 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72  ect-A */.  int r
17a70 65 67 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20  egLimitB;       
17a80 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74   /* Limit regist
17a90 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20  er for select-A 
17aa0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76  */.  int regPrev
17ab0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ;          /* A 
17ac0 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65  range of registe
17ad0 72 73 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69  rs to hold previ
17ae0 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  ous output */.  
17af0 69 6e 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20  int savedLimit; 
17b00 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76        /* Saved v
17b10 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69  alue of p->iLimi
17b20 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64  t */.  int saved
17b30 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  Offset;      /* 
17b40 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70  Saved value of p
17b50 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69  ->iOffset */.  i
17b60 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20  nt labelCmpr;   
17b70 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f       /* Label fo
17b80 72 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  r the start of t
17b90 68 65 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74  he merge algorit
17ba0 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65  hm */.  int labe
17bb0 6c 45 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a  lEnd;         /*
17bc0 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65   Label for the e
17bd0 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c  nd of the overal
17be0 6c 20 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f  l SELECT stmt */
17bf0 0a 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20  .  int j1;      
17c00 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
17c10 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68   instructions th
17c20 61 74 20 67 65 74 20 72 65 74 61 72 67 65 74 74  at get retargett
17c30 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20  ed */.  int op; 
17c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17c50 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20   One of TK_ALL, 
17c60 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43  TK_UNION, TK_EXC
17c70 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43  EPT, TK_INTERSEC
17c80 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  T */.  KeyInfo *
17c90 70 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20  pKeyDup = 0; /* 
17ca0 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72  Comparison infor
17cb0 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69  mation for dupli
17cc0 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a  cate removal */.
17cd0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d    KeyInfo *pKeyM
17ce0 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61  erge;   /* Compa
17cf0 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  rison informatio
17d00 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f  n for merging ro
17d10 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ws */.  sqlite3 
17d20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  *db;          /*
17d30 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
17d40 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69  tion */.  ExprLi
17d50 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
17d60 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
17d70 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
17d80 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  nOrderBy;       
17d90 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
17da0 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45  erms in the ORDE
17db0 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
17dc0 20 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20   int *aPermute; 
17dd0 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e         /* Mappin
17de0 67 20 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20  g from ORDER BY 
17df0 74 65 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20  terms to result 
17e00 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23  set columns */.#
17e10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17e20 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74  IT_EXPLAIN.  int
17e30 20 69 53 75 62 31 3b 20 20 20 20 20 20 20 20 20   iSub1;         
17e40 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20     /* EQP id of 
17e50 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20  left-hand query 
17e60 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 3b 20  */.  int iSub2; 
17e70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51             /* EQ
17e80 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61  P id of right-ha
17e90 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64  nd query */.#end
17ea0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  if..  assert( p-
17eb0 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a  >pOrderBy!=0 );.
17ec0 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 44 75    assert( pKeyDu
17ed0 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61  p==0 ); /* "Mana
17ee0 67 65 64 22 20 63 6f 64 65 20 6e 65 65 64 73 20  ged" code needs 
17ef0 74 68 69 73 2e 20 20 54 69 63 6b 65 74 20 23 33  this.  Ticket #3
17f00 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70  382. */.  db = p
17f10 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d  Parse->db;.  v =
17f20 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
17f30 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
17f40 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 72 65 61  ;       /* Alrea
17f50 64 79 20 74 68 72 6f 77 6e 20 74 68 65 20 65 72  dy thrown the er
17f60 72 6f 72 20 69 66 20 56 44 42 45 20 61 6c 6c 6f  ror if VDBE allo
17f70 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61  c failed */.  la
17f80 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65 33  belEnd = sqlite3
17f90 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
17fa0 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20  ;.  labelCmpr = 
17fb0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
17fc0 61 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20  abel(v);...  /* 
17fd0 50 61 74 63 68 20 75 70 20 74 68 65 20 4f 52 44  Patch up the ORD
17fe0 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a  ER BY clause.  *
17ff0 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20  /.  op = p->op; 
18000 20 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e   .  pPrior = p->
18010 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74  pPrior;.  assert
18020 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  ( pPrior->pOrder
18030 42 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65  By==0 );.  pOrde
18040 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
18050 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  y;.  assert( pOr
18060 64 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65  derBy );.  nOrde
18070 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  rBy = pOrderBy->
18080 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72  nExpr;..  /* For
18090 20 6f 70 65 72 61 74 6f 72 73 20 6f 74 68 65 72   operators other
180a0 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20   than UNION ALL 
180b0 77 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20  we have to make 
180c0 73 75 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74  sure that.  ** t
180d0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
180e0 73 65 20 63 6f 76 65 72 73 20 65 76 65 72 79 20  se covers every 
180f0 74 65 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75  term of the resu
18100 6c 74 20 73 65 74 2e 20 20 41 64 64 0a 20 20 2a  lt set.  Add.  *
18110 2a 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 4f  * terms to the O
18120 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
18130 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a  s necessary..  *
18140 2f 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41  /.  if( op!=TK_A
18150 4c 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  LL ){.    for(i=
18160 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  1; db->mallocFai
18170 6c 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e  led==0 && i<=p->
18180 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
18190 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
181a0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
181b0 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f  *pItem;.      fo
181c0 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72  r(j=0, pItem=pOr
181d0 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64  derBy->a; j<nOrd
181e0 65 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d  erBy; j++, pItem
181f0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ++){.        ass
18200 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  ert( pItem->u.x.
18210 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b  iOrderByCol>0 );
18220 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
18230 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
18240 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a  Col==i ) break;.
18250 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
18260 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b  ( j==nOrderBy ){
18270 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
18280 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
18290 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52  r(db, TK_INTEGER
182a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
182b0 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
182c0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
182d0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  .        pNew->f
182e0 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61  lags |= EP_IntVa
182f0 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  lue;.        pNe
18300 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b  w->u.iValue = i;
18310 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42  .        pOrderB
18320 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
18330 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
18340 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77  , pOrderBy, pNew
18350 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
18360 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64 65 72  OrderBy ) pOrder
18370 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b  By->a[nOrderBy++
18380 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
18390 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20  l = (u16)i;.    
183a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
183b0 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
183c0 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75  comparison permu
183d0 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e  tation and keyin
183e0 66 6f 20 74 68 61 74 20 69 73 20 75 73 65 64 20  fo that is used 
183f0 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65  with.  ** the pe
18400 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74  rmutation used t
18410 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
18420 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77  he next.  ** row
18430 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65   of results come
18440 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f  s from selectA o
18450 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f  r selectB.  Also
18460 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20   add explicit.  
18470 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f  ** collations to
18480 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
18490 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68  ause terms so th
184a0 61 74 20 77 68 65 6e 20 74 68 65 20 73 75 62 71  at when the subq
184b0 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74  ueries.  ** to t
184c0 68 65 20 72 69 67 68 74 20 61 6e 64 20 74 68 65  he right and the
184d0 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75 61   left are evalua
184e0 74 65 64 2c 20 74 68 65 79 20 75 73 65 20 74 68  ted, they use th
184f0 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63  e correct.  ** c
18500 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  ollation..  */. 
18510 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69   aPermute = sqli
18520 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
18530 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e  b, sizeof(int)*n
18540 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20  OrderBy);.  if( 
18550 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20  aPermute ){.    
18560 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
18570 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
18580 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
18590 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 6e  pOrderBy->a; i<n
185a0 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49  OrderBy; i++, pI
185b0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  tem++){.      as
185c0 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78  sert( pItem->u.x
185d0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 0a 20  .iOrderByCol>0. 
185e0 20 20 20 20 20 20 20 20 20 26 26 20 70 49 74 65           && pIte
185f0 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
18600 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ol<=p->pEList->n
18610 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 50  Expr );.      aP
18620 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74 65  ermute[i] = pIte
18630 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
18640 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ol - 1;.    }.  
18650 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 6d 75    pKeyMerge = mu
18660 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
18670 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
18680 70 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  p, 1);.  }else{.
18690 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20      pKeyMerge = 
186a0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  0;.  }..  /* Rea
186b0 74 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20  ttach the ORDER 
186c0 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65  BY clause to the
186d0 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70   query..  */.  p
186e0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
186f0 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d  derBy;.  pPrior-
18700 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69  >pOrderBy = sqli
18710 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
18720 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65  Parse->db, pOrde
18730 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41  rBy, 0);..  /* A
18740 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20  llocate a range 
18750 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  of temporary reg
18760 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b  isters and the K
18770 65 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20  eyInfo needed.  
18780 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63  ** for the logic
18790 20 74 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75   that removes du
187a0 70 6c 69 63 61 74 65 20 72 65 73 75 6c 74 20 72  plicate result r
187b0 6f 77 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a  ows when the.  *
187c0 2a 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e  * operator is UN
187d0 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20  ION, EXCEPT, or 
187e0 49 4e 54 45 52 53 45 43 54 20 28 62 75 74 20 6e  INTERSECT (but n
187f0 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20  ot UNION ALL).. 
18800 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
18810 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50  _ALL ){.    regP
18820 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  rev = 0;.  }else
18830 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20  {.    int nExpr 
18840 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  = p->pEList->nEx
18850 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
18860 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20  nOrderBy>=nExpr 
18870 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
18880 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72  led );.    regPr
18890 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ev = pParse->nMe
188a0 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
188b0 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b 31  >nMem += nExpr+1
188c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
188d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
188e0 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65  teger, 0, regPre
188f0 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20  v);.    pKeyDup 
18900 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
18910 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2c  Alloc(db, nExpr,
18920 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65   1);.    if( pKe
18930 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20 61 73  yDup ){.      as
18940 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79  sert( sqlite3Key
18950 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
18960 70 4b 65 79 44 75 70 29 20 29 3b 0a 20 20 20 20  pKeyDup) );.    
18970 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
18980 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
18990 20 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c    pKeyDup->aColl
189a0 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  [i] = multiSelec
189b0 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
189c0 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20   p, i);.        
189d0 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72  pKeyDup->aSortOr
189e0 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  der[i] = 0;.    
189f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a    }.    }.  }. .
18a00 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20 74 68    /* Separate th
18a10 65 20 6c 65 66 74 20 61 6e 64 20 74 68 65 20 72  e left and the r
18a20 69 67 68 74 20 71 75 65 72 79 20 66 72 6f 6d 20  ight query from 
18a30 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f  one another.  */
18a40 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30  .  p->pPrior = 0
18a50 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78  ;.  pPrior->pNex
18a60 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
18a70 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75  ResolveOrderGrou
18a80 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70  pBy(pParse, p, p
18a90 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44  ->pOrderBy, "ORD
18aa0 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50 72 69  ER");.  if( pPri
18ab0 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b  or->pPrior==0 ){
18ac0 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f  .    sqlite3Reso
18ad0 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28  lveOrderGroupBy(
18ae0 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
18af0 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
18b00 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d 0a  , "ORDER");.  }.
18b10 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
18b20 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72  e limit register
18b30 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69  s */.  computeLi
18b40 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
18b50 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e 64  rse, p, labelEnd
18b60 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  );.  if( p->iLim
18b70 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c  it && op==TK_ALL
18b80 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74   ){.    regLimit
18b90 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
18ba0 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74  em;.    regLimit
18bb0 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  B = ++pParse->nM
18bc0 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
18bd0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18be0 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65 74  Copy, p->iOffset
18bf0 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 20   ? p->iOffset+1 
18c00 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20 20  : p->iLimit,.   
18c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
18c30 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20 73  egLimitA);.    s
18c40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18c50 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67  (v, OP_Copy, reg
18c60 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69 74  LimitA, regLimit
18c70 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  B);.  }else{.   
18c80 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72 65 67   regLimitA = reg
18c90 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d 0a  LimitB = 0;.  }.
18ca0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
18cb0 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
18cc0 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20  t);.  p->pLimit 
18cd0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  = 0;.  sqlite3Ex
18ce0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
18cf0 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d 3e 70  pOffset);.  p->p
18d00 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 72  Offset = 0;..  r
18d10 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72  egAddrA = ++pPar
18d20 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41  se->nMem;.  regA
18d30 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ddrB = ++pParse-
18d40 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41  >nMem;.  regOutA
18d50 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
18d60 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20 2b  m;.  regOutB = +
18d70 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
18d80 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
18d90 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20 53  stInit(&destA, S
18da0 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  RT_Coroutine, re
18db0 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74  gAddrA);.  sqlit
18dc0 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
18dd0 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f 72  (&destB, SRT_Cor
18de0 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42  outine, regAddrB
18df0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
18e00 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f  e a coroutine to
18e10 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45   evaluate the SE
18e20 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
18e30 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20  o the.  ** left 
18e40 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
18e50 6f 70 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22  operator - the "
18e60 41 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a  A" select..  */.
18e70 20 20 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20    addrSelectA = 
18e80 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
18e90 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20  ntAddr(v) + 1;. 
18ea0 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j1 = sqlite3Vdb
18eb0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
18ec0 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  itCoroutine, reg
18ed0 41 64 64 72 41 2c 20 30 2c 20 61 64 64 72 53 65  AddrA, 0, addrSe
18ee0 6c 65 63 74 41 29 3b 0a 20 20 56 64 62 65 43 6f  lectA);.  VdbeCo
18ef0 6d 6d 65 6e 74 28 28 76 2c 20 22 6c 65 66 74 20  mment((v, "left 
18f00 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 70 50 72  SELECT"));.  pPr
18f10 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65  ior->iLimit = re
18f20 67 4c 69 6d 69 74 41 3b 0a 20 20 65 78 70 6c 61  gLimitA;.  expla
18f30 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
18f40 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b1, pParse->iNex
18f50 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71  tSelectId);.  sq
18f60 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
18f70 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73  se, pPrior, &des
18f80 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  tA);.  sqlite3Vd
18f90 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45  beAddOp1(v, OP_E
18fa0 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  ndCoroutine, reg
18fb0 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65  AddrA);.  sqlite
18fc0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
18fd0 20 6a 31 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65   j1);..  /* Gene
18fe0 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65  rate a coroutine
18ff0 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
19000 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
19010 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72  t on .  ** the r
19020 69 67 68 74 20 2d 20 74 68 65 20 22 42 22 20 73  ight - the "B" s
19030 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64  elect.  */.  add
19040 72 53 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74  rSelectB = sqlit
19050 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
19060 72 28 76 29 20 2b 20 31 3b 0a 20 20 6a 31 20 3d  r(v) + 1;.  j1 =
19070 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19080 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
19090 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42  outine, regAddrB
190a0 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74 42  , 0, addrSelectB
190b0 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
190c0 28 28 76 2c 20 22 72 69 67 68 74 20 53 45 4c 45  ((v, "right SELE
190d0 43 54 22 29 29 3b 0a 20 20 73 61 76 65 64 4c 69  CT"));.  savedLi
190e0 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b  mit = p->iLimit;
190f0 0a 20 20 73 61 76 65 64 4f 66 66 73 65 74 20 3d  .  savedOffset =
19100 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70   p->iOffset;.  p
19110 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69  ->iLimit = regLi
19120 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73  mitB;.  p->iOffs
19130 65 74 20 3d 20 30 3b 20 20 0a 20 20 65 78 70 6c  et = 0;  .  expl
19140 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
19150 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub2, pParse->iNe
19160 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73  xtSelectId);.  s
19170 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
19180 72 73 65 2c 20 70 2c 20 26 64 65 73 74 42 29 3b  rse, p, &destB);
19190 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73  .  p->iLimit = s
191a0 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e  avedLimit;.  p->
191b0 69 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64 4f  iOffset = savedO
191c0 66 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65 33  ffset;.  sqlite3
191d0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
191e0 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20 72  _EndCoroutine, r
191f0 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20  egAddrB);..  /* 
19200 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
19210 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
19220 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ts the current r
19230 6f 77 20 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a  ow of the A.  **
19240 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e   select as the n
19250 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f  ext output row o
19260 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
19270 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64  elect..  */.  Vd
19280 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
19290 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e  , "Output routin
192a0 65 20 66 6f 72 20 41 22 29 29 3b 0a 20 20 61 64  e for A"));.  ad
192b0 64 72 4f 75 74 41 20 3d 20 67 65 6e 65 72 61 74  drOutA = generat
192c0 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
192d0 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
192e0 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64             p, &d
192f0 65 73 74 41 2c 20 70 44 65 73 74 2c 20 72 65 67  estA, pDest, reg
19300 4f 75 74 41 2c 0a 20 20 20 20 20 20 20 20 20 20  OutA,.          
19310 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20         regPrev, 
19320 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e  pKeyDup, labelEn
19330 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65  d);.  .  /* Gene
19340 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
19350 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 74  e that outputs t
19360 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f  he current row o
19370 66 20 74 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c  f the B.  ** sel
19380 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74 20  ect as the next 
19390 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68  output row of th
193a0 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
193b0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  t..  */.  if( op
193c0 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d  ==TK_ALL || op==
193d0 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20  TK_UNION ){.    
193e0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
193f0 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74  (v, "Output rout
19400 69 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a 20 20  ine for B"));.  
19410 20 20 61 64 64 72 4f 75 74 42 20 3d 20 67 65 6e    addrOutB = gen
19420 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f  erateOutputSubro
19430 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20  utine(pParse,.  
19440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
19450 2c 20 26 64 65 73 74 42 2c 20 70 44 65 73 74 2c  , &destB, pDest,
19460 20 72 65 67 4f 75 74 42 2c 0a 20 20 20 20 20 20   regOutB,.      
19470 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50 72             regPr
19480 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62  ev, pKeyDup, lab
19490 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 20 20 73 71  elEnd);.  }.  sq
194a0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
194b0 66 28 70 4b 65 79 44 75 70 29 3b 0a 0a 20 20 2f  f(pKeyDup);..  /
194c0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
194d0 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77  routine to run w
194e0 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  hen the results 
194f0 66 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20 20  from select A.  
19500 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64  ** are exhausted
19510 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69   and only data i
19520 6e 20 73 65 6c 65 63 74 20 42 20 72 65 6d 61 69  n select B remai
19530 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ns..  */.  if( o
19540 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20  p==TK_EXCEPT || 
19550 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
19560 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 41   ){.    addrEofA
19570 5f 6e 6f 42 20 3d 20 61 64 64 72 45 6f 66 41 20  _noB = addrEofA 
19580 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a 20 20 7d 65  = labelEnd;.  }e
19590 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e  lse{  .    VdbeN
195a0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
195b0 65 6f 66 2d 41 20 73 75 62 72 6f 75 74 69 6e 65  eof-A subroutine
195c0 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66  "));.    addrEof
195d0 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  A = sqlite3VdbeA
195e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
195f0 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72  b, regOutB, addr
19600 4f 75 74 42 29 3b 0a 20 20 20 20 61 64 64 72 45  OutB);.    addrE
19610 6f 66 41 5f 6e 6f 42 20 3d 20 73 71 6c 69 74 65  ofA_noB = sqlite
19620 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19630 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
19640 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  B, labelEnd);.  
19650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19670 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
19680 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
19690 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
196a0 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66  Goto, 0, addrEof
196b0 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65  A);.    p->nSele
196c0 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d  ctRow += pPrior-
196d0 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d  >nSelectRow;.  }
196e0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
196f0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  a subroutine to 
19700 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73  run when the res
19710 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74  ults from select
19720 20 42 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61   B.  ** are exha
19730 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64  usted and only d
19740 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 41 20  ata in select A 
19750 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  remains..  */.  
19760 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52  if( op==TK_INTER
19770 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
19780 45 6f 66 42 20 3d 20 61 64 64 72 45 6f 66 41 3b  EofB = addrEofA;
19790 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c  .    if( p->nSel
197a0 65 63 74 52 6f 77 20 3e 20 70 50 72 69 6f 72 2d  ectRow > pPrior-
197b0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d  >nSelectRow ) p-
197c0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50  >nSelectRow = pP
197d0 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
197e0 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20  ;.  }else{  .   
197f0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
19800 28 28 76 2c 20 22 65 6f 66 2d 42 20 73 75 62 72  ((v, "eof-B subr
19810 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61  outine"));.    a
19820 64 64 72 45 6f 66 42 20 3d 20 73 71 6c 69 74 65  ddrEofB = sqlite
19830 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19840 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41  P_Gosub, regOutA
19850 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20  , addrOutA);.   
19860 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19870 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
19880 72 65 67 41 64 64 72 41 2c 20 6c 61 62 65 6c 45  regAddrA, labelE
19890 6e 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  nd); VdbeCoverag
198a0 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
198b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
198c0 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45  P_Goto, 0, addrE
198d0 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ofB);.  }..  /* 
198e0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
198f0 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65   handle the case
19900 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56   of A<B.  */.  V
19910 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
19920 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f  v, "A-lt-B subro
19930 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72  utine"));.  addr
19940 41 6c 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64  AltB = sqlite3Vd
19950 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
19960 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61  osub, regOutA, a
19970 64 64 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69  ddrOutA);.  sqli
19980 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19990 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
199a0 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20  drA, addrEofA); 
199b0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
199c0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
199d0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
199e0 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a   0, labelCmpr);.
199f0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
19a00 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ode to handle th
19a10 65 20 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20  e case of A==B. 
19a20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
19a30 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64 72  _ALL ){.    addr
19a40 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b  AeqB = addrAltB;
19a50 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
19a60 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b  =TK_INTERSECT ){
19a70 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20  .    addrAeqB = 
19a80 61 64 64 72 41 6c 74 42 3b 0a 20 20 20 20 61 64  addrAltB;.    ad
19a90 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73  drAltB++;.  }els
19aa0 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43  e{.    VdbeNoopC
19ab0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65 71  omment((v, "A-eq
19ac0 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
19ad0 3b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d  ;.    addrAeqB =
19ae0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19af0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
19b00 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64  ld, regAddrA, ad
19b10 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76  drEofA); VdbeCov
19b20 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
19b30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19b40 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c  v, OP_Goto, 0, l
19b50 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a  abelCmpr);.  }..
19b60 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
19b70 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
19b80 20 63 61 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a   case of A>B.  *
19b90 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
19ba0 65 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20  ent((v, "A-gt-B 
19bb0 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
19bc0 20 61 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69   addrAgtB = sqli
19bd0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
19be0 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d  dr(v);.  if( op=
19bf0 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54  =TK_ALL || op==T
19c00 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73  K_UNION ){.    s
19c10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19c20 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
19c30 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29  gOutB, addrOutB)
19c40 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
19c50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19c60 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c  Yield, regAddrB,
19c70 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65   addrEofB); Vdbe
19c80 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
19c90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19ca0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
19cb0 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f  labelCmpr);..  /
19cc0 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e 73  * This code runs
19cd0 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c   once to initial
19ce0 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67 2e 0a  ize everything..
19cf0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
19d00 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31  beJumpHere(v, j1
19d10 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
19d20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
19d30 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64  ld, regAddrA, ad
19d40 64 72 45 6f 66 41 5f 6e 6f 42 29 3b 20 56 64 62  drEofA_noB); Vdb
19d50 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
19d60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19d70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
19d80 65 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66  egAddrB, addrEof
19d90 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  B); VdbeCoverage
19da0 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65  (v);..  /* Imple
19db0 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65  ment the main me
19dc0 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20  rge loop.  */.  
19dd0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
19de0 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c  veLabel(v, label
19df0 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Cmpr);.  sqlite3
19e00 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
19e10 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c  _Permutation, 0,
19e20 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50   0, 0, (char*)aP
19e30 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52  ermute, P4_INTAR
19e40 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  RAY);.  sqlite3V
19e50 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
19e60 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69  Compare, destA.i
19e70 53 64 73 74 2c 20 64 65 73 74 42 2e 69 53 64 73  Sdst, destB.iSds
19e80 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20  t, nOrderBy,.   
19e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ea0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
19eb0 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e  yMerge, P4_KEYIN
19ec0 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  FO);.  sqlite3Vd
19ed0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
19ee0 46 4c 41 47 5f 50 45 52 4d 55 54 45 29 3b 0a 20  FLAG_PERMUTE);. 
19ef0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19f00 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61  p3(v, OP_Jump, a
19f10 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41 65 71  ddrAltB, addrAeq
19f20 42 2c 20 61 64 64 72 41 67 74 42 29 3b 20 56 64  B, addrAgtB); Vd
19f30 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
19f40 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
19f50 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f   this point in o
19f60 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e 61 74  rder to terminat
19f70 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a  e the query..  *
19f80 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
19f90 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
19fa0 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20  abelEnd);..  /* 
19fb0 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Set the number o
19fc0 66 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73  f output columns
19fd0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73  .  */.  if( pDes
19fe0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t->eDest==SRT_Ou
19ff0 74 70 75 74 20 29 7b 0a 20 20 20 20 53 65 6c 65  tput ){.    Sele
1a000 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 50 72  ct *pFirst = pPr
1a010 69 6f 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ior;.    while( 
1a020 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29  pFirst->pPrior )
1a030 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74   pFirst = pFirst
1a040 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 67 65  ->pPrior;.    ge
1a050 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
1a060 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69  s(pParse, 0, pFi
1a070 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
1a080 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d 62  }..  /* Reassemb
1a090 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  ly the compound 
1a0a0 71 75 65 72 79 20 73 6f 20 74 68 61 74 20 69 74  query so that it
1a0b0 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 63   will be freed c
1a0c0 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79  orrectly.  ** by
1a0d0 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
1a0e0 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70  ction */.  if( p
1a0f0 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
1a100 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
1a110 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f  ete(db, p->pPrio
1a120 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72  r);.  }.  p->pPr
1a130 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
1a140 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20  pPrior->pNext = 
1a150 70 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20  p;..  /*** TBD: 
1a160 20 49 6e 73 65 72 74 20 73 75 62 72 6f 75 74 69   Insert subrouti
1a170 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73  ne calls to clos
1a180 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63  e cursors on inc
1a190 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73  omplete.  **** s
1a1a0 75 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a  ubqueries ****/.
1a1b0 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69    explainComposi
1a1c0 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70  te(pParse, p->op
1a1d0 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20  , iSub1, iSub2, 
1a1e0 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  0);.  return SQL
1a1f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
1a200 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
1a210 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1a220 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
1a230 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
1a240 57 29 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65  W)./* Forward De
1a250 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74  clarations */.st
1a260 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
1a270 78 70 72 4c 69 73 74 28 73 71 6c 69 74 65 33 2a  xprList(sqlite3*
1a280 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74  , ExprList*, int
1a290 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74  , ExprList*);.st
1a2a0 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53  atic void substS
1a2b0 65 6c 65 63 74 28 73 71 6c 69 74 65 33 2a 2c 20  elect(sqlite3*, 
1a2c0 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45  Select *, int, E
1a2d0 78 70 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a  xprList *);../*.
1a2e0 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20  ** Scan through 
1a2f0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
1a300 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65  Expr.  Replace e
1a310 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74  very reference t
1a320 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  o.** a column in
1a330 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54   table number iT
1a340 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79  able with a copy
1a350 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d   of the iColumn-
1a360 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70  th.** entry in p
1a370 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61  EList.  (But lea
1a380 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ve references to
1a390 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d   the ROWID colum
1a3a0 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e  n .** unchanged.
1a3b0 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ).**.** This rou
1a3c0 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20  tine is part of 
1a3d0 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70  the flattening p
1a3e0 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62  rocedure.  A sub
1a3f0 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72  query.** whose r
1a400 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66  esult set is def
1a410 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61  ined by pEList a
1a420 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20  ppears as entry 
1a430 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63  in the.** FROM c
1a440 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
1a450 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  T such that the 
1a460 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69  VDBE cursor assi
1a470 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20  gned to that.** 
1a480 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72  FORM clause entr
1a490 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68  y is iTable.  Th
1a4a0 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20  is routine make 
1a4b0 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a  the necessary .*
1a4c0 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78  * changes to pEx
1a4d0 70 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65  pr so that it re
1a4e0 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f  fers directly to
1a4f0 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c   the source tabl
1a500 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71  e.** of the subq
1a510 75 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20  uery rather the 
1a520 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
1a530 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73  e subquery..*/.s
1a540 74 61 74 69 63 20 45 78 70 72 20 2a 73 75 62 73  tatic Expr *subs
1a550 74 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33  tExpr(.  sqlite3
1a560 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20   *db,        /* 
1a570 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
1a580 72 6f 72 73 20 74 6f 20 74 68 69 73 20 63 6f 6e  rors to this con
1a590 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  nection */.  Exp
1a5a0 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
1a5b0 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63   /* Expr in whic
1a5c0 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f  h substitution o
1a5d0 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ccurs */.  int i
1a5e0 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 2f  Table,         /
1a5f0 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75  * Table to be su
1a600 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45  bstituted */.  E
1a610 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
1a620 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
1a630 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a   expressions */.
1a640 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ){.  if( pExpr==
1a650 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1a660 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
1a670 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70  K_COLUMN && pExp
1a680 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c  r->iTable==iTabl
1a690 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78  e ){.    if( pEx
1a6a0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  pr->iColumn<0 ){
1a6b0 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
1a6c0 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20   = TK_NULL;.    
1a6d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
1a6e0 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61  r *pNew;.      a
1a6f0 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
1a700 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   && pExpr->iColu
1a710 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  mn<pEList->nExpr
1a720 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1a730 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  ( pExpr->pLeft==
1a740 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67  0 && pExpr->pRig
1a750 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ht==0 );.      p
1a760 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
1a770 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d  rDup(db, pEList-
1a780 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  >a[pExpr->iColum
1a790 6e 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  n].pExpr, 0);.  
1a7a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1a7b0 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
1a7c0 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20  ;.      pExpr = 
1a7d0 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  pNew;.    }.  }e
1a7e0 6c 73 65 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e  lse{.    pExpr->
1a7f0 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45 78 70  pLeft = substExp
1a800 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65  r(db, pExpr->pLe
1a810 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ft, iTable, pELi
1a820 73 74 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  st);.    pExpr->
1a830 70 52 69 67 68 74 20 3d 20 73 75 62 73 74 45 78  pRight = substEx
1a840 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 52  pr(db, pExpr->pR
1a850 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  ight, iTable, pE
1a860 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 45  List);.    if( E
1a870 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1a880 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
1a890 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62  ct) ){.      sub
1a8a0 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 45 78  stSelect(db, pEx
1a8b0 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69  pr->x.pSelect, i
1a8c0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1a8d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a8e0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
1a8f0 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  b, pExpr->x.pLis
1a900 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
1a910 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
1a920 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
1a930 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
1a940 74 45 78 70 72 4c 69 73 74 28 0a 20 20 73 71 6c  tExprList(.  sql
1a950 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
1a960 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c    /* Report mall
1a970 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a  oc errors here *
1a980 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
1a990 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74  ist,     /* List
1a9a0 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20   to scan and in 
1a9b0 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75  which to make su
1a9c0 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 20 20 69  bstitutes */.  i
1a9d0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
1a9e0 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
1a9f0 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a  be substituted *
1aa00 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
1aa10 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73  List     /* Subs
1aa20 74 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f  titute values */
1aa30 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
1aa40 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
1aa50 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
1aa60 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
1aa70 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74   i++){.    pList
1aa80 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73  ->a[i].pExpr = s
1aa90 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 4c 69  ubstExpr(db, pLi
1aaa0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
1aab0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1aac0 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
1aad0 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a  id substSelect(.
1aae0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
1aaf0 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74         /* Report
1ab00 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68   malloc errors h
1ab10 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ere */.  Select 
1ab20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
1ab30 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1ab40 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61  t in which to ma
1ab50 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73  ke substitutions
1ab60 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
1ab70 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  ,          /* Ta
1ab80 62 6c 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63  ble to be replac
1ab90 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
1aba0 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20   *pEList     /* 
1abb0 53 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65  Substitute value
1abc0 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73  s */.){.  SrcLis
1abd0 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63  t *pSrc;.  struc
1abe0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1abf0 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  pItem;.  int i;.
1ac00 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
1ac10 6e 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69  n;.  substExprLi
1ac20 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74  st(db, p->pEList
1ac30 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1ac40 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69  );.  substExprLi
1ac50 73 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70  st(db, p->pGroup
1ac60 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  By, iTable, pELi
1ac70 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72  st);.  substExpr
1ac80 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64  List(db, p->pOrd
1ac90 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45  erBy, iTable, pE
1aca0 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70 48 61 76  List);.  p->pHav
1acb0 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28  ing = substExpr(
1acc0 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20  db, p->pHaving, 
1acd0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1ace0 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73  .  p->pWhere = s
1acf0 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e  ubstExpr(db, p->
1ad00 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65 2c 20  pWhere, iTable, 
1ad10 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74  pEList);.  subst
1ad20 53 65 6c 65 63 74 28 64 62 2c 20 70 2d 3e 70 50  Select(db, p->pP
1ad30 72 69 6f 72 2c 20 69 54 61 62 6c 65 2c 20 70 45  rior, iTable, pE
1ad40 4c 69 73 74 29 3b 0a 20 20 70 53 72 63 20 3d 20  List);.  pSrc = 
1ad50 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
1ad60 74 28 20 70 53 72 63 20 29 3b 20 20 2f 2a 20 45  t( pSrc );  /* E
1ad70 76 65 6e 20 66 6f 72 20 28 53 45 4c 45 43 54 20  ven for (SELECT 
1ad80 31 29 20 77 65 20 68 61 76 65 3a 20 70 53 72 63  1) we have: pSrc
1ad90 21 3d 30 20 62 75 74 20 70 53 72 63 2d 3e 6e 53  !=0 but pSrc->nS
1ada0 72 63 3d 3d 30 20 2a 2f 0a 20 20 69 66 28 20 41  rc==0 */.  if( A
1adb0 4c 57 41 59 53 28 70 53 72 63 29 20 29 7b 0a 20  LWAYS(pSrc) ){. 
1adc0 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e     for(i=pSrc->n
1add0 53 72 63 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d  Src, pItem=pSrc-
1ade0 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  >a; i>0; i--, pI
1adf0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75  tem++){.      su
1ae00 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 49  bstSelect(db, pI
1ae10 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54  tem->pSelect, iT
1ae20 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1ae30 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
1ae40 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
1ae50 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1ae60 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
1ae70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1ae80 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e  ) */..#if !defin
1ae90 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
1aea0 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
1aeb0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1aec0 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69  _VIEW)./*.** Thi
1aed0 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
1aee0 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75  ts to flatten su
1aef0 62 71 75 65 72 69 65 73 20 61 73 20 61 20 70 65  bqueries as a pe
1af00 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69  rformance optimi
1af10 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  zation..** This 
1af20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
1af30 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68  1 if it makes ch
1af40 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e  anges and 0 if n
1af50 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 63 63  o flattening occ
1af60 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e  urs..**.** To un
1af70 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e  derstand the con
1af80 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69  cept of flatteni
1af90 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65  ng, consider the
1afa0 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75   following.** qu
1afb0 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ery:.**.**     S
1afc0 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45  ELECT a FROM (SE
1afd0 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
1afe0 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
1aff0 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a  0) WHERE a>5.**.
1b000 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 77  ** The default w
1b010 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69  ay of implementi
1b020 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69 73  ng this query is
1b030 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a   to execute the.
1b040 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72 73  ** subquery firs
1b050 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  t and store the 
1b060 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d  results in a tem
1b070 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68  porary table, th
1b080 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75  en.** run the ou
1b090 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61  ter query on tha
1b0a0 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  t temporary tabl
1b0b0 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72 65  e.  This require
1b0c0 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20  s two.** passes 
1b0d0 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20 20  over the data.  
1b0e0 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63  Furthermore, bec
1b0f0 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61  ause the tempora
1b100 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20  ry table.** has 
1b110 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20  no indices, the 
1b120 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20  WHERE clause on 
1b130 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1b140 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74  cannot be.** opt
1b150 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  imized..**.** Th
1b160 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
1b170 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20 71  pts to rewrite q
1b180 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20 74  ueries such as t
1b190 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a  he above into.**
1b1a0 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73   a single flat s
1b1b0 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73  elect, like this
1b1c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
1b1d0 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
1b1e0 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20   t1 WHERE z<100 
1b1f0 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  AND a>5.**.** Th
1b200 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
1b210 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66   for this simpif
1b220 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68  ication gives th
1b230 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a  e same result.**
1b240 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f   but only has to
1b250 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f   scan the data o
1b260 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73  nce.  And becaus
1b270 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20  e indices might 
1b280 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65  .** exist on the
1b290 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d   table t1, a com
1b2a0 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68  plete scan of th
1b2b0 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a  e data might be.
1b2c0 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a  ** avoided..**.*
1b2d0 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  * Flattening is 
1b2e0 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69  only attempted i
1b2f0 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
1b300 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
1b310 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68  .**.**   (1)  Th
1b320 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
1b330 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
1b340 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61  o not both use a
1b350 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
1b360 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62 71     (2)  The subq
1b370 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61  uery is not an a
1b380 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20  ggregate or the 
1b390 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1b3a0 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
1b3b0 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71     (3)  The subq
1b3c0 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20  uery is not the 
1b3d0 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
1b3e0 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f   a left outer jo
1b3f0 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 4f 72  in.**        (Or
1b400 69 67 69 6e 61 6c 6c 79 20 74 69 63 6b 65 74 20  iginally ticket 
1b410 23 33 30 36 2e 20 20 53 74 72 65 6e 67 74 68 65  #306.  Strengthe
1b420 6e 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  ned by ticket #3
1b430 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29  300).**.**   (4)
1b440 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
1b450 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 2e 0a  s not DISTINCT..
1b460 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20  **.**  (**)  At 
1b470 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69  one point restri
1b480 63 74 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28  ctions (4) and (
1b490 35 29 20 64 65 66 69 6e 65 64 20 61 20 73 75 62  5) defined a sub
1b4a0 73 65 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a  set of DISTINCT.
1b4b0 2a 2a 20 20 20 20 20 20 20 20 73 75 62 2d 71 75  **        sub-qu
1b4c0 65 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20  eries that were 
1b4d0 65 78 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68  excluded from th
1b4e0 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  is optimization.
1b4f0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a   Restriction .**
1b500 20 20 20 20 20 20 20 20 28 34 29 20 68 61 73 20          (4) has 
1b510 73 69 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e  since been expan
1b520 64 65 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61  ded to exclude a
1b530 6c 6c 20 44 49 53 54 49 4e 43 54 20 73 75 62 71  ll DISTINCT subq
1b540 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  ueries..**.**   
1b550 28 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (6)  The subquer
1b560 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61  y does not use a
1b570 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65  ggregates or the
1b580 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
1b590 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49  not.**        DI
1b5a0 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20  STINCT..**.**   
1b5b0 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (7)  The subquer
1b5c0 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61  y has a FROM cla
1b5d0 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20 46 6f 72  use.  TODO:  For
1b5e0 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68   subqueries with
1b5f0 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 41 20  out.**        A 
1b600 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20 63 6f 6e  FROM clause, con
1b610 73 69 64 65 72 20 61 64 64 69 6e 67 20 61 20 46  sider adding a F
1b620 52 4f 4d 20 63 6c 6f 73 65 20 77 69 74 68 20 74  ROM close with t
1b630 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20  he special.**   
1b640 20 20 20 20 20 74 61 62 6c 65 20 73 71 6c 69 74       table sqlit
1b650 65 5f 6f 6e 63 65 20 74 68 61 74 20 63 6f 6e 73  e_once that cons
1b660 69 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  ists of a single
1b670 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20   row containing 
1b680 61 0a 2a 2a 20 20 20 20 20 20 20 20 73 69 6e 67  a.**        sing
1b690 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20  le NULL..**.**  
1b6a0 20 28 38 29 20 20 54 68 65 20 73 75 62 71 75 65   (8)  The subque
1b6b0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1b6c0 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
1b6d0 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
1b6e0 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
1b6f0 28 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (9)  The subquer
1b700 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
1b710 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
1b720 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
1b730 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
1b740 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
1b750 20 20 28 31 30 29 20 20 54 68 65 20 73 75 62 71    (10)  The subq
1b760 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
1b770 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20  e aggregates or 
1b780 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1b790 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  does not.**     
1b7a0 20 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a     use LIMIT..**
1b7b0 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73  .**  (11)  The s
1b7c0 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
1b7d0 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
1b7e0 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44  ot both have ORD
1b7f0 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a  ER BY clauses..*
1b800 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20  *.**  (**)  Not 
1b810 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75  implemented.  Su
1b820 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74  bsumed into rest
1b830 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61  riction (3).  Wa
1b840 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  s previously.** 
1b850 20 20 20 20 20 20 20 61 20 73 65 70 61 72 61 74         a separat
1b860 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65  e restriction de
1b870 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b  riving from tick
1b880 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20  et #350..**.**  
1b890 28 31 33 29 20 20 54 68 65 20 73 75 62 71 75 65  (13)  The subque
1b8a0 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65  ry and outer que
1b8b0 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75  ry do not both u
1b8c0 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20  se LIMIT..**.** 
1b8d0 20 28 31 34 29 20 20 54 68 65 20 73 75 62 71 75   (14)  The subqu
1b8e0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
1b8f0 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20   OFFSET..**.**  
1b900 28 31 35 29 20 20 54 68 65 20 6f 75 74 65 72 20  (15)  The outer 
1b910 71 75 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72  query is not par
1b920 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t of a compound 
1b930 73 65 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a  select or the.**
1b940 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79          subquery
1b950 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61   does not have a
1b960 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a   LIMIT clause..*
1b970 2a 20 20 20 20 20 20 20 20 28 53 65 65 20 74 69  *        (See ti
1b980 63 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20 74  cket #2339 and t
1b990 69 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34  icket [02a8e81d4
1b9a0 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29  4])..**.**  (16)
1b9b0 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72    The outer quer
1b9c0 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  y is not an aggr
1b9d0 65 67 61 74 65 20 6f 72 20 74 68 65 20 73 75 62  egate or the sub
1b9e0 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20  query does.**   
1b9f0 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e       not contain
1ba00 20 4f 52 44 45 52 20 42 59 2e 20 20 28 54 69 63   ORDER BY.  (Tic
1ba10 6b 65 74 20 23 32 39 34 32 29 20 20 54 68 69 73  ket #2942)  This
1ba20 20 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74   used to not mat
1ba30 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e  ter.**        un
1ba40 74 69 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65  til we introduce
1ba50 64 20 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63  d the group_conc
1ba60 61 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  at() function.  
1ba70 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54 68  .**.**  (17)  Th
1ba80 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e  e sub-query is n
1ba90 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  ot a compound se
1baa0 6c 65 63 74 2c 20 6f 72 20 69 74 20 69 73 20 61  lect, or it is a
1bab0 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20   UNION ALL .**  
1bac0 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63        compound c
1bad0 6c 61 75 73 65 20 6d 61 64 65 20 75 70 20 65 6e  lause made up en
1bae0 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67  tirely of non-ag
1baf0 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 2c  gregate queries,
1bb00 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20 20   and .**        
1bb10 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
1bb20 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1bb30 20 2a 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66   * is not itself
1bb40 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f   part of a compo
1bb50 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20  und select,.**  
1bb60 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74          * is not
1bb70 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72   an aggregate or
1bb80 20 44 49 53 54 49 4e 43 54 20 71 75 65 72 79 2c   DISTINCT query,
1bb90 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
1bba0 20 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e   * is not a join
1bbb0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68  .**.**        Th
1bbc0 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62  e parent and sub
1bbd0 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61  -query may conta
1bbe0 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 73  in WHERE clauses
1bbf0 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20  . Subject to.** 
1bc00 20 20 20 20 20 20 20 72 75 6c 65 73 20 28 31 31         rules (11
1bc10 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34 29  ), (13) and (14)
1bc20 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20  , they may also 
1bc30 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59  contain ORDER BY
1bc40 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49  ,.**        LIMI
1bc50 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
1bc60 75 73 65 73 2e 20 20 54 68 65 20 73 75 62 71 75  uses.  The subqu
1bc70 65 72 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61  ery cannot use a
1bc80 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  ny compound.**  
1bc90 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f        operator o
1bca0 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20  ther than UNION 
1bcb0 41 4c 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20  ALL because all 
1bcc0 74 68 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75  the other compou
1bcd0 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65  nd.**        ope
1bce0 72 61 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69  rators have an i
1bcf0 6d 70 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20  mplied DISTINCT 
1bd00 77 68 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f  which is disallo
1bd10 77 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20  wed by.**       
1bd20 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29   restriction (4)
1bd30 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41  ..**.**        A
1bd40 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e  lso, each compon
1bd50 65 6e 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71  ent of the sub-q
1bd60 75 65 72 79 20 6d 75 73 74 20 72 65 74 75 72 6e  uery must return
1bd70 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
1bd80 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 72 65  .**        of re
1bd90 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68  sult columns. Th
1bda0 69 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  is is actually a
1bdb0 20 72 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72   requirement for
1bdc0 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a   any compound.**
1bdd0 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 73          SELECT s
1bde0 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c  tatement, but al
1bdf0 6c 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20  l the code here 
1be00 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 75 72  does is make sur
1be10 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20  e that no.**    
1be20 20 20 20 20 73 75 63 68 20 28 69 6c 6c 65 67 61      such (illega
1be30 6c 29 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  l) sub-query is 
1be40 66 6c 61 74 74 65 6e 65 64 2e 20 54 68 65 20 63  flattened. The c
1be50 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74 65 63  aller will detec
1be60 74 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  t the.**        
1be70 73 79 6e 74 61 78 20 65 72 72 6f 72 20 61 6e 64  syntax error and
1be80 20 72 65 74 75 72 6e 20 61 20 64 65 74 61 69 6c   return a detail
1be90 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a  ed message..**.*
1bea0 2a 20 20 28 31 38 29 20 20 49 66 20 74 68 65 20  *  (18)  If the 
1beb0 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
1bec0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
1bed0 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f  then all terms o
1bee0 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  f the.**        
1bef0 4f 52 44 45 52 20 62 79 20 63 6c 61 75 73 65 20  ORDER by clause 
1bf00 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75  of the parent mu
1bf10 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66  st be simple ref
1bf20 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20  erences to .**  
1bf30 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66        columns of
1bf40 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a   the sub-query..
1bf50 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20 54 68 65  **.**  (19)  The
1bf60 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
1bf70 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
1bf80 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1bf90 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  does not.**     
1bfa0 20 20 20 68 61 76 65 20 61 20 57 48 45 52 45 20     have a WHERE 
1bfb0 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  clause..**.**  (
1bfc0 32 30 29 20 20 49 66 20 74 68 65 20 73 75 62 2d  20)  If the sub-
1bfd0 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
1bfe0 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
1bff0 20 69 74 20 6d 75 73 74 20 6e 6f 74 20 75 73 65   it must not use
1c000 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 20 4f 52  .**        an OR
1c010 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20  DER BY clause.  
1c020 54 69 63 6b 65 74 20 23 33 37 37 33 2e 20 20 57  Ticket #3773.  W
1c030 65 20 63 6f 75 6c 64 20 72 65 6c 61 78 20 74 68  e could relax th
1c040 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a  is constraint.**
1c050 20 20 20 20 20 20 20 20 73 6f 6d 65 77 68 61 74          somewhat
1c060 20 62 79 20 73 61 79 69 6e 67 20 74 68 61 74 20   by saying that 
1c070 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
1c080 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1c090 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20 20 20   must.**        
1c0a0 61 70 70 65 61 72 20 61 73 20 75 6e 6d 6f 64 69  appear as unmodi
1c0b0 66 69 65 64 20 72 65 73 75 6c 74 20 63 6f 6c 75  fied result colu
1c0c0 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72  mns in the outer
1c0d0 20 71 75 65 72 79 2e 20 20 42 75 74 20 77 65 0a   query.  But we.
1c0e0 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 6f  **        have o
1c0f0 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ther optimizatio
1c100 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65  ns in mind to de
1c110 61 6c 20 77 69 74 68 20 74 68 61 74 20 63 61 73  al with that cas
1c120 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20  e..**.**  (21)  
1c130 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1c140 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
1c150 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1c160 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20  ry is not.**    
1c170 20 20 20 20 44 49 53 54 49 4e 43 54 2e 20 20 28      DISTINCT.  (
1c180 53 65 65 20 74 69 63 6b 65 74 20 5b 37 35 32 65  See ticket [752e
1c190 31 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20  1646fc])..**.** 
1c1a0 20 28 32 32 29 20 20 54 68 65 20 73 75 62 71 75   (22)  The subqu
1c1b0 65 72 79 20 69 73 20 6e 6f 74 20 61 20 72 65 63  ery is not a rec
1c1c0 75 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a  ursive CTE..**.*
1c1d0 2a 20 20 28 32 33 29 20 20 54 68 65 20 70 61 72  *  (23)  The par
1c1e0 65 6e 74 20 69 73 20 6e 6f 74 20 61 20 72 65 63  ent is not a rec
1c1f0 75 72 73 69 76 65 20 43 54 45 2c 20 6f 72 20 74  ursive CTE, or t
1c200 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
1c210 6e 6f 74 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  not a.**        
1c220 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20  compound query. 
1c230 54 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e  This restriction
1c240 20 69 73 20 62 65 63 61 75 73 65 20 74 72 61 6e   is because tran
1c250 73 66 6f 72 6d 69 6e 67 20 74 68 65 0a 2a 2a 20  sforming the.** 
1c260 20 20 20 20 20 20 20 70 61 72 65 6e 74 20 74 6f         parent to
1c270 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
1c280 79 20 63 6f 6e 66 75 73 65 73 20 74 68 65 20 63  y confuses the c
1c290 6f 64 65 20 74 68 61 74 20 68 61 6e 64 6c 65 73  ode that handles
1c2a0 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 63 75 72  .**        recur
1c2b0 73 69 76 65 20 71 75 65 72 69 65 73 20 69 6e 20  sive queries in 
1c2c0 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 2e 0a 2a  multiSelect()..*
1c2d0 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  *.**.** In this 
1c2e0 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22  routine, the "p"
1c2f0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
1c300 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f  pointer to the o
1c310 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54  uter query..** T
1c320 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70  he subquery is p
1c330 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d  ->pSrc->a[iFrom]
1c340 2e 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65  .  isAgg is true
1c350 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   if the outer qu
1c360 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72  ery.** uses aggr
1c370 65 67 61 74 65 73 20 61 6e 64 20 73 75 62 71 75  egates and subqu
1c380 65 72 79 49 73 41 67 67 20 69 73 20 74 72 75 65  eryIsAgg is true
1c390 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
1c3a0 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73   uses aggregates
1c3b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74  ..**.** If flatt
1c3c0 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74  ening is not att
1c3d0 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75  empted, this rou
1c3e0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
1c3f0 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a  and returns 0..*
1c400 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
1c410 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69  is attempted thi
1c420 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1c430 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f  s 1..**.** All o
1c440 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1c450 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f   analysis must o
1c460 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65  ccur on both the
1c470 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
1c480 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79  .** the subquery
1c490 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
1c4a0 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74  tine runs..*/.st
1c4b0 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e  atic int flatten
1c4c0 53 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73  Subquery(.  Pars
1c4d0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1c4e0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
1c4f0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
1c500 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
1c510 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f   The parent or o
1c520 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74  uter SELECT stat
1c530 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ement */.  int i
1c540 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  From,           
1c550 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70  /* Index in p->p
1c560 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20  Src->a[] of the 
1c570 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a  inner subquery *
1c580 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20  /.  int isAgg,  
1c590 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1c5a0 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54   if outer SELECT
1c5b0 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
1c5c0 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  functions */.  i
1c5d0 6e 74 20 73 75 62 71 75 65 72 79 49 73 41 67 67  nt subqueryIsAgg
1c5e0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
1c5f0 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
1c600 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1c610 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ions */.){.  con
1c620 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41  st char *zSavedA
1c630 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61  uthContext = pPa
1c640 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
1c650 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61  t;.  Select *pPa
1c660 72 65 6e 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a  rent;.  Select *
1c670 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54  pSub;       /* T
1c680 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f  he inner query o
1c690 72 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a  r "subquery" */.
1c6a0 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 31 3b    Select *pSub1;
1c6b0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1c6c0 20 74 6f 20 74 68 65 20 72 69 67 68 74 6d 6f 73   to the rightmos
1c6d0 74 20 73 65 6c 65 63 74 20 69 6e 20 73 75 62 2d  t select in sub-
1c6e0 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69  query */.  SrcLi
1c6f0 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f  st *pSrc;      /
1c700 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
1c710 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
1c720 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73  uery */.  SrcLis
1c730 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a  t *pSubSrc;   /*
1c740 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
1c750 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
1c760 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1c770 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65  pList;    /* The
1c780 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
1c790 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
1c7a0 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b  /.  int iParent;
1c7b0 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20          /* VDBE 
1c7c0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
1c7d0 20 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74   the pSub result
1c7e0 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20   set temp table 
1c7f0 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
1c800 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1c810 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78   counter */.  Ex
1c820 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
1c830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c840 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
1c850 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
1c860 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75  rcList_item *pSu
1c870 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20  bitem;   /* The 
1c880 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 73 71  subquery */.  sq
1c890 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1c8a0 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68  se->db;..  /* Ch
1c8b0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c  eck to see if fl
1c8c0 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
1c8d0 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30  itted.  Return 0
1c8e0 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20   if not..  */.  
1c8f0 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
1c900 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72    assert( p->pPr
1c910 69 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a 20 55 6e  ior==0 );  /* Un
1c920 61 62 6c 65 20 74 6f 20 66 6c 61 74 74 65 6e 20  able to flatten 
1c930 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69 65 73  compound queries
1c940 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69   */.  if( Optimi
1c950 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64  zationDisabled(d
1c960 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46  b, SQLITE_QueryF
1c970 6c 61 74 74 65 6e 65 72 29 20 29 20 72 65 74 75  lattener) ) retu
1c980 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70  rn 0;.  pSrc = p
1c990 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
1c9a0 28 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e  ( pSrc && iFrom>
1c9b0 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63  =0 && iFrom<pSrc
1c9c0 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62  ->nSrc );.  pSub
1c9d0 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b  item = &pSrc->a[
1c9e0 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e  iFrom];.  iParen
1c9f0 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43  t = pSubitem->iC
1ca00 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20  ursor;.  pSub = 
1ca10 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
1ca20 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75  t;.  assert( pSu
1ca30 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73  b!=0 );.  if( is
1ca40 41 67 67 20 26 26 20 73 75 62 71 75 65 72 79 49  Agg && subqueryI
1ca50 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b  sAgg ) return 0;
1ca60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca70 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1ca80 28 31 29 20 20 2a 2f 0a 20 20 69 66 28 20 73 75  (1)  */.  if( su
1ca90 62 71 75 65 72 79 49 73 41 67 67 20 26 26 20 70  bqueryIsAgg && p
1caa0 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65  Src->nSrc>1 ) re
1cab0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1cac0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1cad0 28 32 29 20 20 2a 2f 0a 20 20 70 53 75 62 53 72  (2)  */.  pSubSr
1cae0 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a  c = pSub->pSrc;.
1caf0 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72    assert( pSubSr
1cb00 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20  c );.  /* Prior 
1cb10 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32  to version 3.1.2
1cb20 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64  , when LIMIT and
1cb30 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20 62   OFFSET had to b
1cb40 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e  e simple constan
1cb50 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62  ts,.  ** not arb
1cb60 69 74 72 61 72 79 20 65 78 70 72 65 73 73 73 69  itrary expresssi
1cb70 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20  ons, we allowed 
1cb80 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f  some combining o
1cb90 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  f LIMIT and OFFS
1cba0 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20  ET.  ** because 
1cbb0 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f  they could be co
1cbc0 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c  mputed at compil
1cbd0 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65  e-time.  But whe
1cbe0 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  n LIMIT and OFFS
1cbf0 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61  ET.  ** became a
1cc00 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73  rbitrary express
1cc10 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f  ions, we were fo
1cc20 72 63 65 64 20 74 6f 20 61 64 64 20 72 65 73 74  rced to add rest
1cc30 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20  rictions (13).  
1cc40 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a  ** and (14). */.
1cc50 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
1cc60 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20  it && p->pLimit 
1cc70 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1cc80 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1cc90 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a  riction (13) */.
1cca0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66 66    if( pSub->pOff
1ccb0 73 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  set ) return 0; 
1ccc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccd0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1cce0 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a  riction (14) */.
1ccf0 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
1cd00 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e 64  gs & SF_Compound
1cd10 29 21 3d 30 20 26 26 20 70 53 75 62 2d 3e 70 4c  )!=0 && pSub->pL
1cd20 69 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74 75  imit ){.    retu
1cd30 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1cd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd60 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1cd70 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (15) */.  }.  if
1cd80 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d  ( pSubSrc->nSrc=
1cd90 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
1cda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdb0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1cdc0 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66  ion (7)  */.  if
1cdd0 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  ( pSub->selFlags
1cde0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29   & SF_Distinct )
1cdf0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1ce00 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1ce10 69 6f 6e 20 28 35 29 20 20 2a 2f 0a 20 20 69 66  ion (5)  */.  if
1ce20 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
1ce30 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  & (pSrc->nSrc>1 
1ce40 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20  || isAgg) ){.   
1ce50 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
1ce60 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1ce70 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a 20 20  ons (8)(9) */.  
1ce80 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  }.  if( (p->selF
1ce90 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
1cea0 63 74 29 21 3d 30 20 26 26 20 73 75 62 71 75 65  ct)!=0 && subque
1ceb0 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20  ryIsAgg ){.     
1cec0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1ced0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1cee0 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20 69   (6)  */.  }.  i
1cef0 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26  f( p->pOrderBy &
1cf00 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  & pSub->pOrderBy
1cf10 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
1cf20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1cf30 20 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 2f 2a 20               /* 
1cf50 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29  Restriction (11)
1cf60 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73   */.  }.  if( is
1cf70 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72  Agg && pSub->pOr
1cf80 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20 30  derBy ) return 0
1cf90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1cfa0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1cfb0 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53  (16) */.  if( pS
1cfc0 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d  ub->pLimit && p-
1cfd0 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e  >pWhere ) return
1cfe0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1cff0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1d000 28 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70 53  (19) */.  if( pS
1d010 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70  ub->pLimit && (p
1d020 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1d030 44 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a  Distinct)!=0 ){.
1d040 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1d050 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1d060 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20  ction (21) */.  
1d070 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65  }.  if( pSub->se
1d080 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
1d090 72 73 69 76 65 20 29 20 72 65 74 75 72 6e 20 30  rsive ) return 0
1d0a0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
1d0b0 73 74 72 69 63 74 69 6f 6e 20 28 32 32 29 20 20  striction (22)  
1d0c0 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c  */.  if( (p->sel
1d0d0 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
1d0e0 73 69 76 65 29 20 26 26 20 70 53 75 62 2d 3e 70  sive) && pSub->p
1d0f0 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30  Prior ) return 0
1d100 3b 20 20 20 20 20 20 20 2f 2a 20 28 32 33 29 20  ;       /* (23) 
1d110 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45   */..  /* OBSOLE
1d120 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20  TE COMMENT 1:.  
1d130 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33  ** Restriction 3
1d140 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  :  If the subque
1d150 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61  ry is a join, ma
1d160 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71  ke sure the subq
1d170 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f  uery is .  ** no
1d180 74 20 75 73 65 64 20 61 73 20 74 68 65 20 72 69  t used as the ri
1d190 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
1d1a0 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45  n outer join.  E
1d1b0 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74  xamples of why t
1d1c0 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  his.  ** is not 
1d1d0 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20  allowed:.  **.  
1d1e0 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45  **         t1 LE
1d1f0 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74  FT OUTER JOIN (t
1d200 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a  2 JOIN t3).  **.
1d210 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74    ** If we flatt
1d220 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65  en the above, we
1d230 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a   would get.  **.
1d240 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31    **         (t1
1d250 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1d260 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a   t2) JOIN t3.  *
1d270 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20  *.  ** which is 
1d280 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73  not at all the s
1d290 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a  ame thing..  **.
1d2a0 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f    ** OBSOLETE CO
1d2b0 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20 52 65  MMENT 2:.  ** Re
1d2c0 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49  striction 12:  I
1d2d0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
1d2e0 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
1d2f0 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75  and of a left ou
1d300 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d  ter.  ** join, m
1d310 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
1d320 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45  query has no WHE
1d330 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20  RE clause..  ** 
1d340 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77  An examples of w
1d350 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  hy this is not a
1d360 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
1d370 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
1d380 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45  T OUTER JOIN (SE
1d390 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57  LECT * FROM t2 W
1d3a0 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a  HERE t2.x>0).  *
1d3b0 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61  *.  ** If we fla
1d3c0 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  tten the above, 
1d3d0 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a  we would get.  *
1d3e0 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28  *.  **         (
1d3f0 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
1d400 49 4e 20 74 32 29 20 57 48 45 52 45 20 74 32 2e  IN t2) WHERE t2.
1d410 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75  x>0.  **.  ** Bu
1d420 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73  t the t2.x>0 tes
1d430 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61  t will always fa
1d440 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77  il on a NULL row
1d450 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20   of t2, which.  
1d460 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20 63  ** effectively c
1d470 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54 45  onverts the OUTE
1d480 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49  R JOIN into an I
1d490 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a  NNER JOIN..  **.
1d4a0 20 20 2a 2a 20 54 48 49 53 20 4f 56 45 52 52 49    ** THIS OVERRI
1d4b0 44 45 53 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d  DES OBSOLETE COM
1d4c0 4d 45 4e 54 53 20 31 20 41 4e 44 20 32 20 41 42  MENTS 1 AND 2 AB
1d4d0 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b 65 74  OVE:.  ** Ticket
1d4e0 20 23 33 33 30 30 20 73 68 6f 77 73 20 74 68 61   #3300 shows tha
1d4f0 74 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65  t flattening the
1d500 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61   right term of a
1d510 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20   LEFT JOIN.  ** 
1d520 69 73 20 66 72 61 75 67 68 74 20 77 69 74 68 20  is fraught with 
1d530 64 61 6e 67 65 72 2e 20 20 42 65 73 74 20 74 6f  danger.  Best to
1d540 20 61 76 6f 69 64 20 74 68 65 20 77 68 6f 6c 65   avoid the whole
1d550 20 74 68 69 6e 67 2e 20 20 49 66 20 74 68 65 0a   thing.  If the.
1d560 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73    ** subquery is
1d570 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20   the right term 
1d580 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20  of a LEFT JOIN, 
1d590 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74  then do not flat
1d5a0 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ten..  */.  if( 
1d5b0 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74  (pSubitem->joint
1d5c0 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
1d5d0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1d5e0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
1d5f0 73 74 72 69 63 74 69 6f 6e 20 31 37 3a 20 49 66  striction 17: If
1d600 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
1d610 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
1d620 45 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73  ECT, then it mus
1d630 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20  t.  ** use only 
1d640 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  the UNION ALL op
1d650 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65  erator. And none
1d660 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20 73   of the simple s
1d670 65 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20 20  elect queries.  
1d680 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ** that make up 
1d690 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  the compound SEL
1d6a0 45 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  ECT are allowed 
1d6b0 74 6f 20 62 65 20 61 67 67 72 65 67 61 74 65 20  to be aggregate 
1d6c0 6f 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a  or distinct.  **
1d6d0 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20   queries..  */. 
1d6e0 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f   if( pSub->pPrio
1d6f0 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 75  r ){.    if( pSu
1d700 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
1d710 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1d720 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 32  /* Restriction 2
1d730 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69  0 */.    }.    i
1d740 66 28 20 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e  f( isAgg || (p->
1d750 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
1d760 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53  stinct)!=0 || pS
1d770 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20  rc->nSrc!=1 ){. 
1d780 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1d790 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 75     }.    for(pSu
1d7a0 62 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b 20  b1=pSub; pSub1; 
1d7b0 70 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50 72  pSub1=pSub1->pPr
1d7c0 69 6f 72 29 7b 0a 20 20 20 20 20 20 74 65 73 74  ior){.      test
1d7d0 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65  case( (pSub1->se
1d7e0 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
1d7f0 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
1d800 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63  te))==SF_Distinc
1d810 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
1d820 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c  ase( (pSub1->sel
1d830 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
1d840 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
1d850 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74  e))==SF_Aggregat
1d860 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
1d870 74 28 20 70 53 75 62 2d 3e 70 53 72 63 21 3d 30  t( pSub->pSrc!=0
1d880 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   );.      if( (p
1d890 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Sub1->selFlags &
1d8a0 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
1d8b0 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d 30 0a  _Aggregate))!=0.
1d8c0 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31         || (pSub1
1d8d0 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62  ->pPrior && pSub
1d8e0 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a  1->op!=TK_ALL) .
1d8f0 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62 31 2d         || pSub1-
1d900 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31 0a 20 20  >pSrc->nSrc<1.  
1d910 20 20 20 20 20 7c 7c 20 70 53 75 62 2d 3e 70 45       || pSub->pE
1d920 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 53 75  List->nExpr!=pSu
1d930 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  b1->pEList->nExp
1d940 72 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  r.      ){.     
1d950 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1d960 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
1d970 61 73 65 28 20 70 53 75 62 31 2d 3e 70 53 72 63  ase( pSub1->pSrc
1d980 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20 20 20 20  ->nSrc>1 );.    
1d990 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 72 69  }..    /* Restri
1d9a0 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20 20  ction 18. */.   
1d9b0 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
1d9c0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69   ){.      int ii
1d9d0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  ;.      for(ii=0
1d9e0 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79  ; ii<p->pOrderBy
1d9f0 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a  ->nExpr; ii++){.
1da00 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
1da10 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 75  OrderBy->a[ii].u
1da20 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d  .x.iOrderByCol==
1da30 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1da40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1da50 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20  .  /***** If we 
1da60 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
1da70 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  , flattening is 
1da80 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a  permitted. *****
1da90 2f 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a  /..  /* Authoriz
1daa0 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a  e the subquery *
1dab0 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  /.  pParse->zAut
1dac0 68 43 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69  hContext = pSubi
1dad0 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45  tem->zName;.  TE
1dae0 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69  STONLY(i =) sqli
1daf0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1db00 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45  rse, SQLITE_SELE
1db10 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  CT, 0, 0, 0);.  
1db20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 53 51 4c  testcase( i==SQL
1db30 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50  ITE_DENY );.  pP
1db40 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
1db50 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43  xt = zSavedAuthC
1db60 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66  ontext;..  /* If
1db70 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
1db80 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
1db90 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ECT statement, t
1dba0 68 65 6e 20 28 62 79 20 72 65 73 74 72 69 63 74  hen (by restrict
1dbb0 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64  ions.  ** 17 and
1dbc0 20 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75   18 above) it mu
1dbd0 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c  st be a UNION AL
1dbe0 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74  L and the parent
1dbf0 20 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a   query must .  *
1dc00 2a 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  * be of the form
1dc10 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
1dc20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73  SELECT <expr-lis
1dc30 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75  t> FROM (<sub-qu
1dc40 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61  ery>) <where-cla
1dc50 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  use> .  **.  ** 
1dc60 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20  followed by any 
1dc70 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20  ORDER BY, LIMIT 
1dc80 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c  and/or OFFSET cl
1dc90 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63  auses. This bloc
1dca0 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e  k.  ** creates N
1dcb0 2d 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  -1 copies of the
1dcc0 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 77 69   parent query wi
1dcd0 74 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20  thout any ORDER 
1dce0 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20  BY, LIMIT or .  
1dcf0 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  ** OFFSET clause
1dd00 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d  s and joins them
1dd10 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e   to the left-han
1dd20 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72  d-side of the or
1dd30 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e  iginal.  ** usin
1dd40 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  g UNION ALL oper
1dd50 61 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63  ators. In this c
1dd60 61 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ase N is the num
1dd70 62 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20  ber of simple.  
1dd80 2a 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  ** select statem
1dd90 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70  ents in the comp
1dda0 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a  ound sub-query..
1ddb0 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c    **.  ** Exampl
1ddc0 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  e:.  **.  **    
1ddd0 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d   SELECT a+1 FROM
1dde0 20 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53   (.  **        S
1ddf0 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62  ELECT x FROM tab
1de00 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49  .  **        UNI
1de10 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
1de20 20 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d     SELECT y FROM
1de30 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20   tab.  **       
1de40 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
1de50 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 62         SELECT ab
1de60 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32  s(z*2) FROM tab2
1de70 0a 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52  .  **     ) WHER
1de80 45 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20  E a!=5 ORDER BY 
1de90 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e  1.  **.  ** Tran
1dea0 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20  sformed into:.  
1deb0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
1dec0 43 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20  CT x+1 FROM tab 
1ded0 57 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a  WHERE x+1!=5.  *
1dee0 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a  *     UNION ALL.
1def0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
1df00 79 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45  y+1 FROM tab WHE
1df10 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  RE y+1!=5.  **  
1df20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
1df30 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73  *     SELECT abs
1df40 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62  (z*2)+1 FROM tab
1df50 32 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29  2 WHERE abs(z*2)
1df60 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f  +1!=5.  **     O
1df70 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20  RDER BY 1.  **. 
1df80 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73   ** We call this
1df90 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73   the "compound-s
1dfa0 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69  ubquery flatteni
1dfb0 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ng"..  */.  for(
1dfc0 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f  pSub=pSub->pPrio
1dfd0 72 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53  r; pSub; pSub=pS
1dfe0 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  ub->pPrior){.   
1dff0 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
1e000 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72     ExprList *pOr
1e010 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
1e020 72 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  rBy;.    Expr *p
1e030 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
1e040 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 66  t;.    Expr *pOf
1e050 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
1e060 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  t;.    Select *p
1e070 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
1e080 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  r;.    p->pOrder
1e090 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  By = 0;.    p->p
1e0a0 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  Src = 0;.    p->
1e0b0 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
1e0c0 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
1e0d0 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
1e0e0 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  0;.    pNew = sq
1e0f0 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
1e100 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 70 2d  b, p, 0);.    p-
1e110 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
1e120 65 74 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69  et;.    p->pLimi
1e130 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
1e140 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
1e150 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70  rderBy;.    p->p
1e160 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20  Src = pSrc;.    
1e170 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a  p->op = TK_ALL;.
1e180 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
1e190 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  ){.      p->pPri
1e1a0 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
1e1b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e   }else{.      pN
1e1c0 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72  ew->pPrior = pPr
1e1d0 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ior;.      if( p
1e1e0 50 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e  Prior ) pPrior->
1e1f0 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pNext = pNew;.  
1e200 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20      pNew->pNext 
1e210 3d 20 70 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  = p;.      p->pP
1e220 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20  rior = pNew;.   
1e230 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d   }.    if( db->m
1e240 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
1e250 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
1e260 2a 20 42 65 67 69 6e 20 66 6c 61 74 74 65 6e 69  * Begin flatteni
1e270 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d 74 68 20  ng the iFrom-th 
1e280 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
1e290 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69  M clause .  ** i
1e2a0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1e2b0 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d  y..  */.  pSub =
1e2c0 20 70 53 75 62 31 20 3d 20 70 53 75 62 69 74 65   pSub1 = pSubite
1e2d0 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f  m->pSelect;..  /
1e2e0 2a 20 44 65 6c 65 74 65 20 74 68 65 20 74 72 61  * Delete the tra
1e2f0 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72  nsient table str
1e300 75 63 74 75 72 65 20 61 73 73 6f 63 69 61 74 65  ucture associate
1e310 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20  d with the.  ** 
1e320 73 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20  subquery.  */.  
1e330 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1e340 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74  , pSubitem->zDat
1e350 61 62 61 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  abase);.  sqlite
1e360 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
1e370 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  item->zName);.  
1e380 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1e390 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69  , pSubitem->zAli
1e3a0 61 73 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  as);.  pSubitem-
1e3b0 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a  >zDatabase = 0;.
1e3c0 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d    pSubitem->zNam
1e3d0 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65  e = 0;.  pSubite
1e3e0 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20  m->zAlias = 0;. 
1e3f0 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
1e400 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65  ct = 0;..  /* De
1e410 66 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65  fer deleting the
1e420 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 73   Table object as
1e430 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1e440 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20  e.  ** subquery 
1e450 75 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72  until code gener
1e460 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f  ation is.  ** co
1e470 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65 20 74 68  mplete, since th
1e480 65 72 65 20 6d 61 79 20 73 74 69 6c 6c 20 65 78  ere may still ex
1e490 69 73 74 20 45 78 70 72 2e 70 54 61 62 20 65 6e  ist Expr.pTab en
1e4a0 74 72 69 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  tries that.  ** 
1e4b0 72 65 66 65 72 20 74 6f 20 74 68 65 20 73 75 62  refer to the sub
1e4c0 71 75 65 72 79 20 65 76 65 6e 20 61 66 74 65 72  query even after
1e4d0 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54 69   flattening.  Ti
1e4e0 63 6b 65 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a  cket #3346..  **
1e4f0 0a 20 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e  .  ** pSubitem->
1e500 70 54 61 62 20 69 73 20 61 6c 77 61 79 73 20 6e  pTab is always n
1e510 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74 20  on-NULL by test 
1e520 72 65 73 74 72 69 63 74 69 6f 6e 73 20 61 6e 64  restrictions and
1e530 20 74 65 73 74 73 20 61 62 6f 76 65 2e 0a 20 20   tests above..  
1e540 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  */.  if( ALWAYS(
1e550 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d  pSubitem->pTab!=
1e560 30 29 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  0) ){.    Table 
1e570 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20 70 53 75  *pTabToDel = pSu
1e580 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bitem->pTab;.   
1e590 20 69 66 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e   if( pTabToDel->
1e5a0 6e 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20  nRef==1 ){.     
1e5b0 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
1e5c0 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
1e5d0 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
1e5e0 3b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65  ;.      pTabToDe
1e5f0 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d  l->pNextZombie =
1e600 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d   pToplevel->pZom
1e610 62 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70 54  bieTab;.      pT
1e620 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65  oplevel->pZombie
1e630 54 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b  Tab = pTabToDel;
1e640 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e650 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65    pTabToDel->nRe
1e660 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  f--;.    }.    p
1e670 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20  Subitem->pTab = 
1e680 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  0;.  }..  /* The
1e690 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20   following loop 
1e6a0 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61  runs once for ea
1e6b0 63 68 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d  ch term in a com
1e6c0 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20  pound-subquery. 
1e6d0 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28   ** flattening (
1e6e0 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
1e6f0 76 65 29 2e 20 20 49 66 20 77 65 20 61 72 65 20  ve).  If we are 
1e700 64 6f 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e  doing a differen
1e710 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66  t kind.  ** of f
1e720 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c  lattening - a fl
1e730 61 74 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74  attening other t
1e740 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73  han a compound-s
1e750 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69  ubquery flatteni
1e760 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74  ng -.  ** then t
1e770 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75  his loop only ru
1e780 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20  ns once..  **.  
1e790 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76  ** This loop mov
1e7a0 65 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52  es all of the FR
1e7b0 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  OM elements of t
1e7c0 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
1e7d0 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52   the.  ** the FR
1e7e0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1e7f0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
1e800 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73  efore doing this
1e810 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20  , remember.  ** 
1e820 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
1e830 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  r for the origin
1e840 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46  al outer query F
1e850 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20  ROM element in. 
1e860 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68   ** iParent.  Th
1e870 65 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72  e iParent cursor
1e880 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75   will never be u
1e890 73 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74  sed.  Subsequent
1e8a0 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20   code.  ** will 
1e8b0 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  scan expressions
1e8c0 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61   looking for iPa
1e8d0 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20  rent references 
1e8e0 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a  and replace.  **
1e8f0 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65   those reference
1e900 73 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f  s with expressio
1e910 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20  ns that resolve 
1e920 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20  to the subquery 
1e930 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e  FROM.  ** elemen
1e940 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f  ts we are now co
1e950 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20  pying in..  */. 
1e960 20 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20   for(pParent=p; 
1e970 70 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74  pParent; pParent
1e980 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72  =pParent->pPrior
1e990 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  , pSub=pSub->pPr
1e9a0 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53  ior){.    int nS
1e9b0 75 62 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f  ubSrc;.    u8 jo
1e9c0 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20  intype = 0;.    
1e9d0 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e  pSubSrc = pSub->
1e9e0 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f  pSrc;     /* FRO
1e9f0 4d 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71  M clause of subq
1ea00 75 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62  uery */.    nSub
1ea10 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e  Src = pSubSrc->n
1ea20 53 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  Src;  /* Number 
1ea30 6f 66 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71  of terms in subq
1ea40 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65  uery FROM clause
1ea50 20 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70   */.    pSrc = p
1ea60 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20  Parent->pSrc;   
1ea70 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
1ea80 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
1ea90 65 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20  ery */..    if( 
1eaa0 70 53 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73  pSrc ){.      as
1eab0 73 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70  sert( pParent==p
1eac0 20 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69   );  /* First ti
1ead0 6d 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c  me through the l
1eae0 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69  oop */.      joi
1eaf0 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d  ntype = pSubitem
1eb00 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20  ->jointype;.    
1eb10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1eb20 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20  ert( pParent!=p 
1eb30 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73  );  /* 2nd and s
1eb40 75 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20  ubsequent times 
1eb50 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70  through the loop
1eb60 20 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d   */.      pSrc =
1eb70 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d   pParent->pSrc =
1eb80 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1eb90 70 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20  ppend(db, 0, 0, 
1eba0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  0);.      if( pS
1ebb0 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc==0 ){.       
1ebc0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
1ebd0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
1ebe0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ebf0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1ec00 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75  * The subquery u
1ec10 73 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f  ses a single slo
1ec20 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
1ec30 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
1ec40 72 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20  r.    ** query. 
1ec50 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
1ec60 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f   has more than o
1ec70 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74  ne element in it
1ec80 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20  s FROM clause,. 
1ec90 20 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e     ** then expan
1eca0 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
1ecb0 79 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20  y to make space 
1ecc0 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61  for it to hold a
1ecd0 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20  ll elements.    
1ece0 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ** of the subque
1ecf0 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ry..    **.    *
1ed00 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
1ed10 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45  *.    **    SELE
1ed20 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20  CT * FROM tabA, 
1ed30 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73  (SELECT * FROM s
1ed40 75 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42  ub1, sub2), tabB
1ed50 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1ed60 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
1ed70 68 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69  has 3 slots in i
1ed80 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  ts FROM clause. 
1ed90 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65   One slot of the
1eda0 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
1edb0 65 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20  ery (the middle 
1edc0 73 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79  slot) is used by
1edd0 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20   the subquery.  
1ede0 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20  The next.    ** 
1edf0 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69  block of code wi
1ee00 6c 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75  ll expand the ou
1ee10 74 20 71 75 65 72 79 20 74 6f 20 34 20 73 6c 6f  t query to 4 slo
1ee20 74 73 2e 20 20 54 68 65 20 6d 69 64 64 6c 65 0a  ts.  The middle.
1ee30 20 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 65      ** slot is e
1ee40 78 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73  xpanded to two s
1ee50 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  lots in order to
1ee60 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20   make space for 
1ee70 74 68 65 0a 20 20 20 20 2a 2a 20 74 77 6f 20 65  the.    ** two e
1ee80 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46  lements in the F
1ee90 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
1eea0 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20  e subquery..    
1eeb0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53  */.    if( nSubS
1eec0 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50  rc>1 ){.      pP
1eed0 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53  arent->pSrc = pS
1eee0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
1eef0 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70  istEnlarge(db, p
1ef00 53 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69  Src, nSubSrc-1,i
1ef10 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69  From+1);.      i
1ef20 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
1ef30 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62  led ){.        b
1ef40 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1ef50 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e    }..    /* Tran
1ef60 73 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c  sfer the FROM cl
1ef70 61 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20  ause terms from 
1ef80 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74  the subquery int
1ef90 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74  o the.    ** out
1efa0 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f  er query..    */
1efb0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1efc0 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  nSubSrc; i++){. 
1efd0 20 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69       sqlite3IdLi
1efe0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72  stDelete(db, pSr
1eff0 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55  c->a[i+iFrom].pU
1f000 73 69 6e 67 29 3b 0a 20 20 20 20 20 20 70 53 72  sing);.      pSr
1f010 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20  c->a[i+iFrom] = 
1f020 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20  pSubSrc->a[i];. 
1f030 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75       memset(&pSu
1f040 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73  bSrc->a[i], 0, s
1f050 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61  izeof(pSubSrc->a
1f060 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  [i]));.    }.   
1f070 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e   pSrc->a[iFrom].
1f080 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74  jointype = joint
1f090 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e  ype;.  .    /* N
1f0a0 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74  ow begin substit
1f0b0 75 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72  uting subquery r
1f0c0 65 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73  esult set expres
1f0d0 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a  sions for .    *
1f0e0 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  * references to 
1f0f0 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74  the iParent in t
1f100 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
1f110 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45      ** .    ** E
1f120 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20  xample:.    **. 
1f130 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61     **   SELECT a
1f140 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53  +5, b*10 FROM (S
1f150 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20  ELECT x*3 AS a, 
1f160 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74  y+10 AS b FROM t
1f170 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20  1) WHERE a>b;.  
1f180 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20    **   \        
1f190 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f               \__
1f1a0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71  ___________ subq
1f1b0 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  uery __________/
1f1c0 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20            /.    
1f1d0 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f  **    \_________
1f1e0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74  ____________ out
1f1f0 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  er query _______
1f200 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1f210 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a  _______/.    **.
1f220 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61      ** We look a
1f230 74 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  t every expressi
1f240 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  on in the outer 
1f250 71 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20  query and every 
1f260 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 20  place we see.   
1f270 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74   ** "a" we subst
1f280 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20  itute "x*3" and 
1f290 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
1f2a0 65 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69  ee "b" we substi
1f2b0 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20  tute "y+10"..   
1f2c0 20 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   */.    pList = 
1f2d0 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b  pParent->pEList;
1f2e0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1f2f0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
1f300 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  +){.      if( pL
1f310 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d  ist->a[i].zName=
1f320 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  =0 ){.        ch
1f330 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ar *zName = sqli
1f340 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
1f350 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  pList->a[i].zSpa
1f360 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  n);.        sqli
1f370 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65  te3Dequote(zName
1f380 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  );.        pList
1f390 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a  ->a[i].zName = z
1f3a0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Name;.      }.  
1f3b0 20 20 7d 0a 20 20 20 20 73 75 62 73 74 45 78 70    }.    substExp
1f3c0 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e  rList(db, pParen
1f3d0 74 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65  t->pEList, iPare
1f3e0 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
1f3f0 29 3b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67  );.    if( isAgg
1f400 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45   ){.      substE
1f410 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72  xprList(db, pPar
1f420 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69  ent->pGroupBy, i
1f430 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
1f440 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61  List);.      pPa
1f450 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20  rent->pHaving = 
1f460 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50  substExpr(db, pP
1f470 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20  arent->pHaving, 
1f480 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
1f490 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  EList);.    }.  
1f4a0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64    if( pSub->pOrd
1f4b0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 61 73  erBy ){.      as
1f4c0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
1f4d0 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
1f4e0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72      pParent->pOr
1f4f0 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f  derBy = pSub->pO
1f500 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53  rderBy;.      pS
1f510 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30  ub->pOrderBy = 0
1f520 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1f530 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42  pParent->pOrderB
1f540 79 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  y ){.      subst
1f550 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61  ExprList(db, pPa
1f560 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20  rent->pOrderBy, 
1f570 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
1f580 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  EList);.    }.  
1f590 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65    if( pSub->pWhe
1f5a0 72 65 20 29 7b 0a 20 20 20 20 20 20 70 57 68 65  re ){.      pWhe
1f5b0 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
1f5c0 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57  Dup(db, pSub->pW
1f5d0 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65  here, 0);.    }e
1f5e0 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 68 65 72  lse{.      pWher
1f5f0 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  e = 0;.    }.   
1f600 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41   if( subqueryIsA
1f610 67 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  gg ){.      asse
1f620 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 48 61  rt( pParent->pHa
1f630 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ving==0 );.     
1f640 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
1f650 67 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57 68  g = pParent->pWh
1f660 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65  ere;.      pPare
1f670 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68  nt->pWhere = pWh
1f680 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65  ere;.      pPare
1f690 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75  nt->pHaving = su
1f6a0 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72  bstExpr(db, pPar
1f6b0 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50  ent->pHaving, iP
1f6c0 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
1f6d0 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ist);.      pPar
1f6e0 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  ent->pHaving = s
1f6f0 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
1f700 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69  , pParent->pHavi
1f710 6e 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ng, .           
1f720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f730 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1f740 70 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e  prDup(db, pSub->
1f750 70 48 61 76 69 6e 67 2c 20 30 29 29 3b 0a 20 20  pHaving, 0));.  
1f760 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1f770 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ent->pGroupBy==0
1f780 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   );.      pParen
1f790 74 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  t->pGroupBy = sq
1f7a0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
1f7b0 28 64 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75  (db, pSub->pGrou
1f7c0 70 42 79 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  pBy, 0);.    }el
1f7d0 73 65 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  se{.      pParen
1f7e0 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73  t->pWhere = subs
1f7f0 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e  tExpr(db, pParen
1f800 74 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65  t->pWhere, iPare
1f810 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
1f820 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
1f830 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
1f840 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50  e3ExprAnd(db, pP
1f850 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 70  arent->pWhere, p
1f860 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Where);.    }.  
1f870 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74  .    /* The flat
1f880 74 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64  tened query is d
1f890 69 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65  istinct if eithe
1f8a0 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74  r the inner or t
1f8b0 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
1f8c0 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63  query is distinc
1f8d0 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  t. .    */.    p
1f8e0 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73  Parent->selFlags
1f8f0 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61   |= pSub->selFla
1f900 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
1f910 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ;.  .    /*.    
1f920 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  ** SELECT ... FR
1f930 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c  OM (SELECT ... L
1f940 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29  IMIT a OFFSET b)
1f950 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20   LIMIT x OFFSET 
1f960 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y;.    **.    **
1f970 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20   One is tempted 
1f980 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61 20  to try to add a 
1f990 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65  and b to combine
1f9a0 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75   the limits.  Bu
1f9b0 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f  t this.    ** do
1f9c0 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65  es not work if e
1f9d0 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e  ither limit is n
1f9e0 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a  egative..    */.
1f9f0 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c      if( pSub->pL
1fa00 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50  imit ){.      pP
1fa10 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20  arent->pLimit = 
1fa20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20  pSub->pLimit;.  
1fa30 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74      pSub->pLimit
1fa40 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
1fa50 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20  .  /* Finially, 
1fa60 64 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c  delete what is l
1fa70 65 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75  eft of the subqu
1fa80 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  ery and return. 
1fa90 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a   ** success..  *
1faa0 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  /.  sqlite3Selec
1fab0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62  tDelete(db, pSub
1fac0 31 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b  1);..  return 1;
1fad0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
1fae0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1faf0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
1fb00 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1fb10 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a  MIT_VIEW) */../*
1fb20 0a 2a 2a 20 42 61 73 65 64 20 6f 6e 20 74 68 65  .** Based on the
1fb30 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1fb40 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75   AggInfo structu
1fb50 72 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20  re indicated by 
1fb60 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67  the first.** arg
1fb70 75 6d 65 6e 74 2c 20 74 68 69 73 20 66 75 6e 63  ument, this func
1fb80 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 74  tion checks if t
1fb90 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
1fba0 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   true:.**.**    
1fbb0 2a 20 74 68 65 20 71 75 65 72 79 20 63 6f 6e 74  * the query cont
1fbc0 61 69 6e 73 20 6a 75 73 74 20 61 20 73 69 6e 67  ains just a sing
1fbd0 6c 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  le aggregate fun
1fbe0 63 74 69 6f 6e 2c 0a 2a 2a 20 20 20 20 2a 20 74  ction,.**    * t
1fbf0 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  he aggregate fun
1fc00 63 74 69 6f 6e 20 69 73 20 65 69 74 68 65 72 20  ction is either 
1fc10 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 2c 20  min() or max(), 
1fc20 61 6e 64 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  and.**    * the 
1fc30 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
1fc40 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
1fc50 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76  on is a column v
1fc60 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  alue..**.** If a
1fc70 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20  ll of the above 
1fc80 61 72 65 20 74 72 75 65 2c 20 74 68 65 6e 20 57  are true, then W
1fc90 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
1fca0 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42   or WHERE_ORDERB
1fcb0 59 5f 4d 41 58 0a 2a 2a 20 69 73 20 72 65 74 75  Y_MAX.** is retu
1fcc0 72 6e 65 64 20 61 73 20 61 70 70 72 6f 70 72 69  rned as appropri
1fcd0 61 74 65 2e 20 41 6c 73 6f 2c 20 2a 70 70 4d 69  ate. Also, *ppMi
1fce0 6e 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 70  nMax is set to p
1fcf0 6f 69 6e 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20  oint to the .** 
1fd00 6c 69 73 74 20 6f 66 20 61 72 67 75 6d 65 6e 74  list of argument
1fd10 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  s passed to the 
1fd20 61 67 67 72 65 67 61 74 65 20 62 65 66 6f 72 65  aggregate before
1fd30 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
1fd40 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 63 6f 6e  * Or, if the con
1fd50 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 61 72  ditions above ar
1fd60 65 20 6e 6f 74 20 6d 65 74 2c 20 2a 70 70 4d 69  e not met, *ppMi
1fd70 6e 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 30  nMax is set to 0
1fd80 20 61 6e 64 0a 2a 2a 20 57 48 45 52 45 5f 4f 52   and.** WHERE_OR
1fd90 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 69 73 20  DERBY_NORMAL is 
1fda0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1fdb0 74 69 63 20 75 38 20 6d 69 6e 4d 61 78 51 75 65  tic u8 minMaxQue
1fdc0 72 79 28 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  ry(AggInfo *pAgg
1fdd0 49 6e 66 6f 2c 20 45 78 70 72 4c 69 73 74 20 2a  Info, ExprList *
1fde0 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e  *ppMinMax){.  in
1fdf0 74 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f  t eRet = WHERE_O
1fe00 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20  RDERBY_NORMAL;  
1fe10 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1fe20 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2a 70  n value */..  *p
1fe30 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 69  pMinMax = 0;.  i
1fe40 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75  f( pAggInfo->nFu
1fe50 6e 63 3d 3d 31 20 29 7b 0a 20 20 20 20 45 78 70  nc==1 ){.    Exp
1fe60 72 20 2a 70 45 78 70 72 20 3d 20 70 41 67 67 49  r *pExpr = pAggI
1fe70 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 45  nfo->aFunc[0].pE
1fe80 78 70 72 3b 20 2f 2a 20 41 67 67 72 65 67 61 74  xpr; /* Aggregat
1fe90 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  e function */.  
1fea0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
1feb0 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
1fec0 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 72 67  ist;      /* Arg
1fed0 75 6d 65 6e 74 73 20 74 6f 20 61 67 67 20 66 75  uments to agg fu
1fee0 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 61  nction */..    a
1fef0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
1ff00 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  ==TK_AGG_FUNCTIO
1ff10 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 4c  N );.    if( pEL
1ff20 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
1ff30 45 78 70 72 3d 3d 31 20 26 26 20 70 45 4c 69 73  Expr==1 && pELis
1ff40 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f  t->a[0].pExpr->o
1ff50 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
1ff60 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
1ff70 63 68 61 72 20 2a 7a 46 75 6e 63 20 3d 20 70 45  char *zFunc = pE
1ff80 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
1ff90 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1ffa0 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22  StrICmp(zFunc, "
1ffb0 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  min")==0 ){.    
1ffc0 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45      eRet = WHERE
1ffd0 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20  _ORDERBY_MIN;.  
1ffe0 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20        *ppMinMax 
1fff0 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  = pEList;.      
20000 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
20010 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20  3StrICmp(zFunc, 
20020 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "max")==0 ){.   
20030 20 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52       eRet = WHER
20040 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20  E_ORDERBY_MAX;. 
20050 20 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78         *ppMinMax
20060 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20   = pEList;.     
20070 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
20080 61 73 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61  assert( *ppMinMa
20090 78 3d 3d 30 20 7c 7c 20 28 2a 70 70 4d 69 6e 4d  x==0 || (*ppMinM
200a0 61 78 29 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b  ax)->nExpr==1 );
200b0 0a 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a  .  return eRet;.
200c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c  }../*.** The sel
200d0 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ect statement pa
200e0 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
200f0 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e  t argument is an
20100 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
20110 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  ..** The second 
20120 61 72 67 6d 65 6e 74 20 69 73 20 74 68 65 20 61  argment is the a
20130 73 73 6f 63 69 61 74 65 64 20 61 67 67 72 65 67  ssociated aggreg
20140 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e  ate-info object.
20150 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   This .** functi
20160 6f 6e 20 74 65 73 74 73 20 69 66 20 74 68 65 20  on tests if the 
20170 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65  SELECT is of the
20180 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53   form:.**.**   S
20190 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
201a0 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20  ROM <tbl>.**.** 
201b0 77 68 65 72 65 20 74 61 62 6c 65 20 69 73 20 61  where table is a
201c0 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c   database table,
201d0 20 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63   not a sub-selec
201e0 74 20 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68  t or view. If th
201f0 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20  e query.** does 
20200 6d 61 74 63 68 20 74 68 69 73 20 70 61 74 74 65  match this patte
20210 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74  rn, then a point
20220 65 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20  er to the Table 
20230 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74  object represent
20240 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20  ing.** <tbl> is 
20250 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
20260 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e  ise, 0 is return
20270 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61  ed..*/.static Ta
20280 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75  ble *isSimpleCou
20290 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67  nt(Select *p, Ag
202a0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
202b0 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
202c0 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a  .  Expr *pExpr;.
202d0 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70  .  assert( !p->p
202e0 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66  GroupBy );..  if
202f0 28 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70  ( p->pWhere || p
20300 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
20310 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72  =1 .   || p->pSr
20320 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d  c->nSrc!=1 || p-
20330 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  >pSrc->a[0].pSel
20340 65 63 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ect.  ){.    ret
20350 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61  urn 0;.  }.  pTa
20360 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
20370 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20  ].pTab;.  pExpr 
20380 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  = p->pEList->a[0
20390 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72  ].pExpr;.  asser
203a0 74 28 20 70 54 61 62 20 26 26 20 21 70 54 61 62  t( pTab && !pTab
203b0 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 70 45 78  ->pSelect && pEx
203c0 70 72 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56  pr );..  if( IsV
203d0 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72  irtual(pTab) ) r
203e0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
203f0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
20400 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75  _FUNCTION ) retu
20410 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45  rn 0;.  if( NEVE
20420 52 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  R(pAggInfo->nFun
20430 63 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30  c==0) ) return 0
20440 3b 0a 20 20 69 66 28 20 28 70 41 67 67 49 6e 66  ;.  if( (pAggInf
20450 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e  o->aFunc[0].pFun
20460 63 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53 51 4c  c->funcFlags&SQL
20470 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d  ITE_FUNC_COUNT)=
20480 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
20490 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
204a0 73 26 45 50 5f 44 69 73 74 69 6e 63 74 20 29 20  s&EP_Distinct ) 
204b0 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74  return 0;..  ret
204c0 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a  urn pTab;.}../*.
204d0 2a 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63 65  ** If the source
204e0 2d 6c 69 73 74 20 69 74 65 6d 20 70 61 73 73 65  -list item passe
204f0 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
20500 20 77 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77   was augmented w
20510 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45  ith an.** INDEXE
20520 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  D BY clause, the
20530 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20  n try to locate 
20540 74 68 65 20 73 70 65 63 69 66 69 65 64 20 69 6e  the specified in
20550 64 65 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a  dex. If there.**
20560 20 77 61 73 20 73 75 63 68 20 61 20 63 6c 61 75   was such a clau
20570 73 65 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64  se and the named
20580 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65   index cannot be
20590 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a   found, return .
205a0 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  ** SQLITE_ERROR 
205b0 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72  and leave an err
205c0 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74  or in pParse. Ot
205d0 68 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74  herwise, populat
205e0 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e  e .** pFrom->pIn
205f0 64 65 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53  dex and return S
20600 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74  QLITE_OK..*/.int
20610 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42   sqlite3IndexedB
20620 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70  yLookup(Parse *p
20630 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72  Parse, struct Sr
20640 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
20650 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  m){.  if( pFrom-
20660 3e 70 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e  >pTab && pFrom->
20670 7a 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 54 61  zIndex ){.    Ta
20680 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
20690 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61  m->pTab;.    cha
206a0 72 20 2a 7a 49 6e 64 65 78 20 3d 20 70 46 72 6f  r *zIndex = pFro
206b0 6d 2d 3e 7a 49 6e 64 65 78 3b 0a 20 20 20 20 49  m->zIndex;.    I
206c0 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
206d0 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
206e0 49 6e 64 65 78 3b 20 0a 20 20 20 20 20 20 20 20  Index; .        
206f0 70 49 64 78 20 26 26 20 73 71 6c 69 74 65 33 53  pIdx && sqlite3S
20700 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61  trICmp(pIdx->zNa
20710 6d 65 2c 20 7a 49 6e 64 65 78 29 3b 20 0a 20 20  me, zIndex); .  
20720 20 20 20 20 20 20 70 49 64 78 3d 70 49 64 78 2d        pIdx=pIdx-
20730 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20 20  >pNext.    );.  
20740 20 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20    if( !pIdx ){. 
20750 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
20760 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
20770 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 73 22   such index: %s"
20780 2c 20 7a 49 6e 64 65 78 2c 20 30 29 3b 0a 20 20  , zIndex, 0);.  
20790 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
207a0 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20  kSchema = 1;.   
207b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
207c0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
207d0 20 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20    pFrom->pIndex 
207e0 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65  = pIdx;.  }.  re
207f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
20800 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63 74 20 63  }./*.** Detect c
20810 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73  ompound SELECT s
20820 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 75  tatements that u
20830 73 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  se an ORDER BY c
20840 6c 61 75 73 65 20 77 69 74 68 20 0a 2a 2a 20 61  lause with .** a
20850 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  n alternative co
20860 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
20870 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  ..**.**    SELEC
20880 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58  T ... FROM t1 EX
20890 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20  CEPT SELECT ... 
208a0 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59  FROM t2 ORDER BY
208b0 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a   .. COLLATE ....
208c0 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20  **.** These are 
208d0 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 73  rewritten as a s
208e0 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  ubquery:.**.**  
208f0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
20900 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d  (SELECT ... FROM
20910 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43   t1 EXCEPT SELEC
20920 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 29 0a 2a  T ... FROM t2).*
20930 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 2e  *     ORDER BY .
20940 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a  .. COLLATE ....*
20950 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66  *.** This transf
20960 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 63 65  ormation is nece
20970 73 73 61 72 79 20 62 65 63 61 75 73 65 20 74 68  ssary because th
20980 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  e multiSelectOrd
20990 65 72 42 79 28 29 20 72 6f 75 74 69 6e 65 0a 2a  erBy() routine.*
209a0 2a 20 61 62 6f 76 65 20 74 68 61 74 20 67 65 6e  * above that gen
209b0 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
209c0 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53  for a compound S
209d0 45 4c 45 43 54 20 77 69 74 68 20 61 6e 20 4f 52  ELECT with an OR
209e0 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a  DER BY clause.**
209f0 20 75 73 65 73 20 61 20 6d 65 72 67 65 20 61 6c   uses a merge al
20a00 67 6f 72 69 74 68 6d 20 74 68 61 74 20 72 65 71  gorithm that req
20a10 75 69 72 65 73 20 74 68 65 20 73 61 6d 65 20 63  uires the same c
20a20 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
20a30 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75  e on the.** resu
20a40 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e  lt columns as on
20a50 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
20a60 61 75 73 65 2e 20 20 53 65 65 20 74 69 63 6b 65  ause.  See ticke
20a70 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77 77 2e  t.** http://www.
20a80 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69  sqlite.org/src/i
20a90 6e 66 6f 2f 36 37 30 39 35 37 34 64 32 61 0a 2a  nfo/6709574d2a.*
20aa0 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66  *.** This transf
20ab0 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  ormation is only
20ac0 20 6e 65 65 64 65 64 20 66 6f 72 20 45 58 43 45   needed for EXCE
20ad0 50 54 2c 20 49 4e 54 45 52 53 45 43 54 2c 20 61  PT, INTERSECT, a
20ae0 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65  nd UNION..** The
20af0 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
20b00 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e 65 20 77  tor works fine w
20b10 69 74 68 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  ith multiSelectO
20b20 72 64 65 72 42 79 28 29 20 65 76 65 6e 20 77 68  rderBy() even wh
20b30 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20  en.** there are 
20b40 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73 20 69 6e  COLLATE terms in
20b50 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a   the ORDER BY..*
20b60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e  /.static int con
20b70 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65  vertCompoundSele
20b80 63 74 54 6f 53 75 62 71 75 65 72 79 28 57 61 6c  ctToSubquery(Wal
20b90 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
20ba0 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
20bb0 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  i;.  Select *pNe
20bc0 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 58 3b  w;.  Select *pX;
20bd0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
20be0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
20bf0 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 53 72 63  t_item *a;.  Src
20c00 4c 69 73 74 20 2a 70 4e 65 77 53 72 63 3b 0a 20  List *pNewSrc;. 
20c10 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a   Parse *pParse;.
20c20 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a    Token dummy;..
20c30 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d    if( p->pPrior=
20c40 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
20c50 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28 20  Continue;.  if( 
20c60 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  p->pOrderBy==0 )
20c70 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
20c80 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58 3d 70  inue;.  for(pX=p
20c90 3b 20 70 58 20 26 26 20 28 70 58 2d 3e 6f 70 3d  ; pX && (pX->op=
20ca0 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f  =TK_ALL || pX->o
20cb0 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b 20 70  p==TK_SELECT); p
20cc0 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a  X=pX->pPrior){}.
20cd0 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 72 65    if( pX==0 ) re
20ce0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
20cf0 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f 72 64  e;.  a = p->pOrd
20d00 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72 28 69  erBy->a;.  for(i
20d10 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  =p->pOrderBy->nE
20d20 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  xpr-1; i>=0; i--
20d30 29 7b 0a 20 20 20 20 69 66 28 20 61 5b 69 5d 2e  ){.    if( a[i].
20d40 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
20d50 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72 65 61  P_Collate ) brea
20d60 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 30  k;.  }.  if( i<0
20d70 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
20d80 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49 66  ntinue;..  /* If
20d90 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
20da0 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73  oint, that means
20db0 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74   the transformat
20dc0 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 2e  ion is required.
20dd0 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20   */..  pParse = 
20de0 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
20df0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
20e00 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  db;.  pNew = sql
20e10 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
20e20 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
20e30 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
20e40 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
20e50 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73 65 74  _Abort;.  memset
20e60 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69 7a 65  (&dummy, 0, size
20e70 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20 70 4e  of(dummy));.  pN
20e80 65 77 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  ewSrc = sqlite3S
20e90 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d  rcListAppendFrom
20ea0 54 65 72 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c  Term(pParse,0,0,
20eb0 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c  0,&dummy,pNew,0,
20ec0 30 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 53 72  0);.  if( pNewSr
20ed0 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  c==0 ) return WR
20ee0 43 5f 41 62 6f 72 74 3b 0a 20 20 2a 70 4e 65 77  C_Abort;.  *pNew
20ef0 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70 53 72 63   = *p;.  p->pSrc
20f00 20 3d 20 70 4e 65 77 53 72 63 3b 0a 20 20 70 2d   = pNewSrc;.  p-
20f10 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
20f20 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
20f30 70 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74  pParse, 0, sqlit
20f40 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 41 4c  e3Expr(db, TK_AL
20f50 4c 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20  L, 0));.  p->op 
20f60 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70  = TK_SELECT;.  p
20f70 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20  ->pWhere = 0;.  
20f80 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d  pNew->pGroupBy =
20f90 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76   0;.  pNew->pHav
20fa0 69 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ing = 0;.  pNew-
20fb0 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
20fc0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
20fd0 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a    p->pNext = 0;.
20fe0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
20ff0 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20   ~SF_Compound;. 
21000 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70   assert( pNew->p
21010 50 72 69 6f 72 21 3d 30 20 29 3b 0a 20 20 70 4e  Prior!=0 );.  pN
21020 65 77 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78  ew->pPrior->pNex
21030 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77  t = pNew;.  pNew
21040 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
21050 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20  pNew->pOffset = 
21060 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  0;.  return WRC_
21070 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66  Continue;.}..#if
21080 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
21090 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  _CTE./*.** Argum
210a0 65 6e 74 20 70 57 69 74 68 20 28 77 68 69 63 68  ent pWith (which
210b0 20 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 70 6f   may be NULL) po
210c0 69 6e 74 73 20 74 6f 20 61 20 6c 69 6e 6b 65 64  ints to a linked
210d0 20 6c 69 73 74 20 6f 66 20 6e 65 73 74 65 64 20   list of nested 
210e0 0a 2a 2a 20 57 49 54 48 20 63 6f 6e 74 65 78 74  .** WITH context
210f0 73 2c 20 66 72 6f 6d 20 69 6e 6e 65 72 20 74 6f  s, from inner to
21100 20 6f 75 74 65 72 6d 6f 73 74 2e 20 49 66 20 74   outermost. If t
21110 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66  he table identif
21120 69 65 64 20 62 79 20 0a 2a 2a 20 46 52 4f 4d 20  ied by .** FROM 
21130 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 70  clause element p
21140 49 74 65 6d 20 69 73 20 72 65 61 6c 6c 79 20 61  Item is really a
21150 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78   common-table-ex
21160 70 72 65 73 73 69 6f 6e 20 28 43 54 45 29 20 0a  pression (CTE) .
21170 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61  ** then return a
21180 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
21190 43 54 45 20 64 65 66 69 6e 69 74 69 6f 6e 20 66  CTE definition f
211a0 6f 72 20 74 68 61 74 20 74 61 62 6c 65 2e 20 4f  or that table. O
211b0 74 68 65 72 77 69 73 65 0a 2a 2a 20 72 65 74 75  therwise.** retu
211c0 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  rn NULL..**.** I
211d0 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c  f a non-NULL val
211e0 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  ue is returned, 
211f0 73 65 74 20 2a 70 70 43 6f 6e 74 65 78 74 20 74  set *ppContext t
21200 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 57  o point to the W
21210 69 74 68 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68  ith.** object th
21220 61 74 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  at the returned 
21230 43 54 45 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a  CTE belongs to..
21240 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
21250 20 43 74 65 20 2a 73 65 61 72 63 68 57 69 74 68   Cte *searchWith
21260 28 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c  (.  With *pWith,
21270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21280 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f      /* Current o
21290 75 74 65 72 6d 6f 73 74 20 57 49 54 48 20 63 6c  utermost WITH cl
212a0 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
212b0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
212c0 49 74 65 6d 2c 20 20 20 20 20 2f 2a 20 46 52 4f  Item,     /* FRO
212d0 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74  M clause element
212e0 20 74 6f 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20   to resolve */. 
212f0 20 57 69 74 68 20 2a 2a 70 70 43 6f 6e 74 65 78   With **ppContex
21300 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
21310 20 2f 2a 20 4f 55 54 3a 20 57 49 54 48 20 63 6c   /* OUT: WITH cl
21320 61 75 73 65 20 72 65 74 75 72 6e 20 76 61 6c 75  ause return valu
21330 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  e belongs to */.
21340 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
21350 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 49  *zName;.  if( pI
21360 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d  tem->zDatabase==
21370 30 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 49  0 && (zName = pI
21380 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29  tem->zName)!=0 )
21390 7b 0a 20 20 20 20 57 69 74 68 20 2a 70 3b 0a 20  {.    With *p;. 
213a0 20 20 20 66 6f 72 28 70 3d 70 57 69 74 68 3b 20     for(p=pWith; 
213b0 70 3b 20 70 3d 70 2d 3e 70 4f 75 74 65 72 29 7b  p; p=p->pOuter){
213c0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
213d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
213e0 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCte; i++){.  
213f0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
21400 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20  3StrICmp(zName, 
21410 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  p->a[i].zName)==
21420 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  0 ){.          *
21430 70 70 43 6f 6e 74 65 78 74 20 3d 20 70 3b 0a 20  ppContext = p;. 
21440 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
21450 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  &p->a[i];.      
21460 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
21470 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
21480 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 64 65  ;.}../* The code
21490 20 67 65 6e 65 72 61 74 6f 72 20 6d 61 69 6e 74   generator maint
214a0 61 69 6e 73 20 61 20 73 74 61 63 6b 20 6f 66 20  ains a stack of 
214b0 61 63 74 69 76 65 20 57 49 54 48 20 63 6c 61 75  active WITH clau
214c0 73 65 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ses.** with the 
214d0 69 6e 6e 65 72 2d 6d 6f 73 74 20 57 49 54 48 20  inner-most WITH 
214e0 63 6c 61 75 73 65 20 62 65 69 6e 67 20 61 74 20  clause being at 
214f0 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
21500 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tack..**.** This
21510 20 72 6f 75 74 69 6e 65 20 70 75 73 68 65 73 20   routine pushes 
21520 74 68 65 20 57 49 54 48 20 63 6c 61 75 73 65 20  the WITH clause 
21530 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
21540 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a  cond argument.**
21550 20 6f 6e 74 6f 20 74 68 65 20 74 6f 70 20 6f 66   onto the top of
21560 20 74 68 65 20 73 74 61 63 6b 2e 20 49 66 20 61   the stack. If a
21570 72 67 75 6d 65 6e 74 20 62 46 72 65 65 20 69 73  rgument bFree is
21580 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 69 73   true, then this
21590 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20  .** WITH clause 
215a0 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 70 6f  will never be po
215b0 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74  pped from the st
215c0 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ack. In this cas
215d0 65 20 69 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62  e it.** should b
215e0 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69  e freed along wi
215f0 74 68 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  th the Parse obj
21600 65 63 74 2e 20 49 6e 20 6f 74 68 65 72 20 63 61  ect. In other ca
21610 73 65 73 2c 20 77 68 65 6e 0a 2a 2a 20 62 46 72  ses, when.** bFr
21620 65 65 3d 3d 30 2c 20 74 68 65 20 57 69 74 68 20  ee==0, the With 
21630 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 66  object will be f
21640 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  reed along with 
21650 74 68 65 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73  the SELECT .** s
21660 74 61 74 65 6d 65 6e 74 20 77 69 74 68 20 77 68  tatement with wh
21670 69 63 68 20 69 74 20 69 73 20 61 73 73 6f 63 69  ich it is associ
21680 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
21690 6c 69 74 65 33 57 69 74 68 50 75 73 68 28 50 61  lite3WithPush(Pa
216a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 74  rse *pParse, Wit
216b0 68 20 2a 70 57 69 74 68 2c 20 75 38 20 62 46 72  h *pWith, u8 bFr
216c0 65 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 62  ee){.  assert( b
216d0 46 72 65 65 3d 3d 30 20 7c 7c 20 70 50 61 72 73  Free==0 || pPars
216e0 65 2d 3e 70 57 69 74 68 3d 3d 30 20 29 3b 0a 20  e->pWith==0 );. 
216f0 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20   if( pWith ){.  
21700 20 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 20    pWith->pOuter 
21710 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b  = pParse->pWith;
21720 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69  .    pParse->pWi
21730 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20  th = pWith;.    
21740 70 50 61 72 73 65 2d 3e 62 46 72 65 65 57 69 74  pParse->bFreeWit
21750 68 20 3d 20 62 46 72 65 65 3b 0a 20 20 7d 0a 7d  h = bFree;.  }.}
21760 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
21770 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20  ction checks if 
21780 61 72 67 75 6d 65 6e 74 20 70 46 72 6f 6d 20 72  argument pFrom r
21790 65 66 65 72 73 20 74 6f 20 61 20 43 54 45 20 64  efers to a CTE d
217a0 65 63 6c 61 72 65 64 20 62 79 20 0a 2a 2a 20 61  eclared by .** a
217b0 20 57 49 54 48 20 63 6c 61 75 73 65 20 6f 6e 20   WITH clause on 
217c0 74 68 65 20 73 74 61 63 6b 20 63 75 72 72 65 6e  the stack curren
217d0 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65 64 20 62  tly maintained b
217e0 79 20 74 68 65 20 70 61 72 73 65 72 2e 20 41 6e  y the parser. An
217f0 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72 65 6e 74  d,.** if current
21800 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20  ly processing a 
21810 43 54 45 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  CTE expression, 
21820 69 66 20 69 74 20 69 73 20 61 20 72 65 63 75 72  if it is a recur
21830 73 69 76 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  sive.** referenc
21840 65 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  e to the current
21850 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70   CTE..**.** If p
21860 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e 74 6f 20  From falls into 
21870 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 74 77  either of the tw
21880 6f 20 63 61 74 65 67 6f 72 69 65 73 20 61 62 6f  o categories abo
21890 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 0a  ve, pFrom->pTab.
218a0 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65  ** and other fie
218b0 6c 64 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65  lds are populate
218c0 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54  d accordingly. T
218d0 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  he caller should
218e0 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d   check.** (pFrom
218f0 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f 20 64 65  ->pTab!=0) to de
21900 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
21910 6f 72 20 6e 6f 74 20 61 20 73 75 63 63 65 73 73  or not a success
21920 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20 77 61 73  ful match.** was
21930 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68   found..**.** Wh
21940 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 6d  ether or not a m
21950 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c 20 53  atch is found, S
21960 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
21970 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72  rned if no error
21980 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49 66 20 61  .** occurs. If a
21990 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63  n error does occ
219a0 75 72 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ur, an error mes
219b0 73 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69  sage is stored i
219c0 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73 65 72 20  n the.** parser 
219d0 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f 72 20 63  and some error c
219e0 6f 64 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53  ode other than S
219f0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
21a00 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
21a10 20 77 69 74 68 45 78 70 61 6e 64 28 0a 20 20 57   withExpand(.  W
21a20 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
21a30 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
21a40 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b  t_item *pFrom.){
21a50 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
21a60 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
21a70 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  se;.  sqlite3 *d
21a80 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
21a90 20 20 73 74 72 75 63 74 20 43 74 65 20 2a 70 43    struct Cte *pC
21aa0 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
21ab0 20 20 2f 2a 20 4d 61 74 63 68 65 64 20 43 54 45    /* Matched CTE
21ac0 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 20   (or NULL if no 
21ad0 6d 61 74 63 68 29 20 2a 2f 0a 20 20 57 69 74 68  match) */.  With
21ae0 20 2a 70 57 69 74 68 3b 20 20 20 20 20 20 20 20   *pWith;        
21af0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
21b00 49 54 48 20 63 6c 61 75 73 65 20 74 68 61 74 20  ITH clause that 
21b10 70 43 74 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20  pCte belongs to 
21b20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  */..  assert( pF
21b30 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
21b40 0a 20 20 70 43 74 65 20 3d 20 73 65 61 72 63 68  .  pCte = search
21b50 57 69 74 68 28 70 50 61 72 73 65 2d 3e 70 57 69  With(pParse->pWi
21b60 74 68 2c 20 70 46 72 6f 6d 2c 20 26 70 57 69 74  th, pFrom, &pWit
21b70 68 29 3b 0a 20 20 69 66 28 20 70 43 74 65 20 29  h);.  if( pCte )
21b80 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
21b90 62 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  b;.    ExprList 
21ba0 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53 65 6c  *pEList;.    Sel
21bb0 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20 53  ect *pSel;.    S
21bc0 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b 20 20 20  elect *pLeft;   
21bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21be0 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54  Left-most SELECT
21bf0 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
21c00 20 20 69 6e 74 20 62 4d 61 79 52 65 63 75 72 73    int bMayRecurs
21c10 69 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ive;            
21c20 2f 2a 20 54 72 75 65 20 69 66 20 63 6f 6d 70 6f  /* True if compo
21c30 75 6e 64 20 6a 6f 69 6e 65 64 20 62 79 20 55 4e  und joined by UN
21c40 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20  ION [ALL] */.   
21c50 20 57 69 74 68 20 2a 70 53 61 76 65 64 57 69 74   With *pSavedWit
21c60 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  h;             /
21c70 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  * Initial value 
21c80 6f 66 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68  of pParse->pWith
21c90 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70   */..    /* If p
21ca0 43 74 65 2d 3e 7a 45 72 72 20 69 73 20 6e 6f 6e  Cte->zErr is non
21cb0 2d 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f  -NULL at this po
21cc0 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 69  int, then this i
21cd0 73 20 61 6e 20 69 6c 6c 65 67 61 6c 0a 20 20 20  s an illegal.   
21ce0 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20 72 65   ** recursive re
21cf0 66 65 72 65 6e 63 65 20 74 6f 20 43 54 45 20 70  ference to CTE p
21d00 43 74 65 2e 20 4c 65 61 76 65 20 61 6e 20 65 72  Cte. Leave an er
21d10 72 6f 72 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ror in pParse an
21d20 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20  d return.    ** 
21d30 65 61 72 6c 79 2e 20 49 66 20 70 43 74 65 2d 3e  early. If pCte->
21d40 7a 45 72 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68  zErr is NULL, th
21d50 65 6e 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  en this is not a
21d60 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72   recursive refer
21d70 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20  ence..    ** In 
21d80 74 68 69 73 20 63 61 73 65 2c 20 70 72 6f 63 65  this case, proce
21d90 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ed.  */.    if( 
21da0 70 43 74 65 2d 3e 7a 45 72 72 20 29 7b 0a 20 20  pCte->zErr ){.  
21db0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
21dc0 4d 73 67 28 70 50 61 72 73 65 2c 20 70 43 74 65  Msg(pParse, pCte
21dd0 2d 3e 7a 45 72 72 2c 20 70 43 74 65 2d 3e 7a 4e  ->zErr, pCte->zN
21de0 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
21df0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
21e00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
21e10 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
21e20 3d 30 20 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d  =0 );.    pFrom-
21e30 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73  >pTab = pTab = s
21e40 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
21e50 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
21e60 62 6c 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70  ble));.    if( p
21e70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
21e80 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 70  WRC_Abort;.    p
21e90 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  Tab->nRef = 1;. 
21ea0 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d     pTab->zName =
21eb0 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
21ec0 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  (db, pCte->zName
21ed0 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b  );.    pTab->iPK
21ee0 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 70 54 61  ey = -1;.    pTa
21ef0 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20  b->nRowLogEst = 
21f00 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30  200; assert( 200
21f10 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
21f20 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 20 20  1048576) );.    
21f30 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
21f40 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a  = TF_Ephemeral;.
21f50 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65      pFrom->pSele
21f60 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
21f70 63 74 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e  ctDup(db, pCte->
21f80 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
21f90 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
21fa0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53  ailed ) return S
21fb0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
21fc0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
21fd0 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20  pSelect );..    
21fe0 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73  /* Check if this
21ff0 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65 20   is a recursive 
22000 43 54 45 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c  CTE. */.    pSel
22010 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
22020 74 3b 0a 20 20 20 20 62 4d 61 79 52 65 63 75 72  t;.    bMayRecur
22030 73 69 76 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f  sive = ( pSel->o
22040 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65  p==TK_ALL || pSe
22050 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  l->op==TK_UNION 
22060 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52  );.    if( bMayR
22070 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
22080 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 53    int i;.      S
22090 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70  rcList *pSrc = p
220a0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  From->pSelect->p
220b0 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Src;.      for(i
220c0 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  =0; i<pSrc->nSrc
220d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
220e0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
220f0 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53  tem *pItem = &pS
22100 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
22110 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61    if( pItem->zDa
22120 74 61 62 61 73 65 3d 3d 30 20 0a 20 20 20 20 20  tabase==0 .     
22130 20 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e      && pItem->zN
22140 61 6d 65 21 3d 30 20 0a 20 20 20 20 20 20 20 20  ame!=0 .        
22150 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
22160 72 49 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61  rICmp(pItem->zNa
22170 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29  me, pCte->zName)
22180 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
22190 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
221a0 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20  Tab = pTab;.    
221b0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 52        pItem->isR
221c0 65 63 75 72 73 69 76 65 20 3d 20 31 3b 0a 20 20  ecursive = 1;.  
221d0 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52          pTab->nR
221e0 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ef++;.          
221f0 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  pSel->selFlags |
22200 3d 20 53 46 5f 52 65 63 75 72 73 69 76 65 3b 0a  = SF_Recursive;.
22210 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22220 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
22230 4f 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72 73 69  Only one recursi
22240 76 65 20 72 65 66 65 72 65 6e 63 65 20 69 73 20  ve reference is 
22250 70 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a 20  permitted. */ . 
22260 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 52 65     if( pTab->nRe
22270 66 3e 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  f>2 ){.      sql
22280 69 74 65 33 45 72 72 6f 72 4d 73 67 28 0a 20 20  ite3ErrorMsg(.  
22290 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
222a0 22 6d 75 6c 74 69 70 6c 65 20 72 65 66 65 72 65  "multiple refere
222b0 6e 63 65 73 20 74 6f 20 72 65 63 75 72 73 69 76  nces to recursiv
222c0 65 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 70 43  e table: %s", pC
222d0 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20  te->zName.      
222e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
222f0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
22300 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
22310 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 31 20 7c 7c  pTab->nRef==1 ||
22320 20 28 28 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67   ((pSel->selFlag
22330 73 26 53 46 5f 52 65 63 75 72 73 69 76 65 29 20  s&SF_Recursive) 
22340 26 26 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 32  && pTab->nRef==2
22350 20 29 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d 3e   ));..    pCte->
22360 7a 45 72 72 20 3d 20 22 63 69 72 63 75 6c 61 72  zErr = "circular
22370 20 72 65 66 65 72 65 6e 63 65 3a 20 25 73 22 3b   reference: %s";
22380 0a 20 20 20 20 70 53 61 76 65 64 57 69 74 68 20  .    pSavedWith 
22390 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b  = pParse->pWith;
223a0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69  .    pParse->pWi
223b0 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20  th = pWith;.    
223c0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
223d0 74 28 70 57 61 6c 6b 65 72 2c 20 62 4d 61 79 52  t(pWalker, bMayR
223e0 65 63 75 72 73 69 76 65 20 3f 20 70 53 65 6c 2d  ecursive ? pSel-
223f0 3e 70 50 72 69 6f 72 20 3a 20 70 53 65 6c 29 3b  >pPrior : pSel);
22400 0a 0a 20 20 20 20 66 6f 72 28 70 4c 65 66 74 3d  ..    for(pLeft=
22410 70 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72  pSel; pLeft->pPr
22420 69 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74  ior; pLeft=pLeft
22430 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 70  ->pPrior);.    p
22440 45 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70  EList = pLeft->p
22450 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70  EList;.    if( p
22460 43 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20 20  Cte->pCols ){.  
22470 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e      if( pEList->
22480 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e 70 43 6f  nExpr!=pCte->pCo
22490 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  ls->nExpr ){.   
224a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
224b0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
224c0 62 6c 65 20 25 73 20 68 61 73 20 25 64 20 76 61  ble %s has %d va
224d0 6c 75 65 73 20 66 6f 72 20 25 64 20 63 6f 6c 75  lues for %d colu
224e0 6d 6e 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  mns",.          
224f0 20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70    pCte->zName, p
22500 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 43  EList->nExpr, pC
22510 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72  te->pCols->nExpr
22520 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
22530 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
22540 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a  h = pSavedWith;.
22550 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
22560 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
22570 20 20 20 7d 0a 20 20 20 20 20 20 70 45 4c 69 73     }.      pELis
22580 74 20 3d 20 70 43 74 65 2d 3e 70 43 6f 6c 73 3b  t = pCte->pCols;
22590 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 6c 65  .    }..    sele
225a0 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  ctColumnsFromExp
225b0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
225c0 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f  List, &pTab->nCo
225d0 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b  l, &pTab->aCol);
225e0 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63  .    if( bMayRec
225f0 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
22600 69 66 28 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61  if( pSel->selFla
22610 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
22620 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74  e ){.        pCt
22630 65 2d 3e 7a 45 72 72 20 3d 20 22 6d 75 6c 74 69  e->zErr = "multi
22640 70 6c 65 20 72 65 63 75 72 73 69 76 65 20 72 65  ple recursive re
22650 66 65 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20  ferences: %s";. 
22660 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22670 20 20 20 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d      pCte->zErr =
22680 20 22 72 65 63 75 72 73 69 76 65 20 72 65 66 65   "recursive refe
22690 72 65 6e 63 65 20 69 6e 20 61 20 73 75 62 71 75  rence in a subqu
226a0 65 72 79 3a 20 25 73 22 3b 0a 20 20 20 20 20 20  ery: %s";.      
226b0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  }.      sqlite3W
226c0 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
226d0 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a  r, pSel);.    }.
226e0 20 20 20 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d      pCte->zErr =
226f0 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   0;.    pParse->
22700 70 57 69 74 68 20 3d 20 70 53 61 76 65 64 57 69  pWith = pSavedWi
22710 74 68 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  th;.  }..  retur
22720 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
22730 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
22740 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f  QLITE_OMIT_CTE./
22750 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45  *.** If the SELE
22760 43 54 20 70 61 73 73 65 64 20 61 73 20 74 68 65  CT passed as the
22770 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
22780 20 68 61 73 20 61 6e 20 61 73 73 6f 63 69 61 74   has an associat
22790 65 64 20 57 49 54 48 20 0a 2a 2a 20 63 6c 61 75  ed WITH .** clau
227a0 73 65 2c 20 70 6f 70 20 69 74 20 66 72 6f 6d 20  se, pop it from 
227b0 74 68 65 20 73 74 61 63 6b 20 73 74 6f 72 65 64  the stack stored
227c0 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
227d0 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a  Parse object..**
227e0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
227f0 6e 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65  n is used as the
22800 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b   xSelectCallback
22810 32 28 29 20 63 61 6c 6c 62 61 63 6b 20 62 79 0a  2() callback by.
22820 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
22830 45 78 70 61 6e 64 28 29 20 77 68 65 6e 20 77 61  Expand() when wa
22840 6c 6b 69 6e 67 20 61 20 53 45 4c 45 43 54 20 74  lking a SELECT t
22850 72 65 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 74  ree to resolve t
22860 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e  able.** names an
22870 64 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61  d other FROM cla
22880 75 73 65 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a  use elements. .*
22890 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
228a0 6c 65 63 74 50 6f 70 57 69 74 68 28 57 61 6c 6b  lectPopWith(Walk
228b0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
228c0 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  ect *p){.  Parse
228d0 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b   *pParse = pWalk
228e0 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 57 69  er->pParse;.  Wi
228f0 74 68 20 2a 70 57 69 74 68 20 3d 20 66 69 6e 64  th *pWith = find
22900 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57  Rightmost(p)->pW
22910 69 74 68 3b 0a 20 20 69 66 28 20 70 57 69 74 68  ith;.  if( pWith
22920 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  !=0 ){.    asser
22930 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68  t( pParse->pWith
22940 3d 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20 70  ==pWith );.    p
22950 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
22960 57 69 74 68 2d 3e 70 4f 75 74 65 72 3b 0a 20 20  With->pOuter;.  
22970 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  }.}.#else.#defin
22980 65 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 20  e selectPopWith 
22990 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
229a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
229b0 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63  a Walker callbac
229c0 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67  k for "expanding
229d0 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  " a SELECT state
229e0 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64  ment..** "Expand
229f0 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f  ing" means to do
22a00 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
22a10 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61  **.**    (1)  Ma
22a20 6b 65 20 73 75 72 65 20 56 44 42 45 20 63 75 72  ke sure VDBE cur
22a30 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65  sor numbers have
22a40 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74   been assigned t
22a50 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20  o every.**      
22a60 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68     element of th
22a70 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a  e FROM clause..*
22a80 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c  *.**    (2)  Fil
22a90 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73  l in the pTabLis
22aa0 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c  t->a[].pTab fiel
22ab0 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73  ds in the SrcLis
22ac0 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20  t that .**      
22ad0 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20     defines FROM 
22ae0 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69  clause.  When vi
22af0 65 77 73 20 61 70 70 65 61 72 20 69 6e 20 74 68  ews appear in th
22b00 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a  e FROM clause,.*
22b10 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70  *         fill p
22b20 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65  TabList->a[].pSe
22b30 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79  lect with a copy
22b40 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
22b50 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
22b60 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65      that impleme
22b70 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41  nts the view.  A
22b80 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66   copy is made of
22b90 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45   the view's SELE
22ba0 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74  CT.**         st
22bb0 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20  atement so that 
22bc0 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f  we can freely mo
22bd0 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74  dify or delete t
22be0 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  hat statement.**
22bf0 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74           without
22c00 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20   worrying about 
22c10 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70  messing up the p
22c20 72 65 73 69 73 74 65 6e 74 20 72 65 70 72 65 73  resistent repres
22c30 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  entation.**     
22c40 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e      of the view.
22c50 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41  .**.**    (3)  A
22c60 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  dd terms to the 
22c70 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
22c80 61 63 63 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e  accomodate the N
22c90 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a  ATURAL keyword.*
22ca0 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69  *         on joi
22cb0 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e  ns and the ON an
22cc0 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  d USING clause o
22cd0 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20  f joins..**.**  
22ce0 20 20 28 34 29 20 20 53 63 61 6e 20 74 68 65 20    (4)  Scan the 
22cf0 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
22d00 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
22d10 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69  t (pEList) looki
22d20 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f  ng.**         fo
22d30 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  r instances of t
22d40 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20  he "*" operator 
22d50 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f  or the TABLE.* o
22d60 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20  perator..**     
22d70 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78      If found, ex
22d80 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f  pand each "*" to
22d90 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
22da0 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a   in every table.
22db0 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54  **         and T
22dc0 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65  ABLE.* to be eve
22dd0 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42  ry column in TAB
22de0 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  LE..**.*/.static
22df0 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61 6e   int selectExpan
22e00 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  der(Walker *pWal
22e10 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
22e20 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
22e30 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
22e40 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  se;.  int i, j, 
22e50 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  k;.  SrcList *pT
22e60 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69  abList;.  ExprLi
22e70 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74  st *pEList;.  st
22e80 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
22e90 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69  m *pFrom;.  sqli
22ea0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
22eb0 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45  ->db;.  Expr *pE
22ec0 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70 45 78 70  , *pRight, *pExp
22ed0 72 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c 61 67  r;.  u16 selFlag
22ee0 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b  s = p->selFlags;
22ef0 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  ..  p->selFlags 
22f00 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a  |= SF_Expanded;.
22f10 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
22f20 46 61 69 6c 65 64 20 20 29 7b 0a 20 20 20 20 72  Failed  ){.    r
22f30 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
22f40 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45 56 45 52  .  }.  if( NEVER
22f50 28 70 2d 3e 70 53 72 63 3d 3d 30 29 20 7c 7c 20  (p->pSrc==0) || 
22f60 28 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 45  (selFlags & SF_E
22f70 78 70 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20  xpanded)!=0 ){. 
22f80 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
22f90 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c  une;.  }.  pTabL
22fa0 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
22fb0 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
22fc0 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 57 69  ist;.  sqlite3Wi
22fd0 74 68 50 75 73 68 28 70 50 61 72 73 65 2c 20 66  thPush(pParse, f
22fe0 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d  indRightmost(p)-
22ff0 3e 70 57 69 74 68 2c 20 30 29 3b 0a 0a 20 20 2f  >pWith, 0);..  /
23000 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73  * Make sure curs
23010 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20  or numbers have 
23020 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f  been assigned to
23030 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a   all entries in.
23040 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    ** the FROM cl
23050 61 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45  ause of the SELE
23060 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  CT statement..  
23070 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  */.  sqlite3SrcL
23080 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
23090 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
230a0 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75  t);..  /* Look u
230b0 70 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61  p every table na
230c0 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  med in the FROM 
230d0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 65  clause of the se
230e0 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61  lect.  If.  ** a
230f0 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46  n entry of the F
23100 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20  ROM clause is a 
23110 73 75 62 71 75 65 72 79 20 69 6e 73 74 65 61 64  subquery instead
23120 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76   of a table or v
23130 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63  iew,.  ** then c
23140 72 65 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e  reate a transien
23150 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  t table structur
23160 65 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68  e to describe th
23170 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f  e subquery..  */
23180 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f  .  for(i=0, pFro
23190 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
231a0 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
231b0 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a   i++, pFrom++){.
231c0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
231d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
231e0 6f 6d 2d 3e 69 73 52 65 63 75 72 73 69 76 65 3d  om->isRecursive=
231f0 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61  =0 || pFrom->pTa
23200 62 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46 72  b );.    if( pFr
23210 6f 6d 2d 3e 69 73 52 65 63 75 72 73 69 76 65 20  om->isRecursive 
23220 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
23230 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21  if( pFrom->pTab!
23240 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
23250 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61  his statement ha
23260 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
23270 72 65 70 61 72 65 64 2e 20 20 54 68 65 72 65 20  repared.  There 
23280 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20  is no need.     
23290 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65   ** to go furthe
232a0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  r. */.      asse
232b0 72 74 28 20 69 3d 3d 30 20 29 3b 0a 23 69 66 6e  rt( i==0 );.#ifn
232c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
232d0 43 54 45 0a 20 20 20 20 20 20 73 65 6c 65 63 74  CTE.      select
232e0 50 6f 70 57 69 74 68 28 70 57 61 6c 6b 65 72 2c  PopWith(pWalker,
232f0 20 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   p);.#endif.    
23300 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
23310 6e 65 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ne;.    }.#ifnde
23320 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
23330 45 0a 20 20 20 20 69 66 28 20 77 69 74 68 45 78  E.    if( withEx
23340 70 61 6e 64 28 70 57 61 6c 6b 65 72 2c 20 70 46  pand(pWalker, pF
23350 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 57 52  rom) ) return WR
23360 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69 66 28  C_Abort;.    if(
23370 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29 20 7b   pFrom->pTab ) {
23380 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20  } else.#endif.  
23390 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61    if( pFrom->zNa
233a0 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66  me==0 ){.#ifndef
233b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
233c0 51 55 45 52 59 0a 20 20 20 20 20 20 53 65 6c 65  QUERY.      Sele
233d0 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d  ct *pSel = pFrom
233e0 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
233f0 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
23400 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
23410 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
23420 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
23430 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  pSel!=0 );.     
23440 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
23450 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  pTab==0 );.     
23460 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
23470 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c  ct(pWalker, pSel
23480 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  );.      pFrom->
23490 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71  pTab = pTab = sq
234a0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
234b0 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
234c0 6c 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  le));.      if( 
234d0 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  pTab==0 ) return
234e0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
234f0 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31    pTab->nRef = 1
23500 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e  ;.      pTab->zN
23510 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
23520 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65  intf(db, "sqlite
23530 5f 73 71 5f 25 70 22 2c 20 28 76 6f 69 64 2a 29  _sq_%p", (void*)
23540 70 54 61 62 29 3b 0a 20 20 20 20 20 20 77 68 69  pTab);.      whi
23550 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  le( pSel->pPrior
23560 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d   ){ pSel = pSel-
23570 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20  >pPrior; }.     
23580 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72   selectColumnsFr
23590 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
235a0 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c  e, pSel->pEList,
235b0 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70   &pTab->nCol, &p
235c0 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20  Tab->aCol);.    
235d0 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
235e0 2d 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  -1;.      pTab->
235f0 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30  nRowLogEst = 200
23600 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73  ; assert( 200==s
23610 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34  qlite3LogEst(104
23620 38 35 37 36 29 20 29 3b 0a 20 20 20 20 20 20 70  8576) );.      p
23630 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
23640 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 23   TF_Ephemeral;.#
23650 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
23660 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64  .      /* An ord
23670 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76  inary table or v
23680 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  iew name in the 
23690 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
236a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
236b0 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20  om->pTab==0 );. 
236c0 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
236d0 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65   = pTab = sqlite
236e0 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d  3LocateTableItem
236f0 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 72 6f  (pParse, 0, pFro
23700 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  m);.      if( pT
23710 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  ab==0 ) return W
23720 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
23730 69 66 28 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d  if( pTab->nRef==
23740 30 78 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20  0xffff ){.      
23750 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
23760 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
23770 61 6e 79 20 72 65 66 65 72 65 6e 63 65 73 20 74  any references t
23780 6f 20 5c 22 25 73 5c 22 3a 20 6d 61 78 20 36 35  o \"%s\": max 65
23790 35 33 35 22 2c 0a 20 20 20 20 20 20 20 20 20 20  535",.          
237a0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
237b0 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54         pFrom->pT
237c0 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ab = 0;.        
237d0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
237e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
237f0 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69  pTab->nRef++;.#i
23800 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
23810 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
23820 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45  !defined (SQLITE
23830 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
23840 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20 70 54  LE).      if( pT
23850 61 62 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49  ab->pSelect || I
23860 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
23870 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
23880 72 65 61 63 68 20 68 65 72 65 20 69 66 20 74 68  reach here if th
23890 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73  e named table is
238a0 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77   a really a view
238b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
238c0 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
238d0 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
238e0 2c 20 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  , pTab) ) return
238f0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
23900 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
23910 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b  m->pSelect==0 );
23920 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  .        pFrom->
23930 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
23940 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
23950 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29  Tab->pSelect, 0)
23960 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
23970 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
23980 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ker, pFrom->pSel
23990 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  ect);.      }.#e
239a0 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
239b0 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  /* Locate the in
239c0 64 65 78 20 6e 61 6d 65 64 20 62 79 20 74 68 65  dex named by the
239d0 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
239e0 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20  se, if any. */. 
239f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e     if( sqlite3In
23a00 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50  dexedByLookup(pP
23a10 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a  arse, pFrom) ){.
23a20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
23a30 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20  _Abort;.    }.  
23a40 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  }..  /* Process 
23a50 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73  NATURAL keywords
23a60 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49  , and ON and USI
23a70 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f  NG clauses of jo
23a80 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
23a90 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
23aa0 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63 65 73   || sqliteProces
23ab0 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29  sJoin(pParse, p)
23ac0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
23ad0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20  RC_Abort;.  }.. 
23ae0 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a   /* For every "*
23af0 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e  " that occurs in
23b00 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   the column list
23b10 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d  , insert the nam
23b20 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63  es of.  ** all c
23b30 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61  olumns in all ta
23b40 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65  bles.  And for e
23b50 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73  very TABLE.* ins
23b60 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20  ert the names.  
23b70 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  ** of all column
23b80 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65  s in TABLE.  The
23b90 20 70 61 72 73 65 72 20 69 6e 73 65 72 74 65 64   parser inserted
23ba0 20 61 20 73 70 65 63 69 61 6c 20 65 78 70 72 65   a special expre
23bb0 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20  ssion.  ** with 
23bc0 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61  the TK_ALL opera
23bd0 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22  tor for each "*"
23be0 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69   that it found i
23bf0 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  n the column lis
23c00 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  t..  ** The foll
23c10 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20  owing code just 
23c20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  has to locate th
23c30 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73  e TK_ALL express
23c40 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a  ions and expand.
23c50 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f    ** each one to
23c60 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c   the list of all
23c70 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20   columns in all 
23c80 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tables..  **.  *
23c90 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70  * The first loop
23ca0 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20   just checks to 
23cb0 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65  see if there are
23cc0 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f   any "*" operato
23cd0 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65  rs.  ** that nee
23ce0 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a  d expanding..  *
23cf0 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70  /.  for(k=0; k<p
23d00 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
23d10 2b 29 7b 0a 20 20 20 20 70 45 20 3d 20 70 45 4c  +){.    pE = pEL
23d20 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b  ist->a[k].pExpr;
23d30 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
23d40 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b  =TK_ALL ) break;
23d50 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d  .    assert( pE-
23d60 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
23d70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a  E->pRight!=0 );.
23d80 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
23d90 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70  op!=TK_DOT || (p
23da0 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70  E->pLeft!=0 && p
23db0 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  E->pLeft->op==TK
23dc0 5f 49 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20  _ID) );.    if( 
23dd0 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26  pE->op==TK_DOT &
23de0 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70  & pE->pRight->op
23df0 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b  ==TK_ALL ) break
23e00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45  ;.  }.  if( k<pE
23e10 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
23e20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20     /*.    ** If 
23e30 77 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d  we get here it m
23e40 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20  eans the result 
23e50 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  set contains one
23e60 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20   or more "*".   
23e70 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68   ** operators th
23e80 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  at need to be ex
23e90 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68  panded.  Loop th
23ea0 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
23eb0 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20  ssion.    ** in 
23ec0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
23ed0 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f  nd expand them o
23ee0 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a  ne by one..    *
23ef0 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  /.    struct Exp
23f00 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20  rList_item *a = 
23f10 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45  pEList->a;.    E
23f20 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20  xprList *pNew = 
23f30 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  0;.    int flags
23f40 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66   = pParse->db->f
23f50 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f  lags;.    int lo
23f60 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73  ngNames = (flags
23f70 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f   & SQLITE_FullCo
23f80 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20 20 20  lNames)!=0.     
23f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fa0 20 26 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c   && (flags & SQL
23fb0 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
23fc0 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57  s)==0;..    /* W
23fd0 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 46  hen processing F
23fe0 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
23ff0 65 72 69 65 73 2c 20 69 74 20 69 73 20 61 6c 77  eries, it is alw
24000 61 79 73 20 74 68 65 20 63 61 73 65 0a 20 20 20  ays the case.   
24010 20 2a 2a 20 74 68 61 74 20 66 75 6c 6c 5f 63 6f   ** that full_co
24020 6c 75 6d 6e 5f 6e 61 6d 65 73 3d 4f 46 46 20 61  lumn_names=OFF a
24030 6e 64 20 73 68 6f 72 74 5f 63 6f 6c 75 6d 6e 5f  nd short_column_
24040 6e 61 6d 65 73 3d 4f 4e 2e 20 20 54 68 65 0a 20  names=ON.  The. 
24050 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 52 65 73     ** sqlite3Res
24060 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29  ultSetOfSelect()
24070 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 69   routine makes i
24080 74 20 73 6f 2e 20 2a 2f 0a 20 20 20 20 61 73 73  t so. */.    ass
24090 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
240a0 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f  s & SF_NestedFro
240b0 6d 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  m)==0.          
240c0 7c 7c 20 28 28 66 6c 61 67 73 20 26 20 53 51 4c  || ((flags & SQL
240d0 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73  ITE_FullColNames
240e0 29 3d 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20  )==0 &&.        
240f0 20 20 20 20 20 20 28 66 6c 61 67 73 20 26 20 53        (flags & S
24100 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
24110 6d 65 73 29 21 3d 30 29 20 29 3b 0a 0a 20 20 20  mes)!=0) );..   
24120 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
24130 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
24140 0a 20 20 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d  .      pE = a[k]
24150 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 52  .pExpr;.      pR
24160 69 67 68 74 20 3d 20 70 45 2d 3e 70 52 69 67 68  ight = pE->pRigh
24170 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
24180 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20   pE->op!=TK_DOT 
24190 7c 7c 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a  || pRight!=0 );.
241a0 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
241b0 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 28 70 45 2d  !=TK_ALL && (pE-
241c0 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
241d0 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  Right->op!=TK_AL
241e0 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  L) ){.        /*
241f0 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72   This particular
24200 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73   expression does
24210 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
24220 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20  expanded..      
24230 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65    */.        pNe
24240 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
24250 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
24260 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78  , pNew, a[k].pEx
24270 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pr);.        if(
24280 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
24290 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
242a0 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20  >nExpr-1].zName 
242b0 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  = a[k].zName;.  
242c0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b          pNew->a[
242d0 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a  pNew->nExpr-1].z
242e0 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61  Span = a[k].zSpa
242f0 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b  n;.          a[k
24300 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ].zName = 0;.   
24310 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61         a[k].zSpa
24320 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  n = 0;.        }
24330 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45  .        a[k].pE
24340 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  xpr = 0;.      }
24350 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
24360 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   This expression
24370 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22   is a "*" or a "
24380 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65  TABLE.*" and nee
24390 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20  ds to be.       
243a0 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f   ** expanded. */
243b0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62  .        int tab
243c0 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20  leSeen = 0;     
243d0 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65   /* Set to 1 whe
243e0 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20  n TABLE matches 
243f0 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  */.        char 
24400 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20  *zTName = 0;    
24410 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61     /* text of na
24420 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20  me of TABLE */. 
24430 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f         if( pE->o
24440 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20  p==TK_DOT ){.   
24450 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
24460 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20  E->pLeft!=0 );. 
24470 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
24480 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
24490 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f  y(pE->pLeft, EP_
244a0 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
244b0 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20         zTName = 
244c0 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f  pE->pLeft->u.zTo
244d0 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ken;.        }. 
244e0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20         for(i=0, 
244f0 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
24500 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
24510 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
24520 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61  +){.          Ta
24530 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
24540 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  m->pTab;.       
24550 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20     Select *pSub 
24560 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
24570 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  ;.          char
24580 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72   *zTabName = pFr
24590 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20  om->zAlias;.    
245a0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
245b0 20 2a 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20   *zSchemaName = 
245c0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  0;.          int
245d0 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20   iDb;.          
245e0 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20  if( zTabName==0 
245f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ){.            z
24600 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e  TabName = pTab->
24610 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
24620 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
24630 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
24640 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  d ) break;.     
24650 20 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30       if( pSub==0
24660 20 7c 7c 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c   || (pSub->selFl
24670 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46  ags & SF_NestedF
24680 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rom)==0 ){.     
24690 20 20 20 20 20 20 20 70 53 75 62 20 3d 20 30 3b         pSub = 0;
246a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
246b0 20 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c 69 74   zTName && sqlit
246c0 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65  e3StrICmp(zTName
246d0 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20 29  , zTabName)!=0 )
246e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
246f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
24700 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24710 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
24720 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
24730 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
24740 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  );.            z
24750 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 69 44 62  SchemaName = iDb
24760 3e 3d 30 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44  >=0 ? db->aDb[iD
24770 62 5d 2e 7a 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a  b].zName : "*";.
24780 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
24790 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
247a0 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
247b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
247c0 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61  har *zName = pTa
247d0 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
247e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  ;.            ch
247f0 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f  ar *zColname;  /
24800 2a 20 54 68 65 20 63 6f 6d 70 75 74 65 64 20 63  * The computed c
24810 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
24820 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
24830 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61  zToFree;   /* Ma
24840 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67 20 74 68  lloced string th
24850 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66  at needs to be f
24860 72 65 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  reed */.        
24870 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61      Token sColna
24880 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64  me;  /* Computed
24890 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20   column name as 
248a0 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20  a token */..    
248b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
248c0 7a 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 20  zName );.       
248d0 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
248e0 26 26 20 70 53 75 62 0a 20 20 20 20 20 20 20 20  && pSub.        
248f0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 4d       && sqlite3M
24900 61 74 63 68 53 70 61 6e 4e 61 6d 65 28 70 53 75  atchSpanName(pSu
24910 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  b->pEList->a[j].
24920 7a 53 70 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65  zSpan, 0, zTName
24930 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  , 0)==0.        
24940 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
24950 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
24960 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20             }..  
24970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
24980 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b  a column is mark
24990 65 64 20 61 73 20 27 68 69 64 64 65 6e 27 20 28  ed as 'hidden' (
249a0 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70  currently only p
249b0 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20  ossible.        
249c0 20 20 20 20 2a 2a 20 66 6f 72 20 76 69 72 74 75      ** for virtu
249d0 61 6c 20 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e  al tables), do n
249e0 6f 74 20 69 6e 63 6c 75 64 65 20 69 74 20 69 6e  ot include it in
249f0 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20   the expanded.  
24a00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73            ** res
24a10 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20  ult-set list..  
24a20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
24a30 20 20 20 20 20 20 20 20 20 69 66 28 20 49 73 48           if( IsH
24a40 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61  iddenColumn(&pTa
24a50 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20  b->aCol[j]) ){. 
24a60 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
24a70 65 72 74 28 49 73 56 69 72 74 75 61 6c 28 70 54  ert(IsVirtual(pT
24a80 61 62 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ab));.          
24a90 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
24aa0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
24ab0 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65          tableSee
24ac0 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20  n = 1;..        
24ad0 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a      if( i>0 && z
24ae0 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  TName==0 ){.    
24af0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
24b00 46 72 6f 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  From->jointype &
24b10 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a   JT_NATURAL)!=0.
24b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b30 26 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d  && tableAndColum
24b40 6e 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2c  nIndex(pTabList,
24b50 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29   i, zName, 0, 0)
24b60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29  .              )
24b70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
24b80 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41    /* In a NATURA
24b90 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65  L join, omit the
24ba0 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72   join columns fr
24bb0 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  om the .        
24bc0 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
24bd0 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66   to the right of
24be0 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20   the join */.   
24bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
24c00 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
24c10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
24c20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
24c30 49 64 4c 69 73 74 49 6e 64 65 78 28 70 46 72 6f  IdListIndex(pFro
24c40 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65  m->pUsing, zName
24c50 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
24c60 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
24c70 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e  join with a USIN
24c80 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63  G clause, omit c
24c90 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20  olumns in the.  
24ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
24cb0 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72   using clause fr
24cc0 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20  om the table on 
24cd0 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20  the right. */.  
24ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
24cf0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
24d00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24d10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
24d20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74    pRight = sqlit
24d30 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44  e3Expr(db, TK_ID
24d40 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
24d50 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d        zColname =
24d60 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20   zName;.        
24d70 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b      zToFree = 0;
24d80 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
24d90 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54   longNames || pT
24da0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29  abList->nSrc>1 )
24db0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
24dc0 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20  Expr *pLeft;.   
24dd0 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
24de0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
24df0 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61  b, TK_ID, zTabNa
24e00 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
24e10 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74     pExpr = sqlit
24e20 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
24e30 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70  TK_DOT, pLeft, p
24e40 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20  Right, 0);.     
24e50 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63           if( zSc
24e60 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20  hemaName ){.    
24e70 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66              pLef
24e80 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
24e90 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65  db, TK_ID, zSche
24ea0 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  maName);.       
24eb0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
24ec0 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
24ed0 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c  arse, TK_DOT, pL
24ee0 65 66 74 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  eft, pExpr, 0);.
24ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
24f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
24f10 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20  ( longNames ){. 
24f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
24f30 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  Colname = sqlite
24f40 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
24f50 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20  .%s", zTabName, 
24f60 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
24f70 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20          zToFree 
24f80 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20  = zColname;.    
24f90 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
24fa0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
24fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
24fc0 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20  pr = pRight;.   
24fd0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24fe0 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
24ff0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
25000 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77  end(pParse, pNew
25010 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
25020 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 7a        sColname.z
25030 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20   = zColname;.   
25040 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d           sColnam
25050 65 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  e.n = sqlite3Str
25060 6c 65 6e 33 30 28 7a 43 6f 6c 6e 61 6d 65 29 3b  len30(zColname);
25070 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
25080 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e  ite3ExprListSetN
25090 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 65 77  ame(pParse, pNew
250a0 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b  , &sColname, 0);
250b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
250c0 20 70 4e 65 77 20 26 26 20 28 70 2d 3e 73 65 6c   pNew && (p->sel
250d0 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65  Flags & SF_Neste
250e0 64 46 72 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20  dFrom)!=0 ){.   
250f0 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63             struc
25100 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
25110 2a 70 58 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70  *pX = &pNew->a[p
25120 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20  New->nExpr-1];. 
25130 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
25140 20 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20   pSub ){.       
25150 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70           pX->zSp
25160 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  an = sqlite3DbSt
25170 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  rDup(db, pSub->p
25180 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61  EList->a[j].zSpa
25190 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
251a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
251b0 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20  ->zSpan==0 );.  
251c0 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
251d0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
251e0 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73     pX->zSpan = s
251f0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
25200 2c 20 22 25 73 2e 25 73 2e 25 73 22 2c 0a 20 20  , "%s.%s.%s",.  
25210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 7a 53 63 68 65 6d 61           zSchema
25240 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 2c 20  Name, zTabName, 
25250 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20  zColname);.     
25260 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
25270 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d  ase( pX->zSpan==
25280 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
25290 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
252a0 20 20 20 70 58 2d 3e 62 53 70 61 6e 49 73 54 61     pX->bSpanIsTa
252b0 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  b = 1;.         
252c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
252d0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
252e0 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20  b, zToFree);.   
252f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25300 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   }.        if( !
25310 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20  tableSeen ){.   
25320 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d         if( zTNam
25330 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
25340 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
25350 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
25360 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54  h table: %s", zT
25370 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
25380 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
25390 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
253a0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
253b0 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64  tables specified
253c0 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ");.          }.
253d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
253e0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
253f0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
25400 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20  e(db, pEList);. 
25410 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70     p->pEList = p
25420 4e 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c  New;.  }.#if SQL
25430 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20  ITE_MAX_COLUMN. 
25440 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 26   if( p->pEList &
25450 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  & p->pEList->nEx
25460 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  pr>db->aLimit[SQ
25470 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
25480 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  N] ){.    sqlite
25490 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
254a0 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75  , "too many colu
254b0 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65  mns in result se
254c0 74 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  t");.  }.#endif.
254d0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
254e0 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
254f0 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f  No-op routine fo
25500 72 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65  r the parse-tree
25510 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57   walker..**.** W
25520 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
25530 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78   is the Walker.x
25540 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65  ExprCallback the
25550 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
25560 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64  es.** are walked
25570 20 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74   without any act
25580 69 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e  ions being taken
25590 20 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20   at each node.  
255a0 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77  Presumably,.** w
255b0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
255c0 20 69 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c   is used for Wal
255d0 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63  ker.xExprCallbac
255e0 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65  k then .** Walke
255f0 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  r.xSelectCallbac
25600 6b 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73  k is set to do s
25610 6f 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20  omething useful 
25620 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75  for every .** su
25630 62 71 75 65 72 79 20 69 6e 20 74 68 65 20 70 61  bquery in the pa
25640 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 73 74  rser tree..*/.st
25650 61 74 69 63 20 69 6e 74 20 65 78 70 72 57 61 6c  atic int exprWal
25660 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f  kNoop(Walker *No
25670 74 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74  tUsed, Expr *Not
25680 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
25690 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
256a0 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
256b0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
256c0 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
256d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78  This routine "ex
256e0 70 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20  pands" a SELECT 
256f0 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c  statement and al
25700 6c 20 6f 66 20 69 74 73 20 73 75 62 71 75 65 72  l of its subquer
25710 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69  ies..** For addi
25720 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
25730 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65  on on what it me
25740 61 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20  ans to "expand" 
25750 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74  a SELECT.** stat
25760 65 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63  ement, see the c
25770 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65  omment on the se
25780 6c 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65  lectExpand worke
25790 72 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65  r callback above
257a0 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e  ..**.** Expandin
257b0 67 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  g a SELECT state
257c0 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73  ment is the firs
257d0 74 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73  t step in proces
257e0 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54  sing a.** SELECT
257f0 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
25800 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
25810 74 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64  t must be expand
25820 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d  ed before.** nam
25830 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20  e resolution is 
25840 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a  performed..**.**
25850 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   If anything goe
25860 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f  s wrong, an erro
25870 72 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69  r message is wri
25880 74 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65  tten into pParse
25890 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  ..** The calling
258a0 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65   function can de
258b0 74 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d  tect the problem
258c0 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70   by looking at p
258d0 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61  Parse->nErr.** a
258e0 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62  nd/or pParse->db
258f0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a  ->mallocFailed..
25900 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
25910 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
25920 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  nd(Parse *pParse
25930 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
25940 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  t){.  Walker w;.
25950 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
25960 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
25970 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
25980 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  exprWalkNoop;.  
25990 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  w.pParse = pPars
259a0 65 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  e;.  if( pParse-
259b0 3e 68 61 73 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a  >hasCompound ){.
259c0 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c      w.xSelectCal
259d0 6c 62 61 63 6b 20 3d 20 63 6f 6e 76 65 72 74 43  lback = convertC
259e0 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53  ompoundSelectToS
259f0 75 62 71 75 65 72 79 3b 0a 20 20 20 20 73 71 6c  ubquery;.    sql
25a00 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
25a10 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d  w, pSelect);.  }
25a20 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
25a30 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70  back = selectExp
25a40 61 6e 64 65 72 3b 0a 20 20 77 2e 78 53 65 6c 65  ander;.  w.xSele
25a50 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65  ctCallback2 = se
25a60 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a 20 20 73  lectPopWith;.  s
25a70 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
25a80 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d  (&w, pSelect);.}
25a90 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
25aa0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
25ab0 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
25ac0 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61  Walker.xSelectCa
25ad0 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20  llback callback 
25ae0 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 53  for the sqlite3S
25af0 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a  electTypeInfo().
25b00 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a  ** interface..**
25b10 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f  .** For each FRO
25b20 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
25b30 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54  y, add Column.zT
25b40 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a  ype and Column.z
25b50 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  Coll.** informat
25b60 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65  ion to the Table
25b70 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
25b80 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72  represents the r
25b90 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20  esult set.** of 
25ba0 74 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a  that subquery..*
25bb0 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73  *.** The Table s
25bc0 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
25bd0 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73  presents the res
25be0 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73  ult set was cons
25bf0 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65  tructed.** by se
25c00 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29 20 62  lectExpander() b
25c10 75 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ut the type and 
25c20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
25c30 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65  ation was omitte
25c40 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69  d.** at that poi
25c50 6e 74 20 62 65 63 61 75 73 65 20 69 64 65 6e 74  nt because ident
25c60 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79  ifiers had not y
25c70 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  et been resolved
25c80 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
25c90 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
25ca0 65 72 20 69 64 65 6e 74 69 66 69 65 72 20 72 65  er identifier re
25cb0 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  solution..*/.sta
25cc0 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41  tic void selectA
25cd0 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e  ddSubqueryTypeIn
25ce0 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  fo(Walker *pWalk
25cf0 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
25d00 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
25d10 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c  .  int i;.  SrcL
25d20 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
25d30 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
25d40 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20  item *pFrom;..  
25d50 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c  assert( p->selFl
25d60 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65  ags & SF_Resolve
25d70 64 20 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73  d );.  if( (p->s
25d80 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73  elFlags & SF_Has
25d90 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29 7b 0a  TypeInfo)==0 ){.
25da0 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
25db0 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66  |= SF_HasTypeInf
25dc0 6f 3b 0a 20 20 20 20 70 50 61 72 73 65 20 3d 20  o;.    pParse = 
25dd0 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
25de0 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20  .    pTabList = 
25df0 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 66 6f 72  p->pSrc;.    for
25e00 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
25e10 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
25e20 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
25e30 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pFrom++){.      
25e40 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46  Table *pTab = pF
25e50 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  rom->pTab;.     
25e60 20 69 66 28 20 41 4c 57 41 59 53 28 70 54 61 62   if( ALWAYS(pTab
25e70 21 3d 30 29 20 26 26 20 28 70 54 61 62 2d 3e 74  !=0) && (pTab->t
25e80 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
25e90 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20  emeral)!=0 ){.  
25ea0 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71        /* A sub-q
25eb0 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d  uery in the FROM
25ec0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
25ed0 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  ECT */.        S
25ee0 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46  elect *pSel = pF
25ef0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  rom->pSelect;.  
25f00 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 20 29        if( pSel )
25f10 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
25f20 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20  e( pSel->pPrior 
25f30 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70  ) pSel = pSel->p
25f40 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  Prior;.         
25f50 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e   selectAddColumn
25f60 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
25f70 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
25f80 53 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Sel);.        }.
25f90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
25fa0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
25fb0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
25fc0 61 64 64 73 20 64 61 74 61 74 79 70 65 20 61 6e  adds datatype an
25fd0 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
25fe0 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ence information
25ff0 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65   to.** the Table
26000 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 61   structures of a
26010 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ll FROM-clause s
26020 75 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a  ubqueries in a.*
26030 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
26040 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  nt..**.** Use th
26050 69 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72  is routine after
26060 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
26070 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
26080 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
26090 64 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20  dTypeInfo(Parse 
260a0 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
260b0 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64  *pSelect){.#ifnd
260c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
260d0 55 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72  UBQUERY.  Walker
260e0 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c   w;.  memset(&w,
260f0 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a   0, sizeof(w));.
26100 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
26110 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 41 64 64  ack2 = selectAdd
26120 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f  SubqueryTypeInfo
26130 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
26140 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f  ack = exprWalkNo
26150 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d  op;.  w.pParse =
26160 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74   pParse;.  sqlit
26170 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c  e3WalkSelect(&w,
26180 20 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69   pSelect);.#endi
26190 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  f.}.../*.** This
261a0 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70   routine sets up
261b0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
261c0 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69  ent for processi
261d0 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c  ng.  The.** foll
261e0 6f 77 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c  owing is accompl
261f0 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ished:.**.**    
26200 20 2a 20 20 56 44 42 45 20 43 75 72 73 6f 72 20   *  VDBE Cursor 
26210 6e 75 6d 62 65 72 73 20 61 72 65 20 61 73 73 69  numbers are assi
26220 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d  gned to all FROM
26230 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a  -clause terms..*
26240 2a 20 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72  *     *  Ephemer
26250 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73  al Table objects
26260 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72   are created for
26270 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65   all FROM-clause
26280 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20   subqueries..** 
26290 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53      *  ON and US
262a0 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20  ING clauses are 
262b0 73 68 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45  shifted into WHE
262c0 52 45 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  RE statements.**
262d0 20 20 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64       *  Wildcard
262e0 73 20 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45  s "*" and "TABLE
262f0 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65  .*" in result se
26300 74 73 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e  ts are expanded.
26310 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74  .**     *  Ident
26320 69 66 69 65 72 73 20 69 6e 20 65 78 70 72 65 73  ifiers in expres
26330 73 69 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64  sion are matched
26340 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a   to tables..**.*
26350 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
26360 63 74 73 20 72 65 63 75 72 73 69 76 65 6c 79 20  cts recursively 
26370 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65  on all subquerie
26380 73 20 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c  s within the SEL
26390 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ECT..*/.void sql
263a0 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a  ite3SelectPrep(.
263b0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
263c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
263d0 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
263e0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
263f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
26400 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
26410 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20  nt being coded. 
26420 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  */.  NameContext
26430 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e   *pOuterNC  /* N
26440 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ame context for 
26450 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a  container */.){.
26460 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
26470 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29   if( NEVER(p==0)
26480 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20   ) return;.  db 
26490 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
264a0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
264b0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
264c0 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
264d0 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66   & SF_HasTypeInf
264e0 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  o ) return;.  sq
264f0 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
26500 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  d(pParse, p);.  
26510 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
26520 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
26530 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
26540 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53   sqlite3ResolveS
26550 65 6c 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73  electNames(pPars
26560 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b  e, p, pOuterNC);
26570 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
26580 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
26590 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
265a0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
265b0 74 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61  tAddTypeInfo(pPa
265c0 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rse, p);.}../*.*
265d0 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72  * Reset the aggr
265e0 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
265f0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67  r..**.** The agg
26600 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
26610 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d  or is a set of m
26620 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74  emory cells that
26630 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65   hold.** interme
26640 64 69 61 74 65 20 72 65 73 75 6c 74 73 20 77 68  diate results wh
26650 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20  ile calculating 
26660 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54  an aggregate.  T
26670 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67  his.** routine g
26680 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 68  enerates code th
26690 61 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20  at stores NULLs 
266a0 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20  in all of those 
266b0 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e  memory.** cells.
266c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
266d0 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
266e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
266f0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
26700 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
26710 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
26720 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
26730 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
26740 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67  Func;.  int nReg
26750 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   = pAggInfo->nFu
26760 6e 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e  nc + pAggInfo->n
26770 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52  Column;.  if( nR
26780 65 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  eg==0 ) return;.
26790 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
267a0 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  BUG.  /* Verify 
267b0 74 68 61 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f  that all AggInfo
267c0 20 72 65 67 69 73 74 65 72 73 20 61 72 65 20 77   registers are w
267d0 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20  ithin the range 
267e0 73 70 65 63 69 66 69 65 64 20 62 79 0a 20 20 2a  specified by.  *
267f0 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e  * AggInfo.mnReg.
26800 2e 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a  .AggInfo.mxReg *
26810 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 67  /.  assert( nReg
26820 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  ==pAggInfo->mxRe
26830 67 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  g-pAggInfo->mnRe
26840 67 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  g+1 );.  for(i=0
26850 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  ; i<pAggInfo->nC
26860 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
26870 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66   assert( pAggInf
26880 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e  o->aCol[i].iMem>
26890 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67  =pAggInfo->mnReg
268a0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67  .         && pAg
268b0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  gInfo->aCol[i].i
268c0 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Mem<=pAggInfo->m
268d0 78 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f  xReg );.  }.  fo
268e0 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
268f0 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a  o->nFunc; i++){.
26900 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67      assert( pAgg
26910 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69  Info->aFunc[i].i
26920 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Mem>=pAggInfo->m
26930 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26  nReg.         &&
26940 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
26950 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e  [i].iMem<=pAggIn
26960 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d  fo->mxReg );.  }
26970 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
26980 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
26990 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49  P_Null, 0, pAggI
269a0 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67  nfo->mnReg, pAgg
269b0 49 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20  Info->mxReg);.  
269c0 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e  for(pFunc=pAggIn
269d0 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20  fo->aFunc, i=0; 
269e0 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
269f0 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29  c; i++, pFunc++)
26a00 7b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d  {.    if( pFunc-
26a10 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b  >iDistinct>=0 ){
26a20 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20  .      Expr *pE 
26a30 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a  = pFunc->pExpr;.
26a40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
26a50 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
26a60 45 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  E, EP_xIsSelect)
26a70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   );.      if( pE
26a80 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  ->x.pList==0 || 
26a90 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pE->x.pList->nEx
26aa0 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  pr!=1 ){.       
26ab0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
26ac0 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e  (pParse, "DISTIN
26ad0 43 54 20 61 67 67 72 65 67 61 74 65 73 20 6d 75  CT aggregates mu
26ae0 73 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20  st have exactly 
26af0 6f 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20 20  one ".          
26b00 20 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20   "argument");.  
26b10 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69        pFunc->iDi
26b20 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20  stinct = -1;.   
26b30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26b40 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
26b50 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
26b60 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
26b70 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2c 20 30  , pE->x.pList, 0
26b80 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
26b90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
26ba0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
26bb0 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73  ral, pFunc->iDis
26bc0 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20  tinct, 0, 0,.   
26bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26be0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
26bf0 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
26c00 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  FO);.      }.   
26c10 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
26c20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67  Invoke the OP_Ag
26c30 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65  gFinalize opcode
26c40 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72 65   for every aggre
26c50 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  gate function.**
26c60 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20   in the AggInfo 
26c70 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
26c80 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69  atic void finali
26c90 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50  zeAggFunctions(P
26ca0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
26cb0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
26cc0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
26cd0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
26ce0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
26cf0 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b  ggInfo_func *pF;
26d00 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70  .  for(i=0, pF=p
26d10 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20  AggInfo->aFunc; 
26d20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
26d30 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20  c; i++, pF++){. 
26d40 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
26d50 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
26d60 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73  x.pList;.    ass
26d70 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
26d80 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c  perty(pF->pExpr,
26d90 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
26da0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
26db0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67  eAddOp4(v, OP_Ag
26dc0 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d  gFinal, pF->iMem
26dd0 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d  , pList ? pList-
26de0 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a 20  >nExpr : 0, 0,. 
26df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e00 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e       (void*)pF->
26e10 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
26e20 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  F);.  }.}../*.**
26e30 20 55 70 64 61 74 65 20 74 68 65 20 61 63 63 75   Update the accu
26e40 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63  mulator memory c
26e50 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72  ells for an aggr
26e60 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a  egate based on.*
26e70 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  * the current cu
26e80 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a  rsor position..*
26e90 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70  /.static void up
26ea0 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28  dateAccumulator(
26eb0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
26ec0 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
26ed0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
26ee0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
26ef0 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 65 67  int i;.  int reg
26f00 48 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61  Hit = 0;.  int a
26f10 64 64 72 48 69 74 54 65 73 74 20 3d 20 30 3b 0a  ddrHitTest = 0;.
26f20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
26f30 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72  _func *pF;.  str
26f40 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
26f50 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f  *pC;..  pAggInfo
26f60 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31  ->directMode = 1
26f70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
26f80 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
26f90 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
26fa0 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
26fb0 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20      int nArg;.  
26fc0 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d    int addrNext =
26fd0 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41   0;.    int regA
26fe0 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  gg;.    ExprList
26ff0 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45   *pList = pF->pE
27000 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
27010 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
27020 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70  asProperty(pF->p
27030 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
27040 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ct) );.    if( p
27050 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41  List ){.      nA
27060 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  rg = pList->nExp
27070 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20  r;.      regAgg 
27080 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
27090 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 41  Range(pParse, nA
270a0 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rg);.      sqlit
270b0 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
270c0 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  st(pParse, pList
270d0 2c 20 72 65 67 41 67 67 2c 20 53 51 4c 49 54 45  , regAgg, SQLITE
270e0 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20  _ECEL_DUP);.    
270f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72  }else{.      nAr
27100 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67  g = 0;.      reg
27110 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Agg = 0;.    }. 
27120 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74     if( pF->iDist
27130 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  inct>=0 ){.     
27140 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69   addrNext = sqli
27150 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
27160 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  (v);.      asser
27170 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20  t( nArg==1 );.  
27180 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74      codeDistinct
27190 28 70 50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69  (pParse, pF->iDi
271a0 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74  stinct, addrNext
271b0 2c 20 31 2c 20 72 65 67 41 67 67 29 3b 0a 20 20  , 1, regAgg);.  
271c0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e    }.    if( pF->
271d0 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73  pFunc->funcFlags
271e0 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e   & SQLITE_FUNC_N
271f0 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20  EEDCOLL ){.     
27200 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
27210 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63  = 0;.      struc
27220 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
27230 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e  *pItem;.      in
27240 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t j;.      asser
27250 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20  t( pList!=0 );  
27260 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70  /* pList!=0 if p
27270 46 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45  F->pFunc has NEE
27280 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66  DCOLL */.      f
27290 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(j=0, pItem=pL
272a0 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26  ist->a; !pColl &
272b0 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70  & j<nArg; j++, p
272c0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
272d0 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
272e0 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
272f0 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
27300 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
27310 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
27320 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70         pColl = p
27330 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
27340 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
27350 20 20 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d      if( regHit==
27360 30 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e  0 && pAggInfo->n
27370 41 63 63 75 6d 75 6c 61 74 6f 72 20 29 20 72 65  Accumulator ) re
27380 67 48 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  gHit = ++pParse-
27390 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
273a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
273b0 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72 65  , OP_CollSeq, re
273c0 67 48 69 74 2c 20 30 2c 20 30 2c 20 28 63 68 61  gHit, 0, 0, (cha
273d0 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
273e0 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20  LLSEQ);.    }.  
273f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
27400 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 53 74 65  Op4(v, OP_AggSte
27410 70 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46  p, 0, regAgg, pF
27420 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20  ->iMem,.        
27430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
27440 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20  oid*)pF->pFunc, 
27450 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
27460 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
27470 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67  geP5(v, (u8)nArg
27480 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
27490 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
274a0 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
274b0 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20  gAgg, nArg);.   
274c0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
274d0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
274e0 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a   regAgg, nArg);.
274f0 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74      if( addrNext
27500 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
27510 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
27520 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a  l(v, addrNext);.
27530 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
27540 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
27550 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  se);.    }.  }..
27560 20 20 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70 75    /* Before popu
27570 6c 61 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  lating the accum
27580 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73  ulator registers
27590 2c 20 63 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  , clear the colu
275a0 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f  mn cache..  ** O
275b0 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 79  therwise, if any
275c0 20 6f 66 20 74 68 65 20 72 65 71 75 69 72 65 64   of the required
275d0 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61   column values a
275e0 72 65 20 61 6c 72 65 61 64 79 20 70 72 65 73 65  re already prese
275f0 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69  nt .  ** in regi
27600 73 74 65 72 73 2c 20 73 71 6c 69 74 65 33 45 78  sters, sqlite3Ex
27610 70 72 43 6f 64 65 28 29 20 6d 61 79 20 75 73 65  prCode() may use
27620 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70   OP_SCopy to cop
27630 79 20 74 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a  y the value.  **
27640 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75   to pC->iMem. Bu
27650 74 20 62 79 20 74 68 65 20 74 69 6d 65 20 74 68  t by the time th
27660 65 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 2c  e value is used,
27670 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 72 65   the original re
27680 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20  gister.  ** may 
27690 68 61 76 65 20 62 65 65 6e 20 75 73 65 64 2c 20  have been used, 
276a0 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65  invalidating the
276b0 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 75 66 66   underlying buff
276c0 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20  er holding the. 
276d0 20 2a 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f 62   ** text or blob
276e0 20 76 61 6c 75 65 2e 20 53 65 65 20 74 69 63 6b   value. See tick
276f0 65 74 20 5b 38 38 33 30 33 34 64 63 62 35 5d 2e  et [883034dcb5].
27700 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68  .  **.  ** Anoth
27710 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c  er solution woul
27720 64 20 62 65 20 74 6f 20 63 68 61 6e 67 65 20 74  d be to change t
27730 68 65 20 4f 50 5f 53 43 6f 70 79 20 75 73 65 64  he OP_SCopy used
27740 20 74 6f 20 63 6f 70 79 20 63 61 63 68 65 64 0a   to copy cached.
27750 20 20 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20 61    ** values to a
27760 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a  n OP_Copy..  */.
27770 20 20 69 66 28 20 72 65 67 48 69 74 20 29 7b 0a    if( regHit ){.
27780 20 20 20 20 61 64 64 72 48 69 74 54 65 73 74 20      addrHitTest 
27790 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
277a0 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op1(v, OP_If, re
277b0 67 48 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72  gHit); VdbeCover
277c0 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71  age(v);.  }.  sq
277d0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
277e0 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66  ear(pParse);.  f
277f0 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49  or(i=0, pC=pAggI
27800 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67  nfo->aCol; i<pAg
27810 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61  gInfo->nAccumula
27820 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b  tor; i++, pC++){
27830 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
27840 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d  Code(pParse, pC-
27850 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d  >pExpr, pC->iMem
27860 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66  );.  }.  pAggInf
27870 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  o->directMode = 
27880 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  0;.  sqlite3Expr
27890 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
278a0 65 29 3b 0a 20 20 69 66 28 20 61 64 64 72 48 69  e);.  if( addrHi
278b0 74 54 65 73 74 20 29 7b 0a 20 20 20 20 73 71 6c  tTest ){.    sql
278c0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
278d0 28 76 2c 20 61 64 64 72 48 69 74 54 65 73 74 29  (v, addrHitTest)
278e0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
278f0 64 64 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45  dd a single OP_E
27900 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69  xplain instructi
27910 6f 6e 20 74 6f 20 74 68 65 20 56 44 42 45 20 74  on to the VDBE t
27920 6f 20 65 78 70 6c 61 69 6e 20 61 20 73 69 6d 70  o explain a simp
27930 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71  le.** count(*) q
27940 75 65 72 79 20 28 22 53 45 4c 45 43 54 20 63 6f  uery ("SELECT co
27950 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54 61 62  unt(*) FROM pTab
27960 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ")..*/.#ifndef S
27970 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
27980 49 4e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  IN.static void e
27990 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e  xplainSimpleCoun
279a0 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
279b0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
279c0 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
279d0 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
279e0 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
279f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
27a00 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65  ble being querie
27a10 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  d */.  Index *pI
27a20 64 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20  dx              
27a30 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
27a40 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65  used to optimize
27a50 20 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a   scan, or NULL *
27a60 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  /.){.  if( pPars
27a70 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
27a80 0a 20 20 20 20 69 6e 74 20 62 43 6f 76 65 72 20  .    int bCover 
27a90 3d 20 28 70 49 64 78 21 3d 30 20 26 26 20 28 48  = (pIdx!=0 && (H
27aa0 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c  asRowid(pTab) ||
27ab0 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e   !IsPrimaryKeyIn
27ac0 64 65 78 28 70 49 64 78 29 29 29 3b 0a 20 20 20  dex(pIdx)));.   
27ad0 20 63 68 61 72 20 2a 7a 45 71 70 20 3d 20 73 71   char *zEqp = sq
27ae0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61  lite3MPrintf(pPa
27af0 72 73 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20 54  rse->db, "SCAN T
27b00 41 42 4c 45 20 25 73 25 73 25 73 22 2c 0a 20 20  ABLE %s%s%s",.  
27b10 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
27b20 65 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65  e,.        bCove
27b30 72 20 3f 20 22 20 55 53 49 4e 47 20 43 4f 56 45  r ? " USING COVE
27b40 52 49 4e 47 20 49 4e 44 45 58 20 22 20 3a 20 22  RING INDEX " : "
27b50 22 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65  ",.        bCove
27b60 72 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20  r ? pIdx->zName 
27b70 3a 20 22 22 0a 20 20 20 20 29 3b 0a 20 20 20 20  : "".    );.    
27b80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
27b90 34 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  4(.        pPars
27ba0 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 45 78 70  e->pVdbe, OP_Exp
27bb0 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53  lain, pParse->iS
27bc0 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a  electId, 0, 0, z
27bd0 45 71 70 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a  Eqp, P4_DYNAMIC.
27be0 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c      );.  }.}.#el
27bf0 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  se.# define expl
27c00 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61  ainSimpleCount(a
27c10 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,b,c).#endif../*
27c20 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
27c30 65 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43 54  e for the SELECT
27c40 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e   statement given
27c50 20 69 6e 20 74 68 65 20 70 20 61 72 67 75 6d 65   in the p argume
27c60 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nt.  .**.** The 
27c70 72 65 73 75 6c 74 73 20 61 72 65 20 72 65 74 75  results are retu
27c80 72 6e 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74  rned according t
27c90 6f 20 74 68 65 20 53 65 6c 65 63 74 44 65 73 74  o the SelectDest
27ca0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 53   structure..** S
27cb0 65 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 73  ee comments in s
27cc0 71 6c 69 74 65 49 6e 74 2e 68 20 66 6f 72 20 66  qliteInt.h for f
27cd0 75 72 74 68 65 72 20 69 6e 66 6f 72 6d 61 74 69  urther informati
27ce0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  on..**.** This r
27cf0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
27d00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
27d10 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72  ors.  If any err
27d20 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75  ors are.** encou
27d30 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20  ntered, then an 
27d40 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
27d50 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66  r message is lef
27d60 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e  t in.** pParse->
27d70 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54  zErrMsg..**.** T
27d80 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
27d90 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65   NOT free the Se
27da0 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70  lect structure p
27db0 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a  assed in.  The.*
27dc0 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * calling functi
27dd0 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74  on needs to do t
27de0 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  hat..*/.int sqli
27df0 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72  te3Select(.  Par
27e00 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
27e10 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
27e20 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
27e30 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
27e40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
27e50 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
27e60 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20  ing coded. */.  
27e70 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
27e80 74 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  t      /* What t
27e90 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 71 75  o do with the qu
27ea0 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
27eb0 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
27ec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
27ed0 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
27ee0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
27ef0 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72  fo;     /* Retur
27f00 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68  n from sqlite3Wh
27f10 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20  ereBegin() */.  
27f20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
27f30 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
27f40 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e  rtual machine un
27f50 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
27f60 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b   */.  int isAgg;
27f70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27f80 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20  True for select 
27f90 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e  lists like "coun
27fa0 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c  t(*)" */.  ExprL
27fb0 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
27fc0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c    /* List of col
27fd0 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e  umns to extract.
27fe0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
27ff0 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20  TabList;     /* 
28000 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74  List of tables t
28010 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f  o select from */
28020 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
28030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
28040 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
28050 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
28060 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75   ExprList *pGrou
28070 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47  pBy;    /* The G
28080 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
28090 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
280a0 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b    Expr *pHaving;
280b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
280c0 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20  HAVING clause.  
280d0 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
280e0 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20   int rc = 1;    
280f0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
28100 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20   to return from 
28110 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
28120 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 73  .  DistinctCtx s
28130 44 69 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66  Distinct; /* Inf
28140 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65  o on how to code
28150 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
28160 79 77 6f 72 64 20 2a 2f 0a 20 20 53 6f 72 74 43  yword */.  SortC
28170 74 78 20 73 53 6f 72 74 3b 20 20 20 20 20 20 20  tx sSort;       
28180 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77    /* Info on how
28190 20 74 6f 20 63 6f 64 65 20 74 68 65 20 4f 52 44   to code the ORD
281a0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
281b0 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e    AggInfo sAggIn
281c0 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f  fo;      /* Info
281d0 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20  rmation used by 
281e0 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
281f0 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b  s */.  int iEnd;
28200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28210 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
28220 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72 79  end of the query
28230 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
28240 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b;           /* 
28250 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
28260 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e  nection */..#ifn
28270 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
28280 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 52  EXPLAIN.  int iR
28290 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64 20 3d  estoreSelectId =
282a0 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
282b0 49 64 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 53  Id;.  pParse->iS
282c0 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73 65  electId = pParse
282d0 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 2b  ->iNextSelectId+
282e0 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 20  +;.#endif..  db 
282f0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
28300 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e  if( p==0 || db->
28310 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
28320 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
28330 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
28340 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  }.  if( sqlite3A
28350 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
28360 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20   SQLITE_SELECT, 
28370 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  0, 0, 0) ) retur
28380 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  n 1;.  memset(&s
28390 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  AggInfo, 0, size
283a0 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a  of(sAggInfo));..
283b0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
283c0 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73  derBy==0 || pDes
283d0 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69  t->eDest!=SRT_Di
283e0 73 74 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65  stFifo );.  asse
283f0 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
28400 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  =0 || pDest->eDe
28410 73 74 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a  st!=SRT_Fifo );.
28420 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
28430 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73  derBy==0 || pDes
28440 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69  t->eDest!=SRT_Di
28450 73 74 51 75 65 75 65 20 29 3b 0a 20 20 61 73 73  stQueue );.  ass
28460 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
28470 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ==0 || pDest->eD
28480 65 73 74 21 3d 53 52 54 5f 51 75 65 75 65 20 29  est!=SRT_Queue )
28490 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c  ;.  if( Ignorabl
284a0 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20  eOrderby(pDest) 
284b0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70 44  ){.    assert(pD
284c0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
284d0 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d  Exists || pDest-
284e0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f  >eDest==SRT_Unio
284f0 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  n || .          
28500 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
28510 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65  RT_Except || pDe
28520 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44  st->eDest==SRT_D
28530 69 73 63 61 72 64 20 7c 7c 0a 20 20 20 20 20 20  iscard ||.      
28540 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73       pDest->eDes
28550 74 3d 3d 53 52 54 5f 51 75 65 75 65 20 20 7c 7c  t==SRT_Queue  ||
28560 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
28570 52 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20  RT_DistFifo ||. 
28580 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d            pDest-
28590 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74  >eDest==SRT_Dist
285a0 51 75 65 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e  Queue || pDest->
285b0 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29  eDest==SRT_Fifo)
285c0 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52 44 45  ;.    /* If ORDE
285d0 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69  R BY makes no di
285e0 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65 20  fference in the 
285f0 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65 69 74  output then neit
28600 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20  her does.    ** 
28610 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74 20 63  DISTINCT so it c
28620 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20 74 6f  an be removed to
28630 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  o. */.    sqlite
28640 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
28650 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  db, p->pOrderBy)
28660 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
28670 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65  y = 0;.    p->se
28680 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69  lFlags &= ~SF_Di
28690 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71  stinct;.  }.  sq
286a0 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
286b0 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20  pParse, p, 0);. 
286c0 20 6d 65 6d 73 65 74 28 26 73 53 6f 72 74 2c 20   memset(&sSort, 
286d0 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f 72 74 29  0, sizeof(sSort)
286e0 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f 72 64 65  );.  sSort.pOrde
286f0 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
28700 79 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  y;.  pTabList = 
28710 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  p->pSrc;.  pELis
28720 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
28730 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
28740 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
28750 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
28760 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
28770 7d 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d 3e  }.  isAgg = (p->
28780 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
28790 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 61  gregate)!=0;.  a
287a0 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
287b0 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20   );..  /* Begin 
287c0 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e  generating code.
287d0 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
287e0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
287f0 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
28800 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
28810 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69  ;..  /* If writi
28820 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20  ng to memory or 
28830 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74  generating a set
28840 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e  .  ** only a sin
28850 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62  gle column may b
28860 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23  e output..  */.#
28870 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
28880 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66  IT_SUBQUERY.  if
28890 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43  ( checkForMultiC
288a0 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72  olumnSelectError
288b0 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20  (pParse, pDest, 
288c0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  pEList->nExpr) )
288d0 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  {.    goto selec
288e0 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69  t_end;.  }.#endi
288f0 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  f..  /* Generate
28900 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75   code for all su
28910 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  b-queries in the
28920 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a   FROM clause.  *
28930 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
28940 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
28950 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
28960 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
28970 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70  W).  for(i=0; !p
28980 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54  ->pPrior && i<pT
28990 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
289a0 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
289b0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
289c0 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
289d0 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74  a[i];.    Select
289e0 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53  Dest dest;.    S
289f0 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49  elect *pSub = pI
28a00 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
28a10 20 20 69 6e 74 20 69 73 41 67 67 53 75 62 3b 0a    int isAggSub;.
28a20 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30  .    if( pSub==0
28a30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
28a40 20 20 2f 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74    /* Sometimes t
28a50 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 75  he code for a su
28a60 62 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20 67  bquery will be g
28a70 65 6e 65 72 61 74 65 64 20 6d 6f 72 65 20 74 68  enerated more th
28a80 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63 65 2c 20  an.    ** once, 
28a90 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
28aa0 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 57  is part of the W
28ab0 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 61  HERE clause in a
28ac0 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20 20 20 20   LEFT JOIN,.    
28ad0 2a 2a 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20  ** for example. 
28ae0 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64   In that case, d
28af0 6f 20 6e 6f 74 20 72 65 67 65 6e 65 72 61 74 65  o not regenerate
28b00 20 74 68 65 20 63 6f 64 65 20 74 6f 20 6d 61 6e   the code to man
28b10 69 66 65 73 74 0a 20 20 20 20 2a 2a 20 61 20 76  ifest.    ** a v
28b20 69 65 77 20 6f 72 20 74 68 65 20 63 6f 2d 72 6f  iew or the co-ro
28b30 75 74 69 6e 65 20 74 6f 20 69 6d 70 6c 65 6d 65  utine to impleme
28b40 6e 74 20 61 20 76 69 65 77 2e 20 20 54 68 65 20  nt a view.  The 
28b50 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65 0a 20  first instance. 
28b60 20 20 20 2a 2a 20 69 73 20 73 75 66 66 69 63 69     ** is suffici
28b70 65 6e 74 2c 20 74 68 6f 75 67 68 20 74 68 65 20  ent, though the 
28b80 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61  subroutine to ma
28b90 6e 69 66 65 73 74 20 74 68 65 20 76 69 65 77 20  nifest the view 
28ba0 64 6f 65 73 20 6e 65 65 64 0a 20 20 20 20 2a 2a  does need.    **
28bb0 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 61   to be invoked a
28bc0 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  gain. */.    if(
28bd0 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
28be0 53 75 62 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Sub ){.      if(
28bf0 20 70 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75   pItem->viaCorou
28c00 74 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tine==0 ){.     
28c10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
28c20 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
28c30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
28c40 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  rn, pItem->addrF
28c50 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 20 20 7d  illSub);.      }
28c60 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
28c70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
28c80 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e  ncrement Parse.n
28c90 48 65 69 67 68 74 20 62 79 20 74 68 65 20 68 65  Height by the he
28ca0 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61 72 67  ight of the larg
28cb0 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  est expression. 
28cc0 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66 65 72     ** tree refer
28cd0 72 65 64 20 74 6f 20 62 79 20 74 68 69 73 2c 20  red to by this, 
28ce0 74 68 65 20 70 61 72 65 6e 74 20 73 65 6c 65 63  the parent selec
28cf0 74 2e 20 54 68 65 20 63 68 69 6c 64 20 73 65 6c  t. The child sel
28d00 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63  ect.    ** may c
28d10 6f 6e 74 61 69 6e 20 65 78 70 72 65 73 73 69 6f  ontain expressio
28d20 6e 20 74 72 65 65 73 20 6f 66 20 61 74 20 6d 6f  n trees of at mo
28d30 73 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49 54  st.    ** (SQLIT
28d40 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
28d50 2d 50 61 72 73 65 2e 6e 48 65 69 67 68 74 29 20  -Parse.nHeight) 
28d60 68 65 69 67 68 74 2e 20 54 68 69 73 20 69 73 20  height. This is 
28d70 61 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72  a bit.    ** mor
28d80 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 74  e conservative t
28d90 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2c 20 62  han necessary, b
28da0 75 74 20 6d 75 63 68 20 65 61 73 69 65 72 20 74  ut much easier t
28db0 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20  han enforcing.  
28dc0 20 20 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c 69    ** an exact li
28dd0 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mit..    */.    
28de0 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20  pParse->nHeight 
28df0 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  += sqlite3Select
28e00 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 0a  ExprHeight(p);..
28e10 20 20 20 20 69 73 41 67 67 53 75 62 20 3d 20 28      isAggSub = (
28e20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
28e30 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d   SF_Aggregate)!=
28e40 30 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74  0;.    if( flatt
28e50 65 6e 53 75 62 71 75 65 72 79 28 70 50 61 72 73  enSubquery(pPars
28e60 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67 2c 20  e, p, i, isAgg, 
28e70 69 73 41 67 67 53 75 62 29 20 29 7b 0a 20 20 20  isAggSub) ){.   
28e80 20 20 20 2f 2a 20 54 68 69 73 20 73 75 62 71 75     /* This subqu
28e90 65 72 79 20 63 61 6e 20 62 65 20 61 62 73 6f 72  ery can be absor
28ea0 62 65 64 20 69 6e 74 6f 20 69 74 73 20 70 61 72  bed into its par
28eb0 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ent. */.      if
28ec0 28 20 69 73 41 67 67 53 75 62 20 29 7b 0a 20 20  ( isAggSub ){.  
28ed0 20 20 20 20 20 20 69 73 41 67 67 20 3d 20 31 3b        isAgg = 1;
28ee0 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46  .        p->selF
28ef0 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65  lags |= SF_Aggre
28f00 67 61 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  gate;.      }.  
28f10 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20      i = -1;.    
28f20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 4c 69  }else if( pTabLi
28f30 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20  st->nSrc==1.    
28f40 20 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69         && Optimi
28f50 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
28f60 2c 20 53 51 4c 49 54 45 5f 53 75 62 71 43 6f 72  , SQLITE_SubqCor
28f70 6f 75 74 69 6e 65 29 0a 20 20 20 20 29 7b 0a 20  outine).    ){. 
28f80 20 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e       /* Implemen
28f90 74 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74  t a co-routine t
28fa0 68 61 74 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  hat will return 
28fb0 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
28fc0 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20  the result.     
28fd0 20 2a 2a 20 73 65 74 20 6f 6e 20 65 61 63 68 20   ** set on each 
28fe0 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20  invocation..    
28ff0 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61    */.      int a
29000 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ddrTop = sqlite3
29010 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
29020 76 29 2b 31 3b 0a 20 20 20 20 20 20 70 49 74 65  v)+1;.      pIte
29030 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  m->regReturn = +
29040 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
29050 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
29060 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69  AddOp3(v, OP_Ini
29070 74 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65  tCoroutine, pIte
29080 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 30 2c  m->regReturn, 0,
29090 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 20   addrTop);.     
290a0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
290b0 20 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54   "%s", pItem->pT
290c0 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ab->zName));.   
290d0 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69     pItem->addrFi
290e0 6c 6c 53 75 62 20 3d 20 61 64 64 72 54 6f 70 3b  llSub = addrTop;
290f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
29100 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
29110 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st, SRT_Coroutin
29120 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  e, pItem->regRet
29130 75 72 6e 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  urn);.      expl
29140 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 49  ainSetInteger(pI
29150 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  tem->iSelectId, 
29160 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e 65 78  (u8)pParse->iNex
29170 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
29180 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
29190 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64  pParse, pSub, &d
291a0 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65  est);.      pIte
291b0 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67  m->pTab->nRowLog
291c0 45 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Est = sqlite3Log
291d0 45 73 74 28 70 53 75 62 2d 3e 6e 53 65 6c 65 63  Est(pSub->nSelec
291e0 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 70 49 74  tRow);.      pIt
291f0 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65  em->viaCoroutine
29200 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65   = 1;.      pIte
29210 6d 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 64  m->regResult = d
29220 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 20 20 20  est.iSdst;.     
29230 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
29240 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f  p1(v, OP_EndCoro
29250 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65  utine, pItem->re
29260 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
29270 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
29280 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 2d 31  ere(v, addrTop-1
29290 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
292a0 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
292b0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  e(pParse);.    }
292c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 47  else{.      /* G
292d0 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
292e0 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 66  tine that will f
292f0 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ill an ephemeral
29300 20 74 61 62 6c 65 20 77 69 74 68 0a 20 20 20 20   table with.    
29310 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74    ** the content
29320 20 6f 66 20 74 68 69 73 20 73 75 62 71 75 65 72   of this subquer
29330 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  y.  pItem->addrF
29340 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f 69 6e  illSub will poin
29350 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68  t.      ** to th
29360 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
29370 20 67 65 6e 65 72 61 74 65 64 20 73 75 62 72 6f   generated subro
29380 75 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d 3e 72  utine.  pItem->r
29390 65 67 52 65 74 75 72 6e 0a 20 20 20 20 20 20 2a  egReturn.      *
293a0 2a 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20  * is a register 
293b0 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c  allocated to hol
293c0 64 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  d the subroutine
293d0 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 0a   return address.
293e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
293f0 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20 20 20 20  nt topAddr;.    
29400 20 20 69 6e 74 20 6f 6e 63 65 41 64 64 72 20 3d    int onceAddr =
29410 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65   0;.      int re
29420 74 41 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73  tAddr;.      ass
29430 65 72 74 28 20 70 49 74 65 6d 2d 3e 61 64 64 72  ert( pItem->addr
29440 46 69 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20  FillSub==0 );.  
29450 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65      pItem->regRe
29460 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  turn = ++pParse-
29470 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70  >nMem;.      top
29480 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
29490 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
294a0 6e 74 65 67 65 72 2c 20 30 2c 20 70 49 74 65 6d  nteger, 0, pItem
294b0 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
294c0 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46      pItem->addrF
294d0 69 6c 6c 53 75 62 20 3d 20 74 6f 70 41 64 64 72  illSub = topAddr
294e0 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  +1;.      if( pI
294f0 74 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65  tem->isCorrelate
29500 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
29510 2f 2a 20 49 66 20 74 68 65 20 73 75 62 71 75 65  /* If the subque
29520 72 79 20 69 73 20 6e 6f 74 20 63 6f 72 72 65 6c  ry is not correl
29530 61 74 65 64 20 61 6e 64 20 69 66 20 77 65 20 61  ated and if we a
29540 72 65 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66  re not inside of
29550 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72  .        ** a tr
29560 69 67 67 65 72 2c 20 74 68 65 6e 20 77 65 20 6f  igger, then we o
29570 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70  nly need to comp
29580 75 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ute the value of
29590 20 74 68 65 20 73 75 62 71 75 65 72 79 0a 20 20   the subquery.  
295a0 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a        ** once. *
295b0 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 41 64  /.        onceAd
295c0 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  dr = sqlite3Code
295d0 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56 64  Once(pParse); Vd
295e0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
295f0 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
29600 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c  nt((v, "material
29610 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74  ize \"%s\"", pIt
29620 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
29630 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
29640 20 20 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70          VdbeNoop
29650 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74  Comment((v, "mat
29660 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22  erialize \"%s\""
29670 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
29680 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Name));.      }.
29690 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
296a0 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
296b0 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c  t, SRT_EphemTab,
296c0 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
296d0 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
296e0 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d  etInteger(pItem-
296f0 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29  >iSelectId, (u8)
29700 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
29710 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71  ectId);.      sq
29720 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
29730 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
29740 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70  ;.      pItem->p
29750 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
29760 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
29770 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  pSub->nSelectRow
29780 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63  );.      if( onc
29790 65 41 64 64 72 20 29 20 73 71 6c 69 74 65 33 56  eAddr ) sqlite3V
297a0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f  dbeJumpHere(v, o
297b0 6e 63 65 41 64 64 72 29 3b 0a 20 20 20 20 20 20  nceAddr);.      
297c0 72 65 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65  retAddr = sqlite
297d0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
297e0 50 5f 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d  P_Return, pItem-
297f0 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
29800 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
29810 76 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49 74  v, "end %s", pIt
29820 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
29830 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
29840 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20  VdbeChangeP1(v, 
29850 74 6f 70 41 64 64 72 2c 20 72 65 74 41 64 64 72  topAddr, retAddr
29860 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
29870 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
29880 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  e(pParse);.    }
29890 0a 20 20 20 20 69 66 28 20 2f 2a 70 50 61 72 73  .    if( /*pPars
298a0 65 2d 3e 6e 45 72 72 20 7c 7c 2a 2f 20 64 62 2d  e->nErr ||*/ db-
298b0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
298c0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
298d0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
298e0 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68    pParse->nHeigh
298f0 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  t -= sqlite3Sele
29900 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b  ctExprHeight(p);
29910 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20  .    pTabList = 
29920 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28  p->pSrc;.    if(
29930 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72   !IgnorableOrder
29940 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20  by(pDest) ){.   
29950 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42     sSort.pOrderB
29960 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
29970 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c  .    }.  }.  pEL
29980 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
29990 0a 23 65 6e 64 69 66 0a 20 20 70 57 68 65 72 65  .#endif.  pWhere
299a0 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
299b0 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
299c0 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e  roupBy;.  pHavin
299d0 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a  g = p->pHaving;.
299e0 20 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e    sDistinct.isTn
299f0 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ct = (p->selFlag
29a00 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
29a10 21 3d 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  !=0;..#ifndef SQ
29a20 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
29a30 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49  ND_SELECT.  /* I
29a40 66 20 74 68 65 72 65 20 69 73 20 61 72 65 20 61  f there is are a
29a50 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65   sequence of que
29a60 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72  ries, do the ear
29a70 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e  lier ones first.
29a80 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
29a90 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 63 20  Prior ){.    rc 
29aa0 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50  = multiSelect(pP
29ab0 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b  arse, p, pDest);
29ac0 0a 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49  .    explainSetI
29ad0 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69  nteger(pParse->i
29ae0 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f  SelectId, iResto
29af0 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  reSelectId);.   
29b00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
29b10 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
29b20 74 68 65 20 71 75 65 72 79 20 69 73 20 44 49 53  the query is DIS
29b30 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f 52  TINCT with an OR
29b40 44 45 52 20 42 59 20 62 75 74 20 69 73 20 6e 6f  DER BY but is no
29b50 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c 20  t an aggregate, 
29b60 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68 65  and .  ** if the
29b70 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73 20   select-list is 
29b80 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
29b90 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20 74  ORDER BY list, t
29ba0 68 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a 20  hen this query. 
29bb0 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69   ** can be rewri
29bc0 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50 20  tten as a GROUP 
29bd0 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  BY. In other wor
29be0 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ds, this:.  **. 
29bf0 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 44   **     SELECT D
29c00 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d  ISTINCT xyz FROM
29c10 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78 79   ... ORDER BY xy
29c20 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74  z.  **.  ** is t
29c30 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20  ransformed to:. 
29c40 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
29c50 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e  ECT xyz FROM ...
29c60 20 47 52 4f 55 50 20 42 59 20 78 79 7a 0a 20 20   GROUP BY xyz.  
29c70 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f  **.  ** The seco
29c80 6e 64 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65  nd form is prefe
29c90 72 72 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65  rred as a single
29ca0 20 69 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d   index (or temp-
29cb0 74 61 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20  table) may be . 
29cc0 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74   ** used for bot
29cd0 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 61  h the ORDER BY a
29ce0 6e 64 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63  nd DISTINCT proc
29cf0 65 73 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69  essing. As origi
29d00 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74  nally .  ** writ
29d10 74 65 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75  ten the query mu
29d20 73 74 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61  st use a temp-ta
29d30 62 6c 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74  ble for at least
29d40 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45   one of the ORDE
29d50 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44  R .  ** BY and D
29d60 49 53 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20  ISTINCT, and an 
29d70 69 6e 64 65 78 20 6f 72 20 73 65 70 61 72 61 74  index or separat
29d80 65 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72  e temp-table for
29d90 20 74 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f   the other..  */
29da0 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
29db0 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
29dc0 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
29dd0 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a  )==SF_Distinct .
29de0 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
29df0 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 73 53 6f  rListCompare(sSo
29e00 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 70 2d 3e  rt.pOrderBy, p->
29e10 70 45 4c 69 73 74 2c 20 2d 31 29 3d 3d 30 0a 20  pEList, -1)==0. 
29e20 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c   ){.    p->selFl
29e30 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69  ags &= ~SF_Disti
29e40 6e 63 74 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f  nct;.    p->pGro
29e50 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
29e60 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
29e70 3e 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20  >pEList, 0);.   
29e80 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
29e90 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 53 6f  GroupBy;.    sSo
29ea0 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  rt.pOrderBy = 0;
29eb0 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74  .    /* Notice t
29ec0 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74  hat even thought
29ed0 20 53 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73   SF_Distinct has
29ee0 20 62 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72   been cleared fr
29ef0 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a  om p->selFlags,.
29f00 20 20 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74      ** the sDist
29f10 69 6e 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73  inct.isTnct is s
29f20 74 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65  till set.  Hence
29f30 2c 20 69 73 54 6e 63 74 20 72 65 70 72 65 73 65  , isTnct represe
29f40 6e 74 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f  nts the.    ** o
29f50 72 69 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20  riginal setting 
29f60 6f 66 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e  of the SF_Distin
29f70 63 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65  ct flag, not the
29f80 20 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67   current setting
29f90 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
29fa0 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
29fb0 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   );.  }..  /* If
29fc0 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
29fd0 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
29fe0 65 6e 20 74 68 69 73 20 73 6f 72 74 69 6e 67 0a  en this sorting.
29ff0 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67 68 74    ** index might
2a000 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 75 6e   end up being un
2a010 75 73 65 64 20 69 66 20 74 68 65 20 64 61 74 61  used if the data
2a020 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78   can be .  ** ex
2a030 74 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73  tracted in pre-s
2a040 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20 49 66  orted order.  If
2a050 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73   that is the cas
2a060 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  e, then the.  **
2a070 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
2a080 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69  l instruction wi
2a090 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f  ll be changed to
2a0a0 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65   an OP_Noop once
2a0b0 0a 20 20 2a 2a 20 77 65 20 66 69 67 75 72 65 20  .  ** we figure 
2a0c0 6f 75 74 20 74 68 61 74 20 74 68 65 20 73 6f 72  out that the sor
2a0d0 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 6e 6f  ting index is no
2a0e0 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20 61  t needed.  The a
2a0f0 64 64 72 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a  ddrSortIndex.  *
2a100 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  * variable is us
2a110 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  ed to facilitate
2a120 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20   that change..  
2a130 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70  */.  if( sSort.p
2a140 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b  OrderBy ){.    K
2a150 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
2a160 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
2a170 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
2a180 4c 69 73 74 28 70 50 61 72 73 65 2c 20 73 53 6f  List(pParse, sSo
2a190 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c 20  rt.pOrderBy, 0, 
2a1a0 30 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 69 45  0);.    sSort.iE
2a1b0 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
2a1c0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 53 6f  >nTab++;.    sSo
2a1d0 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
2a1e0 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   =.      sqlite3
2a1f0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
2a200 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a  _OpenEphemeral,.
2a210 20 20 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e            sSort.
2a220 69 45 43 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e  iECursor, sSort.
2a230 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b  pOrderBy->nExpr+
2a240 31 2b 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  1+pEList->nExpr,
2a250 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 28 63   0,.          (c
2a260 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
2a270 34 5f 4b 45 59 49 4e 46 4f 0a 20 20 20 20 20 20  4_KEYINFO.      
2a280 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2a290 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2a2a0 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  dex = -1;.  }.. 
2a2b0 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75   /* If the outpu
2a2c0 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f  t is destined fo
2a2d0 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  r a temporary ta
2a2e0 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74  ble, open that t
2a2f0 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
2a300 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
2a310 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20  RT_EphemTab ){. 
2a320 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2a330 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
2a340 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d  phemeral, pDest-
2a350 3e 69 53 44 50 61 72 6d 2c 20 70 45 4c 69 73 74  >iSDParm, pEList
2a360 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20  ->nExpr);.  }.. 
2a370 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69   /* Set the limi
2a380 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64  ter..  */.  iEnd
2a390 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
2a3a0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 2d  keLabel(v);.  p-
2a3b0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 4c 41  >nSelectRow = LA
2a3c0 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20 63  RGEST_INT64;.  c
2a3d0 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
2a3e0 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
2a3f0 69 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e  iEnd);.  if( p->
2a400 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20 73 53 6f  iLimit==0 && sSo
2a410 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
2a420 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
2a430 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 73  e3VdbeGetOp(v, s
2a440 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
2a450 65 78 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  ex)->opcode = OP
2a460 5f 53 6f 72 74 65 72 4f 70 65 6e 3b 0a 20 20 20  _SorterOpen;.   
2a470 20 73 53 6f 72 74 2e 73 6f 72 74 46 6c 61 67 73   sSort.sortFlags
2a480 20 7c 3d 20 53 4f 52 54 46 4c 41 47 5f 55 73 65   |= SORTFLAG_Use
2a490 53 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f  Sorter;.  }..  /
2a4a0 2a 20 4f 70 65 6e 20 61 20 76 69 72 74 75 61 6c  * Open a virtual
2a4b0 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f   index to use fo
2a4c0 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73  r the distinct s
2a4d0 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
2a4e0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2a4f0 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
2a500 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63  sDistinct.tabTnc
2a510 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
2a520 2b 2b 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63  ++;.    sDistinc
2a530 74 2e 61 64 64 72 54 6e 63 74 20 3d 20 73 71 6c  t.addrTnct = sql
2a540 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2a550 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
2a560 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  al,.            
2a570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a580 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61      sDistinct.ta
2a590 62 54 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20  bTnct, 0, 0,.   
2a5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
2a5c0 61 72 2a 29 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  ar*)keyInfoFromE
2a5d0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
2a5e0 70 2d 3e 70 45 4c 69 73 74 2c 30 2c 30 29 2c 0a  p->pEList,0,0),.
2a5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a610 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
2a620 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2a630 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e  geP5(v, BTREE_UN
2a640 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 73 44  ORDERED);.    sD
2a650 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70  istinct.eTnctTyp
2a660 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  e = WHERE_DISTIN
2a670 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a 20 20  CT_UNORDERED;.  
2a680 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44 69 73 74  }else{.    sDist
2a690 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d  inct.eTnctType =
2a6a0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
2a6b0 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  NOOP;.  }..  if(
2a6c0 20 21 69 73 41 67 67 20 26 26 20 70 47 72 6f 75   !isAgg && pGrou
2a6d0 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pBy==0 ){.    /*
2a6e0 20 4e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75   No aggregate fu
2a6f0 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 20 47  nctions and no G
2a700 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a  ROUP BY clause *
2a710 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72 6c 46  /.    u16 wctrlF
2a720 6c 61 67 73 20 3d 20 28 73 44 69 73 74 69 6e 63  lags = (sDistinc
2a730 74 2e 69 73 54 6e 63 74 20 3f 20 57 48 45 52 45  t.isTnct ? WHERE
2a740 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 3a  _WANT_DISTINCT :
2a750 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67   0);..    /* Beg
2a760 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2a770 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 70 57 49  scan. */.    pWI
2a780 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
2a790 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
2a7a0 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
2a7b0 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  , sSort.pOrderBy
2a7c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2a7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7e0 20 70 2d 3e 70 45 4c 69 73 74 2c 20 77 63 74 72   p->pEList, wctr
2a7f0 6c 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20  lFlags, 0);.    
2a800 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
2a810 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
2a820 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2a830 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f  WhereOutputRowCo
2a840 75 6e 74 28 70 57 49 6e 66 6f 29 20 3c 20 70 2d  unt(pWInfo) < p-
2a850 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20  >nSelectRow ){. 
2a860 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
2a870 6f 77 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  ow = sqlite3Wher
2a880 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28  eOutputRowCount(
2a890 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20  pWInfo);.    }. 
2a8a0 20 20 20 69 66 28 20 73 44 69 73 74 69 6e 63 74     if( sDistinct
2a8b0 2e 69 73 54 6e 63 74 20 26 26 20 73 71 6c 69 74  .isTnct && sqlit
2a8c0 65 33 57 68 65 72 65 49 73 44 69 73 74 69 6e 63  e3WhereIsDistinc
2a8d0 74 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20  t(pWInfo) ){.   
2a8e0 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e     sDistinct.eTn
2a8f0 63 74 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33  ctType = sqlite3
2a900 57 68 65 72 65 49 73 44 69 73 74 69 6e 63 74 28  WhereIsDistinct(
2a910 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20  pWInfo);.    }. 
2a920 20 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72     if( sSort.pOr
2a930 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73  derBy ){.      s
2a940 53 6f 72 74 2e 6e 4f 42 53 61 74 20 3d 20 73 71  Sort.nOBSat = sq
2a950 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65  lite3WhereIsOrde
2a960 72 65 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  red(pWInfo);.   
2a970 20 20 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f 42     if( sSort.nOB
2a980 53 61 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64 65  Sat==sSort.pOrde
2a990 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  rBy->nExpr ){.  
2a9a0 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64        sSort.pOrd
2a9b0 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
2a9c0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
2a9d0 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  If sorting index
2a9e0 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74 65   that was create
2a9f0 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f  d by a prior OP_
2aa00 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20  OpenEphemeral . 
2aa10 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f     ** instructio
2aa20 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62  n ended up not b
2aa30 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65  eing needed, the
2aa40 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f  n change the OP_
2aa50 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20  OpenEphemeral.  
2aa60 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f    ** into an OP_
2aa70 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Noop..    */.   
2aa80 20 69 66 28 20 73 53 6f 72 74 2e 61 64 64 72 53   if( sSort.addrS
2aa90 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 73  ortIndex>=0 && s
2aaa0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d 30  Sort.pOrderBy==0
2aab0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2aac0 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
2aad0 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53  p(v, sSort.addrS
2aae0 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d  ortIndex);.    }
2aaf0 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65  ..    /* Use the
2ab00 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20   standard inner 
2ab10 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 73 65 6c  loop. */.    sel
2ab20 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
2ab30 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20  rse, p, pEList, 
2ab40 2d 31 2c 20 26 73 53 6f 72 74 2c 20 26 73 44 69  -1, &sSort, &sDi
2ab50 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20  stinct, pDest,. 
2ab60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab70 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43     sqlite3WhereC
2ab80 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 70 57 49  ontinueLabel(pWI
2ab90 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20  nfo),.          
2aba0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2abb0 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c  3WhereBreakLabel
2abc0 28 70 57 49 6e 66 6f 29 29 3b 0a 0a 20 20 20 20  (pWInfo));..    
2abd0 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62  /* End the datab
2abe0 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  ase scan loop.. 
2abf0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
2ac00 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
2ac10 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2ac20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 77 68 65  /* This case whe
2ac30 6e 20 74 68 65 72 65 20 65 78 69 73 74 20 61 67  n there exist ag
2ac40 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
2ac50 73 20 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20  s or a GROUP BY 
2ac60 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 6f 72  clause.    ** or
2ac70 20 62 6f 74 68 20 2a 2f 0a 20 20 20 20 4e 61 6d   both */.    Nam
2ac80 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20  eContext sNC;   
2ac90 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
2aca0 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20   for processing 
2acb0 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d  aggregate inform
2acc0 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  ation */.    int
2acd0 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20   iAMem;         
2ace0 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64   /* First Mem ad
2acf0 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e  dress for storin
2ad00 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  g current GROUP 
2ad10 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42  BY */.    int iB
2ad20 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem;          /*
2ad30 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65   First Mem addre
2ad40 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20  ss for previous 
2ad50 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20  GROUP BY */.    
2ad60 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20  int iUseFlag;   
2ad70 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65      /* Mem addre
2ad80 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20  ss holding flag 
2ad90 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
2ada0 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20  at least.       
2adb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2adc0 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74   ** one row of t
2add0 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20  he input to the 
2ade0 61 67 67 72 65 67 61 74 6f 72 20 68 61 73 20 62  aggregator has b
2adf0 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  een.            
2ae00 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
2ae10 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20  rocessed */.    
2ae20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20  int iAbortFlag; 
2ae30 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65      /* Mem addre
2ae40 73 73 20 77 68 69 63 68 20 63 61 75 73 65 73 20  ss which causes 
2ae50 71 75 65 72 79 20 61 62 6f 72 74 20 69 66 20 70  query abort if p
2ae60 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69  ositive */.    i
2ae70 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20  nt groupBySort; 
2ae80 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20     /* Rows come 
2ae90 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47  from source in G
2aea0 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f  ROUP BY order */
2aeb0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64  .    int addrEnd
2aec0 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  ;        /* End 
2aed0 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  of processing fo
2aee0 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f  r this SELECT */
2aef0 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 50 54 61  .    int sortPTa
2af00 62 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73 65 75  b = 0;   /* Pseu
2af10 64 6f 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20  dotable used to 
2af20 64 65 63 6f 64 65 20 73 6f 72 74 69 6e 67 20 72  decode sorting r
2af30 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 69 6e  esults */.    in
2af40 74 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b 20 20  t sortOut = 0;  
2af50 20 20 2f 2a 20 4f 75 74 70 75 74 20 72 65 67 69    /* Output regi
2af60 73 74 65 72 20 66 72 6f 6d 20 74 68 65 20 73 6f  ster from the so
2af70 72 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rter */.    int 
2af80 6f 72 64 65 72 42 79 47 72 70 20 3d 20 30 3b 20  orderByGrp = 0; 
2af90 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 47  /* True if the G
2afa0 52 4f 55 50 20 42 59 20 61 6e 64 20 4f 52 44 45  ROUP BY and ORDE
2afb0 52 20 42 59 20 61 72 65 20 74 68 65 20 73 61 6d  R BY are the sam
2afc0 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d  e */..    /* Rem
2afd0 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20  ove any and all 
2afe0 61 6c 69 61 73 65 73 20 62 65 74 77 65 65 6e 20  aliases between 
2aff0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
2b000 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52  nd the.    ** GR
2b010 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  OUP BY clause.. 
2b020 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47     */.    if( pG
2b030 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
2b040 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20  int k;          
2b050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b060 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
2b070 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
2b080 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
2b090 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  em;  /* For loop
2b0a0 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65 73 73  ing over express
2b0b0 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f  ion in a list */
2b0c0 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d  ..      for(k=p-
2b0d0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
2b0e0 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d  pItem=p->pEList-
2b0f0 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49  >a; k>0; k--, pI
2b100 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
2b110 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61  pItem->u.x.iAlia
2b120 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 0;.      }. 
2b130 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f 75       for(k=pGrou
2b140 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  pBy->nExpr, pIte
2b150 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 6b  m=pGroupBy->a; k
2b160 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; k--, pItem++
2b170 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d  ){.        pItem
2b180 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30  ->u.x.iAlias = 0
2b190 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2b1a0 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  if( p->nSelectRo
2b1b0 77 3e 31 30 30 20 29 20 70 2d 3e 6e 53 65 6c 65  w>100 ) p->nSele
2b1c0 63 74 52 6f 77 20 3d 20 31 30 30 3b 0a 20 20 20  ctRow = 100;.   
2b1d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
2b1e0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 31 3b  >nSelectRow = 1;
2b1f0 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 20  .    }...    /* 
2b200 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68  If there is both
2b210 20 61 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20   a GROUP BY and 
2b220 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
2b230 73 65 20 61 6e 64 20 74 68 65 79 20 61 72 65 0a  se and they are.
2b240 20 20 20 20 2a 2a 20 69 64 65 6e 74 69 63 61 6c      ** identical
2b250 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 62 65  , then it may be
2b260 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 69 73   possible to dis
2b270 61 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20 42  able the ORDER B
2b280 59 20 63 6c 61 75 73 65 20 0a 20 20 20 20 2a 2a  Y clause .    **
2b290 20 6f 6e 20 74 68 65 20 67 72 6f 75 6e 64 73 20   on the grounds 
2b2a0 74 68 61 74 20 74 68 65 20 47 52 4f 55 50 20 42  that the GROUP B
2b2b0 59 20 77 69 6c 6c 20 63 61 75 73 65 20 65 6c 65  Y will cause ele
2b2c0 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75  ments to come ou
2b2d0 74 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  t .    ** in the
2b2e0 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2e 20   correct order. 
2b2f0 49 74 20 61 6c 73 6f 20 6d 61 79 20 6e 6f 74 20  It also may not 
2b300 2d 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 6d  - the GROUP BY m
2b310 61 79 20 75 73 65 20 61 0a 20 20 20 20 2a 2a 20  ay use a.    ** 
2b320 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 74  database index t
2b330 68 61 74 20 63 61 75 73 65 73 20 72 6f 77 73 20  hat causes rows 
2b340 74 6f 20 62 65 20 67 72 6f 75 70 65 64 20 74 6f  to be grouped to
2b350 67 65 74 68 65 72 20 61 73 20 72 65 71 75 69 72  gether as requir
2b360 65 64 0a 20 20 20 20 2a 2a 20 62 75 74 20 6e 6f  ed.    ** but no
2b370 74 20 61 63 74 75 61 6c 6c 79 20 73 6f 72 74 65  t actually sorte
2b380 64 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 72  d. Either way, r
2b390 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
2b3a0 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f  hat the.    ** O
2b3b0 52 44 45 52 20 42 59 20 61 6e 64 20 47 52 4f 55  RDER BY and GROU
2b3c0 50 20 42 59 20 63 6c 61 75 73 65 73 20 61 72 65  P BY clauses are
2b3d0 20 74 68 65 20 73 61 6d 65 20 62 79 20 73 65 74   the same by set
2b3e0 74 69 6e 67 20 74 68 65 20 6f 72 64 65 72 42 79  ting the orderBy
2b3f0 47 72 70 0a 20 20 20 20 2a 2a 20 76 61 72 69 61  Grp.    ** varia
2b400 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ble.  */.    if(
2b410 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2b420 43 6f 6d 70 61 72 65 28 70 47 72 6f 75 70 42 79  Compare(pGroupBy
2b430 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  , sSort.pOrderBy
2b440 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , -1)==0 ){.    
2b450 20 20 6f 72 64 65 72 42 79 47 72 70 20 3d 20 31    orderByGrp = 1
2b460 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a  ;.    }. .    /*
2b470 20 43 72 65 61 74 65 20 61 20 6c 61 62 65 6c 20   Create a label 
2b480 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20  to jump to when 
2b490 77 65 20 77 61 6e 74 20 74 6f 20 61 62 6f 72 74  we want to abort
2b4a0 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20   the query */.  
2b4b0 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69    addrEnd = sqli
2b4c0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
2b4d0 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e  (v);..    /* Con
2b4e0 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e  vert TK_COLUMN n
2b4f0 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47  odes into TK_AGG
2b500 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65  _COLUMN and make
2b510 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20   entries in.    
2b520 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20  ** sAggInfo for 
2b530 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  all TK_AGG_FUNCT
2b540 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70  ION nodes in exp
2b550 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a  ressions of the.
2b560 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74      ** SELECT st
2b570 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a  atement..    */.
2b580 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c      memset(&sNC,
2b590 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
2b5a0 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65  ;.    sNC.pParse
2b5b0 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73   = pParse;.    s
2b5c0 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54  NC.pSrcList = pT
2b5d0 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e  abList;.    sNC.
2b5e0 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67 67  pAggInfo = &sAgg
2b5f0 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e  Info;.    sAggIn
2b600 66 6f 2e 6d 6e 52 65 67 20 3d 20 70 50 61 72 73  fo.mnReg = pPars
2b610 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 73  e->nMem+1;.    s
2b620 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67  AggInfo.nSorting
2b630 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42  Column = pGroupB
2b640 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  y ? pGroupBy->nE
2b650 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 73 41 67  xpr : 0;.    sAg
2b660 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d  gInfo.pGroupBy =
2b670 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73   pGroupBy;.    s
2b680 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
2b690 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70  eAggList(&sNC, p
2b6a0 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
2b6b0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2b6c0 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 53 6f 72  gList(&sNC, sSor
2b6d0 74 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  t.pOrderBy);.   
2b6e0 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a   if( pHaving ){.
2b6f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2b700 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
2b710 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67  es(&sNC, pHaving
2b720 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67  );.    }.    sAg
2b730 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74  gInfo.nAccumulat
2b740 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43  or = sAggInfo.nC
2b750 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69  olumn;.    for(i
2b760 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
2b770 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Func; i++){.    
2b780 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2b790 61 73 50 72 6f 70 65 72 74 79 28 73 41 67 67 49  asProperty(sAggI
2b7a0 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78  nfo.aFunc[i].pEx
2b7b0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
2b7c0 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e  ) );.      sNC.n
2b7d0 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41  cFlags |= NC_InA
2b7e0 67 67 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71  ggFunc;.      sq
2b7f0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
2b800 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41  AggList(&sNC, sA
2b810 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e  ggInfo.aFunc[i].
2b820 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b  pExpr->x.pList);
2b830 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61  .      sNC.ncFla
2b840 67 73 20 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46  gs &= ~NC_InAggF
2b850 75 6e 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  unc;.    }.    s
2b860 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 3d 20  AggInfo.mxReg = 
2b870 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2b880 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
2b890 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65  Failed ) goto se
2b8a0 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f  lect_end;..    /
2b8b0 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  * Processing for
2b8c0 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68   aggregates with
2b8d0 20 47 52 4f 55 50 20 42 59 20 69 73 20 76 65 72   GROUP BY is ver
2b8e0 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a  y different and.
2b8f0 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65      ** much more
2b900 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67   complex than ag
2b910 67 72 65 67 61 74 65 73 20 77 69 74 68 6f 75 74  gregates without
2b920 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20   a GROUP BY..   
2b930 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f   */.    if( pGro
2b940 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65  upBy ){.      Ke
2b950 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
2b960 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f    /* Keying info
2b970 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
2b980 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20  group by clause 
2b990 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 3b  */.      int j1;
2b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b9b0 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69  A-vs-B comparisi
2b9c0 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20  on jump */.     
2b9d0 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52   int addrOutputR
2b9e0 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66  ow;  /* Start of
2b9f0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
2ba00 20 6f 75 74 70 75 74 73 20 61 20 72 65 73 75 6c   outputs a resul
2ba10 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69  t row */.      i
2ba20 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b  nt regOutputRow;
2ba30 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64     /* Return add
2ba40 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
2ba50 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  r output subrout
2ba60 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ine */.      int
2ba70 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20   addrSetAbort;  
2ba80 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72   /* Set the abor
2ba90 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72  t flag and retur
2baa0 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  n */.      int a
2bab0 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f  ddrTopOfLoop;  /
2bac0 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70  * Top of the inp
2bad0 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  ut loop */.     
2bae0 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67   int addrSorting
2baf0 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f  Idx; /* The OP_O
2bb00 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72  penEphemeral for
2bb10 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
2bb20 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ex */.      int 
2bb30 61 64 64 72 52 65 73 65 74 3b 20 20 20 20 20 20  addrReset;      
2bb40 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f  /* Subroutine fo
2bb50 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20  r resetting the 
2bb60 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20  accumulator */. 
2bb70 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 73 65       int regRese
2bb80 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75  t;       /* Retu
2bb90 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73  rn address regis
2bba0 74 65 72 20 66 6f 72 20 72 65 73 65 74 20 73 75  ter for reset su
2bbb0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20  broutine */..   
2bbc0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
2bbd0 73 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  s a GROUP BY cla
2bbe0 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65  use we might nee
2bbf0 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  d a sorting inde
2bc00 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d  x to.      ** im
2bc10 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c  plement it.  All
2bc20 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72 74 69  ocate that sorti
2bc30 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49  ng index now.  I
2bc40 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20  f it turns out. 
2bc50 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
2bc60 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61  do not need it a
2bc70 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50  fter all, the OP
2bc80 5f 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74  _SorterOpen inst
2bc90 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ruction.      **
2bca0 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74   will be convert
2bcb0 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20  ed into a Noop. 
2bcc0 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
2bcd0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
2bce0 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e  gIdx = pParse->n
2bcf0 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65  Tab++;.      pKe
2bd00 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
2bd10 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
2bd20 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c  se, pGroupBy, 0,
2bd30 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53   0);.      addrS
2bd40 6f 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69  ortingIdx = sqli
2bd50 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
2bd60 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20   OP_SorterOpen, 
2bd70 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49  .          sAggI
2bd80 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
2bd90 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e  sAggInfo.nSortin
2bda0 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20  gColumn, .      
2bdb0 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b      0, (char*)pK
2bdc0 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
2bdd0 46 4f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  FO);..      /* I
2bde0 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79  nitialize memory
2bdf0 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20   locations used 
2be00 62 79 20 47 52 4f 55 50 20 42 59 20 61 67 67 72  by GROUP BY aggr
2be10 65 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67  egate processing
2be20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2be30 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61  iUseFlag = ++pPa
2be40 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2be50 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b   iAbortFlag = ++
2be60 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2be70 20 20 20 20 72 65 67 4f 75 74 70 75 74 52 6f 77      regOutputRow
2be80 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2be90 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74  m;.      addrOut
2bea0 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  putRow = sqlite3
2beb0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
2bec0 3b 0a 20 20 20 20 20 20 72 65 67 52 65 73 65 74  ;.      regReset
2bed0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2bee0 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 52 65 73  m;.      addrRes
2bef0 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  et = sqlite3Vdbe
2bf00 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
2bf10 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72      iAMem = pPar
2bf20 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20  se->nMem + 1;.  
2bf30 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
2bf40 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45   += pGroupBy->nE
2bf50 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d  xpr;.      iBMem
2bf60 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
2bf70 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73  + 1;.      pPars
2bf80 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75  e->nMem += pGrou
2bf90 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
2bfa0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2bfb0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
2bfc0 72 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67  r, 0, iAbortFlag
2bfd0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2bfe0 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65 61 72 20  ment((v, "clear 
2bff0 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
2c000 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2c010 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
2c020 65 67 65 72 2c 20 30 2c 20 69 55 73 65 46 6c 61  eger, 0, iUseFla
2c030 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
2c040 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63  mment((v, "indic
2c050 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
2c060 65 6d 70 74 79 22 29 29 3b 0a 20 20 20 20 20 20  empty"));.      
2c070 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2c080 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  3(v, OP_Null, 0,
2c090 20 69 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47   iAMem, iAMem+pG
2c0a0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29  roupBy->nExpr-1)
2c0b0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69  ;..      /* Begi
2c0c0 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69  n a loop that wi
2c0d0 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73  ll extract all s
2c0e0 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52  ource rows in GR
2c0f0 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20  OUP BY order..  
2c100 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68      ** This migh
2c110 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65  t involve two se
2c120 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74  parate loops wit
2c130 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20  h an OP_Sort in 
2c140 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20  between, or.    
2c150 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65    ** it might be
2c160 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74   a single loop t
2c170 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65  hat uses an inde
2c180 78 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66  x to extract inf
2c190 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  ormation.      *
2c1a0 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f  * in the right o
2c1b0 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69  rder to begin wi
2c1c0 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  th..      */.   
2c1d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2c1e0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
2c1f0 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72  , regReset, addr
2c200 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57  Reset);.      pW
2c210 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
2c220 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
2c230 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
2c240 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 0a  e, pGroupBy, 0,.
2c250 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
2c260 47 52 4f 55 50 42 59 20 7c 20 28 6f 72 64 65 72  GROUPBY | (order
2c270 42 79 47 72 70 20 3f 20 57 48 45 52 45 5f 53 4f  ByGrp ? WHERE_SO
2c280 52 54 42 59 47 52 4f 55 50 20 3a 20 30 29 2c 20  RTBYGROUP : 0), 
2c290 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  0.      );.     
2c2a0 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
2c2b0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
2c2c0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
2c2d0 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65  te3WhereIsOrdere
2c2e0 64 28 70 57 49 6e 66 6f 29 3d 3d 70 47 72 6f 75  d(pWInfo)==pGrou
2c2f0 70 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  pBy->nExpr ){.  
2c300 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74        /* The opt
2c310 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74  imizer is able t
2c320 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69  o deliver rows i
2c330 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72  n group by order
2c340 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   so.        ** w
2c350 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f  e do not have to
2c360 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f   sort.  The OP_O
2c370 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 61 62  penEphemeral tab
2c380 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  le will be.     
2c390 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20     ** cancelled 
2c3a0 6c 61 74 65 72 20 62 65 63 61 75 73 65 20 77 65  later because we
2c3b0 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75   still need to u
2c3c0 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a  se the pKeyInfo.
2c3d0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2c3e0 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d     groupBySort =
2c3f0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
2c400 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73  .        /* Rows
2c410 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20   are coming out 
2c420 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20  in undetermined 
2c430 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76 65 20  order.  We have 
2c440 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20 20  to push.        
2c450 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f  ** each row into
2c460 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
2c470 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  , terminate the 
2c480 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20  first loop,.    
2c490 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70      ** then loop
2c4a0 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e   over the sortin
2c4b0 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72  g index in order
2c4c0 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70   to get the outp
2c4d0 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  ut.        ** in
2c4e0 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20   sorted order.  
2c4f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2c500 20 69 6e 74 20 72 65 67 42 61 73 65 3b 0a 20 20   int regBase;.  
2c510 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 63        int regRec
2c520 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ord;.        int
2c530 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69   nCol;.        i
2c540 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20  nt nGroupBy;..  
2c550 20 20 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d        explainTem
2c560 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 0a  pTable(pParse, .
2c570 20 20 20 20 20 20 20 20 20 20 20 20 28 73 44 69              (sDi
2c580 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26  stinct.isTnct &&
2c590 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46   (p->selFlags&SF
2c5a0 5f 44 69 73 74 69 6e 63 74 29 3d 3d 30 29 20 3f  _Distinct)==0) ?
2c5b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c5c0 20 20 20 20 20 22 44 49 53 54 49 4e 43 54 22 20       "DISTINCT" 
2c5d0 3a 20 22 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a  : "GROUP BY");..
2c5e0 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53          groupByS
2c5f0 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ort = 1;.       
2c600 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f   nGroupBy = pGro
2c610 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
2c620 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f       nCol = nGro
2c630 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 6a 20  upBy;.        j 
2c640 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  = nGroupBy;.    
2c650 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
2c660 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
2c670 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
2c680 20 69 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43   if( sAggInfo.aC
2c690 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c  ol[i].iSorterCol
2c6a0 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20  umn>=j ){.      
2c6b0 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20        nCol++;.  
2c6c0 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20            j++;. 
2c6d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c6e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67     }.        reg
2c6f0 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65  Base = sqlite3Ge
2c700 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
2c710 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, nCol);.      
2c720 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
2c730 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
2c740 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2c750 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
2c760 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
2c770 79 2c 20 72 65 67 42 61 73 65 2c 20 30 29 3b 0a  y, regBase, 0);.
2c780 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f          j = nGro
2c790 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f  upBy;.        fo
2c7a0 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
2c7b0 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  o.nColumn; i++){
2c7c0 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
2c7d0 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
2c7e0 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e  Col = &sAggInfo.
2c7f0 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20  aCol[i];.       
2c800 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f     if( pCol->iSo
2c810 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b  rterColumn>=j ){
2c820 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
2c830 20 72 31 20 3d 20 6a 20 2b 20 72 65 67 42 61 73   r1 = j + regBas
2c840 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e;.            i
2c850 6e 74 20 72 32 3b 0a 0a 20 20 20 20 20 20 20 20  nt r2;..        
2c860 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
2c870 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
2c880 6e 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  n(pParse, .     
2c890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c8a0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
2c8b0 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c  pTab, pCol->iCol
2c8c0 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c  umn, pCol->iTabl
2c8d0 65 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20  e, r1, 0);.     
2c8e0 20 20 20 20 20 20 20 69 66 28 20 72 31 21 3d 72         if( r1!=r
2c8f0 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  2 ){.           
2c900 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2c910 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
2c920 2c 20 72 32 2c 20 72 31 29 3b 0a 20 20 20 20 20  , r2, r1);.     
2c930 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c940 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
2c950 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2c960 20 20 20 20 20 20 20 20 72 65 67 52 65 63 6f 72          regRecor
2c970 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
2c980 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
2c990 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2c9a0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
2c9b0 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61  akeRecord, regBa
2c9c0 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 52 65 63  se, nCol, regRec
2c9d0 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ord);.        sq
2c9e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2c9f0 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65  v, OP_SorterInse
2ca00 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  rt, sAggInfo.sor
2ca10 74 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63 6f  tingIdx, regReco
2ca20 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rd);.        sql
2ca30 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
2ca40 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
2ca50 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73  cord);.        s
2ca60 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
2ca70 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
2ca80 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20  egBase, nCol);. 
2ca90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
2caa0 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
2cab0 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
2cac0 2e 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62 20  .sortingIdxPTab 
2cad0 3d 20 73 6f 72 74 50 54 61 62 20 3d 20 70 50 61  = sortPTab = pPa
2cae0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
2caf0 20 20 20 20 20 73 6f 72 74 4f 75 74 20 3d 20 73       sortOut = s
2cb00 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
2cb10 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
2cb20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2cb30 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73  Op3(v, OP_OpenPs
2cb40 65 75 64 6f 2c 20 73 6f 72 74 50 54 61 62 2c 20  eudo, sortPTab, 
2cb50 73 6f 72 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a  sortOut, nCol);.
2cb60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2cb70 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2cb80 53 6f 72 74 65 72 53 6f 72 74 2c 20 73 41 67 67  SorterSort, sAgg
2cb90 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
2cba0 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20   addrEnd);.     
2cbb0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2cbc0 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f 72  v, "GROUP BY sor
2cbd0 74 22 29 29 3b 20 56 64 62 65 43 6f 76 65 72 61  t")); VdbeCovera
2cbe0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
2cbf0 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69  AggInfo.useSorti
2cc00 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20  ngIdx = 1;.     
2cc10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
2cc20 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
2cc30 3b 0a 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  ;..      }..    
2cc40 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65    /* If the inde
2cc50 78 20 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 74  x or temporary t
2cc60 61 62 6c 65 20 75 73 65 64 20 62 79 20 74 68 65  able used by the
2cc70 20 47 52 4f 55 50 20 42 59 20 73 6f 72 74 0a 20   GROUP BY sort. 
2cc80 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 6e 61 74       ** will nat
2cc90 75 72 61 6c 6c 79 20 64 65 6c 69 76 65 72 20 72  urally deliver r
2cca0 6f 77 73 20 69 6e 20 74 68 65 20 6f 72 64 65 72  ows in the order
2ccb0 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
2ccc0 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20 20 20   ORDER BY.      
2ccd0 2a 2a 20 63 6c 61 75 73 65 2c 20 63 61 6e 63 65  ** clause, cance
2cce0 6c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  l the ephemeral 
2ccf0 74 61 62 6c 65 20 6f 70 65 6e 20 63 6f 64 65 64  table open coded
2cd00 20 65 61 72 6c 69 65 72 2e 0a 20 20 20 20 20 20   earlier..      
2cd10 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  **.      ** This
2cd20 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
2cd30 69 6f 6e 20 2d 20 74 68 65 20 63 6f 72 72 65 63  ion - the correc
2cd40 74 20 61 6e 73 77 65 72 20 73 68 6f 75 6c 64 20  t answer should 
2cd50 72 65 73 75 6c 74 20 72 65 67 61 72 64 6c 65 73  result regardles
2cd60 73 2e 0a 20 20 20 20 20 20 2a 2a 20 55 73 65 20  s..      ** Use 
2cd70 74 68 65 20 53 51 4c 49 54 45 5f 47 72 6f 75 70  the SQLITE_Group
2cd80 42 79 4f 72 64 65 72 20 66 6c 61 67 20 77 69 74  ByOrder flag wit
2cd90 68 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  h SQLITE_TESTCTR
2cda0 4c 5f 4f 50 54 49 4d 49 5a 45 52 20 74 6f 20 0a  L_OPTIMIZER to .
2cdb0 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65        ** disable
2cdc0 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
2cdd0 6f 6e 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70  on for testing p
2cde0 75 72 70 6f 73 65 73 2e 20 20 2a 2f 0a 20 20 20  urposes.  */.   
2cdf0 20 20 20 69 66 28 20 6f 72 64 65 72 42 79 47 72     if( orderByGr
2ce00 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f  p && Optimizatio
2ce10 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  nEnabled(db, SQL
2ce20 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72  ITE_GroupByOrder
2ce30 29 20 0a 20 20 20 20 20 20 20 26 26 20 28 67 72  ) .       && (gr
2ce40 6f 75 70 42 79 53 6f 72 74 20 7c 7c 20 73 71 6c  oupBySort || sql
2ce50 69 74 65 33 57 68 65 72 65 49 73 53 6f 72 74 65  ite3WhereIsSorte
2ce60 64 28 70 57 49 6e 66 6f 29 29 0a 20 20 20 20 20  d(pWInfo)).     
2ce70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 53 6f 72   ){.        sSor
2ce80 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  t.pOrderBy = 0;.
2ce90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2cea0 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
2ceb0 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  v, sSort.addrSor
2cec0 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 7d  tIndex);.      }
2ced0 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75  ..      /* Evalu
2cee0 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ate the current 
2cef0 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61  GROUP BY terms a
2cf00 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c 20  nd store in b0, 
2cf10 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20  b1, b2....      
2cf20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72 79  ** (b0 is memory
2cf30 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b   location iBMem+
2cf40 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b 31  0, b1 is iBMem+1
2cf50 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a  , and so forth).
2cf60 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f        ** Then co
2cf70 6d 70 61 72 65 20 74 68 65 20 63 75 72 72 65 6e  mpare the curren
2cf80 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73  t GROUP BY terms
2cf90 20 61 67 61 69 6e 73 74 20 74 68 65 20 47 52 4f   against the GRO
2cfa0 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20 20  UP BY terms.    
2cfb0 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 72    ** from the pr
2cfc0 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72 65  evious row curre
2cfd0 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61  ntly stored in a
2cfe0 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20  0, a1, a2....   
2cff0 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
2d000 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69  TopOfLoop = sqli
2d010 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2d020 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
2d030 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
2d040 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
2d050 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72    if( groupBySor
2d060 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
2d070 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2d080 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c  , OP_SorterData,
2d090 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
2d0a0 67 49 64 78 2c 20 73 6f 72 74 4f 75 74 29 3b 0a  gIdx, sortOut);.
2d0b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
2d0c0 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42  r(j=0; j<pGroupB
2d0d0 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  y->nExpr; j++){.
2d0e0 20 20 20 20 20 20 20 20 69 66 28 20 67 72 6f 75          if( grou
2d0f0 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  pBySort ){.     
2d100 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2d110 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
2d120 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c 20 6a  umn, sortPTab, j
2d130 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20  , iBMem+j);.    
2d140 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29        if( j==0 )
2d150 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2d160 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 43  geP5(v, OPFLAG_C
2d170 4c 45 41 52 43 41 43 48 45 29 3b 0a 20 20 20 20  LEARCACHE);.    
2d180 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d190 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69       sAggInfo.di
2d1a0 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  rectMode = 1;.  
2d1b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2d1c0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
2d1d0 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70  pGroupBy->a[j].p
2d1e0 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a  Expr, iBMem+j);.
2d1f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d200 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
2d210 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
2d220 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20  Compare, iAMem, 
2d230 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d  iBMem, pGroupBy-
2d240 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
2d250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d260 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33    (char*)sqlite3
2d270 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49  KeyInfoRef(pKeyI
2d280 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  nfo), P4_KEYINFO
2d290 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20 73 71  );.      j1 = sq
2d2a0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
2d2b0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
2d2c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2d2d0 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 31 2b  (v, OP_Jump, j1+
2d2e0 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 20 56 64 62  1, 0, j1+1); Vdb
2d2f0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
2d300 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
2d310 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20   code that runs 
2d320 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f  whenever the GRO
2d330 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20  UP BY changes.. 
2d340 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73 20       ** Changes 
2d350 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  in the GROUP BY 
2d360 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20  are detected by 
2d370 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64  the previous cod
2d380 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  e.      ** block
2d390 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65  .  If there were
2d3a0 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69   no changes, thi
2d3b0 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70  s block is skipp
2d3c0 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
2d3d0 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20     ** This code 
2d3e0 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20 67  copies current g
2d3f0 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e  roup by terms in
2d400 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20   b0,b1,b2,....  
2d410 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61      ** over to a
2d420 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65  0,a1,a2.  It the
2d430 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70  n calls the outp
2d440 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20  ut subroutine.  
2d450 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74      ** and reset
2d460 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  s the aggregate 
2d470 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69  accumulator regi
2d480 73 74 65 72 73 20 69 6e 20 70 72 65 70 61 72 61  sters in prepara
2d490 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f  tion.      ** fo
2d4a0 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50  r the next GROUP
2d4b0 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20   BY batch..     
2d4c0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2d4d0 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
2d4e0 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d  arse, iBMem, iAM
2d4f0 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  em, pGroupBy->nE
2d500 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
2d510 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2d520 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
2d530 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74  tputRow, addrOut
2d540 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
2d550 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2d560 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29  output one row")
2d570 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2d580 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2d590 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c  _IfPos, iAbortFl
2d5a0 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 20 56 64  ag, addrEnd); Vd
2d5b0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2d5c0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2d5d0 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72  ((v, "check abor
2d5e0 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
2d5f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2d600 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
2d610 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65  regReset, addrRe
2d620 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  set);.      Vdbe
2d630 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73  Comment((v, "res
2d640 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29  et accumulator")
2d650 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64  );..      /* Upd
2d660 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74  ate the aggregat
2d670 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62  e accumulators b
2d680 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ased on the cont
2d690 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ent of.      ** 
2d6a0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a  the current row.
2d6b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
2d6c0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
2d6d0 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20  re(v, j1);.     
2d6e0 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
2d6f0 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
2d700 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c  Info);.      sql
2d710 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2d720 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
2d730 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20   iUseFlag);.    
2d740 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2d750 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61 74 61  , "indicate data
2d760 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22   in accumulator"
2d770 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e  ));..      /* En
2d780 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20  d of the loop.  
2d790 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
2d7a0 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
2d7b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2d7c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2d7d0 53 6f 72 74 65 72 4e 65 78 74 2c 20 73 41 67 67  SorterNext, sAgg
2d7e0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
2d7f0 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b   addrTopOfLoop);
2d800 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
2d810 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
2d820 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
2d830 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
2d840 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
2d850 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2d860 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53  eToNoop(v, addrS
2d870 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20 20 20 20  ortingIdx);.    
2d880 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75    }..      /* Ou
2d890 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20 72  tput the final r
2d8a0 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20 20  ow of result.   
2d8b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
2d8c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2d8d0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
2d8e0 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74  tputRow, addrOut
2d8f0 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
2d900 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2d910 6f 75 74 70 75 74 20 66 69 6e 61 6c 20 72 6f 77  output final row
2d920 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a  "));..      /* J
2d930 75 6d 70 20 6f 76 65 72 20 74 68 65 20 73 75 62  ump over the sub
2d940 72 6f 75 74 69 6e 65 73 0a 20 20 20 20 20 20 2a  routines.      *
2d950 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
2d960 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2d970 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6e 64  Goto, 0, addrEnd
2d980 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
2d990 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
2d9a0 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
2d9b0 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
2d9c0 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20  the result.     
2d9d0 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20 73   ** set.  This s
2d9e0 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20  ubroutine first 
2d9f0 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55 73  looks at the iUs
2da00 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65 46  eFlag.  If iUseF
2da10 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  lag.      ** is 
2da20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
2da30 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20  al to zero, the 
2da40 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61 20  subroutine is a 
2da50 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20 20  no-op.  If.     
2da60 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 69   ** the processi
2da70 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65  ng calls for the
2da80 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74 2c   query to abort,
2da90 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
2daa0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d  .      ** increm
2dab0 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74 46  ents the iAbortF
2dac0 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  lag memory locat
2dad0 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72  ion before retur
2dae0 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a  ning in.      **
2daf0 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61 6c   order to signal
2db00 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61   the caller to a
2db10 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  bort..      */. 
2db20 20 20 20 20 20 61 64 64 72 53 65 74 41 62 6f 72       addrSetAbor
2db30 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
2db40 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
2db50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2db60 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
2db70 65 67 65 72 2c 20 31 2c 20 69 41 62 6f 72 74 46  eger, 1, iAbortF
2db80 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
2db90 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65 74  Comment((v, "set
2dba0 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
2dbb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2dbc0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
2dbd0 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52  turn, regOutputR
2dbe0 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ow);.      sqlit
2dbf0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2dc00 65 6c 28 76 2c 20 61 64 64 72 4f 75 74 70 75 74  el(v, addrOutput
2dc10 52 6f 77 29 3b 0a 20 20 20 20 20 20 61 64 64 72  Row);.      addr
2dc20 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69  OutputRow = sqli
2dc30 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2dc40 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
2dc50 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2dc60 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73 65  , OP_IfPos, iUse
2dc70 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75 74  Flag, addrOutput
2dc80 52 6f 77 2b 32 29 3b 20 56 64 62 65 43 6f 76 65  Row+2); VdbeCove
2dc90 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56  rage(v);.      V
2dca0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2dcb0 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67  Groupby result g
2dcc0 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70  enerator entry p
2dcd0 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73  oint"));.      s
2dce0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
2dcf0 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
2dd00 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
2dd10 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46      finalizeAggF
2dd20 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c  unctions(pParse,
2dd30 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
2dd40 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
2dd50 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48  False(pParse, pH
2dd60 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75  aving, addrOutpu
2dd70 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a  tRow+1, SQLITE_J
2dd80 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
2dd90 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
2dda0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
2ddb0 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26 73 53 6f  pEList, -1, &sSo
2ddc0 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rt,.            
2ddd0 20 20 20 20 20 20 20 20 20 20 26 73 44 69 73 74            &sDist
2dde0 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20  inct, pDest,.   
2ddf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de00 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
2de10 2b 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72 74  +1, addrSetAbort
2de20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2de30 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2de40 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70  _Return, regOutp
2de50 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64  utRow);.      Vd
2de60 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  beComment((v, "e
2de70 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73 75 6c  nd groupby resul
2de80 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a  t generator"));.
2de90 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
2dea0 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
2deb0 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65 74 20  that will reset 
2dec0 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61 63 63  the group-by acc
2ded0 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a  umulator.      *
2dee0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
2def0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
2df00 76 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  v, addrReset);. 
2df10 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75       resetAccumu
2df20 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
2df30 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
2df40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2df50 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
2df60 72 65 67 52 65 73 65 74 29 3b 0a 20 20 20 20 20  regReset);.     
2df70 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20  .    } /* endif 
2df80 70 47 72 6f 75 70 42 79 2e 20 20 42 65 67 69 6e  pGroupBy.  Begin
2df90 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69   aggregate queri
2dfa0 65 73 20 77 69 74 68 6f 75 74 20 47 52 4f 55 50  es without GROUP
2dfb0 20 42 59 3a 20 2a 2f 0a 20 20 20 20 65 6c 73 65   BY: */.    else
2dfc0 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
2dfd0 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 23 69 66  t *pDel = 0;.#if
2dfe0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2dff0 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20 20 20 20  _BTREECOUNT.    
2e000 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
2e010 20 20 20 20 20 69 66 28 20 28 70 54 61 62 20 3d       if( (pTab =
2e020 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70   isSimpleCount(p
2e030 2c 20 26 73 41 67 67 49 6e 66 6f 29 29 21 3d 30  , &sAggInfo))!=0
2e040 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
2e050 66 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28  f isSimpleCount(
2e060 29 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  ) returns a poin
2e070 74 65 72 20 74 6f 20 61 20 54 61 62 6c 65 20 73  ter to a Table s
2e080 74 72 75 63 74 75 72 65 2c 20 74 68 65 6e 0a 20  tructure, then. 
2e090 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51         ** the SQ
2e0a0 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f  L statement is o
2e0b0 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 20 20  f the form:.    
2e0c0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2e0d0 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  *   SELECT count
2e0e0 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20  (*) FROM <tbl>. 
2e0f0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2e100 20 20 2a 2a 20 77 68 65 72 65 20 74 68 65 20 54    ** where the T
2e110 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 72  able structure r
2e120 65 74 75 72 6e 65 64 20 72 65 70 72 65 73 65 6e  eturned represen
2e130 74 73 20 74 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a  ts table <tbl>..
2e140 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2e150 20 20 20 2a 2a 20 54 68 69 73 20 73 74 61 74 65     ** This state
2e160 6d 65 6e 74 20 69 73 20 73 6f 20 63 6f 6d 6d 6f  ment is so commo
2e170 6e 20 74 68 61 74 20 69 74 20 69 73 20 6f 70 74  n that it is opt
2e180 69 6d 69 7a 65 64 20 73 70 65 63 69 61 6c 6c 79  imized specially
2e190 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  . The.        **
2e1a0 20 4f 50 5f 43 6f 75 6e 74 20 69 6e 73 74 72 75   OP_Count instru
2e1b0 63 74 69 6f 6e 20 69 73 20 65 78 65 63 75 74 65  ction is execute
2e1c0 64 20 65 69 74 68 65 72 20 6f 6e 20 74 68 65 20  d either on the 
2e1d0 69 6e 74 6b 65 79 20 74 61 62 6c 65 20 74 68 61  intkey table tha
2e1e0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e  t.        ** con
2e1f0 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 20 66  tains the data f
2e200 6f 72 20 74 61 62 6c 65 20 3c 74 62 6c 3e 20 6f  or table <tbl> o
2e210 72 20 6f 6e 20 6f 6e 65 20 6f 66 20 69 74 73 20  r on one of its 
2e220 69 6e 64 65 78 65 73 2e 20 49 74 0a 20 20 20 20  indexes. It.    
2e230 20 20 20 20 2a 2a 20 69 73 20 62 65 74 74 65 72      ** is better
2e240 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
2e250 6f 70 20 6f 6e 20 61 6e 20 69 6e 64 65 78 2c 20  op on an index, 
2e260 61 73 20 69 6e 64 65 78 65 73 20 61 72 65 20 61  as indexes are a
2e270 6c 6d 6f 73 74 0a 20 20 20 20 20 20 20 20 2a 2a  lmost.        **
2e280 20 61 6c 77 61 79 73 20 73 70 72 65 61 64 20 61   always spread a
2e290 63 72 6f 73 73 20 6c 65 73 73 20 70 61 67 65 73  cross less pages
2e2a0 20 74 68 61 6e 20 74 68 65 69 72 20 63 6f 72 72   than their corr
2e2b0 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 73  esponding tables
2e2c0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2e2d0 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
2e2e0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
2e2f0 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
2e300 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
2e310 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  ema);.        co
2e320 6e 73 74 20 69 6e 74 20 69 43 73 72 20 3d 20 70  nst int iCsr = p
2e330 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
2e340 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20     /* Cursor to 
2e350 73 63 61 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 20  scan b-tree */. 
2e360 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49         Index *pI
2e370 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
2e380 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2e390 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
2e3a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 4b 65 79 49   */.        KeyI
2e3b0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
2e3c0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2e3d0 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20   /* Keyinfo for 
2e3e0 73 63 61 6e 6e 65 64 20 69 6e 64 65 78 20 2a 2f  scanned index */
2e3f0 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a  .        Index *
2e400 70 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20  pBest = 0;      
2e410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e420 20 42 65 73 74 20 69 6e 64 65 78 20 66 6f 75 6e   Best index foun
2e430 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20  d so far */.    
2e440 20 20 20 20 69 6e 74 20 69 52 6f 6f 74 20 3d 20      int iRoot = 
2e450 70 54 61 62 2d 3e 74 6e 75 6d 3b 20 20 20 20 20  pTab->tnum;     
2e460 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
2e470 20 70 61 67 65 20 6f 66 20 73 63 61 6e 6e 65 64   page of scanned
2e480 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20   b-tree */..    
2e490 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
2e4a0 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
2e4b0 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
2e4c0 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
2e4d0 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
2e4e0 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
2e4f0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
2e500 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20        /* Search 
2e510 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 74 68  for the index th
2e520 61 74 20 68 61 73 20 74 68 65 20 6c 6f 77 65 73  at has the lowes
2e530 74 20 73 63 61 6e 20 63 6f 73 74 2e 0a 20 20 20  t scan cost..   
2e540 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2e550 2a 2a 20 28 32 30 31 31 2d 30 34 2d 31 35 29 20  ** (2011-04-15) 
2e560 44 6f 20 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c  Do not do a full
2e570 20 73 63 61 6e 20 6f 66 20 61 6e 20 75 6e 6f 72   scan of an unor
2e580 64 65 72 65 64 20 69 6e 64 65 78 2e 0a 20 20 20  dered index..   
2e590 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2e5a0 2a 2a 20 28 32 30 31 33 2d 31 30 2d 30 33 29 20  ** (2013-10-03) 
2e5b0 44 6f 20 6e 6f 74 20 63 6f 75 6e 74 20 74 68 65  Do not count the
2e5c0 20 65 6e 74 72 69 65 73 20 69 6e 20 61 20 70 61   entries in a pa
2e5d0 72 74 69 61 6c 20 69 6e 64 65 78 2e 0a 20 20 20  rtial index..   
2e5e0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2e5f0 2a 2a 20 49 6e 20 70 72 61 63 74 69 63 65 20 74  ** In practice t
2e600 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
2e610 74 75 72 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ture will not be
2e620 20 75 73 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c   used. It is onl
2e630 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  y .        ** pa
2e640 73 73 65 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f  ssed to keep OP_
2e650 4f 70 65 6e 52 65 61 64 20 68 61 70 70 79 2e 0a  OpenRead happy..
2e660 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2e670 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64     if( !HasRowid
2e680 28 70 54 61 62 29 20 29 20 70 42 65 73 74 20 3d  (pTab) ) pBest =
2e690 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
2e6a0 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
2e6b0 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d         for(pIdx=
2e6c0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
2e6d0 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
2e6e0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20  Next){.         
2e6f0 20 69 66 28 20 70 49 64 78 2d 3e 62 55 6e 6f 72   if( pIdx->bUnor
2e700 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20  dered==0.       
2e710 20 20 20 20 26 26 20 70 49 64 78 2d 3e 73 7a 49      && pIdx->szI
2e720 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61  dxRow<pTab->szTa
2e730 62 52 6f 77 0a 20 20 20 20 20 20 20 20 20 20 20  bRow.           
2e740 26 26 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64  && pIdx->pPartId
2e750 78 57 68 65 72 65 3d 3d 30 0a 20 20 20 20 20 20  xWhere==0.      
2e760 20 20 20 20 20 26 26 20 28 21 70 42 65 73 74 20       && (!pBest 
2e770 7c 7c 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f  || pIdx->szIdxRo
2e780 77 3c 70 42 65 73 74 2d 3e 73 7a 49 64 78 52 6f  w<pBest->szIdxRo
2e790 77 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  w).          ){.
2e7a0 20 20 20 20 20 20 20 20 20 20 20 20 70 42 65 73              pBes
2e7b0 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20  t = pIdx;.      
2e7c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2e7d0 20 20 20 20 20 20 20 20 69 66 28 20 70 42 65 73          if( pBes
2e7e0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  t ){.          i
2e7f0 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e  Root = pBest->tn
2e800 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b  um;.          pK
2e810 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
2e820 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70  KeyInfoOfIndex(p
2e830 50 61 72 73 65 2c 20 70 42 65 73 74 29 3b 0a 20  Parse, pBest);. 
2e840 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2e850 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61 64    /* Open a read
2e860 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 65 78  -only cursor, ex
2e870 65 63 75 74 65 20 74 68 65 20 4f 50 5f 43 6f 75  ecute the OP_Cou
2e880 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65 20 63 75  nt, close the cu
2e890 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rsor. */.       
2e8a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2e8b0 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e  p4Int(v, OP_Open
2e8c0 52 65 61 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f  Read, iCsr, iRoo
2e8d0 74 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20  t, iDb, 1);.    
2e8e0 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
2e8f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2e900 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2e910 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a  4(v, -1, (char *
2e920 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
2e930 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20  YINFO);.        
2e940 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
2e950 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2e960 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73  P_Count, iCsr, s
2e970 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d  AggInfo.aFunc[0]
2e980 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20  .iMem);.        
2e990 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2e9a0 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  1(v, OP_Close, i
2e9b0 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20 65 78  Csr);.        ex
2e9c0 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74  plainSimpleCount
2e9d0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
2e9e0 42 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Best);.      }el
2e9f0 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  se.#endif /* SQL
2ea00 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f  ITE_OMIT_BTREECO
2ea10 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20  UNT */.      {. 
2ea20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
2ea30 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  if the query is 
2ea40 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  of one of the fo
2ea50 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20  llowing forms:. 
2ea60 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2ea70 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 69    **   SELECT mi
2ea80 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20  n(x) FROM ....  
2ea90 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
2eaa0 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e  T max(x) FROM ..
2eab0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
2eac0 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73       ** If it is
2ead0 2c 20 74 68 65 6e 20 61 73 6b 20 74 68 65 20 63  , then ask the c
2eae0 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 74  ode in where.c t
2eaf0 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73 6f 72  o attempt to sor
2eb00 74 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20  t results.      
2eb10 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65 72 65    ** as if there
2eb20 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52 20 4f   was an "ORDER O
2eb30 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52 20 4f  N x" or "ORDER O
2eb40 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75 73 65  N x DESC" clause
2eb50 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66  . .        ** If
2eb60 20 77 68 65 72 65 2e 63 20 69 73 20 61 62 6c 65   where.c is able
2eb70 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65 73 75   to produce resu
2eb80 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20 74 68  lts sorted in th
2eb90 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20  is order, then. 
2eba0 20 20 20 20 20 20 20 2a 2a 20 61 64 64 20 76 64         ** add vd
2ebb0 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65 61 6b  be code to break
2ebc0 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72 6f 63   out of the proc
2ebd0 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65  essing loop afte
2ebe0 72 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  r the .        *
2ebf0 2a 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  * first iteratio
2ec00 6e 20 28 73 69 6e 63 65 20 74 68 65 20 66 69 72  n (since the fir
2ec10 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  st iteration of 
2ec20 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20  the loop is .   
2ec30 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65       ** guarante
2ec40 65 64 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  ed to operate on
2ec50 20 74 68 65 20 72 6f 77 20 77 69 74 68 20 74 68   the row with th
2ec60 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78  e minimum or max
2ec70 69 6d 75 6d 20 0a 20 20 20 20 20 20 20 20 2a 2a  imum .        **
2ec80 20 76 61 6c 75 65 20 6f 66 20 78 2c 20 74 68 65   value of x, the
2ec90 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75 69 72   only row requir
2eca0 65 64 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ed)..        **.
2ecb0 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73 70 65          ** A spe
2ecc0 63 69 61 6c 20 66 6c 61 67 20 6d 75 73 74 20 62  cial flag must b
2ecd0 65 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  e passed to sqli
2ece0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
2ecf0 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20  to slightly.    
2ed00 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65      ** modify be
2ed10 68 61 76 69 6f 72 20 61 73 20 66 6f 6c 6c 6f 77  havior as follow
2ed20 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  s:.        **.  
2ed30 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 49 66 20        **   + If 
2ed40 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20 22  the query is a "
2ed50 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c 20  SELECT min(x)", 
2ed60 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f  then the loop co
2ed70 64 65 64 20 62 79 0a 20 20 20 20 20 20 20 20 2a  ded by.        *
2ed80 2a 20 20 20 20 20 77 68 65 72 65 2e 63 20 73 68  *     where.c sh
2ed90 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72 61 74 65  ould not iterate
2eda0 20 6f 76 65 72 20 61 6e 79 20 76 61 6c 75 65 73   over any values
2edb0 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c   with a NULL val
2edc0 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ue.        **   
2edd0 20 20 66 6f 72 20 78 2e 0a 20 20 20 20 20 20 20    for x..       
2ede0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
2edf0 20 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72   + The optimizer
2ee00 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63   code in where.c
2ee10 20 28 74 68 65 20 74 68 69 6e 67 20 74 68 61 74   (the thing that
2ee20 20 64 65 63 69 64 65 73 20 77 68 69 63 68 0a 20   decides which. 
2ee30 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e         **     in
2ee40 64 65 78 20 6f 72 20 69 6e 64 69 63 65 73 20 74  dex or indices t
2ee50 6f 20 75 73 65 29 20 73 68 6f 75 6c 64 20 70 6c  o use) should pl
2ee60 61 63 65 20 61 20 64 69 66 66 65 72 65 6e 74 20  ace a different 
2ee70 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20  priority on .   
2ee80 20 20 20 20 20 2a 2a 20 20 20 20 20 73 61 74 69       **     sati
2ee90 73 66 79 69 6e 67 20 74 68 65 20 27 4f 52 44 45  sfying the 'ORDE
2eea0 52 20 42 59 27 20 63 6c 61 75 73 65 20 74 68 61  R BY' clause tha
2eeb0 6e 20 69 74 20 64 6f 65 73 20 69 6e 20 6f 74 68  n it does in oth
2eec0 65 72 20 63 61 73 65 73 2e 0a 20 20 20 20 20 20  er cases..      
2eed0 20 20 2a 2a 20 20 20 20 20 52 65 66 65 72 20 74    **     Refer t
2eee0 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65  o code and comme
2eef0 6e 74 73 20 69 6e 20 77 68 65 72 65 2e 63 20 66  nts in where.c f
2ef00 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 20 20  or details..    
2ef10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 45      */.        E
2ef20 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78  xprList *pMinMax
2ef30 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38   = 0;.        u8
2ef40 20 66 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f 52   flag = WHERE_OR
2ef50 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  DERBY_NORMAL;.  
2ef60 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 61        .        a
2ef70 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70  ssert( p->pGroup
2ef80 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  By==0 );.       
2ef90 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30   assert( flag==0
2efa0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2efb0 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 7b  p->pHaving==0 ){
2efc0 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20  .          flag 
2efd0 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 26 73  = minMaxQuery(&s
2efe0 41 67 67 49 6e 66 6f 2c 20 26 70 4d 69 6e 4d 61  AggInfo, &pMinMa
2eff0 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  x);.        }.  
2f000 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c        assert( fl
2f010 61 67 3d 3d 30 20 7c 7c 20 28 70 4d 69 6e 4d 61  ag==0 || (pMinMa
2f020 78 21 3d 30 20 26 26 20 70 4d 69 6e 4d 61 78 2d  x!=0 && pMinMax-
2f030 3e 6e 45 78 70 72 3d 3d 31 29 20 29 3b 0a 0a 20  >nExpr==1) );.. 
2f040 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 20         if( flag 
2f050 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 69  ){.          pMi
2f060 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 45 78  nMax = sqlite3Ex
2f070 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4d  prListDup(db, pM
2f080 69 6e 4d 61 78 2c 20 30 29 3b 0a 20 20 20 20 20  inMax, 0);.     
2f090 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e       pDel = pMin
2f0a0 4d 61 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Max;.          i
2f0b0 66 28 20 70 4d 69 6e 4d 61 78 20 26 26 20 21 64  f( pMinMax && !d
2f0c0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2f0d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
2f0e0 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72  MinMax->a[0].sor
2f0f0 74 4f 72 64 65 72 20 3d 20 66 6c 61 67 21 3d 57  tOrder = flag!=W
2f100 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
2f110 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20 20 20   ?1:0;.         
2f120 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d     pMinMax->a[0]
2f130 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f  .pExpr->op = TK_
2f140 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20  COLUMN;.        
2f150 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2f160 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
2f170 20 63 61 73 65 20 72 75 6e 73 20 69 66 20 74 68   case runs if th
2f180 65 20 61 67 67 72 65 67 61 74 65 20 68 61 73 20  e aggregate has 
2f190 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  no GROUP BY clau
2f1a0 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20  se.  The.       
2f1b0 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69   ** processing i
2f1c0 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73  s much simpler s
2f1d0 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e  ince there is on
2f1e0 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a  ly a single row.
2f1f0 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75          ** of ou
2f200 74 70 75 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  tput..        */
2f210 0a 20 20 20 20 20 20 20 20 72 65 73 65 74 41 63  .        resetAc
2f220 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
2f230 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
2f240 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73        pWInfo = s
2f250 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2f260 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
2f270 74 2c 20 70 57 68 65 72 65 2c 20 70 4d 69 6e 4d  t, pWhere, pMinM
2f280 61 78 2c 30 2c 66 6c 61 67 2c 30 29 3b 0a 20 20  ax,0,flag,0);.  
2f290 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
2f2a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2f2b0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2f2c0 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29  Delete(db, pDel)
2f2d0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
2f2e0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
2f2f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75       }.        u
2f300 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
2f310 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
2f320 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  fo);.        ass
2f330 65 72 74 28 20 70 4d 69 6e 4d 61 78 3d 3d 30 20  ert( pMinMax==0 
2f340 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70  || pMinMax->nExp
2f350 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  r==1 );.        
2f360 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
2f370 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f  IsOrdered(pWInfo
2f380 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  )>0 ){.         
2f390 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f3a0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
2f3b0 2c 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72  , sqlite3WhereBr
2f3c0 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29  eakLabel(pWInfo)
2f3d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
2f3e0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
2f3f0 28 29 20 62 79 20 69 6e 64 65 78 22 2c 0a 20 20  () by index",.  
2f400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 66                (f
2f410 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52  lag==WHERE_ORDER
2f420 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61  BY_MIN?"min":"ma
2f430 78 22 29 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  x")));.        }
2f440 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f450 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
2f460 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c 69  ;.        finali
2f470 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70  zeAggFunctions(p
2f480 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
2f490 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
2f4a0 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
2f4b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
2f4c0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
2f4d0 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20  Parse, pHaving, 
2f4e0 61 64 64 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f  addrEnd, SQLITE_
2f4f0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
2f500 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
2f510 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
2f520 3e 70 45 4c 69 73 74 2c 20 2d 31 2c 20 30 2c 20  >pEList, -1, 0, 
2f530 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
2f540 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2c            pDest,
2f550 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45 6e   addrEnd, addrEn
2f560 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
2f570 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
2f580 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d  db, pDel);.    }
2f590 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2f5a0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
2f5b0 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20  addrEnd);.    . 
2f5c0 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67 67 72   } /* endif aggr
2f5d0 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a  egate query */..
2f5e0 20 20 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e    if( sDistinct.
2f5f0 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52 45  eTnctType==WHERE
2f600 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45  _DISTINCT_UNORDE
2f610 52 45 44 20 29 7b 0a 20 20 20 20 65 78 70 6c 61  RED ){.    expla
2f620 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72  inTempTable(pPar
2f630 73 65 2c 20 22 44 49 53 54 49 4e 43 54 22 29 3b  se, "DISTINCT");
2f640 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
2f650 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
2f660 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
2f670 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20  we need to sort 
2f680 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a  the results.  **
2f690 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74   and send them t
2f6a0 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f  o the callback o
2f6b0 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  ne by one..  */.
2f6c0 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64    if( sSort.pOrd
2f6d0 65 72 42 79 20 29 7b 0a 20 20 20 20 65 78 70 6c  erBy ){.    expl
2f6e0 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61  ainTempTable(pPa
2f6f0 72 73 65 2c 20 73 53 6f 72 74 2e 6e 4f 42 53 61  rse, sSort.nOBSa
2f700 74 3e 30 20 3f 20 22 52 49 47 48 54 20 50 41 52  t>0 ? "RIGHT PAR
2f710 54 20 4f 46 20 4f 52 44 45 52 20 42 59 22 3a 22  T OF ORDER BY":"
2f720 4f 52 44 45 52 20 42 59 22 29 3b 0a 20 20 20 20  ORDER BY");.    
2f730 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
2f740 28 70 50 61 72 73 65 2c 20 70 2c 20 26 73 53 6f  (pParse, p, &sSo
2f750 72 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rt, pEList->nExp
2f760 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a  r, pDest);.  }..
2f770 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
2f780 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75 65 72  o skip this quer
2f790 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  y.  */.  sqlite3
2f7a0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
2f7b0 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a  (v, iEnd);..  /*
2f7c0 20 54 68 65 20 53 45 4c 45 43 54 20 77 61 73 20   The SELECT was 
2f7d0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64  successfully cod
2f7e0 65 64 2e 20 20 20 53 65 74 20 74 68 65 20 72 65  ed.   Set the re
2f7f0 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20  turn code to 0. 
2f800 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
2f810 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a  no errors..  */.
2f820 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20    rc = 0;..  /* 
2f830 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f  Control jumps to
2f840 20 68 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f   here if an erro
2f850 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
2f860 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a   above, or upon.
2f870 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20    ** successful 
2f880 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45  coding of the SE
2f890 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63  LECT..  */.selec
2f8a0 74 5f 65 6e 64 3a 0a 20 20 65 78 70 6c 61 69 6e  t_end:.  explain
2f8b0 53 65 74 49 6e 74 65 67 65 72 28 70 50 61 72 73  SetInteger(pPars
2f8c0 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52  e->iSelectId, iR
2f8d0 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b  estoreSelectId);
2f8e0 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20  ..  /* Identify 
2f8f0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20  column names if 
2f900 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 53  results of the S
2f910 45 4c 45 43 54 20 61 72 65 20 74 6f 20 62 65 20  ELECT are to be 
2f920 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69  output..  */.  i
2f930 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2f940 20 26 26 20 70 44 65 73 74 2d 3e 65 44 65 73 74   && pDest->eDest
2f950 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
2f960 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
2f970 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
2f980 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
2f990 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
2f9a0 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67  3DbFree(db, sAgg
2f9b0 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71  Info.aCol);.  sq
2f9c0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2f9d0 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b  sAggInfo.aFunc);
2f9e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2f9f0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
2fa00 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f  ITE_ENABLE_TREE_
2fa10 45 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47  EXPLAIN)./*.** G
2fa20 65 6e 65 72 61 74 65 20 61 20 68 75 6d 61 6e 2d  enerate a human-
2fa30 72 65 61 64 61 62 6c 65 20 64 65 73 63 72 69 70  readable descrip
2fa40 74 69 6f 6e 20 6f 66 20 61 20 74 68 65 20 53 65  tion of a the Se
2fa50 6c 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  lect object..*/.
2fa60 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
2fa70 61 69 6e 4f 6e 65 53 65 6c 65 63 74 28 56 64 62  ainOneSelect(Vdb
2fa80 65 20 2a 70 56 64 62 65 2c 20 53 65 6c 65 63 74  e *pVdbe, Select
2fa90 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 45   *p){.  sqlite3E
2faa0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
2fab0 62 65 2c 20 22 53 45 4c 45 43 54 20 22 29 3b 0a  be, "SELECT ");.
2fac0 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
2fad0 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
2fae0 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 20 29  |SF_Aggregate) )
2faf0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c  {.    if( p->sel
2fb00 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
2fb10 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  nct ){.      sql
2fb20 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
2fb30 66 28 70 56 64 62 65 2c 20 22 44 49 53 54 49 4e  f(pVdbe, "DISTIN
2fb40 43 54 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  CT ");.    }.   
2fb50 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
2fb60 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 20   & SF_Aggregate 
2fb70 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2fb80 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
2fb90 64 62 65 2c 20 22 61 67 67 5f 66 6c 61 67 20 22  dbe, "agg_flag "
2fba0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2fbb0 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56  ite3ExplainNL(pV
2fbc0 64 62 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dbe);.    sqlite
2fbd0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
2fbe0 56 64 62 65 2c 20 22 20 20 20 22 29 3b 0a 20 20  Vdbe, "   ");.  
2fbf0 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61  }.  sqlite3Expla
2fc00 69 6e 45 78 70 72 4c 69 73 74 28 70 56 64 62 65  inExprList(pVdbe
2fc10 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
2fc20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c  sqlite3ExplainNL
2fc30 28 70 56 64 62 65 29 3b 0a 20 20 69 66 28 20 70  (pVdbe);.  if( p
2fc40 2d 3e 70 53 72 63 20 26 26 20 70 2d 3e 70 53 72  ->pSrc && p->pSr
2fc50 63 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 69  c->nSrc ){.    i
2fc60 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65  nt i;.    sqlite
2fc70 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
2fc80 56 64 62 65 2c 20 22 46 52 4f 4d 20 22 29 3b 0a  Vdbe, "FROM ");.
2fc90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2fca0 69 6e 50 75 73 68 28 70 56 64 62 65 29 3b 0a 20  inPush(pVdbe);. 
2fcb0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
2fcc0 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  >pSrc->nSrc; i++
2fcd0 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
2fce0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
2fcf0 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e  tem = &p->pSrc->
2fd00 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  a[i];.      sqli
2fd10 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2fd20 28 70 56 64 62 65 2c 20 22 7b 25 64 2c 2a 7d 20  (pVdbe, "{%d,*} 
2fd30 3d 20 22 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  = ", pItem->iCur
2fd40 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  sor);.      if( 
2fd50 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pItem->pSelect )
2fd60 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2fd70 33 45 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 70  3ExplainSelect(p
2fd80 56 64 62 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65  Vdbe, pItem->pSe
2fd90 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 69  lect);.        i
2fda0 66 28 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 29  f( pItem->pTab )
2fdb0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
2fdc0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2fdd0 28 70 56 64 62 65 2c 20 22 20 28 74 61 62 6e 61  (pVdbe, " (tabna
2fde0 6d 65 3d 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e  me=%s)", pItem->
2fdf0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
2fe00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
2fe10 6c 73 65 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a  lse if( pItem->z
2fe20 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
2fe30 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2fe40 69 6e 74 66 28 70 56 64 62 65 2c 20 22 25 73 22  intf(pVdbe, "%s"
2fe50 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pItem->zName);
2fe60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2fe70 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  f( pItem->zAlias
2fe80 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2fe90 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2fea0 28 70 56 64 62 65 2c 20 22 20 28 41 53 20 25 73  (pVdbe, " (AS %s
2feb0 29 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  )", pItem->zAlia
2fec0 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s);.      }.    
2fed0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 6a 6f 69    if( pItem->joi
2fee0 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 20  ntype & JT_LEFT 
2fef0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2ff00 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2ff10 70 56 64 62 65 2c 20 22 20 4c 45 46 54 2d 4a 4f  pVdbe, " LEFT-JO
2ff20 49 4e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  IN");.      }.  
2ff30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2ff40 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 20  inNL(pVdbe);.   
2ff50 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
2ff60 70 6c 61 69 6e 50 6f 70 28 70 56 64 62 65 29 3b  plainPop(pVdbe);
2ff70 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 57  .  }.  if( p->pW
2ff80 68 65 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  here ){.    sqli
2ff90 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2ffa0 28 70 56 64 62 65 2c 20 22 57 48 45 52 45 20 22  (pVdbe, "WHERE "
2ffb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2ffc0 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62 65 2c  plainExpr(pVdbe,
2ffd0 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20   p->pWhere);.   
2ffe0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
2fff0 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20  L(pVdbe);.  }.  
30000 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20  if( p->pGroupBy 
30010 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
30020 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
30030 65 2c 20 22 47 52 4f 55 50 42 59 20 22 29 3b 0a  e, "GROUPBY ");.
30040 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
30050 69 6e 45 78 70 72 4c 69 73 74 28 70 56 64 62 65  inExprList(pVdbe
30060 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a  , p->pGroupBy);.
30070 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
30080 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d  inNL(pVdbe);.  }
30090 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e  .  if( p->pHavin
300a0 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
300b0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
300c0 64 62 65 2c 20 22 48 41 56 49 4e 47 20 22 29 3b  dbe, "HAVING ");
300d0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
300e0 61 69 6e 45 78 70 72 28 70 56 64 62 65 2c 20 70  ainExpr(pVdbe, p
300f0 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20  ->pHaving);.    
30100 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c  sqlite3ExplainNL
30110 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69  (pVdbe);.  }.  i
30120 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
30130 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
30140 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
30150 2c 20 22 4f 52 44 45 52 42 59 20 22 29 3b 0a 20  , "ORDERBY ");. 
30160 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
30170 6e 45 78 70 72 4c 69 73 74 28 70 56 64 62 65 2c  nExprList(pVdbe,
30180 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
30190 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
301a0 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a  nNL(pVdbe);.  }.
301b0 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20    if( p->pLimit 
301c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
301d0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
301e0 65 2c 20 22 4c 49 4d 49 54 20 22 29 3b 0a 20 20  e, "LIMIT ");.  
301f0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
30200 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70  Expr(pVdbe, p->p
30210 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69  Limit);.    sqli
30220 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64  te3ExplainNL(pVd
30230 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  be);.  }.  if( p
30240 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->pOffset ){.   
30250 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
30260 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 4f 46  rintf(pVdbe, "OF
30270 46 53 45 54 20 22 29 3b 0a 20 20 20 20 73 71 6c  FSET ");.    sql
30280 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
30290 70 56 64 62 65 2c 20 70 2d 3e 70 4f 66 66 73 65  pVdbe, p->pOffse
302a0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
302b0 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b  xplainNL(pVdbe);
302c0 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
302d0 74 65 33 45 78 70 6c 61 69 6e 53 65 6c 65 63 74  te3ExplainSelect
302e0 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53 65  (Vdbe *pVdbe, Se
302f0 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20  lect *p){.  if( 
30300 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  p==0 ){.    sqli
30310 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
30320 28 70 56 64 62 65 2c 20 22 28 6e 75 6c 6c 2d 73  (pVdbe, "(null-s
30330 65 6c 65 63 74 29 22 29 3b 0a 20 20 20 20 72 65  elect)");.    re
30340 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
30350 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70  te3ExplainPush(p
30360 56 64 62 65 29 3b 0a 20 20 77 68 69 6c 65 28 20  Vdbe);.  while( 
30370 70 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e  p ){.    explain
30380 4f 6e 65 53 65 6c 65 63 74 28 70 56 64 62 65 2c  OneSelect(pVdbe,
30390 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e   p);.    p = p->
303a0 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70  pNext;.    if( p
303b0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
303c0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
303d0 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20 73 71  L(pVdbe);.    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 25 73 5c 6e 22  tf(pVdbe, "%s\n"
30400 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70  , selectOpName(p
30410 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 20 20 73 71  ->op));.  }.  sq
30420 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
30430 74 66 28 70 56 64 62 65 2c 20 22 45 4e 44 22 29  tf(pVdbe, "END")
30440 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61  ;.  sqlite3Expla
30450 69 6e 50 6f 70 28 70 56 64 62 65 29 3b 0a 7d 0a  inPop(pVdbe);.}.
30460 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73  ./* End of the s
30470 74 72 75 63 74 75 72 65 20 64 65 62 75 67 20 70  tructure debug p
30480 72 69 6e 74 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a  rinting code.***
30490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
304a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
304b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
304c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
304d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64  **********/.#end
304e0 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
304f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45  LITE_ENABLE_TREE
30500 5f 45 58 50 4c 41 49 4e 29 20 2a 2f 0a           _EXPLAIN) */.