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

Artifact 7f4a1ef9c9e893ee6da160441cd773c951f3d44e:


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 6e 45  tion */.  int nE
3fe0: 78 70 72 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72  xpr = pSort->pOr
3ff0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 20 20  derBy->nExpr;   
4000: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
4010: 2e 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65  . of ORDER BY te
4020: 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 61  rms */.  int nBa
4030: 73 65 20 3d 20 6e 45 78 70 72 20 2b 20 31 20 2b  se = nExpr + 1 +
4040: 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20 20   nData;         
4050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 65            /* Fie
4060: 6c 64 73 20 69 6e 20 73 6f 72 74 65 72 20 72 65  lds in sorter re
4070: 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65  cord */.  int re
4080: 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  gBase;          
4090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
40b0: 67 73 20 66 6f 72 20 73 6f 72 74 65 72 20 72 65  gs for sorter re
40c0: 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65  cord */.  int re
40d0: 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65  gRecord = sqlite
40e0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
40f0: 73 65 29 3b 20 20 20 20 20 20 20 2f 2a 20 41 73  se);       /* As
4100: 73 65 6d 62 6c 69 65 64 20 73 6f 72 74 65 72 20  semblied sorter 
4110: 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
4120: 6e 4f 42 53 61 74 20 3d 20 70 53 6f 72 74 2d 3e  nOBSat = pSort->
4130: 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20 20 20  nOBSat;         
4140: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4150: 4e 6f 2e 20 4f 52 44 45 52 20 42 59 20 74 65 72  No. ORDER BY ter
4160: 6d 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20  ms to skip */.  
4170: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
4180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4190: 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20        /* Opcode 
41a0: 74 6f 20 61 64 64 20 73 6f 72 74 65 72 20 72 65  to add sorter re
41b0: 63 6f 72 64 20 74 6f 20 73 6f 72 74 65 72 20 2a  cord to sorter *
41c0: 2f 0a 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78  /..  if( nPrefix
41d0: 52 65 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Reg ){.    asser
41e0: 74 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 6e  t( nPrefixReg==n
41f0: 45 78 70 72 2b 31 20 29 3b 0a 20 20 20 20 72 65  Expr+1 );.    re
4200: 67 42 61 73 65 20 3d 20 72 65 67 44 61 74 61 20  gBase = regData 
4210: 2d 20 6e 45 78 70 72 20 2d 20 31 3b 0a 20 20 7d  - nExpr - 1;.  }
4220: 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 42 61 73  else{.    regBas
4230: 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  e = sqlite3GetTe
4240: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
4250: 6e 42 61 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71  nBase);.  }.  sq
4260: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
4270: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  rList(pParse, pS
4280: 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72  ort->pOrderBy, r
4290: 65 67 42 61 73 65 2c 20 53 51 4c 49 54 45 5f 45  egBase, SQLITE_E
42a0: 43 45 4c 5f 44 55 50 29 3b 0a 20 20 73 71 6c 69  CEL_DUP);.  sqli
42b0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
42c0: 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 53   OP_Sequence, pS
42d0: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72  ort->iECursor, r
42e0: 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20  egBase+nExpr);. 
42f0: 20 69 66 28 20 6e 50 72 65 66 69 78 52 65 67 3d   if( nPrefixReg=
4300: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
4310: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4320: 50 5f 4d 6f 76 65 2c 20 72 65 67 44 61 74 61 2c  P_Move, regData,
4330: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 2b 31   regBase+nExpr+1
4340: 2c 20 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20  , nData);.  }.  
4350: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4360: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
4370: 72 64 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42 53  rd, regBase+nOBS
4380: 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74  at, nBase-nOBSat
4390: 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
43a0: 69 66 28 20 6e 4f 42 53 61 74 3e 30 20 29 7b 0a  if( nOBSat>0 ){.
43b0: 20 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 4b      int regPrevK
43c0: 65 79 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72  ey;   /* The fir
43d0: 73 74 20 6e 4f 42 53 61 74 20 63 6f 6c 75 6d 6e  st nOBSat column
43e0: 73 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75  s of the previou
43f0: 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74  s row */.    int
4400: 20 61 64 64 72 46 69 72 73 74 3b 20 20 20 20 2f   addrFirst;    /
4410: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
4420: 20 4f 50 5f 49 66 4e 6f 74 20 6f 70 63 6f 64 65   OP_IfNot opcode
4430: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
4440: 4a 6d 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  Jmp;      /* Add
4450: 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4a  ress of the OP_J
4460: 75 6d 70 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ump opcode */.  
4470: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20    VdbeOp *pOp;  
4480: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 68      /* Opcode th
4490: 61 74 20 6f 70 65 6e 73 20 74 68 65 20 73 6f 72  at opens the sor
44a0: 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
44b0: 4b 65 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Key;         /* 
44c0: 4e 75 6d 62 65 72 20 6f 66 20 73 6f 72 74 69 6e  Number of sortin
44d0: 67 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69  g key columns, i
44e0: 6e 63 6c 75 64 69 6e 67 20 4f 50 5f 53 65 71 75  ncluding OP_Sequ
44f0: 65 6e 63 65 20 2a 2f 0a 20 20 20 20 4b 65 79 49  ence */.    KeyI
4500: 6e 66 6f 20 2a 70 4b 49 3b 20 20 20 20 20 2f 2a  nfo *pKI;     /*
4510: 20 4f 72 69 67 69 6e 61 6c 20 4b 65 79 49 6e 66   Original KeyInf
4520: 6f 20 6f 6e 20 74 68 65 20 73 6f 72 74 65 72 20  o on the sorter 
4530: 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 65  table */..    re
4540: 67 50 72 65 76 4b 65 79 20 3d 20 70 50 61 72 73  gPrevKey = pPars
4550: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
4560: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
4570: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20  Sort->nOBSat;.  
4580: 20 20 6e 4b 65 79 20 3d 20 6e 45 78 70 72 20 2d    nKey = nExpr -
4590: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 20 2b   pSort->nOBSat +
45a0: 20 31 3b 0a 20 20 20 20 61 64 64 72 46 69 72 73   1;.    addrFirs
45b0: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
45c0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
45d0: 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  t, regBase+nExpr
45e0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
45f0: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
4600: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
4610: 43 6f 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76  Compare, regPrev
4620: 4b 65 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53  Key, regBase, pS
4630: 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20  ort->nOBSat);.  
4640: 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
4650: 64 62 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72  dbeGetOp(v, pSor
4660: 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  t->addrSortIndex
4670: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  );.    if( pPars
4680: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
4690: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
46a0: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79    pOp->p2 = nKey
46b0: 20 2b 20 31 3b 0a 20 20 20 20 70 4b 49 20 3d 20   + 1;.    pKI = 
46c0: 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
46d0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4b 49  ;.    memset(pKI
46e0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 30 2c  ->aSortOrder, 0,
46f0: 20 70 4b 49 2d 3e 6e 46 69 65 6c 64 29 3b 20 2f   pKI->nField); /
4700: 2a 20 4d 61 6b 65 73 20 4f 50 5f 4a 75 6d 70 20  * Makes OP_Jump 
4710: 62 65 6c 6f 77 20 74 65 73 74 61 62 6c 65 20 2a  below testable *
4720: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
4730: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
4740: 20 28 63 68 61 72 2a 29 70 4b 49 2c 20 50 34 5f   (char*)pKI, P4_
4750: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 70 4f  KEYINFO);.    pO
4760: 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20 3d  p->p4.pKeyInfo =
4770: 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
4780: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f  List(pParse, pSo
4790: 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 6e 4f  rt->pOrderBy, nO
47a0: 42 53 61 74 2c 20 31 29 3b 0a 20 20 20 20 61 64  BSat, 1);.    ad
47b0: 64 72 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33 56  drJmp = sqlite3V
47c0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
47d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
47e0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
47f0: 75 6d 70 2c 20 61 64 64 72 4a 6d 70 2b 31 2c 20  ump, addrJmp+1, 
4800: 30 2c 20 61 64 64 72 4a 6d 70 2b 31 29 3b 20 56  0, addrJmp+1); V
4810: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
4820: 20 20 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c      pSort->label
4830: 42 6b 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 56  BkOut = sqlite3V
4840: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
4850: 0a 20 20 20 20 70 53 6f 72 74 2d 3e 72 65 67 52  .    pSort->regR
4860: 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65  eturn = ++pParse
4870: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
4880: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
4890: 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74   OP_Gosub, pSort
48a0: 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f  ->regReturn, pSo
48b0: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b  rt->labelBkOut);
48c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
48d0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73  AddOp1(v, OP_Res
48e0: 65 74 53 6f 72 74 65 72 2c 20 70 53 6f 72 74 2d  etSorter, pSort-
48f0: 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  >iECursor);.    
4900: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
4910: 65 72 65 28 76 2c 20 61 64 64 72 46 69 72 73 74  ere(v, addrFirst
4920: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4930: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
4940: 6f 76 65 2c 20 72 65 67 42 61 73 65 2c 20 72 65  ove, regBase, re
4950: 67 50 72 65 76 4b 65 79 2c 20 70 53 6f 72 74 2d  gPrevKey, pSort-
4960: 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20 73 71  >nOBSat);.    sq
4970: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
4980: 65 28 76 2c 20 61 64 64 72 4a 6d 70 29 3b 0a 20  e(v, addrJmp);. 
4990: 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e   }.  if( pSort->
49a0: 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54  sortFlags & SORT
49b0: 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29  FLAG_UseSorter )
49c0: 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 53 6f  {.    op = OP_So
49d0: 72 74 65 72 49 6e 73 65 72 74 3b 0a 20 20 7d 65  rterInsert;.  }e
49e0: 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50  lse{.    op = OP
49f0: 5f 49 64 78 49 6e 73 65 72 74 3b 0a 20 20 7d 0a  _IdxInsert;.  }.
4a00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4a10: 4f 70 32 28 76 2c 20 6f 70 2c 20 70 53 6f 72 74  Op2(v, op, pSort
4a20: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52  ->iECursor, regR
4a30: 65 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 6e 4f  ecord);.  if( nO
4a40: 42 53 61 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  BSat==0 ){.    s
4a50: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
4a60: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
4a70: 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 69 66 28  Record);.    if(
4a80: 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 30 20 29   nPrefixReg==0 )
4a90: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
4aa0: 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
4ab0: 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c  pParse, regBase,
4ac0: 20 6e 42 61 73 65 29 3b 0a 20 20 20 20 7d 0a 20   nBase);.    }. 
4ad0: 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74   }.  if( pSelect
4ae0: 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
4af0: 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32  int addr1, addr2
4b00: 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74  ;.    int iLimit
4b10: 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  ;.    if( pSelec
4b20: 74 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a 20 20  t->iOffset ){.  
4b30: 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65      iLimit = pSe
4b40: 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 3b  lect->iOffset+1;
4b50: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4b60: 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65    iLimit = pSele
4b70: 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20  ct->iLimit;.    
4b80: 7d 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71  }.    addr1 = sq
4b90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
4ba0: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c  v, OP_IfZero, iL
4bb0: 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72  imit); VdbeCover
4bc0: 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
4bd0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
4be0: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 69 4c 69 6d   OP_AddImm, iLim
4bf0: 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64 64  it, -1);.    add
4c00: 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
4c10: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74  AddOp0(v, OP_Got
4c20: 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  o);.    sqlite3V
4c30: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
4c40: 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  ddr1);.    sqlit
4c50: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
4c60: 4f 50 5f 4c 61 73 74 2c 20 70 53 6f 72 74 2d 3e  OP_Last, pSort->
4c70: 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73  iECursor);.    s
4c80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
4c90: 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70  (v, OP_Delete, p
4ca0: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b  Sort->iECursor);
4cb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4cc0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
4cd0: 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  2);.  }.}../*.**
4ce0: 20 41 64 64 20 63 6f 64 65 20 74 6f 20 69 6d 70   Add code to imp
4cf0: 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46 46 53 45  lement the OFFSE
4d00: 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  T.*/.static void
4d10: 20 63 6f 64 65 4f 66 66 73 65 74 28 0a 20 20 56   codeOffset(.  V
4d20: 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
4d30: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
4d40: 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a  e into this VM *
4d50: 2f 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 2c  /.  int iOffset,
4d60: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
4d70: 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 66  r holding the of
4d80: 66 73 65 74 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  fset counter */.
4d90: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20    int iContinue 
4da0: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
4db0: 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72   to skip the cur
4dc0: 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 29  rent record */.)
4dd0: 7b 0a 20 20 69 66 28 20 69 4f 66 66 73 65 74 3e  {.  if( iOffset>
4de0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  0 ){.    int add
4df0: 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  r;.    sqlite3Vd
4e00: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
4e10: 64 64 49 6d 6d 2c 20 69 4f 66 66 73 65 74 2c 20  ddImm, iOffset, 
4e20: 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20  -1);.    addr = 
4e30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4e40: 31 28 76 2c 20 4f 50 5f 49 66 4e 65 67 2c 20 69  1(v, OP_IfNeg, i
4e50: 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76  Offset); VdbeCov
4e60: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
4e70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
4e80: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  v, OP_Goto, 0, i
4e90: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 56  Continue);.    V
4ea0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
4eb0: 73 6b 69 70 20 4f 46 46 53 45 54 20 72 65 63 6f  skip OFFSET reco
4ec0: 72 64 73 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  rds"));.    sqli
4ed0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
4ee0: 76 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a  v, addr);.  }.}.
4ef0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20  ./*.** Add code 
4f00: 74 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20  that will check 
4f10: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
4f20: 20 4e 20 72 65 67 69 73 74 65 72 73 20 73 74 61   N registers sta
4f30: 72 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a  rting at iMem.**
4f40: 20 66 6f 72 6d 20 61 20 64 69 73 74 69 6e 63 74   form a distinct
4f50: 20 65 6e 74 72 79 2e 20 20 69 54 61 62 20 69 73   entry.  iTab is
4f60: 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
4f70: 20 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76   that holds prev
4f80: 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63  iously.** seen c
4f90: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74  ombinations of t
4fa0: 68 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20  he N values.  A 
4fb0: 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64  new entry is mad
4fc0: 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20  e in iTab.** if 
4fd0: 74 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61  the current N va
4fe0: 6c 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a  lues are new..**
4ff0: 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64  .** A jump to ad
5000: 64 72 52 65 70 65 61 74 20 69 73 20 6d 61 64 65  drRepeat is made
5010: 20 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c   and the N+1 val
5020: 75 65 73 20 61 72 65 20 70 6f 70 70 65 64 20 66  ues are popped f
5030: 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b  rom the.** stack
5040: 20 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c   if the top N el
5050: 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64  ements are not d
5060: 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74  istinct..*/.stat
5070: 69 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74  ic void codeDist
5080: 69 6e 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  inct(.  Parse *p
5090: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61  Parse,     /* Pa
50a0: 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
50b0: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
50c0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c  t */.  int iTab,
50d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
50e0: 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65  orting index use
50f0: 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69  d to test for di
5100: 73 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20  stinctness */.  
5110: 69 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c 20  int addrRepeat, 
5120: 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65     /* Jump to he
5130: 72 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e  re if not distin
5140: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20  ct */.  int N,  
5150: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5160: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
5170: 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20   */.  int iMem  
5180: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
5190: 74 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  t element */.){.
51a0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
51b0: 20 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72   r1;..  v = pPar
51c0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31 20  se->pVdbe;.  r1 
51d0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
51e0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
51f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
5200: 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
5210: 20 69 54 61 62 2c 20 61 64 64 72 52 65 70 65 61   iTab, addrRepea
5220: 74 2c 20 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62  t, iMem, N); Vdb
5230: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
5240: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5250: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
5260: 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29  rd, iMem, N, r1)
5270: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
5280: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
5290: 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31 29  nsert, iTab, r1)
52a0: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
52b0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
52c0: 2c 20 72 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  , r1);.}..#ifnde
52d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
52e0: 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e  BQUERY./*.** Gen
52f0: 65 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20 6d  erate an error m
5300: 65 73 73 61 67 65 20 77 68 65 6e 20 61 20 53 45  essage when a SE
5310: 4c 45 43 54 20 69 73 20 75 73 65 64 20 77 69 74  LECT is used wit
5320: 68 69 6e 20 61 20 73 75 62 65 78 70 72 65 73 73  hin a subexpress
5330: 69 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a  ion.** (example:
5340: 20 20 22 61 20 49 4e 20 28 53 45 4c 45 43 54 20    "a IN (SELECT 
5350: 2a 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 29 20  * FROM table)") 
5360: 62 75 74 20 69 74 20 68 61 73 20 6d 6f 72 65 20  but it has more 
5370: 74 68 61 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a  than 1 result.**
5380: 20 63 6f 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20   column.  We do 
5390: 74 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75  this in a subrou
53a0: 74 69 6e 65 20 62 65 63 61 75 73 65 20 74 68 65  tine because the
53b0: 20 65 72 72 6f 72 20 75 73 65 64 20 74 6f 20 6f   error used to o
53c0: 63 63 75 72 0a 2a 2a 20 69 6e 20 6d 75 6c 74 69  ccur.** in multi
53d0: 70 6c 65 20 70 6c 61 63 65 73 2e 20 20 28 54 68  ple places.  (Th
53e0: 65 20 65 72 72 6f 72 20 6f 6e 6c 79 20 6f 63 63  e error only occ
53f0: 75 72 73 20 69 6e 20 6f 6e 65 20 70 6c 61 63 65  urs in one place
5400: 20 6e 6f 77 2c 20 62 75 74 20 77 65 0a 2a 2a 20   now, but we.** 
5410: 72 65 74 61 69 6e 20 74 68 65 20 73 75 62 72 6f  retain the subro
5420: 75 74 69 6e 65 20 74 6f 20 6d 69 6e 69 6d 69 7a  utine to minimiz
5430: 65 20 63 6f 64 65 20 64 69 73 72 75 70 74 69 6f  e code disruptio
5440: 6e 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  n.).*/.static in
5450: 74 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43  t checkForMultiC
5460: 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72  olumnSelectError
5470: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5480: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
5490: 65 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20  e context. */.  
54a0: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
54b0: 74 2c 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74  t,   /* Destinat
54c0: 69 6f 6e 20 6f 66 20 53 45 4c 45 43 54 20 72 65  ion of SELECT re
54d0: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  sults */.  int n
54e0: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
54f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
5500: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75  ult columns retu
5510: 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 2a  rned by SELECT *
5520: 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 73 74  /.){.  int eDest
5530: 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b   = pDest->eDest;
5540: 0a 20 20 69 66 28 20 6e 45 78 70 72 3e 31 20 26  .  if( nExpr>1 &
5550: 26 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65  & (eDest==SRT_Me
5560: 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  m || eDest==SRT_
5570: 53 65 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Set) ){.    sqli
5580: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
5590: 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67  se, "only a sing
55a0: 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65  le result allowe
55b0: 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22  d for ".       "
55c0: 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 73  a SELECT that is
55d0: 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
55e0: 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65  ession");.    re
55f0: 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  turn 1;.  }else{
5600: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
5610: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
5620: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5630: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
5640: 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64  de for the insid
5650: 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  e of the inner l
5660: 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45  oop.** of a SELE
5670: 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63  CT..**.** If src
5680: 54 61 62 20 69 73 20 6e 65 67 61 74 69 76 65 2c  Tab is negative,
5690: 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73 74   then the pEList
56a0: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
56b0: 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e  are evaluated in
56c0: 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68   order to get th
56d0: 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20  e data for this 
56e0: 72 6f 77 2e 20 20 49 66 20 73 72 63 54 61 62 20  row.  If srcTab 
56f0: 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d 6f  is.** zero or mo
5700: 72 65 2c 20 74 68 65 6e 20 64 61 74 61 20 69 73  re, then data is
5710: 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63   pulled from src
5720: 54 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69  Tab and pEList i
5730: 73 20 75 73 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20  s used only .** 
5740: 74 6f 20 67 65 74 20 6e 75 6d 62 65 72 20 63 6f  to get number co
5750: 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 64 61  lumns and the da
5760: 74 61 74 79 70 65 20 66 6f 72 20 65 61 63 68 20  tatype for each 
5770: 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69  column..*/.stati
5780: 63 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e  c void selectInn
5790: 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20  erLoop(.  Parse 
57a0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
57b0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
57c0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
57d0: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
57e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
57f0: 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74 61 74  lete select stat
5800: 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
5810: 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
5820: 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  *pEList,       /
5830: 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  * List of values
5840: 20 62 65 69 6e 67 20 65 78 74 72 61 63 74 65 64   being extracted
5850: 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62   */.  int srcTab
5860: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
5870: 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20   Pull data from 
5880: 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
5890: 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20  SortCtx *pSort, 
58a0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
58b0: 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20  t NULL, info on 
58c0: 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20 4f  how to process O
58d0: 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 44 69 73  RDER BY */.  Dis
58e0: 74 69 6e 63 74 43 74 78 20 2a 70 44 69 73 74 69  tinctCtx *pDisti
58f0: 6e 63 74 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e  nct, /* If not N
5900: 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77  ULL, info on how
5910: 20 74 6f 20 70 72 6f 63 65 73 73 20 44 49 53 54   to process DIST
5920: 49 4e 43 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74  INCT */.  Select
5930: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20  Dest *pDest,    
5940: 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70    /* How to disp
5950: 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c  ose of the resul
5960: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e  ts */.  int iCon
5970: 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20  tinue,          
5980: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
5990: 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65  continue with ne
59a0: 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20  xt row */.  int 
59b0: 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20  iBreak          
59c0: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
59d0: 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
59e0: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20   the inner loop 
59f0: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
5a00: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
5a10: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
5a20: 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20  hasDistinct;    
5a30: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
5a40: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
5a50: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
5a60: 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c  /.  int regResul
5a70: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
5a80: 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f  /* Start of memo
5a90: 72 79 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c  ry holding resul
5aa0: 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 65  t set */.  int e
5ab0: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
5ac0: 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f  est;   /* How to
5ad0: 20 64 69 73 70 6f 73 65 20 6f 66 20 72 65 73 75   dispose of resu
5ae0: 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  lts */.  int iPa
5af0: 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50  rm = pDest->iSDP
5b00: 61 72 6d 3b 20 2f 2a 20 46 69 72 73 74 20 61 72  arm; /* First ar
5b10: 67 75 6d 65 6e 74 20 74 6f 20 64 69 73 70 6f 73  gument to dispos
5b20: 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69  al method */.  i
5b30: 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20  nt nResultCol;  
5b40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5b50: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
5b60: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  olumns */.  int 
5b70: 6e 50 72 65 66 69 78 52 65 67 20 3d 20 30 3b 20  nPrefixReg = 0; 
5b80: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5b90: 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73  r of extra regis
5ba0: 74 65 72 73 20 62 65 66 6f 72 65 20 72 65 67 52  ters before regR
5bb0: 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 61 73 73 65  esult */..  asse
5bc0: 72 74 28 20 76 20 29 3b 0a 20 20 61 73 73 65 72  rt( v );.  asser
5bd0: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
5be0: 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20    hasDistinct = 
5bf0: 70 44 69 73 74 69 6e 63 74 20 3f 20 70 44 69 73  pDistinct ? pDis
5c00: 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65  tinct->eTnctType
5c10: 20 3a 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   : WHERE_DISTINC
5c20: 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70 53  T_NOOP;.  if( pS
5c30: 6f 72 74 20 26 26 20 70 53 6f 72 74 2d 3e 70 4f  ort && pSort->pO
5c40: 72 64 65 72 42 79 3d 3d 30 20 29 20 70 53 6f 72  rderBy==0 ) pSor
5c50: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53 6f  t = 0;.  if( pSo
5c60: 72 74 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73  rt==0 && !hasDis
5c70: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73  tinct ){.    ass
5c80: 65 72 74 28 20 69 43 6f 6e 74 69 6e 75 65 21 3d  ert( iContinue!=
5c90: 30 20 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66  0 );.    codeOff
5ca0: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
5cb0: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  t, iContinue);. 
5cc0: 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68   }..  /* Pull th
5cd0: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75  e requested colu
5ce0: 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65 73  mns..  */.  nRes
5cf0: 75 6c 74 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d  ultCol = pEList-
5d00: 3e 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20 70  >nExpr;..  if( p
5d10: 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29  Dest->iSdst==0 )
5d20: 7b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 20  {.    if( pSort 
5d30: 29 7b 0a 20 20 20 20 20 20 6e 50 72 65 66 69 78  ){.      nPrefix
5d40: 52 65 67 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72  Reg = pSort->pOr
5d50: 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31  derBy->nExpr + 1
5d60: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
5d70: 6e 4d 65 6d 20 2b 3d 20 6e 50 72 65 66 69 78 52  nMem += nPrefixR
5d80: 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44  eg;.    }.    pD
5d90: 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 70 50 61  est->iSdst = pPa
5da0: 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
5db0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
5dc0: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d   nResultCol;.  }
5dd0: 65 6c 73 65 20 69 66 28 20 70 44 65 73 74 2d 3e  else if( pDest->
5de0: 69 53 64 73 74 2b 6e 52 65 73 75 6c 74 43 6f 6c  iSdst+nResultCol
5df0: 20 3e 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   > pParse->nMem 
5e00: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
5e10: 73 20 61 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69  s an error condi
5e20: 74 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 72 65  tion that can re
5e30: 73 75 6c 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c  sult, for exampl
5e40: 65 2c 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54  e, when a SELECT
5e50: 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 72  .    ** on the r
5e60: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
5e70: 66 20 61 6e 20 49 4e 53 45 52 54 20 63 6f 6e 74  f an INSERT cont
5e80: 61 69 6e 73 20 6d 6f 72 65 20 72 65 73 75 6c 74  ains more result
5e90: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a 20 20   columns than.  
5ea0: 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 63    ** there are c
5eb0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61  olumns in the ta
5ec0: 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 2e  ble on the left.
5ed0: 20 20 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c    The error will
5ee0: 20 62 65 20 63 61 75 67 68 74 0a 20 20 20 20 2a   be caught.    *
5ef0: 2a 20 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c  * and reported l
5f00: 61 74 65 72 2e 20 20 42 75 74 20 77 65 20 6e 65  ater.  But we ne
5f10: 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
5f20: 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 69 73  enough memory is
5f30: 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a   allocated.    *
5f40: 2a 20 74 6f 20 61 76 6f 69 64 20 6f 74 68 65 72  * to avoid other
5f50: 20 73 70 75 72 69 6f 75 73 20 65 72 72 6f 72 73   spurious errors
5f60: 20 69 6e 20 74 68 65 20 6d 65 61 6e 74 69 6d 65   in the meantime
5f70: 2e 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d  . */.    pParse-
5f80: 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74  >nMem += nResult
5f90: 43 6f 6c 3b 0a 20 20 7d 0a 20 20 70 44 65 73 74  Col;.  }.  pDest
5fa0: 2d 3e 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c  ->nSdst = nResul
5fb0: 74 43 6f 6c 3b 0a 20 20 72 65 67 52 65 73 75 6c  tCol;.  regResul
5fc0: 74 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74  t = pDest->iSdst
5fd0: 3b 0a 20 20 69 66 28 20 73 72 63 54 61 62 3e 3d  ;.  if( srcTab>=
5fe0: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
5ff0: 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20  ; i<nResultCol; 
6000: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
6010: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6020: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54   OP_Column, srcT
6030: 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74  ab, i, regResult
6040: 2b 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  +i);.      VdbeC
6050: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
6060: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
6070: 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ame));.    }.  }
6080: 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 21 3d  else if( eDest!=
6090: 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20  SRT_Exists ){.  
60a0: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74    /* If the dest
60b0: 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58  ination is an EX
60c0: 49 53 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73  ISTS(...) expres
60d0: 73 69 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c  sion, the actual
60e0: 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72  .    ** values r
60f0: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53  eturned by the S
6100: 45 4c 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65  ELECT are not re
6110: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
6120: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
6130: 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
6140: 65 2c 20 70 45 4c 69 73 74 2c 20 72 65 67 52 65  e, pEList, regRe
6150: 73 75 6c 74 2c 0a 20 20 20 20 20 20 20 20 20 20  sult,.          
6160: 20 20 20 20 20 20 20 20 28 65 44 65 73 74 3d 3d          (eDest==
6170: 53 52 54 5f 4f 75 74 70 75 74 7c 7c 65 44 65 73  SRT_Output||eDes
6180: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
6190: 29 3f 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55  )?SQLITE_ECEL_DU
61a0: 50 3a 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  P:0);.  }..  /* 
61b0: 49 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  If the DISTINCT 
61c0: 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72 65 73  keyword was pres
61d0: 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43  ent on the SELEC
61e0: 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  T statement.  **
61f0: 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61   and this row ha
6200: 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f  s been seen befo
6210: 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  re, then do not 
6220: 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20  make this row.  
6230: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 72  ** part of the r
6240: 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  esult..  */.  if
6250: 28 20 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b  ( hasDistinct ){
6260: 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 44 69  .    switch( pDi
6270: 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70  stinct->eTnctTyp
6280: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
6290: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
62a0: 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20  RDERED: {.      
62b0: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20    VdbeOp *pOp;  
62c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
62d0: 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 20  longer required 
62e0: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
62f0: 73 74 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  str. */.        
6300: 69 6e 74 20 69 4a 75 6d 70 3b 20 20 20 20 20 20  int iJump;      
6310: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
6320: 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20  destination */. 
6330: 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 50 72         int regPr
6340: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ev;            /
6350: 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 20 63  * Previous row c
6360: 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20  ontent */..     
6370: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73     /* Allocate s
6380: 70 61 63 65 20 66 6f 72 20 74 68 65 20 70 72 65  pace for the pre
6390: 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20  vious row */.   
63a0: 20 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70       regPrev = p
63b0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
63c0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
63d0: 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f  Mem += nResultCo
63e0: 6c 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  l;..        /* C
63f0: 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65  hange the OP_Ope
6400: 6e 45 70 68 65 6d 65 72 61 6c 20 63 6f 64 65 64  nEphemeral coded
6410: 20 65 61 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f   earlier to an O
6420: 50 5f 4e 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a  P_Null.        *
6430: 2a 20 73 65 74 73 20 74 68 65 20 4d 45 4d 5f 43  * sets the MEM_C
6440: 6c 65 61 72 65 64 20 62 69 74 20 6f 6e 20 74 68  leared bit on th
6450: 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72  e first register
6460: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
6470: 2a 2a 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75  ** previous valu
6480: 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61  e.  This will ca
6490: 75 73 65 20 74 68 65 20 4f 50 5f 4e 65 20 62 65  use the OP_Ne be
64a0: 6c 6f 77 20 74 6f 20 61 6c 77 61 79 73 0a 20 20  low to always.  
64b0: 20 20 20 20 20 20 2a 2a 20 66 61 69 6c 20 6f 6e        ** fail on
64c0: 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61   the first itera
64d0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70  tion of the loop
64e0: 20 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 72   even if the fir
64f0: 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f  st.        ** ro
6500: 77 20 69 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a  w is all NULLs..
6510: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
6520: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
6530: 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44  angeToNoop(v, pD
6540: 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63  istinct->addrTnc
6550: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 20  t);.        pOp 
6560: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
6570: 4f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d  Op(v, pDistinct-
6580: 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20  >addrTnct);.    
6590: 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
65a0: 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20  = OP_Null;.     
65b0: 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a     pOp->p1 = 1;.
65c0: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20          pOp->p2 
65d0: 3d 20 72 65 67 50 72 65 76 3b 0a 0a 20 20 20 20  = regPrev;..    
65e0: 20 20 20 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69      iJump = sqli
65f0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
6600: 64 72 28 76 29 20 2b 20 6e 52 65 73 75 6c 74 43  dr(v) + nResultC
6610: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ol;.        for(
6620: 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f  i=0; i<nResultCo
6630: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
6640: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
6650: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
6660: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
6670: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
6680: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  r);.          if
6690: 28 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31  ( i<nResultCol-1
66a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
66b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
66c0: 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52  3(v, OP_Ne, regR
66d0: 65 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20  esult+i, iJump, 
66e0: 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20  regPrev+i);.    
66f0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
6700: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
6710: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6720: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6730: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71  eAddOp3(v, OP_Eq
6740: 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69  , regResult+i, i
6750: 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72 65  Continue, regPre
6760: 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  v+i);.          
6770: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
6780: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a  );.           }.
6790: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
67a0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
67b0: 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72   -1, (const char
67c0: 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c   *)pColl, P4_COL
67d0: 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20  LSEQ);.         
67e0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
67f0: 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e  geP5(v, SQLITE_N
6800: 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20  ULLEQ);.        
6810: 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
6820: 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  ( sqlite3VdbeCur
6830: 72 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75  rentAddr(v)==iJu
6840: 6d 70 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  mp );.        sq
6850: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6860: 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 52  v, OP_Copy, regR
6870: 65 73 75 6c 74 2c 20 72 65 67 50 72 65 76 2c 20  esult, regPrev, 
6880: 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 29 3b 0a 20  nResultCol-1);. 
6890: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
68a0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73      }..      cas
68b0: 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
68c0: 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20  _UNIQUE: {.     
68d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
68e0: 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44  angeToNoop(v, pD
68f0: 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63  istinct->addrTnc
6900: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
6910: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
6920: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
6930: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 69       assert( pDi
6940: 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70  stinct->eTnctTyp
6950: 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43  e==WHERE_DISTINC
6960: 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 3b 0a 20  T_UNORDERED );. 
6970: 20 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69         codeDisti
6980: 6e 63 74 28 70 50 61 72 73 65 2c 20 70 44 69 73  nct(pParse, pDis
6990: 74 69 6e 63 74 2d 3e 74 61 62 54 6e 63 74 2c 20  tinct->tabTnct, 
69a0: 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 52 65 73 75  iContinue, nResu
69b0: 6c 74 43 6f 6c 2c 20 72 65 67 52 65 73 75 6c 74  ltCol, regResult
69c0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
69d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
69e0: 20 20 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30      if( pSort==0
69f0: 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66   ){.      codeOf
6a00: 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73  fset(v, p->iOffs
6a10: 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a  et, iContinue);.
6a20: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69      }.  }..  swi
6a30: 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20  tch( eDest ){.  
6a40: 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64    /* In this mod
6a50: 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71 75  e, write each qu
6a60: 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68  ery result to th
6a70: 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d  e key of the tem
6a80: 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61  porary.    ** ta
6a90: 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a  ble iParm..    *
6aa0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
6ab0: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
6ac0: 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20 53  ELECT.    case S
6ad0: 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20  RT_Union: {.    
6ae0: 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20    int r1;.      
6af0: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
6b00: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
6b10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6b20: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
6b30: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
6b40: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  ult, nResultCol,
6b50: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
6b60: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6b70: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
6b80: 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20  Parm, r1);.     
6b90: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
6ba0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
6bb0: 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
6bc0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
6bd0: 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f 72  onstruct a recor
6be0: 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79  d from the query
6bf0: 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73   result, but ins
6c00: 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73  tead of.    ** s
6c10: 61 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72  aving that recor
6c20: 64 2c 20 75 73 65 20 69 74 20 61 73 20 61 20 6b  d, use it as a k
6c30: 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65  ey to delete ele
6c40: 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a  ments from.    *
6c50: 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  * the temporary 
6c60: 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20  table iParm..   
6c70: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
6c80: 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20  _Except: {.     
6c90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6ca0: 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c 65  p3(v, OP_IdxDele
6cb0: 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 65  te, iParm, regRe
6cc0: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
6cd0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6ce0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
6cf0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
6d00: 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a  OUND_SELECT */..
6d10: 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
6d20: 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20   result as data 
6d30: 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b  using a unique k
6d40: 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ey..    */.    c
6d50: 61 73 65 20 53 52 54 5f 46 69 66 6f 3a 0a 20 20  ase SRT_Fifo:.  
6d60: 20 20 63 61 73 65 20 53 52 54 5f 44 69 73 74 46    case SRT_DistF
6d70: 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ifo:.    case SR
6d80: 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73  T_Table:.    cas
6d90: 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20  e SRT_EphemTab: 
6da0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d  {.      int r1 =
6db0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
6dc0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 50 72  ange(pParse, nPr
6dd0: 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20 20 20  efixReg+1);.    
6de0: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
6df0: 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a  t==SRT_Table );.
6e00: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
6e10: 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d  eDest==SRT_Ephem
6e20: 54 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  Tab );.      sql
6e30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6e40: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
6e50: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
6e60: 75 6c 74 43 6f 6c 2c 20 72 31 2b 6e 50 72 65 66  ultCol, r1+nPref
6e70: 69 78 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20  ixReg);.#ifndef 
6e80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
6e90: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
6ea0: 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29 7b  =SRT_DistFifo ){
6eb0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
6ec0: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  he destination i
6ed0: 73 20 44 69 73 74 46 69 66 6f 2c 20 74 68 65 6e  s DistFifo, then
6ee0: 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31   cursor (iParm+1
6ef0: 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20  ) is open.      
6f00: 20 20 2a 2a 20 6f 6e 20 61 6e 20 65 70 68 65 6d    ** on an ephem
6f10: 65 72 61 6c 20 69 6e 64 65 78 2e 20 49 66 20 74  eral index. If t
6f20: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69  he current row i
6f30: 73 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e  s already presen
6f40: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  t.        ** in 
6f50: 74 68 65 20 69 6e 64 65 78 2c 20 64 6f 20 6e 6f  the index, do no
6f60: 74 20 77 72 69 74 65 20 69 74 20 74 6f 20 74 68  t write it to th
6f70: 65 20 6f 75 74 70 75 74 2e 20 49 66 20 6e 6f 74  e output. If not
6f80: 2c 20 61 64 64 20 74 68 65 0a 20 20 20 20 20 20  , add the.      
6f90: 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 72 6f 77    ** current row
6fa0: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 61 6e   to the index an
6fb0: 64 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 77  d proceed with w
6fc0: 72 69 74 69 6e 67 20 69 74 20 74 6f 20 74 68 65  riting it to the
6fd0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70  .        ** outp
6fe0: 75 74 20 74 61 62 6c 65 20 61 73 20 77 65 6c 6c  ut table as well
6ff0: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  .  */.        in
7000: 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33  t addr = sqlite3
7010: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
7020: 76 29 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20  v) + 4;.        
7030: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7040: 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
7050: 2c 20 69 50 61 72 6d 2b 31 2c 20 61 64 64 72 2c  , iParm+1, addr,
7060: 20 72 31 2c 20 30 29 3b 20 56 64 62 65 43 6f 76   r1, 0); VdbeCov
7070: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
7080: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7090: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
70a0: 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 31  ert, iParm+1, r1
70b0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
70c0: 74 28 20 70 53 6f 72 74 3d 3d 30 20 29 3b 0a 20  t( pSort==0 );. 
70d0: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
70e0: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b      if( pSort ){
70f0: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
7100: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
7110: 70 53 6f 72 74 2c 20 70 2c 20 72 31 2b 6e 50 72  pSort, p, r1+nPr
7120: 65 66 69 78 52 65 67 2c 20 31 2c 20 6e 50 72 65  efixReg, 1, nPre
7130: 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  fixReg);.      }
7140: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
7150: 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65  t r2 = sqlite3Ge
7160: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
7170: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7180: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7190: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72  P_NewRowid, iPar
71a0: 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20  m, r2);.        
71b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
71c0: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
71d0: 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a  iParm, r1, r2);.
71e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
71f0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
7200: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
7210: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
7220: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
7230: 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  rse, r2);.      
7240: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  }.      sqlite3R
7250: 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
7260: 70 50 61 72 73 65 2c 20 72 31 2c 20 6e 50 72 65  pParse, r1, nPre
7270: 66 69 78 52 65 67 2b 31 29 3b 0a 20 20 20 20 20  fixReg+1);.     
7280: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
7290: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
72a0: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
72b0: 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65  /* If we are cre
72c0: 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20  ating a set for 
72d0: 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c  an "expr IN (SEL
72e0: 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72  ECT ...)" constr
72f0: 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  uct,.    ** then
7300: 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65   there should be
7310: 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f   a single item o
7320: 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72  n the stack.  Wr
7330: 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ite this.    ** 
7340: 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65  item into the se
7350: 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67  t table with bog
7360: 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a  us data..    */.
7370: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
7380: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
7390: 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d 31 20  ( nResultCol==1 
73a0: 29 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e  );.      pDest->
73b0: 61 66 66 53 64 73 74 20 3d 0a 20 20 20 20 20 20  affSdst =.      
73c0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
73d0: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
73e0: 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ty(pEList->a[0].
73f0: 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61 66  pExpr, pDest->af
7400: 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 69 66  fSdst);.      if
7410: 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  ( pSort ){.     
7420: 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67     /* At first g
7430: 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20  lance you would 
7440: 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f  think we could o
7450: 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a  ptimize out the.
7460: 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52          ** ORDER
7470: 20 42 59 20 69 6e 20 74 68 69 73 20 63 61 73 65   BY in this case
7480: 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72   since the order
7490: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
74a0: 68 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a  he set.        *
74b0: 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  * does not matte
74c0: 72 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69  r.  But there mi
74d0: 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63  ght be a LIMIT c
74e0: 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a  lause, in which.
74f0: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20          ** case 
7500: 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d  the order does m
7510: 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  atter */.       
7520: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
7530: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70  pParse, pSort, p
7540: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 31 2c 20  , regResult, 1, 
7550: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20  nPrefixReg);.   
7560: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7570: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
7580: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
7590: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
75a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
75b0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
75c0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 31 2c 72 31  , regResult,1,r1
75d0: 2c 20 26 70 44 65 73 74 2d 3e 61 66 66 53 64 73  , &pDest->affSds
75e0: 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73  t, 1);.        s
75f0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
7600: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
7610: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
7620: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   1);.        sql
7630: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7640: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
7650: 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20  iParm, r1);.    
7660: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
7670: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
7680: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , r1);.      }. 
7690: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
76a0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79  }..    /* If any
76b0: 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68   row exist in th
76c0: 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65  e result set, re
76d0: 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20 61  cord that fact a
76e0: 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f  nd abort..    */
76f0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78  .    case SRT_Ex
7700: 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71  ists: {.      sq
7710: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7720: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
7730: 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  , iParm);.      
7740: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
7750: 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61  use will termina
7760: 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  te the loop for 
7770: 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
7780: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
7790: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63   If this is a sc
77a0: 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74  alar select that
77b0: 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
77c0: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a  xpression, then.
77d0: 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65      ** store the
77e0: 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
77f0: 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f  appropriate memo
7800: 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61  ry cell and brea
7810: 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20  k out.    ** of 
7820: 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  the scan loop.. 
7830: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
7840: 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
7850: 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43  assert( nResultC
7860: 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69  ol==1 );.      i
7870: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
7880: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
7890: 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  er(pParse, pSort
78a0: 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  , p, regResult, 
78b0: 31 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a  1, nPrefixReg);.
78c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
78d0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
78e0: 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
78f0: 20 72 65 67 52 65 73 75 6c 74 2c 20 69 50 61 72   regResult, iPar
7900: 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 2f  m, 1);.        /
7910: 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
7920: 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74  se will jump out
7930: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72   of the loop for
7940: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20   us */.      }. 
7950: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7960: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  }.#endif /* #ifn
7970: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7980: 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20  SUBQUERY */..   
7990: 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74   case SRT_Corout
79a0: 69 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20 53 65  ine:       /* Se
79b0: 6e 64 20 64 61 74 61 20 74 6f 20 61 20 63 6f 2d  nd data to a co-
79c0: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 63  routine */.    c
79d0: 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20  ase SRT_Output: 
79e0: 7b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75  {        /* Retu
79f0: 72 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a  rn the results *
7a00: 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
7a10: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
7a20: 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20  outine );.      
7a30: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
7a40: 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
7a50: 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29       if( pSort )
7a60: 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  {.        pushOn
7a70: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
7a80: 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65   pSort, p, regRe
7a90: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
7aa0: 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20  , nPrefixReg);. 
7ab0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65       }else if( e
7ac0: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
7ad0: 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ine ){.        s
7ae0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
7af0: 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44  (v, OP_Yield, pD
7b00: 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20  est->iSDParm);. 
7b10: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7b20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7b30: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
7b40: 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74  ltRow, regResult
7b50: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
7b60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
7b70: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
7b80: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
7b90: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
7ba0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Col);.      }.  
7bb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7bc0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
7bd0: 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a  _OMIT_CTE.    /*
7be0: 20 57 72 69 74 65 20 74 68 65 20 72 65 73 75 6c   Write the resul
7bf0: 74 73 20 69 6e 74 6f 20 61 20 70 72 69 6f 72 69  ts into a priori
7c00: 74 79 20 71 75 65 75 65 20 74 68 61 74 20 69 73  ty queue that is
7c10: 20 6f 72 64 65 72 20 61 63 63 6f 72 64 69 6e 67   order according
7c20: 20 74 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73 74   to.    ** pDest
7c30: 2d 3e 70 4f 72 64 65 72 42 79 20 28 69 6e 20 70  ->pOrderBy (in p
7c40: 53 4f 29 2e 20 20 70 44 65 73 74 2d 3e 69 53 44  SO).  pDest->iSD
7c50: 50 61 72 6d 20 28 69 6e 20 69 50 61 72 6d 29 20  Parm (in iParm) 
7c60: 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f  is the cursor fo
7c70: 72 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 65  r an.    ** inde
7c80: 78 20 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78 70  x with pSO->nExp
7c90: 72 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42 75  r+2 columns.  Bu
7ca0: 69 6c 64 20 61 20 6b 65 79 20 75 73 69 6e 67 20  ild a key using 
7cb0: 70 53 4f 20 66 6f 72 20 74 68 65 20 66 69 72 73  pSO for the firs
7cc0: 74 0a 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45  t.    ** pSO->nE
7cd0: 78 70 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  xpr columns, the
7ce0: 6e 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  n make sure all 
7cf0: 6b 65 79 73 20 61 72 65 20 75 6e 69 71 75 65 20  keys are unique 
7d00: 62 79 20 61 64 64 69 6e 67 20 61 0a 20 20 20 20  by adding a.    
7d10: 2a 2a 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71 75  ** final OP_Sequ
7d20: 65 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68  ence column.  Th
7d30: 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 73  e last column is
7d40: 20 74 68 65 20 72 65 63 6f 72 64 20 61 73 20 61   the record as a
7d50: 20 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20   blob..    */.  
7d60: 20 20 63 61 73 65 20 53 52 54 5f 44 69 73 74 51    case SRT_DistQ
7d70: 75 65 75 65 3a 0a 20 20 20 20 63 61 73 65 20 53  ueue:.    case S
7d80: 52 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20 20  RT_Queue: {.    
7d90: 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20    int nKey;.    
7da0: 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33    int r1, r2, r3
7db0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  ;.      int addr
7dc0: 54 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Test = 0;.      
7dd0: 45 78 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a 20  ExprList *pSO;. 
7de0: 20 20 20 20 20 70 53 4f 20 3d 20 70 44 65 73 74       pSO = pDest
7df0: 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
7e00: 20 20 61 73 73 65 72 74 28 20 70 53 4f 20 29 3b    assert( pSO );
7e10: 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 53  .      nKey = pS
7e20: 4f 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  O->nExpr;.      
7e30: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
7e40: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
7e50: 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
7e60: 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
7e70: 50 61 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a  Parse, nKey+2);.
7e80: 20 20 20 20 20 20 72 33 20 3d 20 72 32 2b 6e 4b        r3 = r2+nK
7e90: 65 79 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20  ey+1;.      if( 
7ea0: 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51  eDest==SRT_DistQ
7eb0: 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20  ueue ){.        
7ec0: 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e  /* If the destin
7ed0: 61 74 69 6f 6e 20 69 73 20 44 69 73 74 51 75 65  ation is DistQue
7ee0: 75 65 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20  ue, then cursor 
7ef0: 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65  (iParm+1) is ope
7f00: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20  n.        ** on 
7f10: 61 20 73 65 63 6f 6e 64 20 65 70 68 65 6d 65 72  a second ephemer
7f20: 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f  al index that ho
7f30: 6c 64 73 20 61 6c 6c 20 76 61 6c 75 65 73 20 65  lds all values e
7f40: 76 65 72 79 20 70 72 65 76 69 6f 75 73 6c 79 0a  very previously.
7f50: 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64          ** added
7f60: 20 74 6f 20 74 68 65 20 71 75 65 75 65 2e 20 2a   to the queue. *
7f70: 2f 0a 20 20 20 20 20 20 20 20 61 64 64 72 54 65  /.        addrTe
7f80: 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
7f90: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
7fa0: 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20  Found, iParm+1, 
7fb0: 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
7fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fd0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52              regR
7fe0: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
7ff0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  l);.        Vdbe
8000: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
8010: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
8020: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
8030: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
8040: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
8050: 74 43 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20  tCol, r3);.     
8060: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
8070: 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20  DistQueue ){.   
8080: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8090: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
80a0: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c  Insert, iParm+1,
80b0: 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r3);.        sq
80c0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
80d0: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53  5(v, OPFLAG_USES
80e0: 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20 20  EEKRESULT);.    
80f0: 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
8100: 30 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b  0; i<nKey; i++){
8110: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8120: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8130: 5f 53 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20  _SCopy,.        
8140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8150: 20 20 72 65 67 52 65 73 75 6c 74 20 2b 20 70 53    regResult + pS
8160: 4f 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64  O->a[i].u.x.iOrd
8170: 65 72 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20  erByCol - 1,.   
8180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8190: 20 20 20 20 20 20 20 72 32 2b 69 29 3b 0a 20 20         r2+i);.  
81a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
81b0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
81c0: 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 69 50   OP_Sequence, iP
81d0: 61 72 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20  arm, r2+nKey);. 
81e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
81f0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
8200: 65 52 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65  eRecord, r2, nKe
8210: 79 2b 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  y+2, r1);.      
8220: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8230: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
8240: 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20  t, iParm, r1);. 
8250: 20 20 20 20 20 69 66 28 20 61 64 64 72 54 65 73       if( addrTes
8260: 74 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  t ) sqlite3VdbeJ
8270: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
8280: 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  est);.      sqli
8290: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
82a0: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
82b0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
82c0: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
82d0: 72 73 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29  rse, r2, nKey+2)
82e0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
82f0: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
8300: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a  QLITE_OMIT_CTE *
8310: 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  /....#if !define
8320: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
8330: 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69  IGGER).    /* Di
8340: 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74  scard the result
8350: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
8360: 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74   for SELECT stat
8370: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20  ements inside.  
8380: 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66    ** the body of
8390: 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65   a TRIGGER.  The
83a0: 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68   purpose of such
83b0: 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63   selects is to c
83c0: 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d  all.    ** user-
83d0: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
83e0: 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65  s that have side
83f0: 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f   effects.  We do
8400: 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a   not care.    **
8410: 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61   about the actua
8420: 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  l results of the
8430: 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   select..    */.
8440: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
8450: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
8460: 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st==SRT_Discard 
8470: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
8480: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
8490: 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
84a0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f  he end of the lo
84b0: 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20  op if the LIMIT 
84c0: 69 73 20 72 65 61 63 68 65 64 2e 20 20 45 78 63  is reached.  Exc
84d0: 65 70 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65  ept, if.  ** the
84e0: 72 65 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20  re is a sorter, 
84f0: 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
8500: 65 20 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72  e sorter has alr
8510: 65 61 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a  eady limited.  *
8520: 2a 20 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72  * the output for
8530: 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   us..  */.  if( 
8540: 70 53 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69  pSort==0 && p->i
8550: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
8560: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8570: 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e  , OP_IfZero, p->
8580: 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c 20  iLimit, iBreak, 
8590: 2d 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  -1); VdbeCoverag
85a0: 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(v);.  }.}../*.
85b0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65  ** Allocate a Ke
85c0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66  yInfo object suf
85d0: 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69  ficient for an i
85e0: 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f  ndex of N key co
85f0: 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65  lumns and.** X e
8600: 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  xtra columns..*/
8610: 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
8620: 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71  3KeyInfoAlloc(sq
8630: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e  lite3 *db, int N
8640: 2c 20 69 6e 74 20 58 29 7b 0a 20 20 4b 65 79 49  , int X){.  KeyI
8650: 6e 66 6f 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  nfo *p = sqlite3
8660: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 30 2c 20  DbMallocZero(0, 
8670: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8680: 20 20 20 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e      sizeof(KeyIn
8690: 66 6f 29 20 2b 20 28 4e 2b 58 29 2a 28 73 69 7a  fo) + (N+X)*(siz
86a0: 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29  eof(CollSeq*)+1)
86b0: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
86c0: 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20    p->aSortOrder 
86d0: 3d 20 28 75 38 2a 29 26 70 2d 3e 61 43 6f 6c 6c  = (u8*)&p->aColl
86e0: 5b 4e 2b 58 5d 3b 0a 20 20 20 20 70 2d 3e 6e 46  [N+X];.    p->nF
86f0: 69 65 6c 64 20 3d 20 28 75 31 36 29 4e 3b 0a 20  ield = (u16)N;. 
8700: 20 20 20 70 2d 3e 6e 58 46 69 65 6c 64 20 3d 20     p->nXField = 
8710: 28 75 31 36 29 58 3b 0a 20 20 20 20 70 2d 3e 65  (u16)X;.    p->e
8720: 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20  nc = ENC(db);.  
8730: 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20    p->db = db;.  
8740: 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20    p->nRef = 1;. 
8750: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e   }else{.    db->
8760: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
8770: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
8780: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  ;.}../*.** Deall
8790: 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  ocate a KeyInfo 
87a0: 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73  object.*/.void s
87b0: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
87c0: 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a  ef(KeyInfo *p){.
87d0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61    if( p ){.    a
87e0: 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30  ssert( p->nRef>0
87f0: 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d   );.    p->nRef-
8800: 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52  -;.    if( p->nR
8810: 65 66 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 44  ef==0 ) sqlite3D
8820: 62 46 72 65 65 28 30 2c 20 70 29 3b 0a 20 20 7d  bFree(0, p);.  }
8830: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
8840: 20 6e 65 77 20 70 6f 69 6e 74 65 72 20 74 6f 20   new pointer to 
8850: 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  a KeyInfo object
8860: 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c  .*/.KeyInfo *sql
8870: 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 4b  ite3KeyInfoRef(K
8880: 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66  eyInfo *p){.  if
8890: 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ( p ){.    asser
88a0: 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  t( p->nRef>0 );.
88b0: 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20      p->nRef++;. 
88c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
88d0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
88e0: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
88f0: 72 6e 20 54 52 55 45 20 69 66 20 61 20 4b 65 79  rn TRUE if a Key
8900: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 61 6e 20  Info object can 
8910: 62 65 20 63 68 61 6e 67 65 2e 20 20 54 68 65 20  be change.  The 
8920: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a  KeyInfo object.*
8930: 2a 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 63 68  * can only be ch
8940: 61 6e 67 65 64 20 69 66 20 74 68 69 73 20 69 73  anged if this is
8950: 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20 72   just a single r
8960: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
8970: 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  object..**.** Th
8980: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
8990: 65 64 20 6f 6e 6c 79 20 69 6e 73 69 64 65 20 6f  ed only inside o
89a0: 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  f assert() state
89b0: 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ments..*/.int sq
89c0: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
89d0: 69 74 65 61 62 6c 65 28 4b 65 79 49 6e 66 6f 20  iteable(KeyInfo 
89e0: 2a 70 29 7b 20 72 65 74 75 72 6e 20 70 2d 3e 6e  *p){ return p->n
89f0: 52 65 66 3d 3d 31 3b 20 7d 0a 23 65 6e 64 69 66  Ref==1; }.#endif
8a00: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
8a10: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e   */../*.** Given
8a20: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
8a30: 69 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20  ist, generate a 
8a40: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
8a50: 65 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a  e that records.*
8a60: 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * the collating 
8a70: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63  sequence for eac
8a80: 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  h expression in 
8a90: 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20  that expression 
8aa0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  list..**.** If t
8ab0: 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 61  he ExprList is a
8ac0: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  n ORDER BY or GR
8ad0: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 68  OUP BY clause th
8ae0: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  en the resulting
8af0: 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  .** KeyInfo stru
8b00: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
8b10: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
8b20: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20  izing a virtual 
8b30: 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c  index to.** impl
8b40: 65 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73  ement that claus
8b50: 65 2e 20 20 49 66 20 74 68 65 20 45 78 70 72 4c  e.  If the ExprL
8b60: 69 73 74 20 69 73 20 74 68 65 20 72 65 73 75 6c  ist is the resul
8b70: 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43  t set of a SELEC
8b80: 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65  T.** then the Ke
8b90: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
8ba0: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
8bb0: 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  or initializing 
8bc0: 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64  a virtual.** ind
8bd0: 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ex to implement 
8be0: 61 20 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e  a DISTINCT test.
8bf0: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
8c00: 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f  hold the KeyInfo
8c10: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62   structure is ob
8c20: 74 61 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  tain from malloc
8c30: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  .  The calling.*
8c40: 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  * function is re
8c50: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65  sponsible for se
8c60: 65 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73  eing that this s
8c70: 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e  tructure is even
8c80: 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e  tually.** freed.
8c90: 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e  .*/.static KeyIn
8ca0: 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  fo *keyInfoFromE
8cb0: 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65  xprList(.  Parse
8cc0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
8cd0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
8ce0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
8cf0: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20   *pList,     /* 
8d00: 46 6f 72 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f  Form the KeyInfo
8d10: 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74 68 69   object from thi
8d20: 73 20 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20  s ExprList */.  
8d30: 69 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20  int iStart,     
8d40: 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 77 69       /* Begin wi
8d50: 74 68 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f  th this column o
8d60: 66 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  f pList */.  int
8d70: 20 6e 45 78 74 72 61 20 20 20 20 20 20 20 20 20   nExtra         
8d80: 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61    /* Add this ma
8d90: 6e 79 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73  ny extra columns
8da0: 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29   to the end */.)
8db0: 7b 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20  {.  int nExpr;. 
8dc0: 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b   KeyInfo *pInfo;
8dd0: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
8de0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
8df0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8e00: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
8e10: 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20  t i;..  nExpr = 
8e20: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
8e30: 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  pInfo = sqlite3K
8e40: 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20  eyInfoAlloc(db, 
8e50: 6e 45 78 70 72 2b 6e 45 78 74 72 61 2d 69 53 74  nExpr+nExtra-iSt
8e60: 61 72 74 2c 20 31 29 3b 0a 20 20 69 66 28 20 70  art, 1);.  if( p
8e70: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 61 73 73 65  Info ){.    asse
8e80: 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
8e90: 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 49  foIsWriteable(pI
8ea0: 6e 66 6f 29 20 29 3b 0a 20 20 20 20 66 6f 72 28  nfo) );.    for(
8eb0: 69 3d 69 53 74 61 72 74 2c 20 70 49 74 65 6d 3d  i=iStart, pItem=
8ec0: 70 4c 69 73 74 2d 3e 61 2b 69 53 74 61 72 74 3b  pList->a+iStart;
8ed0: 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70   i<nExpr; i++, p
8ee0: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 43  Item++){.      C
8ef0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
8f00: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
8f10: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
8f20: 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
8f30: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Expr);.      if(
8f40: 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
8f50: 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
8f60: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43  .      pInfo->aC
8f70: 6f 6c 6c 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20  oll[i-iStart] = 
8f80: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e  pColl;.      pIn
8f90: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  fo->aSortOrder[i
8fa0: 2d 69 53 74 61 72 74 5d 20 3d 20 70 49 74 65 6d  -iStart] = pItem
8fb0: 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ->sortOrder;.   
8fc0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
8fd0: 70 49 6e 66 6f 3b 0a 7d 0a 0a 23 69 66 6e 64 65  pInfo;.}..#ifnde
8fe0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
8ff0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a  MPOUND_SELECT./*
9000: 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20  .** Name of the 
9010: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61  connection opera
9020: 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72  tor, used for er
9030: 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f  ror messages..*/
9040: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
9050: 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65  ar *selectOpName
9060: 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72  (int id){.  char
9070: 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69   *z;.  switch( i
9080: 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  d ){.    case TK
9090: 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20  _ALL:       z = 
90a0: 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62  "UNION ALL";   b
90b0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
90c0: 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d  K_INTERSECT: z =
90d0: 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20   "INTERSECT";   
90e0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
90f0: 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20  TK_EXCEPT:    z 
9100: 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20 20 20  = "EXCEPT";     
9110: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
9120: 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a  ult:           z
9130: 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20   = "UNION";     
9140: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72    break;.  }.  r
9150: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69  eturn z;.}.#endi
9160: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
9170: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
9180: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
9190: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
91a0: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e  ./*.** Unless an
91b0: 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20   "EXPLAIN QUERY 
91c0: 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73  PLAN" command is
91d0: 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64   being processed
91e0: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
91f0: 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f  ** is a no-op. O
9200: 74 68 65 72 77 69 73 65 2c 20 69 74 20 61 64 64  therwise, it add
9210: 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  s a single row o
9220: 66 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20  f output to the 
9230: 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77  EQP result,.** w
9240: 68 65 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e  here the caption
9250: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
9260: 0a 2a 2a 0a 2a 2a 20 20 20 22 55 53 45 20 54 45  .**.**   "USE TE
9270: 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 78 78  MP B-TREE FOR xx
9280: 78 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 78  x".**.** where x
9290: 78 78 20 69 73 20 6f 6e 65 20 6f 66 20 22 44 49  xx is one of "DI
92a0: 53 54 49 4e 43 54 22 2c 20 22 4f 52 44 45 52 20  STINCT", "ORDER 
92b0: 42 59 22 20 6f 72 20 22 47 52 4f 55 50 20 42 59  BY" or "GROUP BY
92c0: 22 2e 20 45 78 61 63 74 6c 79 20 77 68 69 63 68  ". Exactly which
92d0: 0a 2a 2a 20 69 73 20 64 65 74 65 72 6d 69 6e 65  .** is determine
92e0: 64 20 62 79 20 74 68 65 20 7a 55 73 61 67 65 20  d by the zUsage 
92f0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
9300: 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
9310: 54 65 6d 70 54 61 62 6c 65 28 50 61 72 73 65 20  TempTable(Parse 
9320: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
9330: 68 61 72 20 2a 7a 55 73 61 67 65 29 7b 0a 20 20  har *zUsage){.  
9340: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
9350: 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64  ain==2 ){.    Vd
9360: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
9370: 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20  pVdbe;.    char 
9380: 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d  *zMsg = sqlite3M
9390: 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64  Printf(pParse->d
93a0: 62 2c 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54  b, "USE TEMP B-T
93b0: 52 45 45 20 46 4f 52 20 25 73 22 2c 20 7a 55 73  REE FOR %s", zUs
93c0: 61 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  age);.    sqlite
93d0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
93e0: 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73  P_Explain, pPars
93f0: 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c  e->iSelectId, 0,
9400: 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e   0, zMsg, P4_DYN
9410: 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  AMIC);.  }.}../*
9420: 0a 2a 2a 20 41 73 73 69 67 6e 20 65 78 70 72 65  .** Assign expre
9430: 73 73 69 6f 6e 20 62 20 74 6f 20 6c 76 61 6c 75  ssion b to lvalu
9440: 65 20 61 2e 20 41 20 73 65 63 6f 6e 64 2c 20 6e  e a. A second, n
9450: 6f 2d 6f 70 2c 20 76 65 72 73 69 6f 6e 20 6f 66  o-op, version of
9460: 20 74 68 69 73 20 6d 61 63 72 6f 0a 2a 2a 20 69   this macro.** i
9470: 73 20 70 72 6f 76 69 64 65 64 20 77 68 65 6e 20  s provided when 
9480: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
9490: 41 49 4e 20 69 73 20 64 65 66 69 6e 65 64 2e 20  AIN is defined. 
94a0: 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20  This allows the 
94b0: 63 6f 64 65 0a 2a 2a 20 69 6e 20 73 71 6c 69 74  code.** in sqlit
94c0: 65 33 53 65 6c 65 63 74 28 29 20 74 6f 20 61 73  e3Select() to as
94d0: 73 69 67 6e 20 76 61 6c 75 65 73 20 74 6f 20 73  sign values to s
94e0: 74 72 75 63 74 75 72 65 20 6d 65 6d 62 65 72 20  tructure member 
94f0: 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 0a 2a  variables that.*
9500: 2a 20 6f 6e 6c 79 20 65 78 69 73 74 20 69 66 20  * only exist if 
9510: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
9520: 41 49 4e 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  AIN is not defin
9530: 65 64 20 77 69 74 68 6f 75 74 20 70 6f 6c 6c 75  ed without pollu
9540: 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 64 65  ting the.** code
9550: 20 77 69 74 68 20 23 69 66 6e 64 65 66 20 64 69   with #ifndef di
9560: 72 65 63 74 69 76 65 73 2e 0a 2a 2f 0a 23 20 64  rectives..*/.# d
9570: 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74  efine explainSet
9580: 49 6e 74 65 67 65 72 28 61 2c 20 62 29 20 61 20  Integer(a, b) a 
9590: 3d 20 62 0a 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f  = b..#else./* No
95a0: 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  -op versions of 
95b0: 74 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28 29  the explainXXX()
95c0: 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d   functions and m
95d0: 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69  acros. */.# defi
95e0: 6e 65 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61  ne explainTempTa
95f0: 62 6c 65 28 79 2c 7a 29 0a 23 20 64 65 66 69 6e  ble(y,z).# defin
9600: 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65  e explainSetInte
9610: 67 65 72 28 79 2c 7a 29 0a 23 65 6e 64 69 66 0a  ger(y,z).#endif.
9620: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
9630: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
9640: 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  N) && !defined(S
9650: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
9660: 55 4e 44 5f 53 45 4c 45 43 54 29 0a 2f 2a 0a 2a  UND_SELECT)./*.*
9670: 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50  * Unless an "EXP
9680: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22  LAIN QUERY PLAN"
9690: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e   command is bein
96a0: 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69  g processed, thi
96b0: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  s function.** is
96c0: 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77   a no-op. Otherw
96d0: 69 73 65 2c 20 69 74 20 61 64 64 73 20 61 20 73  ise, it adds a s
96e0: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74  ingle row of out
96f0: 70 75 74 20 74 6f 20 74 68 65 20 45 51 50 20 72  put to the EQP r
9700: 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20  esult,.** where 
9710: 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f  the caption is o
9720: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f  f one of the two
9730: 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   forms:.**.**   
9740: 22 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55  "COMPOSITE SUBQU
9750: 45 52 49 45 53 20 69 53 75 62 31 20 61 6e 64 20  ERIES iSub1 and 
9760: 69 53 75 62 32 20 28 6f 70 29 22 0a 2a 2a 20 20  iSub2 (op)".**  
9770: 20 22 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51   "COMPOSITE SUBQ
9780: 55 45 52 49 45 53 20 69 53 75 62 31 20 61 6e 64  UERIES iSub1 and
9790: 20 69 53 75 62 32 20 55 53 49 4e 47 20 54 45 4d   iSub2 USING TEM
97a0: 50 20 42 2d 54 52 45 45 20 28 6f 70 29 22 0a 2a  P B-TREE (op)".*
97b0: 2a 0a 2a 2a 20 77 68 65 72 65 20 69 53 75 62 31  *.** where iSub1
97c0: 20 61 6e 64 20 69 53 75 62 32 20 61 72 65 20 74   and iSub2 are t
97d0: 68 65 20 69 6e 74 65 67 65 72 73 20 70 61 73 73  he integers pass
97e0: 65 64 20 61 73 20 74 68 65 20 63 6f 72 72 65 73  ed as the corres
97f0: 70 6f 6e 64 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  ponding.** funct
9800: 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 73 2c 20  ion parameters, 
9810: 61 6e 64 20 6f 70 20 69 73 20 74 68 65 20 74 65  and op is the te
9820: 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  xt representatio
9830: 6e 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74  n of the paramet
9840: 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d  er.** of the sam
9850: 65 20 6e 61 6d 65 2e 20 54 68 65 20 70 61 72 61  e name. The para
9860: 6d 65 74 65 72 20 22 6f 70 22 20 6d 75 73 74 20  meter "op" must 
9870: 62 65 20 6f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49  be one of TK_UNI
9880: 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 0a 2a  ON, TK_EXCEPT,.*
9890: 2a 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 6f  * TK_INTERSECT o
98a0: 72 20 54 4b 5f 41 4c 4c 2e 20 54 68 65 20 66 69  r TK_ALL. The fi
98b0: 72 73 74 20 66 6f 72 6d 20 69 73 20 75 73 65 64  rst form is used
98c0: 20 69 66 20 61 72 67 75 6d 65 6e 74 20 62 55 73   if argument bUs
98d0: 65 54 6d 70 20 69 73 20 0a 2a 2a 20 66 61 6c 73  eTmp is .** fals
98e0: 65 2c 20 6f 72 20 74 68 65 20 73 65 63 6f 6e 64  e, or the second
98f0: 20 66 6f 72 6d 20 69 66 20 69 74 20 69 73 20 74   form if it is t
9900: 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rue..*/.static v
9910: 6f 69 64 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f  oid explainCompo
9920: 73 69 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70  site(.  Parse *p
9930: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
9940: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
9950: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
9960: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
9970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9980: 20 4f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e   One of TK_UNION
9990: 2c 20 54 4b 5f 45 58 43 45 50 54 20 65 74 63 2e  , TK_EXCEPT etc.
99a0: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 31 2c   */.  int iSub1,
99b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99c0: 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72        /* Subquer
99d0: 79 20 69 64 20 31 20 2a 2f 0a 20 20 69 6e 74 20  y id 1 */.  int 
99e0: 69 53 75 62 32 2c 20 20 20 20 20 20 20 20 20 20  iSub2,          
99f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
9a00: 75 62 71 75 65 72 79 20 69 64 20 32 20 2a 2f 0a  ubquery id 2 */.
9a10: 20 20 69 6e 74 20 62 55 73 65 54 6d 70 20 20 20    int bUseTmp   
9a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a30: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 74    /* True if a t
9a40: 65 6d 70 20 74 61 62 6c 65 20 77 61 73 20 75 73  emp table was us
9a50: 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  ed */.){.  asser
9a60: 74 28 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  t( op==TK_UNION 
9a70: 7c 7c 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  || op==TK_EXCEPT
9a80: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52   || op==TK_INTER
9a90: 53 45 43 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 41  SECT || op==TK_A
9aa0: 4c 4c 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72  LL );.  if( pPar
9ab0: 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
9ac0: 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  {.    Vdbe *v = 
9ad0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
9ae0: 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20     char *zMsg = 
9af0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 0a  sqlite3MPrintf(.
9b00: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
9b10: 64 62 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 53 55  db, "COMPOUND SU
9b20: 42 51 55 45 52 49 45 53 20 25 64 20 41 4e 44 20  BQUERIES %d AND 
9b30: 25 64 20 25 73 28 25 73 29 22 2c 20 69 53 75 62  %d %s(%s)", iSub
9b40: 31 2c 20 69 53 75 62 32 2c 0a 20 20 20 20 20 20  1, iSub2,.      
9b50: 20 20 62 55 73 65 54 6d 70 3f 22 55 53 49 4e 47    bUseTmp?"USING
9b60: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 22 3a 22   TEMP B-TREE ":"
9b70: 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  ", selectOpName(
9b80: 6f 70 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  op).    );.    s
9b90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
9ba0: 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
9bb0: 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
9bc0: 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50  d, 0, 0, zMsg, P
9bd0: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
9be0: 7d 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70  }.#else./* No-op
9bf0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
9c00: 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75   explainXXX() fu
9c10: 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72  nctions and macr
9c20: 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  os. */.# define 
9c30: 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65  explainComposite
9c40: 28 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64  (v,w,x,y,z).#end
9c50: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
9c60: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20   inner loop was 
9c70: 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20  generated using 
9c80: 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65  a non-null pOrde
9c90: 72 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  rBy argument,.**
9ca0: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
9cb0: 73 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e  s were placed in
9cc0: 20 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65   a sorter.  Afte
9cd0: 72 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65  r the loop is te
9ce0: 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e  rminated.** we n
9cf0: 65 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73  eed to run the s
9d00: 6f 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74  orter and output
9d10: 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54   the results.  T
9d20: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
9d30: 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
9d40: 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65  s the code neede
9d50: 64 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f  d to do that..*/
9d60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
9d70: 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20  erateSortTail(. 
9d80: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9d90: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
9da0: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
9db0: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  t *p,        /* 
9dc0: 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
9dd0: 6d 65 6e 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74  ment */.  SortCt
9de0: 78 20 2a 70 53 6f 72 74 2c 20 20 20 2f 2a 20 49  x *pSort,   /* I
9df0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 74 68  nformation on th
9e00: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
9e10: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  e */.  int nColu
9e20: 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  mn,      /* Numb
9e30: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66  er of columns of
9e40: 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63   data */.  Selec
9e50: 74 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20  tDest *pDest /* 
9e60: 57 72 69 74 65 20 74 68 65 20 73 6f 72 74 65 64  Write the sorted
9e70: 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
9e80: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
9e90: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
9ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9eb0: 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72     /* The prepar
9ec0: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ed statement */.
9ed0: 20 20 69 6e 74 20 61 64 64 72 42 72 65 61 6b 20    int addrBreak 
9ee0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
9ef0: 65 4c 61 62 65 6c 28 76 29 3b 20 20 20 20 20 2f  eLabel(v);     /
9f00: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 65  * Jump here to e
9f10: 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  xit loop */.  in
9f20: 74 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d  t addrContinue =
9f30: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
9f40: 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 4a 75  Label(v);  /* Ju
9f50: 6d 70 20 68 65 72 65 20 66 6f 72 20 6e 65 78 74  mp here for next
9f60: 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   cycle */.  int 
9f70: 61 64 64 72 3b 0a 20 20 69 6e 74 20 61 64 64 72  addr;.  int addr
9f80: 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Once = 0;.  int 
9f90: 69 54 61 62 3b 0a 20 20 45 78 70 72 4c 69 73 74  iTab;.  ExprList
9fa0: 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53 6f   *pOrderBy = pSo
9fb0: 72 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  rt->pOrderBy;.  
9fc0: 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73  int eDest = pDes
9fd0: 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74 20  t->eDest;.  int 
9fe0: 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69  iParm = pDest->i
9ff0: 53 44 50 61 72 6d 3b 0a 20 20 69 6e 74 20 72 65  SDParm;.  int re
a000: 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52  gRow;.  int regR
a010: 6f 77 69 64 3b 0a 20 20 69 6e 74 20 6e 4b 65 79  owid;.  int nKey
a020: 3b 0a 20 20 69 6e 74 20 69 53 6f 72 74 54 61 62  ;.  int iSortTab
a030: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a040: 20 20 20 20 2f 2a 20 53 6f 72 74 65 72 20 63 75      /* Sorter cu
a050: 72 73 6f 72 20 74 6f 20 72 65 61 64 20 66 72 6f  rsor to read fro
a060: 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6f 72 74  m */.  int nSort
a070: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
a080: 20 20 20 20 20 20 20 2f 2a 20 54 72 61 69 6c 69         /* Traili
a090: 6e 67 20 76 61 6c 75 65 73 20 74 6f 20 72 65 61  ng values to rea
a0a0: 64 20 66 72 6f 6d 20 73 6f 72 74 65 72 20 2a 2f  d from sorter */
a0b0: 0a 20 20 75 38 20 70 35 3b 20 20 20 20 20 20 20  .  u8 p5;       
a0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0d0: 20 20 20 2f 2a 20 70 35 20 70 61 72 61 6d 65 74     /* p5 paramet
a0e0: 65 72 20 66 6f 72 20 31 73 74 20 4f 50 5f 43 6f  er for 1st OP_Co
a0f0: 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  lumn */.  int i;
a100: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
a110: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
a120: 4d 4d 45 4e 54 53 0a 20 20 73 74 72 75 63 74 20  MMENTS.  struct 
a130: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
a140: 4f 75 74 45 78 20 3d 20 70 2d 3e 70 45 4c 69 73  OutEx = p->pELis
a150: 74 2d 3e 61 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  t->a;.#endif..  
a160: 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  if( pSort->label
a170: 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c  BkOut ){.    sql
a180: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a190: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72  , OP_Gosub, pSor
a1a0: 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53  t->regReturn, pS
a1b0: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29  ort->labelBkOut)
a1c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a1d0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
a1e0: 74 6f 2c 20 30 2c 20 61 64 64 72 42 72 65 61 6b  to, 0, addrBreak
a1f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a200: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
a210: 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  , pSort->labelBk
a220: 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 54 61 62  Out);.  }.  iTab
a230: 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73   = pSort->iECurs
a240: 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d  or;.  if( eDest=
a250: 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65  =SRT_Output || e
a260: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
a270: 69 6e 65 20 29 7b 0a 20 20 20 20 72 65 67 52 6f  ine ){.    regRo
a280: 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 67  wid = 0;.    reg
a290: 52 6f 77 20 3d 20 70 44 65 73 74 2d 3e 69 53 64  Row = pDest->iSd
a2a0: 73 74 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61 74  st;.    nSortDat
a2b0: 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d  a = nColumn;.  }
a2c0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77  else{.    regRow
a2d0: 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  id = sqlite3GetT
a2e0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
a2f0: 20 20 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c      regRow = sql
a300: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
a310: 50 61 72 73 65 29 3b 0a 20 20 20 20 6e 53 6f 72  Parse);.    nSor
a320: 74 44 61 74 61 20 3d 20 31 3b 0a 20 20 7d 0a 20  tData = 1;.  }. 
a330: 20 6e 4b 65 79 20 3d 20 70 4f 72 64 65 72 42 79   nKey = pOrderBy
a340: 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d  ->nExpr - pSort-
a350: 3e 6e 4f 42 53 61 74 3b 0a 20 20 69 66 28 20 70  >nOBSat;.  if( p
a360: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
a370: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
a380: 72 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  rter ){.    int 
a390: 72 65 67 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70  regSortOut = ++p
a3a0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
a3b0: 20 69 53 6f 72 74 54 61 62 20 3d 20 70 50 61 72   iSortTab = pPar
a3c0: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
a3d0: 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  if( pSort->label
a3e0: 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 61  BkOut ){.      a
a3f0: 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65  ddrOnce = sqlite
a400: 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65  3CodeOnce(pParse
a410: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
a420: 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  v);.    }.    sq
a430: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
a440: 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
a450: 2c 20 69 53 6f 72 74 54 61 62 2c 20 72 65 67 53  , iSortTab, regS
a460: 6f 72 74 4f 75 74 2c 20 6e 4b 65 79 2b 31 2b 6e  ortOut, nKey+1+n
a470: 53 6f 72 74 44 61 74 61 29 3b 0a 20 20 20 20 69  SortData);.    i
a480: 66 28 20 61 64 64 72 4f 6e 63 65 20 29 20 73 71  f( addrOnce ) sq
a490: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
a4a0: 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a  e(v, addrOnce);.
a4b0: 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73      addr = 1 + s
a4c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a4d0: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72  (v, OP_SorterSor
a4e0: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65  t, iTab, addrBre
a4f0: 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ak);.    VdbeCov
a500: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f  erage(v);.    co
a510: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69  deOffset(v, p->i
a520: 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74  Offset, addrCont
a530: 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  inue);.    sqlit
a540: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a550: 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69  OP_SorterData, i
a560: 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 29  Tab, regSortOut)
a570: 3b 0a 20 20 20 20 70 35 20 3d 20 4f 50 46 4c 41  ;.    p5 = OPFLA
a580: 47 5f 43 4c 45 41 52 43 41 43 48 45 3b 0a 20 20  G_CLEARCACHE;.  
a590: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 20  }else{.    addr 
a5a0: 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  = 1 + sqlite3Vdb
a5b0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
a5c0: 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72  rt, iTab, addrBr
a5d0: 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
a5e0: 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f  ge(v);.    codeO
a5f0: 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
a600: 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  set, addrContinu
a610: 65 29 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62  e);.    iSortTab
a620: 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 35 20   = iTab;.    p5 
a630: 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  = 0;.  }.  for(i
a640: 3d 30 3b 20 69 3c 6e 53 6f 72 74 44 61 74 61 3b  =0; i<nSortData;
a650: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
a660: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
a670: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74  OP_Column, iSort
a680: 54 61 62 2c 20 6e 4b 65 79 2b 31 2b 69 2c 20 72  Tab, nKey+1+i, r
a690: 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20 69 66  egRow+i);.    if
a6a0: 28 20 69 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  ( i==0 ) sqlite3
a6b0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
a6c0: 70 35 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  p5);.    VdbeCom
a6d0: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 61  ment((v, "%s", a
a6e0: 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3f  OutEx[i].zName ?
a6f0: 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65   aOutEx[i].zName
a700: 20 3a 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 53 70   : aOutEx[i].zSp
a710: 61 6e 29 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74  an));.  }.  swit
a720: 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20  ch( eDest ){.   
a730: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
a740: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
a750: 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
a760: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
a770: 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20  =SRT_Table );.  
a780: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
a790: 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
a7a0: 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  b );.      sqlit
a7b0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a7c0: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61  OP_NewRowid, iPa
a7d0: 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  rm, regRowid);. 
a7e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a7f0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
a800: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ert, iParm, regR
a810: 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  ow, regRowid);. 
a820: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a830: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
a840: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
a850: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
a860: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a870: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
a880: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
a890: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
a8a0: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
a8b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a8c0: 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
a8d0: 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 31 2c  cord, regRow, 1,
a8e0: 20 72 65 67 52 6f 77 69 64 2c 0a 20 20 20 20 20   regRowid,.     
a8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a900: 20 20 20 26 70 44 65 73 74 2d 3e 61 66 66 53 64     &pDest->affSd
a910: 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  st, 1);.      sq
a920: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
a930: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
a940: 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 31 29 3b  rse, regRow, 1);
a950: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a960: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
a970: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
a980: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
a990: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
a9a0: 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
a9b0: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
a9c0: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
a9d0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
a9e0: 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
a9f0: 20 72 65 67 52 6f 77 2c 20 69 50 61 72 6d 2c 20   regRow, iParm, 
aa00: 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  1);.      /* The
aa10: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
aa20: 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  ll terminate the
aa30: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
aa40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
aa50: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
aa60: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
aa70: 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52  ssert( eDest==SR
aa80: 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73  T_Output || eDes
aa90: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
aaa0: 20 29 3b 20 0a 20 20 20 20 20 20 74 65 73 74 63   ); .      testc
aab0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
aac0: 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
aad0: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
aae0: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
aaf0: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  ;.      if( eDes
ab00: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
ab10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ab20: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
ab30: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 44 65 73  _ResultRow, pDes
ab40: 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d  t->iSdst, nColum
ab50: 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  n);.        sqli
ab60: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
ab70: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
ab80: 65 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c  e, pDest->iSdst,
ab90: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
aba0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
abb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
abc0: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
abd0: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
abe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
abf0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
ac00: 20 69 66 28 20 72 65 67 52 6f 77 69 64 20 29 7b   if( regRowid ){
ac10: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
ac20: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
ac30: 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20  e, regRow);.    
ac40: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
ac50: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
ac60: 67 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20 2f  gRowid);.  }.  /
ac70: 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20  * The bottom of 
ac80: 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20  the loop.  */.  
ac90: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
aca0: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43  veLabel(v, addrC
acb0: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28 20  ontinue);.  if( 
acc0: 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73  pSort->sortFlags
acd0: 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53   & SORTFLAG_UseS
ace0: 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  orter ){.    sql
acf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
ad00: 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c  , OP_SorterNext,
ad10: 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64   iTab, addr); Vd
ad20: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
ad30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
ad40: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ad50: 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20   OP_Next, iTab, 
ad60: 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72  addr); VdbeCover
ad70: 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66  age(v);.  }.  if
ad80: 28 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75  ( pSort->regRetu
ad90: 72 6e 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  rn ) sqlite3Vdbe
ada0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
adb0: 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52  urn, pSort->regR
adc0: 65 74 75 72 6e 29 3b 0a 20 20 73 71 6c 69 74 65  eturn);.  sqlite
add0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
ade0: 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  l(v, addrBreak);
adf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
ae00: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
ae10: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
ae20: 67 20 74 68 65 20 27 64 65 63 6c 61 72 61 74 69  g the 'declarati
ae30: 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a  on type' of the.
ae40: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  ** expression pE
ae50: 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20  xpr. The string 
ae60: 6d 61 79 20 62 65 20 74 72 65 61 74 65 64 20 61  may be treated a
ae70: 73 20 73 74 61 74 69 63 20 62 79 20 74 68 65 20  s static by the 
ae80: 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c  caller..**.** Al
ae90: 73 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61  so try to estima
aea0: 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  te the size of t
aeb0: 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
aec0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61  e and return tha
aed0: 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 2a  t.** result in *
aee0: 70 45 73 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a 2a  pEstWidth..**.**
aef0: 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   The declaration
af00: 20 74 79 70 65 20 69 73 20 74 68 65 20 65 78 61   type is the exa
af10: 63 74 20 64 61 74 61 74 79 70 65 20 64 65 66 69  ct datatype defi
af20: 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64  nition extracted
af30: 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69   from the.** ori
af40: 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42  ginal CREATE TAB
af50: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20  LE statement if 
af60: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
af70: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a  s a column. The.
af80: 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  ** declaration t
af90: 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20  ype for a ROWID 
afa0: 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52  field is INTEGER
afb0: 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20 61  . Exactly when a
afc0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  n expression.** 
afd0: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
afe0: 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f  column can be co
aff0: 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72 65  mplex in the pre
b000: 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65 72  sence of subquer
b010: 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75  ies. The.** resu
b020: 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt-set expressio
b030: 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20  n in all of the 
b040: 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54  following SELECT
b050: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20 0a   statements is .
b060: 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  ** considered a 
b070: 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20 66  column by this f
b080: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  unction..**.**  
b090: 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d   SELECT col FROM
b0a0: 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43   tbl;.**   SELEC
b0b0: 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52  T (SELECT col FR
b0c0: 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c  OM tbl;.**   SEL
b0d0: 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20  ECT (SELECT col 
b0e0: 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20  FROM tbl);.**   
b0f0: 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d 20  SELECT abc FROM 
b100: 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20 61  (SELECT col AS a
b110: 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a  bc FROM tbl);.**
b120: 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61   .** The declara
b130: 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e  tion type for an
b140: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74 68  y expression oth
b150: 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e  er than a column
b160: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   is NULL..**.** 
b170: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
b180: 20 65 69 74 68 65 72 20 33 20 6f 72 20 36 20 70   either 3 or 6 p
b190: 61 72 61 6d 65 74 65 72 73 20 64 65 70 65 6e 64  arameters depend
b1a0: 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
b1b0: 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 53 51 4c  r not.** the SQL
b1c0: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
b1d0: 4e 5f 4d 45 54 41 44 41 54 41 20 63 6f 6d 70 69  N_METADATA compi
b1e0: 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69  le-time option i
b1f0: 73 20 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65  s used..*/.#ifde
b200: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
b210: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
b220: 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54  # define columnT
b230: 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29  ype(A,B,C,D,E,F)
b240: 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28   columnTypeImpl(
b250: 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 0a 73 74 61  A,B,C,D,E,F).sta
b260: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
b270: 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a  columnTypeImpl(.
b280: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
b290: 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78  NC, .  Expr *pEx
b2a0: 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  pr,.  const char
b2b0: 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20 20 63   **pzOrigDb,.  c
b2c0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72  onst char **pzOr
b2d0: 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63  igTab,.  const c
b2e0: 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c 2c  har **pzOrigCol,
b2f0: 0a 20 20 75 38 20 2a 70 45 73 74 57 69 64 74 68  .  u8 *pEstWidth
b300: 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74  .){.  char const
b310: 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20   *zOrigDb = 0;. 
b320: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72   char const *zOr
b330: 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 63 68 61  igTab = 0;.  cha
b340: 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 43 6f  r const *zOrigCo
b350: 6c 20 3d 20 30 3b 0a 23 65 6c 73 65 20 2f 2a 20  l = 0;.#else /* 
b360: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
b370: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
b380: 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a 23 20  _METADATA) */.# 
b390: 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70  define columnTyp
b3a0: 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20 63  e(A,B,C,D,E,F) c
b3b0: 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c  olumnTypeImpl(A,
b3c0: 42 2c 46 29 0a 73 74 61 74 69 63 20 63 6f 6e 73  B,F).static cons
b3d0: 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79  t char *columnTy
b3e0: 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d 65 43 6f  peImpl(.  NameCo
b3f0: 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45  ntext *pNC, .  E
b400: 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 75 38  xpr *pExpr,.  u8
b410: 20 2a 70 45 73 74 57 69 64 74 68 0a 29 7b 0a 23   *pEstWidth.){.#
b420: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
b430: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
b440: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 29  COLUMN_METADATA)
b450: 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   */.  char const
b460: 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69   *zType = 0;.  i
b470: 6e 74 20 6a 3b 0a 20 20 75 38 20 65 73 74 57 69  nt j;.  u8 estWi
b480: 64 74 68 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20  dth = 1;..  if( 
b490: 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20  NEVER(pExpr==0) 
b4a0: 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74  || pNC->pSrcList
b4b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
b4c0: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
b4d0: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
b4e0: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20  TK_AGG_COLUMN:. 
b4f0: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
b500: 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  N: {.      /* Th
b510: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
b520: 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65  a column. Locate
b530: 20 74 68 65 20 74 61 62 6c 65 20 74 68 65 20 63   the table the c
b540: 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20  olumn is being. 
b550: 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65       ** extracte
b560: 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f  d from in NameCo
b570: 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20  ntext.pSrcList. 
b580: 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62  This table may b
b590: 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20  e real.      ** 
b5a0: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f  database table o
b5b0: 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20  r a subquery..  
b5c0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62      */.      Tab
b5d0: 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20  le *pTab = 0;   
b5e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
b5f0: 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75  e structure colu
b600: 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20  mn is extracted 
b610: 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65  from */.      Se
b620: 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20  lect *pS = 0;   
b630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c            /* Sel
b640: 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  ect the column i
b650: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
b660: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43   */.      int iC
b670: 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ol = pExpr->iCol
b680: 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f  umn;  /* Index o
b690: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62  f column in pTab
b6a0: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
b6b0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
b6c0: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
b6d0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
b6e0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
b6f0: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 77 68  LUMN );.      wh
b700: 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54 61  ile( pNC && !pTa
b710: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63  b ){.        Src
b720: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d  List *pTabList =
b730: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a   pNC->pSrcList;.
b740: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
b750: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
b760: 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b   && pTabList->a[
b770: 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70  j].iCursor!=pExp
b780: 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a  r->iTable;j++);.
b790: 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54          if( j<pT
b7a0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a  abList->nSrc ){.
b7b0: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 20 3d            pTab =
b7c0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
b7d0: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
b7e0: 70 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  pS = pTabList->a
b7f0: 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  [j].pSelect;.   
b800: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b810: 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d        pNC = pNC-
b820: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
b830: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
b840: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
b850: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e          /* At on
b860: 65 20 74 69 6d 65 2c 20 63 6f 64 65 20 73 75 63  e time, code suc
b870: 68 20 61 73 20 22 53 45 4c 45 43 54 20 6e 65 77  h as "SELECT new
b880: 2e 78 22 20 77 69 74 68 69 6e 20 61 20 74 72 69  .x" within a tri
b890: 67 67 65 72 20 77 6f 75 6c 64 0a 20 20 20 20 20  gger would.     
b8a0: 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68 69 73     ** cause this
b8b0: 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75   condition to ru
b8c0: 6e 2e 20 20 53 69 6e 63 65 20 74 68 65 6e 2c 20  n.  Since then, 
b8d0: 77 65 20 68 61 76 65 20 72 65 73 74 72 75 63 74  we have restruct
b8e0: 75 72 65 64 20 68 6f 77 0a 20 20 20 20 20 20 20  ured how.       
b8f0: 20 2a 2a 20 74 72 69 67 67 65 72 20 63 6f 64 65   ** trigger code
b900: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e   is generated an
b910: 64 20 73 6f 20 74 68 69 73 20 63 6f 6e 64 69 74  d so this condit
b920: 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  ion is no longer
b930: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73   .        ** pos
b940: 73 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20  sible. However, 
b950: 69 74 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20  it can still be 
b960: 74 72 75 65 20 66 6f 72 20 73 74 61 74 65 6d 65  true for stateme
b970: 6e 74 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20  nts like.       
b980: 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** the followin
b990: 67 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  g:.        **.  
b9a0: 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54        **   CREAT
b9b0: 45 20 54 41 42 4c 45 20 74 31 28 63 6f 6c 20 49  E TABLE t1(col I
b9c0: 4e 54 45 47 45 52 29 3b 0a 20 20 20 20 20 20 20  NTEGER);.       
b9d0: 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45   **   SELECT (SE
b9e0: 4c 45 43 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f  LECT t1.col) FRO
b9f0: 4d 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20  M FROM t1;.     
ba00: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
ba10: 20 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65   when columnType
ba20: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
ba30: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22  the expression "
ba40: 74 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a  t1.col" in the .
ba50: 20 20 20 20 20 20 20 20 2a 2a 20 73 75 62 2d 73          ** sub-s
ba60: 65 6c 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63  elect. In this c
ba70: 61 73 65 2c 20 73 65 74 20 74 68 65 20 63 6f 6c  ase, set the col
ba80: 75 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c  umn type to NULL
ba90: 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 20 20 2a  , even.        *
baa0: 2a 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75  * though it shou
bab0: 6c 64 20 72 65 61 6c 6c 79 20 62 65 20 22 49 4e  ld really be "IN
bac0: 54 45 47 45 52 22 2e 0a 20 20 20 20 20 20 20 20  TEGER"..        
bad0: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
bae0: 69 73 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62  is is not a prob
baf0: 6c 65 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c 75  lem, as the colu
bb00: 6d 6e 20 74 79 70 65 20 6f 66 20 22 74 31 2e 63  mn type of "t1.c
bb10: 6f 6c 22 20 69 73 20 6e 65 76 65 72 0a 20 20 20  ol" is never.   
bb20: 20 20 20 20 20 2a 2a 20 75 73 65 64 2e 20 57 68       ** used. Wh
bb30: 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20  en columnType() 
bb40: 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  is called on the
bb50: 20 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 20   expression .   
bb60: 20 20 20 20 20 2a 2a 20 22 28 53 45 4c 45 43 54       ** "(SELECT
bb70: 20 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63   t1.col)", the c
bb80: 6f 72 72 65 63 74 20 74 79 70 65 20 69 73 20 72  orrect type is r
bb90: 65 74 75 72 6e 65 64 20 28 73 65 65 20 74 68 65  eturned (see the
bba0: 20 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 20   TK_SELECT.     
bbb0: 20 20 20 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c     ** branch bel
bbc0: 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ow.  */.        
bbd0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
bbe0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
bbf0: 61 62 20 26 26 20 70 45 78 70 72 2d 3e 70 54 61  ab && pExpr->pTa
bc00: 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20  b==pTab );.     
bc10: 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20 20   if( pS ){.     
bc20: 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c 65     /* The "table
bc30: 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  " is actually a 
bc40: 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61 20  sub-select or a 
bc50: 76 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f 4d  view in the FROM
bc60: 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20   clause.        
bc70: 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ** of the SELECT
bc80: 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74 75   statement. Retu
bc90: 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  rn the declarati
bca0: 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69 67  on type and orig
bcb0: 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  in.        ** da
bcc0: 74 61 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ta for the resul
bcd0: 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  t-set column of 
bce0: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a  the sub-select..
bcf0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
bd00: 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26     if( iCol>=0 &
bd10: 26 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70 53  & ALWAYS(iCol<pS
bd20: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
bd30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
bd40: 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73   If iCol is less
bd50: 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
bd60: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
bd70: 72 65 71 75 65 73 74 73 20 74 68 65 0a 20 20 20  requests the.   
bd80: 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20         ** rowid 
bd90: 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  of the sub-selec
bda0: 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20  t or view. This 
bdb0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65  expression is le
bdc0: 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20  gal (see .      
bdd0: 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65      ** test case
bde0: 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74   misc2.2.2) - it
bdf0: 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65   always evaluate
be00: 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20  s to NULL..     
be10: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
be20: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
be30: 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  C;.          Exp
be40: 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73  r *p = pS->pELis
be50: 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72  t->a[iCol].pExpr
be60: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
be70: 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70  pSrcList = pS->p
be80: 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73  Src;.          s
be90: 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a  NC.pNext = pNC;.
bea0: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50            sNC.pP
beb0: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
bec0: 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  se;.          zT
bed0: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
bee0: 28 26 73 4e 43 2c 20 70 2c 26 7a 4f 72 69 67 44  (&sNC, p,&zOrigD
bef0: 62 2c 26 7a 4f 72 69 67 54 61 62 2c 26 7a 4f 72  b,&zOrigTab,&zOr
bf00: 69 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68  igCol, &estWidth
bf10: 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ); .        }.  
bf20: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
bf30: 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  ab->pSchema ){. 
bf40: 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c         /* A real
bf50: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
bf60: 20 20 61 73 73 65 72 74 28 20 21 70 53 20 29 3b    assert( !pS );
bf70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
bf80: 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61  l<0 ) iCol = pTa
bf90: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
bfa0: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
bfb0: 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26  -1 || (iCol>=0 &
bfc0: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
bfd0: 6c 29 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  l) );.#ifdef SQL
bfe0: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
bff0: 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20  N_METADATA.     
c000: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
c010: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
c020: 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
c030: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c          zOrigCol
c040: 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20   = "rowid";.    
c050: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c060: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61       zType = pTa
c070: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54  b->aCol[iCol].zT
c080: 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ype;.          z
c090: 4f 72 69 67 43 6f 6c 20 3d 20 70 54 61 62 2d 3e  OrigCol = pTab->
c0a0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
c0b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73 74 57  ;.          estW
c0c0: 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f  idth = pTab->aCo
c0d0: 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20  l[iCol].szEst;. 
c0e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c0f0: 20 7a 4f 72 69 67 54 61 62 20 3d 20 70 54 61 62   zOrigTab = pTab
c100: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
c110: 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65   if( pNC->pParse
c120: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
c130: 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
c140: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43  chemaToIndex(pNC
c150: 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  ->pParse->db, pT
c160: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
c170: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 44 62 20          zOrigDb 
c180: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64  = pNC->pParse->d
c190: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
c1a0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6c  e;.        }.#el
c1b0: 73 65 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  se.        if( i
c1c0: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Col<0 ){.       
c1d0: 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45     zType = "INTE
c1e0: 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 7d 65  GER";.        }e
c1f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  lse{.          z
c200: 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Type = pTab->aCo
c210: 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20  l[iCol].zType;. 
c220: 20 20 20 20 20 20 20 20 20 65 73 74 57 69 64 74           estWidt
c230: 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  h = pTab->aCol[i
c240: 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20 20 20  Col].szEst;.    
c250: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
c260: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
c270: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
c280: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
c290: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
c2a0: 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
c2b0: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
c2c0: 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65  on is a sub-sele
c2d0: 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64  ct. Return the d
c2e0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
c2f0: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69  and.      ** ori
c300: 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68 65  gin info for the
c310: 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69   single column i
c320: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
c330: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20   of the SELECT. 
c340: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
c350: 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
c360: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
c370: 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  C;.      Select 
c380: 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  *pS = pExpr->x.p
c390: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78  Select;.      Ex
c3a0: 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69  pr *p = pS->pELi
c3b0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
c3c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
c3d0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
c3e0: 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
c3f0: 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e  t) );.      sNC.
c400: 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70  pSrcList = pS->p
c410: 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70  Src;.      sNC.p
c420: 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20  Next = pNC;.    
c430: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
c440: 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  NC->pParse;.    
c450: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
c460: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a  Type(&sNC, p, &z
c470: 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61  OrigDb, &zOrigTa
c480: 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65  b, &zOrigCol, &e
c490: 73 74 57 69 64 74 68 29 3b 20 0a 20 20 20 20 20  stWidth); .     
c4a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
c4b0: 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64 65 66  ndif.  }..#ifdef
c4c0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
c4d0: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 20  OLUMN_METADATA  
c4e0: 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 44 62 20  .  if( pzOrigDb 
c4f0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
c500: 7a 4f 72 69 67 54 61 62 20 26 26 20 70 7a 4f 72  zOrigTab && pzOr
c510: 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a  igCol );.    *pz
c520: 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69 67 44 62  OrigDb = zOrigDb
c530: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54 61 62  ;.    *pzOrigTab
c540: 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20 20 20   = zOrigTab;.   
c550: 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a 4f   *pzOrigCol = zO
c560: 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e 64  rigCol;.  }.#end
c570: 69 66 0a 20 20 69 66 28 20 70 45 73 74 57 69 64  if.  if( pEstWid
c580: 74 68 20 29 20 2a 70 45 73 74 57 69 64 74 68 20  th ) *pEstWidth 
c590: 3d 20 65 73 74 57 69 64 74 68 3b 0a 20 20 72 65  = estWidth;.  re
c5a0: 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f  turn zType;.}../
c5b0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
c5c0: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c  de that will tel
c5d0: 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20 64  l the VDBE the d
c5e0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 73  eclaration types
c5f0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69   of columns.** i
c600: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
c610: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c620: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
c630: 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  ypes(.  Parse *p
c640: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
c650: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
c660: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
c670: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
c680: 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78  f tables */.  Ex
c690: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
c6a0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
c6b0: 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65   defining the re
c6c0: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 23  sult set */.){.#
c6d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
c6e0: 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 56 64  IT_DECLTYPE.  Vd
c6f0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
c700: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
c710: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
c720: 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  C;.  sNC.pSrcLis
c730: 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
c740: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
c750: 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  rse;.  for(i=0; 
c760: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
c770: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
c780: 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  *p = pEList->a[i
c790: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e  ].pExpr;.    con
c7a0: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a  st char *zType;.
c7b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
c7c0: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
c7d0: 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74 20 63  DATA.    const c
c7e0: 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30  har *zOrigDb = 0
c7f0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
c800: 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a   *zOrigTab = 0;.
c810: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
c820: 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20  zOrigCol = 0;.  
c830: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
c840: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a  Type(&sNC, p, &z
c850: 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61  OrigDb, &zOrigTa
c860: 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 30 29  b, &zOrigCol, 0)
c870: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64  ;..    /* The vd
c880: 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73  be must make its
c890: 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65   own copy of the
c8a0: 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64   column-type and
c8b0: 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63   other .    ** c
c8c0: 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73  olumn specific s
c8d0: 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20  trings, in case 
c8e0: 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 72 65  the schema is re
c8f0: 73 65 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a  set before this.
c900: 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d      ** virtual m
c910: 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65  achine is delete
c920: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  d..    */.    sq
c930: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
c940: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
c950: 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69  E_DATABASE, zOri
c960: 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  gDb, SQLITE_TRAN
c970: 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
c980: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
c990: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
c9a0: 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c  TABLE, zOrigTab,
c9b0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
c9c0: 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  T);.    sqlite3V
c9d0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
c9e0: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55   i, COLNAME_COLU
c9f0: 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53 51  MN, zOrigCol, SQ
ca00: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
ca10: 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70 65  .#else.    zType
ca20: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
ca30: 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 2c 20  NC, p, 0, 0, 0, 
ca40: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  0);.#endif.    s
ca50: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
ca60: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
ca70: 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79  ME_DECLTYPE, zTy
ca80: 70 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  pe, SQLITE_TRANS
ca90: 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  IENT);.  }.#endi
caa0: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
cab0: 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
cac0: 50 45 29 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  PE) */.}../*.** 
cad0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
cae0: 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65  at will tell the
caf0: 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20   VDBE the names 
cb00: 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e  of columns.** in
cb10: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
cb20: 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
cb30: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  on is used to pr
cb40: 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43  ovide the.** azC
cb50: 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74  ol[] values in t
cb60: 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a  he callback..*/.
cb70: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
cb80: 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
cb90: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
cba0: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72  ,      /* Parser
cbb0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
cbc0: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
cbd0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
cbe0: 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  les */.  ExprLis
cbf0: 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
cc00: 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69  Expressions defi
cc10: 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20  ning the result 
cc20: 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  set */.){.  Vdbe
cc30: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
cc40: 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  dbe;.  int i, j;
cc50: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
cc60: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
cc70: 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68  nt fullNames, sh
cc80: 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64  ortNames;..#ifnd
cc90: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
cca0: 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74  XPLAIN.  /* If t
ccb0: 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49  his is an EXPLAI
ccc0: 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74 65  N, skip this ste
ccd0: 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73  p */.  if( pPars
cce0: 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
ccf0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65    return;.  }.#e
cd00: 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50 61 72  ndif..  if( pPar
cd10: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
cd20: 7c 7c 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 7c  || NEVER(v==0) |
cd30: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
cd40: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  ed ) return;.  p
cd50: 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53  Parse->colNamesS
cd60: 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61  et = 1;.  fullNa
cd70: 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  mes = (db->flags
cd80: 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f   & SQLITE_FullCo
cd90: 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68  lNames)!=0;.  sh
cda0: 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e  ortNames = (db->
cdb0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
cdc0: 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  hortColNames)!=0
cdd0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  ;.  sqlite3VdbeS
cde0: 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c  etNumCols(v, pEL
cdf0: 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66  ist->nExpr);.  f
ce00: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
ce10: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
ce20: 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20     Expr *p;.    
ce30: 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  p = pEList->a[i]
ce40: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
ce50: 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 63 6f  NEVER(p==0) ) co
ce60: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
ce70: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
ce80: 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  me ){.      char
ce90: 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74   *zName = pEList
cea0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[i].zName;.  
ceb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
cec0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
ced0: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e  COLNAME_NAME, zN
cee0: 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  ame, SQLITE_TRAN
cef0: 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73  SIENT);.    }els
cf00: 65 20 69 66 28 20 28 70 2d 3e 6f 70 3d 3d 54 4b  e if( (p->op==TK
cf10: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 6f 70  _COLUMN || p->op
cf20: 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29  ==TK_AGG_COLUMN)
cf30: 20 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a   && pTabList ){.
cf40: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
cf50: 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  b;.      char *z
cf60: 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Col;.      int i
cf70: 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e  Col = p->iColumn
cf80: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
cf90: 20 41 4c 57 41 59 53 28 6a 3c 70 54 61 62 4c 69   ALWAYS(j<pTabLi
cfa0: 73 74 2d 3e 6e 53 72 63 29 3b 20 6a 2b 2b 29 7b  st->nSrc); j++){
cfb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61  .        if( pTa
cfc0: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72  bList->a[j].iCur
cfd0: 73 6f 72 3d 3d 70 2d 3e 69 54 61 62 6c 65 20 29  sor==p->iTable )
cfe0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
cff0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c        assert( j<
d000: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
d010: 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70  ;.      pTab = p
d020: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54  TabList->a[j].pT
d030: 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43  ab;.      if( iC
d040: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
d050: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
d060: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d   assert( iCol==-
d070: 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26  1 || (iCol>=0 &&
d080: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
d090: 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  ) );.      if( i
d0a0: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Col<0 ){.       
d0b0: 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b   zCol = "rowid";
d0c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
d0d0: 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61        zCol = pTa
d0e0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
d0f0: 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
d100: 20 20 20 69 66 28 20 21 73 68 6f 72 74 4e 61 6d     if( !shortNam
d110: 65 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73  es && !fullNames
d120: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
d130: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
d140: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
d150: 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20 20 20 20  NAME, .         
d160: 20 20 20 73 71 6c 69 74 65 33 44 62 53 74 72 44     sqlite3DbStrD
d170: 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61  up(db, pEList->a
d180: 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20 53 51 4c 49  [i].zSpan), SQLI
d190: 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  TE_DYNAMIC);.   
d1a0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 75 6c     }else if( ful
d1b0: 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20  lNames ){.      
d1c0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
d1d0: 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  0;.        zName
d1e0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
d1f0: 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70  f(db, "%s.%s", p
d200: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  Tab->zName, zCol
d210: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d220: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
d230: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
d240: 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49  AME, zName, SQLI
d250: 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  TE_DYNAMIC);.   
d260: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d270: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
d280: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
d290: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c  LNAME_NAME, zCol
d2a0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
d2b0: 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  NT);.      }.   
d2c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f   }else{.      co
d2d0: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45  nst char *z = pE
d2e0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
d2f0: 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a 3d 3d 30  ;.      z = z==0
d300: 20 3f 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   ? sqlite3MPrint
d310: 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22  f(db, "column%d"
d320: 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69 74 65 33  , i+1) : sqlite3
d330: 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 29 3b  DbStrDup(db, z);
d340: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d350: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
d360: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
d370: 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d   z, SQLITE_DYNAM
d380: 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  IC);.    }.  }. 
d390: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
d3a0: 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ypes(pParse, pTa
d3b0: 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
d3c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
d3d0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
d3e0: 69 73 74 20 28 77 68 69 63 68 20 69 73 20 72 65  ist (which is re
d3f0: 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f 66  ally the list of
d400: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
d410: 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72 65  that form the re
d420: 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45  sult set of a SE
d430: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29 20  LECT statement) 
d440: 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72 69  compute appropri
d450: 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61  ate.** column na
d460: 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20  mes for a table 
d470: 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64 20  that would hold 
d480: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
d490: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63  ist..**.** All c
d4a0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c 6c  olumn names will
d4b0: 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a   be unique..**.*
d4c0: 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d  * Only the colum
d4d0: 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d 70  n names are comp
d4e0: 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54  uted.  Column.zT
d4f0: 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c  ype, Column.zCol
d500: 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20  l,.** and other 
d510: 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d 6e  fields of Column
d520: 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a   are zeroed..**.
d530: 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
d540: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  _OK on success. 
d550: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
d560: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63  ocation error oc
d570: 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e  curs,.** store N
d580: 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61 6e  ULL in *paCol an
d590: 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e  d 0 in *pnCol an
d5a0: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
d5b0: 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63  NOMEM..*/.static
d5c0: 20 69 6e 74 20 73 65 6c 65 63 74 43 6f 6c 75 6d   int selectColum
d5d0: 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a  nsFromExprList(.
d5e0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
d5f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
d600: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
d610: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
d620: 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45 78 70  st,       /* Exp
d630: 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68 69 63  r list from whic
d640: 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f 6c 75  h to derive colu
d650: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 31  mn names */.  i1
d660: 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20  6 *pnCol,       
d670: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
d680: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
d690: 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20 43  umns here */.  C
d6a0: 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20 20  olumn **paCol   
d6b0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
d6c0: 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c  the new column l
d6d0: 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ist here */.){. 
d6e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
d6f0: 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20  Parse->db;   /* 
d700: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
d710: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  ion */.  int i, 
d720: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
d730: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
d740: 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63  nters */.  int c
d750: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
d760: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
d770: 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68  added to make th
d780: 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a 2f  e name unique */
d790: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c  .  Column *aCol,
d7a0: 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20 20 2f   *pCol;        /
d7b0: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
d7c0: 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  er result column
d7d0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  s */.  int nCol;
d7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7f0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
d800: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
d810: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45  esult set */.  E
d820: 78 70 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20  xpr *p;         
d830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
d840: 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 61 20 73  pression for a s
d850: 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c  ingle result col
d860: 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  umn */.  char *z
d870: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
d880: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
d890: 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  ame */.  int nNa
d8a0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
d8b0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
d8c0: 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20  name in zName[] 
d8d0: 2a 2f 0a 0a 20 20 69 66 28 20 70 45 4c 69 73 74  */..  if( pEList
d8e0: 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70   ){.    nCol = p
d8f0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
d900: 20 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33    aCol = sqlite3
d910: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
d920: 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29   sizeof(aCol[0])
d930: 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73 74  *nCol);.    test
d940: 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29 3b  case( aCol==0 );
d950: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
d960: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43 6f 6c  ol = 0;.    aCol
d970: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 6e 43   = 0;.  }.  *pnC
d980: 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61  ol = nCol;.  *pa
d990: 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66  Col = aCol;..  f
d9a0: 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f  or(i=0, pCol=aCo
d9b0: 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  l; i<nCol; i++, 
d9c0: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20  pCol++){.    /* 
d9d0: 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61  Get an appropria
d9e0: 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  te name for the 
d9f0: 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20  column.    */.  
da00: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70    p = sqlite3Exp
da10: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 4c  rSkipCollate(pEL
da20: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
da30: 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65  ;.    if( (zName
da40: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
da50: 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
da60: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
da70: 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  umn contains an 
da80: 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61  "AS <name>" phra
da90: 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61  se, use <name> a
daa0: 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  s the name */.  
dab0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
dac0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
dad0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
dae0: 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  e{.      Expr *p
daf0: 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f 2a  ColExpr = p;  /*
db00: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
db10: 74 68 61 74 20 69 73 20 74 68 65 20 72 65 73 75  that is the resu
db20: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  lt column name *
db30: 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
db40: 54 61 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Tab;         /* 
db50: 54 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64  Table associated
db60: 20 77 69 74 68 20 74 68 69 73 20 65 78 70 72 65   with this expre
db70: 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 77  ssion */.      w
db80: 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e  hile( pColExpr->
db90: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20  op==TK_DOT ){.  
dba0: 20 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20 3d        pColExpr =
dbb0: 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68   pColExpr->pRigh
dbc0: 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
dbd0: 74 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20 29  t( pColExpr!=0 )
dbe0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
dbf0: 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  if( pColExpr->op
dc00: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41  ==TK_COLUMN && A
dc10: 4c 57 41 59 53 28 70 43 6f 6c 45 78 70 72 2d 3e  LWAYS(pColExpr->
dc20: 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20  pTab!=0) ){.    
dc30: 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d      /* For colum
dc40: 6e 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75 6d  ns use the colum
dc50: 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20  n name name */. 
dc60: 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20         int iCol 
dc70: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c  = pColExpr->iCol
dc80: 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61  umn;.        pTa
dc90: 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54  b = pColExpr->pT
dca0: 61 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ab;.        if( 
dcb0: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
dcc0: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
dcd0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
dce0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
dcf0: 22 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  "%s",.          
dd00: 20 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30 20 3f         iCol>=0 ?
dd10: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
dd20: 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64  ].zName : "rowid
dd30: 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ");.      }else 
dd40: 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  if( pColExpr->op
dd50: 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20  ==TK_ID ){.     
dd60: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
dd70: 48 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f 6c  HasProperty(pCol
dd80: 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
dd90: 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e  e) );.        zN
dda0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
ddb0: 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 70  intf(db, "%s", p
ddc0: 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ColExpr->u.zToke
ddd0: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
dde0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20  .        /* Use 
ddf0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78  the original tex
de00: 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t of the column 
de10: 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74  expression as it
de20: 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  s name */.      
de30: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
de40: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
de50: 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ", pEList->a[i].
de60: 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  zSpan);.      }.
de70: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62      }.    if( db
de80: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
de90: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
dea0: 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
deb0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
dec0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b     }..    /* Mak
ded0: 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d  e sure the colum
dee0: 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65  n name is unique
def0: 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69  .  If the name i
df00: 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20  s not unique,.  
df10: 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69 6e    ** append a in
df20: 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d  teger to the nam
df30: 65 20 73 6f 20 74 68 61 74 20 69 74 20 62 65 63  e so that it bec
df40: 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20  omes unique..   
df50: 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20   */.    nName = 
df60: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
df70: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28  zName);.    for(
df80: 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b  j=cnt=0; j<i; j+
df90: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
dfa0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61 43 6f  lite3StrICmp(aCo
dfb0: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  l[j].zName, zNam
dfc0: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
dfd0: 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65 3b   char *zNewName;
dfe0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a  .        int k;.
dff0: 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 6e 4e          for(k=nN
e000: 61 6d 65 2d 31 3b 20 6b 3e 31 20 26 26 20 73 71  ame-1; k>1 && sq
e010: 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 4e 61  lite3Isdigit(zNa
e020: 6d 65 5b 6b 5d 29 3b 20 6b 2d 2d 29 7b 7d 0a 20  me[k]); k--){}. 
e030: 20 20 20 20 20 20 20 69 66 28 20 6b 3e 3d 30 20         if( k>=0 
e040: 26 26 20 7a 4e 61 6d 65 5b 6b 5d 3d 3d 27 3a 27  && zName[k]==':'
e050: 20 29 20 6e 4e 61 6d 65 20 3d 20 6b 3b 0a 20 20   ) nName = k;.  
e060: 20 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61 6d        zName[nNam
e070: 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  e] = 0;.        
e080: 7a 4e 65 77 4e 61 6d 65 20 3d 20 73 71 6c 69 74  zNewName = sqlit
e090: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
e0a0: 73 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b  s:%d", zName, ++
e0b0: 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  cnt);.        sq
e0c0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
e0d0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
e0e0: 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e 61 6d 65  zName = zNewName
e0f0: 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 2d 31  ;.        j = -1
e100: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e  ;.        if( zN
e110: 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ame==0 ) break;.
e120: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e130: 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20    pCol->zName = 
e140: 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69 66 28  zName;.  }.  if(
e150: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
e160: 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  d ){.    for(j=0
e170: 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<i; j++){.   
e180: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
e190: 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  (db, aCol[j].zNa
e1a0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  me);.    }.    s
e1b0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
e1c0: 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43   aCol);.    *paC
e1d0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43  ol = 0;.    *pnC
e1e0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  ol = 0;.    retu
e1f0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
e200: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
e210: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
e220: 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64 20 63  * Add type and c
e230: 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61  ollation informa
e240: 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d 6e  tion to a column
e250: 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a 2a   list based on.*
e260: 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  * a SELECT state
e270: 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65  ment..** .** The
e280: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72 65   column list pre
e290: 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72 6f  sumably came fro
e2a0: 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61  m selectColumnNa
e2b0: 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mesFromExprList(
e2c0: 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e  )..** The column
e2d0: 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20 6e   list has only n
e2e0: 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73 20  ames, not types 
e2f0: 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20  or collations.  
e300: 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
e310: 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e 64  goes through and
e320: 20 61 64 64 73 20 74 68 65 20 74 79 70 65 73 20   adds the types 
e330: 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a  and collations..
e340: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
e350: 6e 65 20 72 65 71 75 69 72 65 73 20 74 68 61 74  ne requires that
e360: 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72 73   all identifiers
e370: 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a 2a   in the SELECT.*
e380: 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20 72  * statement be r
e390: 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73 74 61 74  esolved..*/.stat
e3a0: 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64  ic void selectAd
e3b0: 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
e3c0: 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73 65  llation(.  Parse
e3d0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
e3e0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
e3f0: 65 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c 65 20  exts */.  Table 
e400: 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *pTab,          
e410: 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20 74 79  /* Add column ty
e420: 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  pe information t
e430: 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  o this table */.
e440: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
e450: 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43  t       /* SELEC
e460: 54 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  T used to determ
e470: 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f  ine types and co
e480: 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  llations */.){. 
e490: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
e4a0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d  Parse->db;.  Nam
e4b0: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
e4c0: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
e4d0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
e4e0: 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20    int i;.  Expr 
e4f0: 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  *p;.  struct Exp
e500: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20  rList_item *a;. 
e510: 20 75 36 34 20 73 7a 41 6c 6c 20 3d 20 30 3b 0a   u64 szAll = 0;.
e520: 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65  .  assert( pSele
e530: 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ct!=0 );.  asser
e540: 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c  t( (pSelect->sel
e550: 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c  Flags & SF_Resol
e560: 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61 73 73  ved)!=0 );.  ass
e570: 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d  ert( pTab->nCol=
e580: 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  =pSelect->pEList
e590: 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d  ->nExpr || db->m
e5a0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
e5b0: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
e5c0: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
e5d0: 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
e5e0: 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
e5f0: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
e600: 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a   pSelect->pSrc;.
e610: 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70    a = pSelect->p
e620: 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72 28  EList->a;.  for(
e630: 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e  i=0, pCol=pTab->
e640: 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  aCol; i<pTab->nC
e650: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
e660: 7b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70  {.    p = a[i].p
e670: 45 78 70 72 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  Expr;.    pCol->
e680: 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 44  zType = sqlite3D
e690: 62 53 74 72 44 75 70 28 64 62 2c 20 63 6f 6c 75  bStrDup(db, colu
e6a0: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 30  mnType(&sNC, p,0
e6b0: 2c 30 2c 30 2c 20 26 70 43 6f 6c 2d 3e 73 7a 45  ,0,0, &pCol->szE
e6c0: 73 74 29 29 3b 0a 20 20 20 20 73 7a 41 6c 6c 20  st));.    szAll 
e6d0: 2b 3d 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a  += pCol->szEst;.
e6e0: 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69      pCol->affini
e6f0: 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ty = sqlite3Expr
e700: 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20  Affinity(p);.   
e710: 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e   if( pCol->affin
e720: 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e 61  ity==0 ) pCol->a
e730: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
e740: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 70  _AFF_NONE;.    p
e750: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
e760: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
e770: 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43  , p);.    if( pC
e780: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  oll ){.      pCo
e790: 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  l->zColl = sqlit
e7a0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
e7b0: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
e7c0: 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e    }.  }.  pTab->
e7d0: 73 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c 69 74  szTabRow = sqlit
e7e0: 65 33 4c 6f 67 45 73 74 28 73 7a 41 6c 6c 2a 34  e3LogEst(szAll*4
e7f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  );.}../*.** Give
e800: 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  n a SELECT state
e810: 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61  ment, generate a
e820: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
e830: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a   that describes.
e840: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ** the result se
e850: 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54  t of that SELECT
e860: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
e870: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
e880: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
e890: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
e8a0: 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ect){.  Table *p
e8b0: 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Tab;.  sqlite3 *
e8c0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
e8d0: 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c 61 67  .  int savedFlag
e8e0: 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61 67 73  s;..  savedFlags
e8f0: 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20   = db->flags;.  
e900: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
e910: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
e920: 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  s;.  db->flags |
e930: 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  = SQLITE_ShortCo
e940: 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65  lNames;.  sqlite
e950: 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72  3SelectPrep(pPar
e960: 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 3b  se, pSelect, 0);
e970: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
e980: 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Err ) return 0;.
e990: 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74    while( pSelect
e9a0: 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65  ->pPrior ) pSele
e9b0: 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50  ct = pSelect->pP
e9c0: 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  rior;.  db->flag
e9d0: 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b 0a  s = savedFlags;.
e9e0: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
e9f0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
ea00: 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29   sizeof(Table) )
ea10: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
ea20: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
ea30: 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 71  .  }.  /* The sq
ea40: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
ea50: 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e 6c 79  Select() is only
ea60: 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78 74 73   used n contexts
ea70: 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69 64 65   where lookaside
ea80: 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  .  ** is disable
ea90: 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64  d */.  assert( d
eaa0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
eab0: 61 62 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 70 54  abled==0 );.  pT
eac0: 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ab->nRef = 1;.  
ead0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b  pTab->zName = 0;
eae0: 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74  .  pTab->nRowEst
eaf0: 20 3d 20 31 30 34 38 35 37 36 3b 0a 20 20 73 65   = 1048576;.  se
eb00: 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  lectColumnsFromE
eb10: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
eb20: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c  pSelect->pEList,
eb30: 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70   &pTab->nCol, &p
eb40: 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 65  Tab->aCol);.  se
eb50: 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
eb60: 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50  eAndCollation(pP
eb70: 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c  arse, pTab, pSel
eb80: 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50  ect);.  pTab->iP
eb90: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  Key = -1;.  if( 
eba0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
ebb0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
ebc0: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
ebd0: 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Tab);.    return
ebe0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
ebf0: 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pTab;.}../*.** 
ec00: 47 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74  Get a VDBE for t
ec10: 68 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20  he given parser 
ec20: 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65  context.  Create
ec30: 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
ec40: 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61  cessary..** If a
ec50: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
ec60: 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20  return NULL and 
ec70: 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20  leave a message 
ec80: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64  in pParse..*/.Vd
ec90: 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64  be *sqlite3GetVd
eca0: 62 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  be(Parse *pParse
ecb0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
ecc0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
ecd0: 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20  if( v==0 ){.    
ece0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
ecf0: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  e = sqlite3VdbeC
ed00: 72 65 61 74 65 28 70 50 61 72 73 65 29 3b 0a 20  reate(pParse);. 
ed10: 20 20 20 69 66 28 20 76 20 29 20 73 71 6c 69 74     if( v ) sqlit
ed20: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
ed30: 4f 50 5f 49 6e 69 74 29 3b 0a 20 20 20 20 69 66  OP_Init);.    if
ed40: 28 20 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65  ( pParse->pTople
ed50: 76 65 6c 3d 3d 30 0a 20 20 20 20 20 26 26 20 4f  vel==0.     && O
ed60: 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
ed70: 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 53 51  ed(pParse->db,SQ
ed80: 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f  LITE_FactorOutCo
ed90: 6e 73 74 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  nst).    ){.    
eda0: 20 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73    pParse->okCons
edb0: 74 46 61 63 74 6f 72 20 3d 20 31 3b 0a 20 20 20  tFactor = 1;.   
edc0: 20 7d 0a 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   }..  }.  return
edd0: 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   v;.}.../*.** Co
ede0: 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74  mpute the iLimit
edf0: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65   and iOffset fie
ee00: 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43  lds of the SELEC
ee10: 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a  T based on the.*
ee20: 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66  * pLimit and pOf
ee30: 66 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73  fset expressions
ee40: 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f  .  pLimit and pO
ee50: 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65 20 65  ffset hold the e
ee60: 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68  xpressions.** th
ee70: 61 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  at appear in the
ee80: 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74   original SQL st
ee90: 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68  atement after th
eea0: 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  e LIMIT and OFFS
eeb0: 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20  ET.** keywords. 
eec0: 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73   Or NULL if thos
eed0: 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f  e keywords are o
eee0: 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61  mitted. iLimit a
eef0: 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61  nd iOffset .** a
ef00: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d  re the integer m
ef10: 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e  emory register n
ef20: 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74  umbers for count
ef30: 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  ers used to comp
ef40: 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69  ute .** the limi
ef50: 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49  t and offset.  I
ef60: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69  f there is no li
ef70: 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65  mit and/or offse
ef80: 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d  t, then .** iLim
ef90: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61  it and iOffset a
efa0: 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a  re negative..**.
efb0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
efc0: 63 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75  changes the valu
efd0: 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64  es of iLimit and
efe0: 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66   iOffset only if
eff0: 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f  .** a limit or o
f000: 66 66 73 65 74 20 69 73 20 64 65 66 69 6e 65 64  ffset is defined
f010: 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64 20 70   by pLimit and p
f020: 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20  Offset.  iLimit 
f030: 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73  and.** iOffset s
f040: 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  hould have been 
f050: 70 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70  preset to approp
f060: 72 69 61 74 65 20 64 65 66 61 75 6c 74 20 76 61  riate default va
f070: 6c 75 65 73 20 28 7a 65 72 6f 29 0a 2a 2a 20 70  lues (zero).** p
f080: 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
f090: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
f0a0: 0a 2a 2a 20 54 68 65 20 69 4f 66 66 73 65 74 20  .** The iOffset 
f0b0: 72 65 67 69 73 74 65 72 20 28 69 66 20 69 74 20  register (if it 
f0c0: 65 78 69 73 74 73 29 20 69 73 20 69 6e 69 74 69  exists) is initi
f0d0: 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76 61  alized to the va
f0e0: 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 4f 46  lue.** of the OF
f0f0: 46 53 45 54 2e 20 20 54 68 65 20 69 4c 69 6d 69  FSET.  The iLimi
f100: 74 20 72 65 67 69 73 74 65 72 20 69 73 20 69 6e  t register is in
f110: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d  itialized to LIM
f120: 49 54 2e 20 20 52 65 67 69 73 74 65 72 0a 2a 2a  IT.  Register.**
f130: 20 69 4f 66 66 73 65 74 2b 31 20 69 73 20 69 6e   iOffset+1 is in
f140: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d  itialized to LIM
f150: 49 54 2b 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a  IT+OFFSET..**.**
f160: 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74 21   Only if pLimit!
f170: 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21 3d 30  =0 or pOffset!=0
f180: 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65   do the limit re
f190: 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72  gisters get.** r
f1a0: 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55  edefined.  The U
f1b0: 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
f1c0: 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f 70  r uses this prop
f1d0: 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a  erty to force.**
f1e0: 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74 68   the reuse of th
f1f0: 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64  e same limit and
f200: 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65 72   offset register
f210: 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c  s across multipl
f220: 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  e.** SELECT stat
f230: 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  ements..*/.stati
f240: 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69  c void computeLi
f250: 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61 72  mitRegisters(Par
f260: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
f270: 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65 61  ct *p, int iBrea
f280: 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  k){.  Vdbe *v = 
f290: 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20  0;.  int iLimit 
f2a0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73  = 0;.  int iOffs
f2b0: 65 74 3b 0a 20 20 69 6e 74 20 61 64 64 72 31 2c  et;.  int addr1,
f2c0: 20 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69   n;.  if( p->iLi
f2d0: 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  mit ) return;.. 
f2e0: 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54   /* .  ** "LIMIT
f2f0: 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77   -1" always show
f300: 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65  s all rows.  The
f310: 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20  re is some.  ** 
f320: 63 6f 6e 74 72 6f 76 65 72 73 79 20 61 62 6f 75  controversy abou
f330: 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65  t what the corre
f340: 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75  ct behavior shou
f350: 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20  ld be..  ** The 
f360: 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  current implemen
f370: 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74  tation interpret
f380: 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d  s "LIMIT 0" to m
f390: 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73  ean.  ** no rows
f3a0: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
f3b0: 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
f3c0: 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
f3d0: 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20  ( p->pOffset==0 
f3e0: 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74 21 3d 30 20  || p->pLimit!=0 
f3f0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d  );.  if( p->pLim
f400: 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69  it ){.    p->iLi
f410: 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b  mit = iLimit = +
f420: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
f430: 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
f440: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
f450: 20 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20     assert( v!=0 
f460: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
f470: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
f480: 70 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 29 20 29  p->pLimit, &n) )
f490: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
f4a0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f4b0: 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69 6d  Integer, n, iLim
f4c0: 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  it);.      VdbeC
f4d0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49  omment((v, "LIMI
f4e0: 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20  T counter"));.  
f4f0: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a      if( n==0 ){.
f500: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
f510: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f520: 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29  Goto, 0, iBreak)
f530: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
f540: 28 20 6e 3e 3d 30 20 26 26 20 70 2d 3e 6e 53 65  ( n>=0 && p->nSe
f550: 6c 65 63 74 52 6f 77 3e 28 75 36 34 29 6e 20 29  lectRow>(u64)n )
f560: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65  {.        p->nSe
f570: 6c 65 63 74 52 6f 77 20 3d 20 6e 3b 0a 20 20 20  lectRow = n;.   
f580: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
f590: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f5a0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d  rCode(pParse, p-
f5b0: 3e 70 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74 29  >pLimit, iLimit)
f5c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f5d0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
f5e0: 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69  MustBeInt, iLimi
f5f0: 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
f600: 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  (v);.      VdbeC
f610: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49  omment((v, "LIMI
f620: 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20  T counter"));.  
f630: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f640: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65  ddOp2(v, OP_IfZe
f650: 72 6f 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65  ro, iLimit, iBre
f660: 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
f670: 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e(v);.    }.    
f680: 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29  if( p->pOffset )
f690: 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73  {.      p->iOffs
f6a0: 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d 20 2b  et = iOffset = +
f6b0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
f6c0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
f6d0: 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63 61  m++;   /* Alloca
f6e0: 74 65 20 61 6e 20 65 78 74 72 61 20 72 65 67 69  te an extra regi
f6f0: 73 74 65 72 20 66 6f 72 20 6c 69 6d 69 74 2b 6f  ster for limit+o
f700: 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 73  ffset */.      s
f710: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
f720: 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65  Parse, p->pOffse
f730: 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  t, iOffset);.   
f740: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f750: 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp1(v, OP_MustB
f760: 65 49 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b 20  eInt, iOffset); 
f770: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
f780: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
f790: 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54 20 63  nt((v, "OFFSET c
f7a0: 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20  ounter"));.     
f7b0: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
f7c0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
f7d0: 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73 65 74 29  _IfPos, iOffset)
f7e0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
f7f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f800: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f810: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 4f 66  _Integer, 0, iOf
f820: 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  fset);.      sql
f830: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
f840: 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
f850: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f860: 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20 69  Op3(v, OP_Add, i
f870: 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2c 20  Limit, iOffset, 
f880: 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20  iOffset+1);.    
f890: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
f8a0: 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22  , "LIMIT+OFFSET"
f8b0: 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20  ));.      addr1 
f8c0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
f8d0: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op1(v, OP_IfPos,
f8e0: 20 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f   iLimit); VdbeCo
f8f0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
f900: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f910: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
f920: 2c 20 2d 31 2c 20 69 4f 66 66 73 65 74 2b 31 29  , -1, iOffset+1)
f930: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f940: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
f950: 64 64 72 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ddr1);.    }.  }
f960: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
f970: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
f980: 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65  _SELECT./*.** Re
f990: 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72  turn the appropr
f9a0: 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  iate collating s
f9b0: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
f9c0: 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol-th column o
f9d0: 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  f.** the result 
f9e0: 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  set for the comp
f9f0: 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74  ound-select stat
fa00: 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75  ement "p".  Retu
fa10: 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68  rn NULL if.** th
fa20: 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20  e column has no 
fa30: 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e  default collatin
fa40: 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a  g sequence..**.*
fa50: 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * The collating 
fa60: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
fa70: 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
fa80: 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74   is taken from t
fa90: 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20  he.** left-most 
faa0: 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65  term of the sele
fab0: 63 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f  ct that has a co
fac0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
fad0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c  ..*/.static Coll
fae0: 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74  Seq *multiSelect
faf0: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
fb00: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
fb10: 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43  , int iCol){.  C
fb20: 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20  ollSeq *pRet;.  
fb30: 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
fb40: 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74  .    pRet = mult
fb50: 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
fb60: 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72  Parse, p->pPrior
fb70: 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65  , iCol);.  }else
fb80: 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a  {.    pRet = 0;.
fb90: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43    }.  assert( iC
fba0: 6f 6c 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ol>=0 );.  if( p
fbb0: 52 65 74 3d 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Ret==0 && iCol<p
fbc0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
fbd0: 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71  ){.    pRet = sq
fbe0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
fbf0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
fc00: 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70  st->a[iCol].pExp
fc10: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
fc20: 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
fc30: 54 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  The select state
fc40: 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74  ment passed as t
fc50: 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
fc60: 74 65 72 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ter is a compoun
fc70: 64 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68  d SELECT.** with
fc80: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
fc90: 75 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  use. This functi
fca0: 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64  on allocates and
fcb0: 20 72 65 74 75 72 6e 73 20 61 20 4b 65 79 49 6e   returns a KeyIn
fcc0: 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  fo.** structure 
fcd0: 73 75 69 74 61 62 6c 65 20 66 6f 72 20 69 6d 70  suitable for imp
fce0: 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52  lementing the OR
fcf0: 44 45 52 20 42 59 2e 0a 2a 2a 0a 2a 2a 20 53 70  DER BY..**.** Sp
fd00: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
fd10: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
fd20: 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  e is obtained fr
fd30: 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 63  om malloc. The c
fd40: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
fd50: 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  on is responsibl
fd60: 65 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74  e for ensuring t
fd70: 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75  hat this structu
fd80: 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79  re is eventually
fd90: 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74  .** freed..*/.st
fda0: 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6d 75  atic KeyInfo *mu
fdb0: 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
fdc0: 4b 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70  KeyInfo(Parse *p
fdd0: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
fde0: 2c 20 69 6e 74 20 6e 45 78 74 72 61 29 7b 0a 20  , int nExtra){. 
fdf0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
fe00: 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
fe10: 79 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  y;.  int nOrderB
fe20: 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d  y = p->pOrderBy-
fe30: 3e 6e 45 78 70 72 3b 0a 20 20 73 71 6c 69 74 65  >nExpr;.  sqlite
fe40: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
fe50: 64 62 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  db;.  KeyInfo *p
fe60: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  Ret = sqlite3Key
fe70: 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 4f  InfoAlloc(db, nO
fe80: 72 64 65 72 42 79 2b 6e 45 78 74 72 61 2c 20 31  rderBy+nExtra, 1
fe90: 29 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b  );.  if( pRet ){
fea0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
feb0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
fec0: 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rBy; i++){.     
fed0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
fee0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
fef0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 3b 0a  pOrderBy->a[i];.
ff00: 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 72        Expr *pTer
ff10: 6d 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  m = pItem->pExpr
ff20: 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  ;.      CollSeq 
ff30: 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 69  *pColl;..      i
ff40: 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20  f( pTerm->flags 
ff50: 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a  & EP_Collate ){.
ff60: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
ff70: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
ff80: 65 71 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  eq(pParse, pTerm
ff90: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
ffa0: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
ffb0: 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
ffc0: 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 70 49  eq(pParse, p, pI
ffd0: 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
ffe0: 79 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20  yCol-1);.       
fff0: 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20   if( pColl==0 ) 
10000 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
10010 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  tColl;.        p
10020 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
10030 78 70 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20  xpr =.          
10040 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
10050 6c 6c 61 74 65 53 74 72 69 6e 67 28 70 50 61 72  llateString(pPar
10060 73 65 2c 20 70 54 65 72 6d 2c 20 70 43 6f 6c 6c  se, pTerm, pColl
10070 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
10080 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
10090 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
100a0 57 72 69 74 65 61 62 6c 65 28 70 52 65 74 29 20  Writeable(pRet) 
100b0 29 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 61  );.      pRet->a
100c0 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b  Coll[i] = pColl;
100d0 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 61 53 6f  .      pRet->aSo
100e0 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72  rtOrder[i] = pOr
100f0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
10100 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Order;.    }.  }
10110 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ..  return pRet;
10120 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
10130 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a  TE_OMIT_CTE./*.*
10140 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
10150 65 6e 65 72 61 74 65 73 20 56 44 42 45 20 63 6f  enerates VDBE co
10160 64 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  de to compute th
10170 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57  e content of a W
10180 49 54 48 20 52 45 43 55 52 53 49 56 45 0a 2a 2a  ITH RECURSIVE.**
10190 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f   query of the fo
101a0 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 3c 72 65 63  rm:.**.**   <rec
101b0 75 72 73 69 76 65 2d 74 61 62 6c 65 3e 20 41 53  ursive-table> AS
101c0 20 28 3c 73 65 74 75 70 2d 71 75 65 72 79 3e 20   (<setup-query> 
101d0 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 3c 72 65 63  UNION [ALL] <rec
101e0 75 72 73 69 76 65 2d 71 75 65 72 79 3e 29 0a 2a  ursive-query>).*
101f0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
10200 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
10210 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20  ______/         
10220 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
10230 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20  ____/.**        
10240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10250 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 20 20 20     p->pPrior    
10260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10270 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65    p.**.**.** The
10280 72 65 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e  re is exactly on
10290 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
102a0 68 65 20 72 65 63 75 72 73 69 76 65 2d 74 61 62  he recursive-tab
102b0 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
102c0 6c 61 75 73 65 0a 2a 2a 20 6f 66 20 72 65 63 75  lause.** of recu
102d0 72 73 69 76 65 2d 71 75 65 72 79 2c 20 6d 61 72  rsive-query, mar
102e0 6b 65 64 20 77 69 74 68 20 74 68 65 20 53 72 63  ked with the Src
102f0 4c 69 73 74 2d 3e 61 5b 5d 2e 69 73 52 65 63 75  List->a[].isRecu
10300 72 73 69 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a  rsive flag..**.*
10310 2a 20 54 68 65 20 73 65 74 75 70 2d 71 75 65 72  * The setup-quer
10320 79 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 67  y runs once to g
10330 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 69 74 69  enerate an initi
10340 61 6c 20 73 65 74 20 6f 66 20 72 6f 77 73 20 74  al set of rows t
10350 68 61 74 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61  hat go.** into a
10360 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 52   Queue table.  R
10370 6f 77 73 20 61 72 65 20 65 78 74 72 61 63 74 65  ows are extracte
10380 64 20 66 72 6f 6d 20 74 68 65 20 51 75 65 75 65  d from the Queue
10390 20 74 61 62 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a   table one by.**
103a0 20 6f 6e 65 2e 20 20 45 61 63 68 20 72 6f 77 20   one.  Each row 
103b0 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51  extracted from Q
103c0 75 65 75 65 20 69 73 20 6f 75 74 70 75 74 20 74  ueue is output t
103d0 6f 20 70 44 65 73 74 2e 20 20 54 68 65 6e 20 74  o pDest.  Then t
103e0 68 65 20 73 69 6e 67 6c 65 0a 2a 2a 20 65 78 74  he single.** ext
103f0 72 61 63 74 65 64 20 72 6f 77 20 28 6e 6f 77 20  racted row (now 
10400 69 6e 20 74 68 65 20 69 43 75 72 72 65 6e 74 20  in the iCurrent 
10410 74 61 62 6c 65 29 20 62 65 63 6f 6d 65 73 20 74  table) becomes t
10420 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
10430 65 0a 2a 2a 20 72 65 63 75 72 73 69 76 65 2d 74  e.** recursive-t
10440 61 62 6c 65 20 66 6f 72 20 61 20 72 65 63 75 72  able for a recur
10450 73 69 76 65 2d 71 75 65 72 79 20 72 75 6e 2e 20  sive-query run. 
10460 20 54 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   The output of t
10470 68 65 20 72 65 63 75 72 73 69 76 65 2d 71 75 65  he recursive-que
10480 72 79 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 62  ry.** is added b
10490 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 51 75 65  ack into the Que
104a0 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65 6e 20  ue table.  Then 
104b0 61 6e 6f 74 68 65 72 20 72 6f 77 20 69 73 20 65  another row is e
104c0 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75  xtracted from Qu
104d0 65 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69  eue.** and the i
104e0 74 65 72 61 74 69 6f 6e 20 63 6f 6e 74 69 6e 75  teration continu
104f0 65 73 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65  es until the Que
10500 75 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  ue table is empt
10510 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y..**.** If the 
10520 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 6f  compound query o
10530 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e  perator is UNION
10540 20 74 68 65 6e 20 6e 6f 20 64 75 70 6c 69 63 61   then no duplica
10550 74 65 20 72 6f 77 73 20 61 72 65 20 65 76 65 72  te rows are ever
10560 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74  .** inserted int
10570 6f 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  o the Queue tabl
10580 65 2e 20 20 54 68 65 20 69 44 69 73 74 69 6e 63  e.  The iDistinc
10590 74 20 74 61 62 6c 65 20 6b 65 65 70 73 20 61 20  t table keeps a 
105a0 63 6f 70 79 20 6f 66 20 61 6c 6c 20 72 6f 77 73  copy of all rows
105b0 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 65 76  .** that have ev
105c0 65 72 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64  er been inserted
105d0 20 69 6e 74 6f 20 51 75 65 75 65 20 61 6e 64 20   into Queue and 
105e0 63 61 75 73 65 73 20 64 75 70 6c 69 63 61 74 65  causes duplicate
105f0 73 20 74 6f 20 62 65 0a 2a 2a 20 64 69 73 63 61  s to be.** disca
10600 72 64 65 64 2e 20 20 49 66 20 74 68 65 20 6f 70  rded.  If the op
10610 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20  erator is UNION 
10620 41 4c 4c 2c 20 74 68 65 6e 20 64 75 70 6c 69 63  ALL, then duplic
10630 61 74 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64  ates are allowed
10640 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
10650 71 75 65 72 79 20 68 61 73 20 61 6e 20 4f 52 44  query has an ORD
10660 45 52 20 42 59 2c 20 74 68 65 6e 20 65 6e 74 72  ER BY, then entr
10670 69 65 73 20 69 6e 20 74 68 65 20 51 75 65 75 65  ies in the Queue
10680 20 74 61 62 6c 65 20 61 72 65 20 6b 65 70 74 20   table are kept 
10690 69 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f  in.** ORDER BY o
106a0 72 64 65 72 20 61 6e 64 20 74 68 65 20 66 69 72  rder and the fir
106b0 73 74 20 65 6e 74 72 79 20 69 73 20 65 78 74 72  st entry is extr
106c0 61 63 74 65 64 20 66 6f 72 20 65 61 63 68 20 63  acted for each c
106d0 79 63 6c 65 2e 20 20 57 69 74 68 6f 75 74 0a 2a  ycle.  Without.*
106e0 2a 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74  * an ORDER BY, t
106f0 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 69  he Queue table i
10700 73 20 6a 75 73 74 20 61 20 46 49 46 4f 2e 0a 2a  s just a FIFO..*
10710 2a 0a 2a 2a 20 49 66 20 61 20 4c 49 4d 49 54 20  *.** If a LIMIT 
10720 63 6c 61 75 73 65 20 69 73 20 70 72 6f 76 69 64  clause is provid
10730 65 64 2c 20 74 68 65 6e 20 74 68 65 20 69 74 65  ed, then the ite
10740 72 61 74 69 6f 6e 20 73 74 6f 70 73 20 61 66 74  ration stops aft
10750 65 72 20 4c 49 4d 49 54 20 72 6f 77 73 0a 2a 2a  er LIMIT rows.**
10760 20 68 61 76 65 20 62 65 65 6e 20 6f 75 74 70 75   have been outpu
10770 74 20 74 6f 20 70 44 65 73 74 2e 20 20 41 20 4c  t to pDest.  A L
10780 49 4d 49 54 20 6f 66 20 7a 65 72 6f 20 6d 65 61  IMIT of zero mea
10790 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 6e 6f 20  ns to output no 
107a0 72 6f 77 73 20 61 6e 64 20 61 0a 2a 2a 20 6e 65  rows and a.** ne
107b0 67 61 74 69 76 65 20 4c 49 4d 49 54 20 6d 65 61  gative LIMIT mea
107c0 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 61 6c 6c  ns to output all
107d0 20 72 6f 77 73 2e 20 20 49 66 20 74 68 65 72 65   rows.  If there
107e0 20 69 73 20 61 6c 73 6f 20 61 6e 20 4f 46 46 53   is also an OFFS
107f0 45 54 20 63 6c 61 75 73 65 0a 2a 2a 20 77 69 74  ET clause.** wit
10800 68 20 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c  h a positive val
10810 75 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ue, then the fir
10820 73 74 20 4f 46 46 53 45 54 20 6f 75 74 70 75 74  st OFFSET output
10830 73 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20  s are discarded 
10840 72 61 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 62  rather.** than b
10850 65 69 6e 67 20 73 65 6e 74 20 74 6f 20 70 44 65  eing sent to pDe
10860 73 74 2e 20 20 54 68 65 20 4c 49 4d 49 54 20 63  st.  The LIMIT c
10870 6f 75 6e 74 20 64 6f 65 73 20 6e 6f 74 20 62 65  ount does not be
10880 67 69 6e 20 75 6e 74 69 6c 20 61 66 74 65 72 20  gin until after 
10890 4f 46 46 53 45 54 0a 2a 2a 20 72 6f 77 73 20 68  OFFSET.** rows h
108a0 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64  ave been skipped
108b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
108c0 20 67 65 6e 65 72 61 74 65 57 69 74 68 52 65 63   generateWithRec
108d0 75 72 73 69 76 65 51 75 65 72 79 28 0a 20 20 50  ursiveQuery(.  P
108e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
108f0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
10900 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
10910 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
10920 20 20 20 2f 2a 20 54 68 65 20 72 65 63 75 72 73     /* The recurs
10930 69 76 65 20 53 45 4c 45 43 54 20 74 6f 20 62 65  ive SELECT to be
10940 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
10950 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
10960 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
10970 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
10980 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69  ts */.){.  SrcLi
10990 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53  st *pSrc = p->pS
109a0 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  rc;      /* The 
109b0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
109c0 68 65 20 72 65 63 75 72 73 69 76 65 20 71 75 65  he recursive que
109d0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  ry */.  int nCol
109e0 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45   = p->pEList->nE
109f0 78 70 72 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  xpr;  /* Number 
10a00 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
10a10 65 20 72 65 63 75 72 73 69 76 65 20 74 61 62 6c  e recursive tabl
10a20 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  e */.  Vdbe *v =
10a30 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
10a40 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70       /* The prep
10a50 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75  ared statement u
10a60 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
10a70 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  n */.  Select *p
10a80 53 65 74 75 70 20 3d 20 70 2d 3e 70 50 72 69 6f  Setup = p->pPrio
10a90 72 3b 20 20 20 2f 2a 20 54 68 65 20 73 65 74 75  r;   /* The setu
10aa0 70 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  p query */.  int
10ab0 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20   addrTop;       
10ac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
10ad0 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  p of the loop */
10ae0 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 2c  .  int addrCont,
10af0 20 61 64 64 72 42 72 65 61 6b 3b 20 20 20 20 20   addrBreak;     
10b00 20 2f 2a 20 43 4f 4e 54 49 4e 55 45 20 61 6e 64   /* CONTINUE and
10b10 20 42 52 45 41 4b 20 61 64 64 72 65 73 73 65 73   BREAK addresses
10b20 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 72 65   */.  int iCurre
10b30 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nt = 0;         
10b40 20 20 20 20 2f 2a 20 54 68 65 20 43 75 72 72 65      /* The Curre
10b50 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  nt table */.  in
10b60 74 20 72 65 67 43 75 72 72 65 6e 74 3b 20 20 20  t regCurrent;   
10b70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10b80 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
10b90 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f  Current table */
10ba0 0a 20 20 69 6e 74 20 69 51 75 65 75 65 3b 20 20  .  int iQueue;  
10bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bc0 20 2f 2a 20 54 68 65 20 51 75 65 75 65 20 74 61   /* The Queue ta
10bd0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 69  ble */.  int iDi
10be0 73 74 69 6e 63 74 20 3d 20 30 3b 20 20 20 20 20  stinct = 0;     
10bf0 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73         /* To ens
10c00 75 72 65 20 75 6e 69 71 75 65 20 72 65 73 75 6c  ure unique resul
10c10 74 73 20 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20  ts if UNION */. 
10c20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 53 52 54   int eDest = SRT
10c30 5f 46 69 66 6f 3b 20 20 20 20 20 20 20 20 20 2f  _Fifo;         /
10c40 2a 20 48 6f 77 20 74 6f 20 77 72 69 74 65 20 74  * How to write t
10c50 6f 20 51 75 65 75 65 20 2a 2f 0a 20 20 53 65 6c  o Queue */.  Sel
10c60 65 63 74 44 65 73 74 20 64 65 73 74 51 75 65 75  ectDest destQueu
10c70 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  e;         /* Se
10c80 6c 65 63 74 44 65 73 74 20 74 61 72 67 65 74 74  lectDest targett
10c90 69 6e 67 20 74 68 65 20 51 75 65 75 65 20 74 61  ing the Queue ta
10ca0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ble */.  int i; 
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cc0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
10cd0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
10ce0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
10cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
10d00 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 45 78  ult code */.  Ex
10d10 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
10d20 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
10d30 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
10d40 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  se */.  Expr *pL
10d50 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20  imit, *pOffset; 
10d60 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 4c        /* Saved L
10d70 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
10d80 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69  */.  int regLimi
10d90 74 2c 20 72 65 67 4f 66 66 73 65 74 3b 20 20 20  t, regOffset;   
10da0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20     /* Registers 
10db0 75 73 65 64 20 62 79 20 4c 49 4d 49 54 20 61 6e  used by LIMIT an
10dc0 64 20 4f 46 46 53 45 54 20 2a 2f 0a 0a 20 20 2f  d OFFSET */..  /
10dd0 2a 20 4f 62 74 61 69 6e 20 61 75 74 68 6f 72 69  * Obtain authori
10de0 7a 61 74 69 6f 6e 20 74 6f 20 64 6f 20 61 20 72  zation to do a r
10df0 65 63 75 72 73 69 76 65 20 71 75 65 72 79 20 2a  ecursive query *
10e00 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  /.  if( sqlite3A
10e10 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
10e20 20 53 51 4c 49 54 45 5f 52 45 43 55 52 53 49 56   SQLITE_RECURSIV
10e30 45 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65  E, 0, 0, 0) ) re
10e40 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63  turn;..  /* Proc
10e50 65 73 73 20 74 68 65 20 4c 49 4d 49 54 20 61 6e  ess the LIMIT an
10e60 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  d OFFSET clauses
10e70 2c 20 69 66 20 74 68 65 79 20 65 78 69 73 74 20  , if they exist 
10e80 2a 2f 0a 20 20 61 64 64 72 42 72 65 61 6b 20 3d  */.  addrBreak =
10e90 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
10ea0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70  Label(v);.  comp
10eb0 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
10ec0 73 28 70 50 61 72 73 65 2c 20 70 2c 20 61 64 64  s(pParse, p, add
10ed0 72 42 72 65 61 6b 29 3b 0a 20 20 70 4c 69 6d 69  rBreak);.  pLimi
10ee0 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
10ef0 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f   pOffset = p->pO
10f00 66 66 73 65 74 3b 0a 20 20 72 65 67 4c 69 6d 69  ffset;.  regLimi
10f10 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20  t = p->iLimit;. 
10f20 20 72 65 67 4f 66 66 73 65 74 20 3d 20 70 2d 3e   regOffset = p->
10f30 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70 4c  iOffset;.  p->pL
10f40 69 6d 69 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  imit = p->pOffse
10f50 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 4c 69 6d  t = 0;.  p->iLim
10f60 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 20  it = p->iOffset 
10f70 3d 20 30 3b 0a 20 20 70 4f 72 64 65 72 42 79 20  = 0;.  pOrderBy 
10f80 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a  = p->pOrderBy;..
10f90 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
10fa0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
10fb0 20 74 68 65 20 43 75 72 72 65 6e 74 20 74 61 62   the Current tab
10fc0 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  le */.  for(i=0;
10fd0 20 41 4c 57 41 59 53 28 69 3c 70 53 72 63 2d 3e   ALWAYS(i<pSrc->
10fe0 6e 53 72 63 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  nSrc); i++){.   
10ff0 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69 5d 2e   if( pSrc->a[i].
11000 69 73 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  isRecursive ){. 
11010 20 20 20 20 20 69 43 75 72 72 65 6e 74 20 3d 20       iCurrent = 
11020 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  pSrc->a[i].iCurs
11030 6f 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  or;.      break;
11040 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
11050 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72   Allocate cursor
11060 73 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 51 75  s numbers for Qu
11070 65 75 65 20 61 6e 64 20 44 69 73 74 69 6e 63 74  eue and Distinct
11080 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75  .  The cursor nu
11090 6d 62 65 72 20 66 6f 72 0a 20 20 2a 2a 20 74 68  mber for.  ** th
110a0 65 20 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65  e Distinct table
110b0 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79   must be exactly
110c0 20 6f 6e 65 20 67 72 65 61 74 65 72 20 74 68 61   one greater tha
110d0 6e 20 51 75 65 75 65 20 69 6e 20 6f 72 64 65 72  n Queue in order
110e0 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 53 52  .  ** for the SR
110f0 54 5f 44 69 73 74 46 69 66 6f 20 61 6e 64 20 53  T_DistFifo and S
11100 52 54 5f 44 69 73 74 51 75 65 75 65 20 64 65 73  RT_DistQueue des
11110 74 69 6e 61 74 69 6f 6e 73 20 74 6f 20 77 6f 72  tinations to wor
11120 6b 2e 20 2a 2f 0a 20 20 69 51 75 65 75 65 20 3d  k. */.  iQueue =
11130 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
11140 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b  .  if( p->op==TK
11150 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 65 44  _UNION ){.    eD
11160 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20 3f  est = pOrderBy ?
11170 20 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 3a   SRT_DistQueue :
11180 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3b 0a 20   SRT_DistFifo;. 
11190 20 20 20 69 44 69 73 74 69 6e 63 74 20 3d 20 70     iDistinct = p
111a0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
111b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 44 65 73   }else{.    eDes
111c0 74 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 53  t = pOrderBy ? S
111d0 52 54 5f 51 75 65 75 65 20 3a 20 53 52 54 5f 46  RT_Queue : SRT_F
111e0 69 66 6f 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ifo;.  }.  sqlit
111f0 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
11200 28 26 64 65 73 74 51 75 65 75 65 2c 20 65 44 65  (&destQueue, eDe
11210 73 74 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20  st, iQueue);..  
11220 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73  /* Allocate curs
11230 6f 72 73 20 66 6f 72 20 43 75 72 72 65 6e 74 2c  ors for Current,
11240 20 51 75 65 75 65 2c 20 61 6e 64 20 44 69 73 74   Queue, and Dist
11250 69 6e 63 74 2e 20 2a 2f 0a 20 20 72 65 67 43 75  inct. */.  regCu
11260 72 72 65 6e 74 20 3d 20 2b 2b 70 50 61 72 73 65  rrent = ++pParse
11270 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65  ->nMem;.  sqlite
11280 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
11290 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 43  P_OpenPseudo, iC
112a0 75 72 72 65 6e 74 2c 20 72 65 67 43 75 72 72 65  urrent, regCurre
112b0 6e 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 69 66 28  nt, nCol);.  if(
112c0 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
112d0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
112e0 66 6f 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  fo = multiSelect
112f0 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 70  OrderByKeyInfo(p
11300 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20  Parse, p, 1);.  
11310 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11320 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
11330 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c  hemeral, iQueue,
11340 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
11350 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  +2, 0,.         
11360 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
11370 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
11380 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 64  _KEYINFO);.    d
11390 65 73 74 51 75 65 75 65 2e 70 4f 72 64 65 72 42  estQueue.pOrderB
113a0 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
113b0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
113c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
113d0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
113e0 2c 20 69 51 75 65 75 65 2c 20 6e 43 6f 6c 29 3b  , iQueue, nCol);
113f0 0a 20 20 7d 0a 20 20 56 64 62 65 43 6f 6d 6d 65  .  }.  VdbeComme
11400 6e 74 28 28 76 2c 20 22 51 75 65 75 65 20 74 61  nt((v, "Queue ta
11410 62 6c 65 22 29 29 3b 0a 20 20 69 66 28 20 69 44  ble"));.  if( iD
11420 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 70  istinct ){.    p
11430 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
11440 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  ] = sqlite3VdbeA
11450 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
11460 45 70 68 65 6d 65 72 61 6c 2c 20 69 44 69 73 74  Ephemeral, iDist
11470 69 6e 63 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d  inct, 0);.    p-
11480 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
11490 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
114a0 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 61 63 68 20   }..  /* Detach 
114b0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
114c0 75 73 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6d  use from the com
114d0 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a  pound SELECT */.
114e0 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
114f0 30 3b 0a 0a 20 20 2f 2a 20 53 74 6f 72 65 20 74  0;..  /* Store t
11500 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
11510 65 20 73 65 74 75 70 2d 71 75 65 72 79 20 69 6e  e setup-query in
11520 20 51 75 65 75 65 2e 20 2a 2f 0a 20 20 70 53 65   Queue. */.  pSe
11530 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  tup->pNext = 0;.
11540 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
11550 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
11560 74 75 70 2c 20 26 64 65 73 74 51 75 65 75 65 29  tup, &destQueue)
11570 3b 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78  ;.  pSetup->pNex
11580 74 20 3d 20 70 3b 0a 20 20 69 66 28 20 72 63 20  t = p;.  if( rc 
11590 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72 65  ) goto end_of_re
115a0 63 75 72 73 69 76 65 5f 71 75 65 72 79 3b 0a 0a  cursive_query;..
115b0 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 65    /* Find the ne
115c0 78 74 20 72 6f 77 20 69 6e 20 74 68 65 20 51 75  xt row in the Qu
115d0 65 75 65 20 61 6e 64 20 6f 75 74 70 75 74 20 74  eue and output t
115e0 68 61 74 20 72 6f 77 20 2a 2f 0a 20 20 61 64 64  hat row */.  add
115f0 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
11600 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
11610 65 77 69 6e 64 2c 20 69 51 75 65 75 65 2c 20 61  ewind, iQueue, a
11620 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43  ddrBreak); VdbeC
11630 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f  overage(v);..  /
11640 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 6e  * Transfer the n
11650 65 78 74 20 72 6f 77 20 69 6e 20 51 75 65 75 65  ext row in Queue
11660 20 6f 76 65 72 20 74 6f 20 43 75 72 72 65 6e 74   over to Current
11670 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
11680 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75  eAddOp1(v, OP_Nu
11690 6c 6c 52 6f 77 2c 20 69 43 75 72 72 65 6e 74 29  llRow, iCurrent)
116a0 3b 20 2f 2a 20 54 6f 20 72 65 73 65 74 20 63 6f  ; /* To reset co
116b0 6c 75 6d 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20  lumn cache */.  
116c0 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
116d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
116e0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
116f0 6d 6e 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64  mn, iQueue, pOrd
11700 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72  erBy->nExpr+1, r
11710 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 65  egCurrent);.  }e
11720 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
11730 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11740 5f 52 6f 77 44 61 74 61 2c 20 69 51 75 65 75 65  _RowData, iQueue
11750 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20  , regCurrent);. 
11760 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
11770 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c  AddOp1(v, OP_Del
11780 65 74 65 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20  ete, iQueue);.. 
11790 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 73   /* Output the s
117a0 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72  ingle row in Cur
117b0 72 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 43 6f  rent */.  addrCo
117c0 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
117d0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
117e0 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 72 65  codeOffset(v, re
117f0 67 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e  gOffset, addrCon
11800 74 29 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65  t);.  selectInne
11810 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
11820 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 43 75 72   p->pEList, iCur
11830 72 65 6e 74 2c 0a 20 20 20 20 20 20 30 2c 20 30  rent,.      0, 0
11840 2c 20 70 44 65 73 74 2c 20 61 64 64 72 43 6f 6e  , pDest, addrCon
11850 74 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  t, addrBreak);. 
11860 20 69 66 28 20 72 65 67 4c 69 6d 69 74 20 29 7b   if( regLimit ){
11870 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11880 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a  AddOp3(v, OP_IfZ
11890 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c 20 61  ero, regLimit, a
118a0 64 64 72 42 72 65 61 6b 2c 20 2d 31 29 3b 0a 20  ddrBreak, -1);. 
118b0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
118c0 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  v);.  }.  sqlite
118d0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
118e0 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a  l(v, addrCont);.
118f0 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68  .  /* Execute th
11900 65 20 72 65 63 75 72 73 69 76 65 20 53 45 4c 45  e recursive SELE
11910 43 54 20 74 61 6b 69 6e 67 20 74 68 65 20 73 69  CT taking the si
11920 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72  ngle row in Curr
11930 65 6e 74 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ent as.  ** the 
11940 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 72 65  value for the re
11950 63 75 72 73 69 76 65 2d 74 61 62 6c 65 2e 20 53  cursive-table. S
11960 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
11970 20 69 6e 20 74 68 65 20 51 75 65 75 65 2e 0a 20   in the Queue.. 
11980 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20   */.  p->pPrior 
11990 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  = 0;.  sqlite3Se
119a0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
119b0 26 64 65 73 74 51 75 65 75 65 29 3b 0a 20 20 61  &destQueue);.  a
119c0 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72  ssert( p->pPrior
119d0 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 50 72 69  ==0 );.  p->pPri
119e0 6f 72 20 3d 20 70 53 65 74 75 70 3b 0a 0a 20 20  or = pSetup;..  
119f0 2f 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20  /* Keep running 
11a00 74 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74  the loop until t
11a10 68 65 20 51 75 65 75 65 20 69 73 20 65 6d 70 74  he Queue is empt
11a20 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  y */.  sqlite3Vd
11a30 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
11a40 6f 74 6f 2c 20 30 2c 20 61 64 64 72 54 6f 70 29  oto, 0, addrTop)
11a50 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
11a60 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
11a70 64 64 72 42 72 65 61 6b 29 3b 0a 0a 65 6e 64 5f  ddrBreak);..end_
11a80 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65  of_recursive_que
11a90 72 79 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70  ry:.  sqlite3Exp
11aa0 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  rListDelete(pPar
11ab0 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65  se->db, p->pOrde
11ac0 72 42 79 29 3b 0a 20 20 70 2d 3e 70 4f 72 64 65  rBy);.  p->pOrde
11ad0 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
11ae0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
11af0 69 6d 69 74 3b 0a 20 20 70 2d 3e 70 4f 66 66 73  imit;.  p->pOffs
11b00 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20  et = pOffset;.  
11b10 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66  return;.}.#endif
11b20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
11b30 43 54 45 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61  CTE */../* Forwa
11b40 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f  rd references */
11b50 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
11b60 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a  iSelectOrderBy(.
11b70 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
11b80 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
11b90 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
11ba0 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
11bb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
11bc0 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43  ht-most of SELEC
11bd0 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  Ts to be coded *
11be0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
11bf0 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
11c00 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
11c10 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b  ry results */.);
11c20 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
11c30 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
11c40 74 6f 20 70 72 6f 63 65 73 73 20 61 20 63 6f 6d  to process a com
11c50 70 6f 75 6e 64 20 71 75 65 72 79 20 66 6f 72 6d  pound query form
11c60 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20   from.** two or 
11c70 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20 71 75  more separate qu
11c80 65 72 69 65 73 20 75 73 69 6e 67 20 55 4e 49 4f  eries using UNIO
11c90 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58  N, UNION ALL, EX
11ca0 43 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45  CEPT, or.** INTE
11cb0 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20  RSECT.**.** "p" 
11cc0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69  points to the ri
11cd0 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20  ght-most of the 
11ce0 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68  two queries.  th
11cf0 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a  e query on the.*
11d00 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72  * left is p->pPr
11d10 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71  ior.  The left q
11d20 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20  uery could also 
11d30 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  be a compound qu
11d40 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20  ery.** in which 
11d50 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e  case this routin
11d60 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  e will be called
11d70 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a   recursively. .*
11d80 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73  *.** The results
11d90 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75   of the total qu
11da0 65 72 79 20 61 72 65 20 74 6f 20 62 65 20 77 72  ery are to be wr
11db0 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73  itten into a des
11dc0 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  tination.** of t
11dd0 79 70 65 20 65 44 65 73 74 20 77 69 74 68 20 70  ype eDest with p
11de0 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a  arameter iParm..
11df0 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a  **.** Example 1:
11e00 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72    Consider a thr
11e10 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20  ee-way compound 
11e20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
11e30 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
11e40 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20  a FROM t1 UNION 
11e50 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
11e60 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20   UNION SELECT c 
11e70 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68  FROM t3.**.** Th
11e80 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  is statement is 
11e90 70 61 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c  parsed up as fol
11ea0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
11eb0 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33  SELECT c FROM t3
11ec0 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20  .**      |.**   
11ed0 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45     `----->  SELE
11ee0 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20  CT b FROM t2.** 
11ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
11f00 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
11f10 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c     `------>  SEL
11f20 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a  ECT a FROM t1.**
11f30 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69  .** The arrows i
11f40 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20 61 62  n the diagram ab
11f50 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20 74 68  ove represent th
11f60 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20  e Select.pPrior 
11f70 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69  pointer..** So i
11f80 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
11f90 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20  s called with p 
11fa0 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20  equal to the t3 
11fb0 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70  query, then.** p
11fc0 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68  Prior will be th
11fd0 65 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e  e t2 query.  p->
11fe0 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e  op will be TK_UN
11ff0 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65  ION in this case
12000 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74  ..**.** Notice t
12010 68 61 74 20 62 65 63 61 75 73 65 20 6f 66 20 74  hat because of t
12020 68 65 20 77 61 79 20 53 51 4c 69 74 65 20 70 61  he way SQLite pa
12030 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45  rses compound SE
12040 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e  LECTs, the.** in
12050 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73  dividual selects
12060 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72   always group fr
12070 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
12080 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12090 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50  multiSelect(.  P
120a0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
120b0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
120c0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
120d0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
120e0 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
120f0 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
12100 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
12110 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
12120 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
12130 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
12140 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20  results */.){.  
12150 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12160 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73  OK;   /* Success
12170 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62   code from a sub
12180 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c  routine */.  Sel
12190 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20  ect *pPrior;    
121a0 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45     /* Another SE
121b0 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79  LECT immediately
121c0 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a   to our left */.
121d0 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
121e0 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
121f0 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73  ate code to this
12200 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63   VDBE */.  Selec
12210 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20  tDest dest;     
12220 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20   /* Alternative 
12230 64 61 74 61 20 64 65 73 74 69 6e 61 74 69 6f 6e  data destination
12240 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 44   */.  Select *pD
12250 65 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43  elete = 0;  /* C
12260 68 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73  hain of simple s
12270 65 6c 65 63 74 73 20 74 6f 20 64 65 6c 65 74 65  elects to delete
12280 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
12290 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  b;          /* D
122a0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
122b0 6f 6e 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  on */.#ifndef SQ
122c0 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
122d0 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 20 3d 20  N.  int iSub1 = 
122e0 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50  0;        /* EQP
122f0 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64   id of left-hand
12300 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
12310 69 53 75 62 32 20 3d 20 30 3b 20 20 20 20 20 20  iSub2 = 0;      
12320 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72    /* EQP id of r
12330 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20  ight-hand query 
12340 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  */.#endif..  /* 
12350 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  Make sure there 
12360 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f  is no ORDER BY o
12370 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f  r LIMIT clause o
12380 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e  n prior SELECTs.
12390 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20    Only.  ** the 
123a0 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f 73 74  last (right-most
123b0 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20  ) SELECT in the 
123c0 73 65 72 69 65 73 20 6d 61 79 20 68 61 76 65 20  series may have 
123d0 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c  an ORDER BY or L
123e0 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  IMIT..  */.  ass
123f0 65 72 74 28 20 70 20 26 26 20 70 2d 3e 70 50 72  ert( p && p->pPr
12400 69 6f 72 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69  ior );  /* Calli
12410 6e 67 20 66 75 6e 63 74 69 6f 6e 20 67 75 61 72  ng function guar
12420 61 6e 74 65 65 73 20 74 68 69 73 20 6d 75 63 68  antees this much
12430 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
12440 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
12450 52 65 63 75 72 73 69 76 65 29 3d 3d 30 20 7c 7c  Recursive)==0 ||
12460 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c   p->op==TK_ALL |
12470 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  | p->op==TK_UNIO
12480 4e 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  N );.  db = pPar
12490 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72 69 6f 72  se->db;.  pPrior
124a0 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
124b0 64 65 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20  dest = *pDest;. 
124c0 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72   if( pPrior->pOr
124d0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  derBy ){.    sql
124e0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
124f0 72 73 65 2c 22 4f 52 44 45 52 20 42 59 20 63 6c  rse,"ORDER BY cl
12500 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65  ause should come
12510 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65   after %s not be
12520 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c  fore",.      sel
12530 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
12540 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  );.    rc = 1;. 
12550 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
12560 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  lect_end;.  }.  
12570 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  if( pPrior->pLim
12580 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
12590 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
125a0 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73  ,"LIMIT clause s
125b0 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72  hould come after
125c0 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c   %s not before",
125d0 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e  .      selectOpN
125e0 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
125f0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
12600 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
12610 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73  nd;.  }..  v = s
12620 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
12630 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
12640 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65   v!=0 );  /* The
12650 20 56 44 42 45 20 61 6c 72 65 61 64 79 20 63 72   VDBE already cr
12660 65 61 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67  eated by calling
12670 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20   function */..  
12680 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 65  /* Create the de
12690 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72  stination tempor
126a0 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63  ary table if nec
126b0 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66  essary.  */.  if
126c0 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52  ( dest.eDest==SR
126d0 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20  T_EphemTab ){.  
126e0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
126f0 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ist );.    sqlit
12700 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12710 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
12720 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20  , dest.iSDParm, 
12730 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
12740 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
12750 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54  beChangeP5(v, BT
12760 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a  REE_UNORDERED);.
12770 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d      dest.eDest =
12780 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a   SRT_Table;.  }.
12790 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
127a0 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74  all SELECTs in t
127b0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76  he statement hav
127c0 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
127d0 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20  r of elements.  
127e0 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73 75  ** in their resu
127f0 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20  lt sets..  */.  
12800 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
12810 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c  t && pPrior->pEL
12820 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ist );.  if( p->
12830 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70  pEList->nExpr!=p
12840 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e  Prior->pEList->n
12850 45 78 70 72 20 29 7b 0a 20 20 20 20 69 66 28 20  Expr ){.    if( 
12860 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
12870 5f 56 61 6c 75 65 73 20 29 7b 0a 20 20 20 20 20  _Values ){.     
12880 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
12890 28 70 50 61 72 73 65 2c 20 22 61 6c 6c 20 56 41  (pParse, "all VA
128a0 4c 55 45 53 20 6d 75 73 74 20 68 61 76 65 20 74  LUES must have t
128b0 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
128c0 66 20 74 65 72 6d 73 22 29 3b 0a 20 20 20 20 7d  f terms");.    }
128d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
128e0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
128f0 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20  se, "SELECTs to 
12900 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67  the left and rig
12910 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20  ht of %s".      
12920 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20    " do not have 
12930 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
12940 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
12950 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65  s", selectOpName
12960 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 7d 0a  (p->op));.    }.
12970 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
12980 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
12990 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 23 69 66 6e  t_end;.  }..#ifn
129a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
129b0 43 54 45 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c  CTE.  if( p->sel
129c0 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
129d0 73 69 76 65 20 29 7b 0a 20 20 20 20 67 65 6e 65  sive ){.    gene
129e0 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69 76  rateWithRecursiv
129f0 65 51 75 65 72 79 28 70 50 61 72 73 65 2c 20 70  eQuery(pParse, p
12a00 2c 20 26 64 65 73 74 29 3b 0a 20 20 7d 65 6c 73  , &dest);.  }els
12a10 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43  e.#endif..  /* C
12a20 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20  ompound SELECTs 
12a30 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52 44  that have an ORD
12a40 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65  ER BY clause are
12a50 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74   handled separat
12a60 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ely..  */.  if( 
12a70 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
12a80 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53     return multiS
12a90 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50 61  electOrderBy(pPa
12aa0 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a  rse, p, pDest);.
12ab0 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 47 65    }else..  /* Ge
12ac0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
12ad0 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67  the left and rig
12ae0 68 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ht SELECT statem
12af0 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69  ents..  */.  swi
12b00 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
12b10 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b    case TK_ALL: {
12b20 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20  .      int addr 
12b30 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  = 0;.      int n
12b40 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 61 73 73  Limit;.      ass
12b50 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c  ert( !pPrior->pL
12b60 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 70 50  imit );.      pP
12b70 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 70  rior->iLimit = p
12b80 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->iLimit;.      
12b90 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 20  pPrior->iOffset 
12ba0 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  = p->iOffset;.  
12bb0 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d      pPrior->pLim
12bc0 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
12bd0 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f        pPrior->pO
12be0 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
12bf0 65 74 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  et;.      explai
12c00 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
12c10 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  1, pParse->iNext
12c20 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
12c30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
12c40 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
12c50 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20  or, &dest);.    
12c60 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
12c70 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
12c80 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
12c90 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
12ca0 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
12cb0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
12cc0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
12cd0 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d  0;.      p->iLim
12ce0 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69  it = pPrior->iLi
12cf0 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f  mit;.      p->iO
12d00 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e  ffset = pPrior->
12d10 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  iOffset;.      i
12d20 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  f( p->iLimit ){.
12d30 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73          addr = s
12d40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
12d50 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70  (v, OP_IfZero, p
12d60 2d 3e 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43  ->iLimit); VdbeC
12d70 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
12d80 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
12d90 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20  (v, "Jump ahead 
12da0 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64  if LIMIT reached
12db0 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "));.      }.   
12dc0 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
12dd0 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72  eger(iSub2, pPar
12de0 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
12df0 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
12e00 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
12e10 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a  rse, p, &dest);.
12e20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
12e30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
12e40 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d  .      pDelete =
12e50 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
12e60 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
12e70 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  rior;.      p->n
12e80 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72  SelectRow += pPr
12e90 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
12ea0 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f  .      if( pPrio
12eb0 72 2d 3e 70 4c 69 6d 69 74 0a 20 20 20 20 20 20  r->pLimit.      
12ec0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
12ed0 73 49 6e 74 65 67 65 72 28 70 50 72 69 6f 72 2d  sInteger(pPrior-
12ee0 3e 70 4c 69 6d 69 74 2c 20 26 6e 4c 69 6d 69 74  >pLimit, &nLimit
12ef0 29 0a 20 20 20 20 20 20 20 26 26 20 6e 4c 69 6d  ).       && nLim
12f00 69 74 3e 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65  it>0 && p->nSele
12f10 63 74 52 6f 77 20 3e 20 28 75 36 34 29 6e 4c 69  ctRow > (u64)nLi
12f20 6d 69 74 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  mit .      ){.  
12f30 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
12f40 52 6f 77 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20  Row = nLimit;.  
12f50 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
12f60 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20  addr ){.        
12f70 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
12f80 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
12f90 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
12fa0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
12fb0 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20  e TK_EXCEPT:.   
12fc0 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20   case TK_UNION: 
12fd0 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f  {.      int unio
12fe0 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73  nTab;    /* Curs
12ff0 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
13000 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
13010 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20   holding result 
13020 2a 2f 0a 20 20 20 20 20 20 75 38 20 6f 70 20 3d  */.      u8 op =
13030 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65   0;       /* One
13040 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65   of the SRT_ ope
13050 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79  rations to apply
13060 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20   to self */.    
13070 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20    int priorOp;  
13080 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f     /* The SRT_ o
13090 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c  peration to appl
130a0 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63  y to prior selec
130b0 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  ts */.      Expr
130c0 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73   *pLimit, *pOffs
130d0 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c  et; /* Saved val
130e0 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74  ues of p->nLimit
130f0 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20   and p->nOffset 
13100 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
13110 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  r;.      SelectD
13120 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a  est uniondest;..
13130 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
13140 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  p->op==TK_EXCEPT
13150 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
13160 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  se( p->op==TK_UN
13170 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 72 69  ION );.      pri
13180 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e  orOp = SRT_Union
13190 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74  ;.      if( dest
131a0 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20  .eDest==priorOp 
131b0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
131c0 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d   can reuse a tem
131d0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e  porary table gen
131e0 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c 45  erated by a SELE
131f0 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20  CT to our.      
13200 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20    ** right..    
13210 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
13220 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74  ssert( p->pLimit
13230 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e  ==0 );      /* N
13240 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65  ot allowed on le
13250 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20  ftward elements 
13260 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
13270 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30  t( p->pOffset==0
13280 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61   );     /* Not a
13290 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61  llowed on leftwa
132a0 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  rd elements */. 
132b0 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
132c0 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a  = dest.iSDParm;.
132d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
132e0 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20       /* We will 
132f0 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f  need to create o
13300 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79  ur own temporary
13310 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74   table to hold t
13320 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  he.        ** in
13330 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c  termediate resul
13340 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ts..        */. 
13350 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
13360 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
13370 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
13380 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
13390 20 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72   );.        addr
133a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
133b0 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
133c0 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54  phemeral, unionT
133d0 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ab, 0);.        
133e0 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
133f0 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31  penEphm[0] == -1
13400 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   );.        p->a
13410 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
13420 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 66   addr;.        f
13430 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d  indRightmost(p)-
13440 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
13450 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
13460 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13470 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
13480 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
13490 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  de the SELECT st
134a0 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20  atements to our 
134b0 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  left.      */.  
134c0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72      assert( !pPr
134d0 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b  ior->pOrderBy );
134e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
134f0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 75 6e  lectDestInit(&un
13500 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f 70  iondest, priorOp
13510 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20  , unionTab);.   
13520 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
13530 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72  eger(iSub1, pPar
13540 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
13550 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
13560 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
13570 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e  rse, pPrior, &un
13580 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20  iondest);.      
13590 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
135a0 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
135b0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
135c0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
135d0 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
135e0 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  CT statement.   
135f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
13600 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  p->op==TK_EXCEPT
13610 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d   ){.        op =
13620 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20   SRT_Except;.   
13630 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13640 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d    assert( p->op=
13650 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20  =TK_UNION );.   
13660 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e       op = SRT_Un
13670 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ion;.      }.   
13680 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
13690 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d  ;.      pLimit =
136a0 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
136b0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
136c0 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d  .      pOffset =
136d0 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
136e0 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
136f0 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65  0;.      unionde
13700 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20  st.eDest = op;. 
13710 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
13720 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50  nteger(iSub2, pP
13730 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
13740 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
13750 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
13760 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e  Parse, p, &union
13770 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
13780 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
13790 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a  E_OK );.      /*
137a0 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e   Query flattenin
137b0 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65  g in sqlite3Sele
137c0 63 74 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c  ct() might refil
137d0 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20  l p->pOrderBy.. 
137e0 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20       ** Be sure 
137f0 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72  to delete p->pOr
13800 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65  derBy, therefore
13810 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d  , to avoid a mem
13820 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20  ory leak. */.   
13830 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
13840 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
13850 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20  pOrderBy);.     
13860 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
13870 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
13880 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
13890 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
138a0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  y = 0;.      if(
138b0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
138c0 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
138d0 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c   += pPrior->nSel
138e0 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73 71  ectRow;.      sq
138f0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
13900 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
13910 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
13920 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = pLimit;.      
13930 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
13940 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69  fset;.      p->i
13950 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
13960 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
13970 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65  ..      /* Conve
13980 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74  rt the data in t
13990 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
139a0 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72  le into whatever
139b0 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69   form.      ** i
139c0 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72  t is that we cur
139d0 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20  rently need..   
139e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
139f0 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65  rt( unionTab==de
13a00 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64 65  st.iSDParm || de
13a10 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f  st.eDest!=priorO
13a20 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  p );.      if( d
13a30 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72  est.eDest!=prior
13a40 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  Op ){.        in
13a50 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
13a60 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20   iStart;.       
13a70 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
13a80 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  st );.        if
13a90 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52  ( dest.eDest==SR
13aa0 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
13ab0 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46        Select *pF
13ac0 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  irst = p;.      
13ad0 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73      while( pFirs
13ae0 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72  t->pPrior ) pFir
13af0 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72  st = pFirst->pPr
13b00 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67  ior;.          g
13b10 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
13b20 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46  es(pParse, 0, pF
13b30 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  irst->pEList);. 
13b40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13b50 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65   iBreak = sqlite
13b60 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
13b70 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74  );.        iCont
13b80 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
13b90 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
13ba0 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74      computeLimit
13bb0 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
13bc0 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  , p, iBreak);.  
13bd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13be0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
13bf0 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  wind, unionTab, 
13c00 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  iBreak); VdbeCov
13c10 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
13c20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
13c30 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
13c40 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 65  r(v);.        se
13c50 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
13c60 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
13c70 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 0a 20 20  st, unionTab,.  
13c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c90 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73        0, 0, &des
13ca0 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  t, iCont, iBreak
13cb0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
13cc0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
13cd0 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
13ce0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13cf0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
13d00 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53  xt, unionTab, iS
13d10 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65 72  tart); VdbeCover
13d20 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
13d30 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
13d40 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
13d50 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
13d60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13d70 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e   OP_Close, union
13d80 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Tab, 0);.      }
13d90 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13da0 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
13db0 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
13dc0 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b 20  TK_INTERSECT ); 
13dd0 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31  {.      int tab1
13de0 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e  , tab2;.      in
13df0 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
13e00 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45   iStart;.      E
13e10 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
13e20 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74  ffset;.      int
13e30 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c   addr;.      Sel
13e40 65 63 74 44 65 73 74 20 69 6e 74 65 72 73 65 63  ectDest intersec
13e50 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74  tdest;.      int
13e60 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49   r1;..      /* I
13e70 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66  NTERSECT is diff
13e80 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f  erent from the o
13e90 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72  thers since it r
13ea0 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a  equires.      **
13eb0 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74   two temporary t
13ec0 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74  ables.  Hence it
13ed0 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73   has its own cas
13ee0 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20  e.  Begin.      
13ef0 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67  ** by allocating
13f00 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77   the tables we w
13f10 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  ill need..      
13f20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20  */.      tab1 = 
13f30 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
13f40 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61        tab2 = pPa
13f50 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
13f60 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
13f70 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20  rderBy==0 );..  
13f80 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
13f90 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13fa0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
13fb0 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
13fc0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
13fd0 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
13fe0 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  -1 );.      p->a
13ff0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
14000 20 61 64 64 72 3b 0a 20 20 20 20 20 20 66 69 6e   addr;.      fin
14010 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73  dRightmost(p)->s
14020 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73  elFlags |= SF_Us
14030 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20  esEphemeral;.   
14040 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
14050 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f  List );..      /
14060 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43  * Code the SELEC
14070 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69  Ts to our left i
14080 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  nto temporary ta
14090 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20  ble "tab1"..    
140a0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
140b0 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
140c0 28 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c  (&intersectdest,
140d0 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31   SRT_Union, tab1
140e0 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
140f0 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31  SetInteger(iSub1
14100 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
14110 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
14120 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
14130 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
14140 72 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73  r, &intersectdes
14150 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
14160 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
14170 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
14180 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
14190 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
141a0 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74  rrent SELECT int
141b0 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
141c0 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a  e "tab2".      *
141d0 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  /.      addr = s
141e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
141f0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
14200 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a  eral, tab2, 0);.
14210 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
14220 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
14230 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
14240 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
14250 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  1] = addr;.     
14260 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
14270 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70        pLimit = p
14280 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
14290 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
142a0 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70       pOffset = p
142b0 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->pOffset;.     
142c0 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
142d0 0a 20 20 20 20 20 20 69 6e 74 65 72 73 65 63 74  .      intersect
142e0 64 65 73 74 2e 69 53 44 50 61 72 6d 20 3d 20 74  dest.iSDParm = t
142f0 61 62 32 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  ab2;.      expla
14300 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
14310 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b2, pParse->iNex
14320 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
14330 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
14340 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
14350 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b  &intersectdest);
14360 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14370 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14380 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20  ;.      pDelete 
14390 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
143a0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
143b0 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28  Prior;.      if(
143c0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70   p->nSelectRow>p
143d0 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
143e0 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  w ) p->nSelectRo
143f0 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  w = pPrior->nSel
14400 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73 71  ectRow;.      sq
14410 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
14420 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
14430 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
14440 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = pLimit;.      
14450 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
14460 66 73 65 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  fset;..      /* 
14470 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
14480 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73   take the inters
14490 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77  ection of the tw
144a0 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  o temporary.    
144b0 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20    ** tables..   
144c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
144d0 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
144e0 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e  .      if( dest.
144f0 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
14500 74 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65 6c  t ){.        Sel
14510 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b  ect *pFirst = p;
14520 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
14530 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29  pFirst->pPrior )
14540 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74   pFirst = pFirst
14550 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
14560 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
14570 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
14580 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29   pFirst->pEList)
14590 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
145a0 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
145b0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
145c0 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20  ;.      iCont = 
145d0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
145e0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63  abel(v);.      c
145f0 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
14600 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
14610 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
14620 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14630 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74  (v, OP_Rewind, t
14640 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  ab1, iBreak); Vd
14650 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
14660 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
14670 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
14680 73 65 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72  se);.      iStar
14690 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
146a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b  ddOp2(v, OP_RowK
146b0 65 79 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a 20  ey, tab1, r1);. 
146c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
146d0 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
146e0 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20  NotFound, tab2, 
146f0 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b 20 56  iCont, r1, 0); V
14700 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
14710 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
14720 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
14730 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  se, r1);.      s
14740 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
14750 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
14760 69 73 74 2c 20 74 61 62 31 2c 0a 20 20 20 20 20  ist, tab1,.     
14770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14780 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43   0, 0, &dest, iC
14790 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  ont, iBreak);.  
147a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
147b0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
147c0 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Cont);.      sql
147d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
147e0 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c  , OP_Next, tab1,
147f0 20 69 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f   iStart); VdbeCo
14800 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
14810 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
14820 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
14830 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
14840 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14850 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20  OP_Close, tab2, 
14860 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
14870 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14880 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30  P_Close, tab1, 0
14890 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
148a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65 78 70      }.  }..  exp
148b0 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50  lainComposite(pP
148c0 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75  arse, p->op, iSu
148d0 62 31 2c 20 69 53 75 62 32 2c 20 70 2d 3e 6f 70  b1, iSub2, p->op
148e0 21 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a  !=TK_ALL);..  /*
148f0 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69   Compute collati
14900 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75 73 65  ng sequences use
14910 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70 6f  d by .  ** tempo
14920 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64  rary tables need
14930 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
14940 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
14950 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68  ect..  ** Attach
14960 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
14970 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65  ucture to all te
14980 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 0a  mporary tables..
14990 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73    **.  ** This s
149a0 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62 79  ection is run by
149b0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
149c0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
149d0 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45   only..  ** SELE
149e0 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  CT statements to
149f0 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79 73   the left always
14a00 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 2e   skip this part.
14a10 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74    The right-most
14a20 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67  .  ** SELECT mig
14a30 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68 69  ht also skip thi
14a40 73 20 70 61 72 74 20 69 66 20 69 74 20 68 61 73  s part if it has
14a50 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61   no ORDER BY cla
14a60 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20  use and.  ** no 
14a70 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65 20  temp tables are 
14a80 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20  required..  */. 
14a90 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
14aa0 20 26 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65   & SF_UsesEpheme
14ab0 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ral ){.    int i
14ac0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14ad0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
14ae0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
14af0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
14b00 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  o;            /*
14b10 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
14b20 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65 73 75  nce for the resu
14b30 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65  lt set */.    Se
14b40 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  lect *pLoop;    
14b50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
14b60 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
14b70 67 68 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  gh SELECT statem
14b80 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c  ents */.    Coll
14b90 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20  Seq **apColl;   
14ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
14bb0 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68   looping through
14bc0 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
14bd0 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  [] */.    int nC
14be0 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
14bf0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
14c00 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
14c10 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20  result set */.. 
14c20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4e     assert( p->pN
14c30 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e 43  ext==0 );.    nC
14c40 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ol = p->pEList->
14c50 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79 49  nExpr;.    pKeyI
14c60 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
14c70 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 43  InfoAlloc(db, nC
14c80 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  ol, 1);.    if( 
14c90 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20  !pKeyInfo ){.   
14ca0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
14cb0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
14cc0 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
14cd0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  d;.    }.    for
14ce0 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65  (i=0, apColl=pKe
14cf0 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c  yInfo->aColl; i<
14d00 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c  nCol; i++, apCol
14d10 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43  l++){.      *apC
14d20 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  oll = multiSelec
14d30 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
14d40 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66   p, i);.      if
14d50 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a  ( 0==*apColl ){.
14d60 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20          *apColl 
14d70 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
14d80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
14d90 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b      for(pLoop=p;
14da0 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
14db0 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  oop->pPrior){.  
14dc0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32      for(i=0; i<2
14dd0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
14de0 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70  int addr = pLoop
14df0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69  ->addrOpenEphm[i
14e00 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ];.        if( a
14e10 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ddr<0 ){.       
14e20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20     /* If [0] is 
14e30 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20  unused then [1] 
14e40 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20  is also unused. 
14e50 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20   So we can.     
14e60 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73       ** always s
14e70 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73  afely abort as s
14e80 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73 74  oon as the first
14e90 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20   unused slot is 
14ea0 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20  found */.       
14eb0 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70     assert( pLoop
14ec0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
14ed0 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ]<0 );.         
14ee0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
14ef0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
14f00 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
14f10 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20   addr, nCol);.  
14f20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14f30 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64  eChangeP4(v, add
14f40 72 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65  r, (char*)sqlite
14f50 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79  3KeyInfoRef(pKey
14f60 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20  Info),.         
14f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f80 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a     P4_KEYINFO);.
14f90 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61          pLoop->a
14fa0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d  ddrOpenEphm[i] =
14fb0 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
14fc0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4b 65   }.    sqlite3Ke
14fd0 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49  yInfoUnref(pKeyI
14fe0 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69  nfo);.  }..multi
14ff0 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70  _select_end:.  p
15000 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 64 65  Dest->iSdst = de
15010 73 74 2e 69 53 64 73 74 3b 0a 20 20 70 44 65 73  st.iSdst;.  pDes
15020 74 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73 74 2e  t->nSdst = dest.
15030 6e 53 64 73 74 3b 0a 20 20 73 71 6c 69 74 65 33  nSdst;.  sqlite3
15040 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
15050 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74   pDelete);.  ret
15060 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
15070 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
15080 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
15090 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  */../*.** Code a
150a0 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  n output subrout
150b0 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74  ine for a corout
150c0 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ine implementati
150d0 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43  on of a.** SELEC
150e0 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a  T statment..**.*
150f0 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20 62 65  * The data to be
15100 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61   output is conta
15110 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53 64  ined in pIn->iSd
15120 73 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a  st.  There are.*
15130 2a 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c  * pIn->nSdst col
15140 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75  umns to be outpu
15150 74 2e 20 20 70 44 65 73 74 20 69 73 20 77 68 65  t.  pDest is whe
15160 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 73 68  re the output sh
15170 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e  ould.** be sent.
15180 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e  .**.** regReturn
15190 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
151a0 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20 68  f the register h
151b0 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f  olding the subro
151c0 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20  utine.** return 
151d0 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49  address..**.** I
151e0 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e  f regPrev>0 then
151f0 20 69 74 20 69 73 20 74 68 65 20 66 69 72 73 74   it is the first
15200 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20 76   register in a v
15210 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65  ector that.** re
15220 63 6f 72 64 73 20 74 68 65 20 70 72 65 76 69 6f  cords the previo
15230 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b  us output.  mem[
15240 72 65 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c  regPrev] is a fl
15250 61 67 20 74 68 61 74 20 69 73 20 66 61 6c 73 65  ag that is false
15260 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 73  .** if there has
15270 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75   been no previou
15280 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65  s output.  If re
15290 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64  gPrev>0 then cod
152a0 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65  e is.** generate
152b0 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 64 75  d to suppress du
152c0 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49  plicates.  pKeyI
152d0 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20  nfo is used for 
152e0 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79  comparing.** key
152f0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
15300 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70  LIMIT found in p
15310 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63  ->iLimit is reac
15320 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69  hed, jump immedi
15330 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65  ately to.** iBre
15340 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ak..*/.static in
15350 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  t generateOutput
15360 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61  Subroutine(.  Pa
15370 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
15380 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
15390 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
153a0 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
153b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
153c0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
153d0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
153e0 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  In,        /* Co
153f0 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e  routine supplyin
15400 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65  g data */.  Sele
15410 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
15420 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
15430 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f  send the data */
15440 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e  .  int regReturn
15450 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
15460 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  e return address
15470 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
15480 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20 20 20  nt regPrev,     
15490 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f         /* Previo
154a0 75 73 20 72 65 73 75 6c 74 20 72 65 67 69 73 74  us result regist
154b0 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65  er.  No uniquene
154c0 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79  ss if 0 */.  Key
154d0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
154e0 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70       /* For comp
154f0 61 72 69 6e 67 20 77 69 74 68 20 70 72 65 76 69  aring with previ
15500 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69  ous entry */.  i
15510 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20  nt iBreak       
15520 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
15530 65 72 65 20 69 66 20 77 65 20 68 69 74 20 74 68  ere if we hit th
15540 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20  e LIMIT */.){.  
15550 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
15560 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
15570 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20  Continue;.  int 
15580 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20  addr;..  addr = 
15590 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
155a0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43 6f  ntAddr(v);.  iCo
155b0 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
155c0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
155d0 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73  ;..  /* Suppress
155e0 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20   duplicates for 
155f0 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61  UNION, EXCEPT, a
15600 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20  nd INTERSECT .  
15610 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65 76  */.  if( regPrev
15620 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 2c 20   ){.    int j1, 
15630 6a 32 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c  j2;.    j1 = sql
15640 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
15650 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50  , OP_IfNot, regP
15660 72 65 76 29 3b 20 56 64 62 65 43 6f 76 65 72 61  rev); VdbeCovera
15670 67 65 28 76 29 3b 0a 20 20 20 20 6a 32 20 3d 20  ge(v);.    j2 = 
15680 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15690 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
156a0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67   pIn->iSdst, reg
156b0 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64  Prev+1, pIn->nSd
156c0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
156d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156e0 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33    (char*)sqlite3
156f0 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49  KeyInfoRef(pKeyI
15700 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  nfo), P4_KEYINFO
15710 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
15720 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
15730 75 6d 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e 74  ump, j2+2, iCont
15740 69 6e 75 65 2c 20 6a 32 2b 32 29 3b 20 56 64 62  inue, j2+2); Vdb
15750 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
15760 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
15770 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20  pHere(v, j1);.  
15780 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15790 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op3(v, OP_Copy, 
157a0 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50  pIn->iSdst, regP
157b0 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73  rev+1, pIn->nSds
157c0 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t-1);.    sqlite
157d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
157e0 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65  P_Integer, 1, re
157f0 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66  gPrev);.  }.  if
15800 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
15810 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
15820 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70  urn 0;..  /* Sup
15830 70 72 65 73 73 20 74 68 65 20 66 69 72 73 74 20  press the first 
15840 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20 69  OFFSET entries i
15850 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 46  f there is an OF
15860 46 53 45 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FSET clause.  */
15870 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c  .  codeOffset(v,
15880 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f   p->iOffset, iCo
15890 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 73 77 69 74  ntinue);..  swit
158a0 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  ch( pDest->eDest
158b0 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65   ){.    /* Store
158c0 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64   the result as d
158d0 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71  ata using a uniq
158e0 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20  ue key..    */. 
158f0 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
15900 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
15910 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
15920 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
15930 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
15940 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  rse);.      int 
15950 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r2 = sqlite3GetT
15960 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
15970 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15980 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
15990 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20  T_Table );.     
159a0 20 74 65 73 74 63 61 73 65 28 20 70 44 65 73 74   testcase( pDest
159b0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ->eDest==SRT_Eph
159c0 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 73  emTab );.      s
159d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
159e0 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
159f0 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  d, pIn->iSdst, p
15a00 49 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29 3b 0a  In->nSdst, r1);.
15a10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15a20 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
15a30 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69  wRowid, pDest->i
15a40 53 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20  SDParm, r2);.   
15a50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15a60 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
15a70 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  t, pDest->iSDPar
15a80 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20  m, r1, r2);.    
15a90 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
15aa0 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
15ab0 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 73  APPEND);.      s
15ac0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
15ad0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
15ae0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
15af0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
15b00 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
15b10 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
15b20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15b30 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
15b40 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65  /* If we are cre
15b50 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20  ating a set for 
15b60 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c  an "expr IN (SEL
15b70 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72  ECT ...)" constr
15b80 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  uct,.    ** then
15b90 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65   there should be
15ba0 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f   a single item o
15bb0 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72  n the stack.  Wr
15bc0 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ite this.    ** 
15bd0 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65  item into the se
15be0 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67  t table with bog
15bf0 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a  us data..    */.
15c00 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
15c10 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
15c20 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15c30 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 29 3b  pIn->nSdst==1 );
15c40 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e 61 66  .      pDest->af
15c50 66 53 64 73 74 20 3d 20 0a 20 20 20 20 20 20 20  fSdst = .       
15c60 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65    sqlite3Compare
15c70 41 66 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69  Affinity(p->pELi
15c80 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  st->a[0].pExpr, 
15c90 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29 3b  pDest->affSdst);
15ca0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
15cb0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
15cc0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
15cd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
15ce0 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
15cf0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31 2c 20   pIn->iSdst, 1, 
15d00 72 31 2c 20 26 70 44 65 73 74 2d 3e 61 66 66 53  r1, &pDest->affS
15d10 64 73 74 2c 31 29 3b 0a 20 20 20 20 20 20 73 71  dst,1);.      sq
15d20 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
15d30 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
15d40 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  rse, pIn->iSdst,
15d50 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
15d60 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15d70 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44  OP_IdxInsert, pD
15d80 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31  est->iSDParm, r1
15d90 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15da0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
15db0 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
15dc0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
15dd0 23 69 66 20 30 20 20 2f 2a 20 4e 65 76 65 72 20  #if 0  /* Never 
15de0 6f 63 63 75 72 73 20 6f 6e 20 61 6e 20 4f 52 44  occurs on an ORD
15df0 45 52 20 42 59 20 71 75 65 72 79 20 2a 2f 0a 20  ER BY query */. 
15e00 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77     /* If any row
15e10 20 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65   exist in the re
15e20 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64  sult set, record
15e30 20 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61   that fact and a
15e40 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  bort..    */.   
15e50 20 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73   case SRT_Exists
15e60 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
15e70 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15e80 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 44  P_Integer, 1, pD
15e90 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20  est->iSDParm);. 
15ea0 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
15eb0 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
15ec0 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
15ed0 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
15ee0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
15ef0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ndif..    /* If 
15f00 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72  this is a scalar
15f10 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20   select that is 
15f20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65  part of an expre
15f30 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ssion, then.    
15f40 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  ** store the res
15f50 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72  ults in the appr
15f60 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63  opriate memory c
15f70 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75  ell and break ou
15f80 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
15f90 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a  scan loop..    *
15fa0 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d  /.    case SRT_M
15fb0 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  em: {.      asse
15fc0 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d  rt( pIn->nSdst==
15fd0 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
15fe0 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
15ff0 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73  Parse, pIn->iSds
16000 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  t, pDest->iSDPar
16010 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20  m, 1);.      /* 
16020 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
16030 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f   will jump out o
16040 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  f the loop for u
16050 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
16060 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
16070 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
16080 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
16090 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  /..    /* The re
160a0 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64  sults are stored
160b0 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f   in a sequence o
160c0 66 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20  f registers.    
160d0 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  ** starting at p
160e0 44 65 73 74 2d 3e 69 53 64 73 74 2e 20 20 54 68  Dest->iSdst.  Th
160f0 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  en the co-routin
16100 65 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f  e yields..    */
16110 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f  .    case SRT_Co
16120 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20  routine: {.     
16130 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73   if( pDest->iSds
16140 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
16150 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 73  pDest->iSdst = s
16160 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
16170 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ge(pParse, pIn->
16180 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20  nSdst);.        
16190 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 70  pDest->nSdst = p
161a0 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20 20 20  In->nSdst;.     
161b0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
161c0 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
161d0 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  rse, pIn->iSdst,
161e0 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 70   pDest->iSdst, p
161f0 44 65 73 74 2d 3e 6e 53 64 73 74 29 3b 0a 20 20  Dest->nSdst);.  
16200 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16210 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
16220 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
16230 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  m);.      break;
16240 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
16250 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61 62  f none of the ab
16260 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ove, then the re
16270 73 75 6c 74 20 64 65 73 74 69 6e 61 74 69 6f 6e  sult destination
16280 20 6d 75 73 74 20 62 65 0a 20 20 20 20 2a 2a 20   must be.    ** 
16290 53 52 54 5f 4f 75 74 70 75 74 2e 20 20 54 68 69  SRT_Output.  Thi
162a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
162b0 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61  er called with a
162c0 6e 79 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20  ny other.    ** 
162d0 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65  destination othe
162e0 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 73 20  r than the ones 
162f0 68 61 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f 72  handled above or
16300 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20   SRT_Output..   
16310 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53   **.    ** For S
16320 52 54 5f 4f 75 74 70 75 74 2c 20 72 65 73 75 6c  RT_Output, resul
16330 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ts are stored in
16340 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
16350 65 67 69 73 74 65 72 73 2e 20 20 0a 20 20 20 20  egisters.  .    
16360 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f 50 5f 52  ** Then the OP_R
16370 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20  esultRow opcode 
16380 69 73 20 75 73 65 64 20 74 6f 20 63 61 75 73 65  is used to cause
16390 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
163a0 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  to.    ** return
163b0 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f 66   the next row of
163c0 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a   result..    */.
163d0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
163e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65       assert( pDe
163f0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  st->eDest==SRT_O
16400 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 73  utput );.      s
16410 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16420 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
16430 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
16440 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
16450 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
16460 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
16470 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64  pParse, pIn->iSd
16480 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
16490 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
164a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75    }.  }..  /* Ju
164b0 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
164c0 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65   the loop if the
164d0 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65   LIMIT is reache
164e0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
164f0 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  >iLimit ){.    s
16500 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
16510 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70  (v, OP_IfZero, p
16520 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  ->iLimit, iBreak
16530 2c 20 2d 31 29 3b 20 56 64 62 65 43 6f 76 65 72  , -1); VdbeCover
16540 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f  age(v);.  }..  /
16550 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 73  * Generate the s
16560 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  ubroutine return
16570 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
16580 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
16590 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  v, iContinue);. 
165a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
165b0 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
165c0 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20   regReturn);..  
165d0 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
165e0 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76  /*.** Alternativ
165f0 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
16600 74 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  t code generator
16610 20 66 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20   for cases when 
16620 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f  there.** is an O
16630 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a  RDER BY clause..
16640 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20  **.** We assume 
16650 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66  a query of the f
16660 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a  ollowing form:.*
16670 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63  *.**      <selec
16680 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20  tA>  <operator> 
16690 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45   <selectB>  ORDE
166a0 52 20 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73  R BY <orderbylis
166b0 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74  t>.**.** <operat
166c0 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e  or> is one of UN
166d0 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20  ION ALL, UNION, 
166e0 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52  EXCEPT, or INTER
166f0 53 45 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a  SECT.  The idea.
16700 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f  ** is to code bo
16710 74 68 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64  th <selectA> and
16720 20 3c 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20   <selectB> with 
16730 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
16740 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75  use as.** co-rou
16750 74 69 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e  tines.  Then run
16760 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73   the co-routines
16770 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64   in parallel and
16780 20 6d 65 72 67 65 20 74 68 65 20 72 65 73 75 6c   merge the resul
16790 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f  ts.** into the o
167a0 75 74 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74  utput.  In addit
167b0 69 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63  ion to the two c
167c0 6f 72 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65  oroutines (calle
167d0 64 20 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a  d selectA and.**
167e0 20 73 65 6c 65 63 74 42 29 20 74 68 65 72 65 20   selectB) there 
167f0 61 72 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65  are 7 subroutine
16800 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41  s:.**.**    outA
16810 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75  :    Move the ou
16820 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65  tput of the sele
16830 63 74 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e  ctA coroutine in
16840 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  to the output.**
16850 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
16860 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
16870 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74  ry..**.**    out
16880 42 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f  B:    Move the o
16890 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c  utput of the sel
168a0 65 63 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69  ectB coroutine i
168b0 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  nto the output.*
168c0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66  *             of
168d0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75   the compound qu
168e0 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65  ery.  (Only gene
168f0 72 61 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20  rated for UNION 
16900 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
16910 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45     UNION ALL.  E
16920 58 43 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54  XCEPT and INSERT
16930 53 45 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75  SECT never outpu
16940 74 20 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20  t a row that.** 
16950 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65              appe
16960 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a  ars only in B.).
16970 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20  **.**    AltB:  
16980 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68    Called when th
16990 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d  ere is data from
169a0 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73   both coroutines
169b0 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20   and A<B..**.** 
169c0 20 20 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c     AeqB:    Call
169d0 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
169e0 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20   data from both 
169f0 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41  coroutines and A
16a00 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67  ==B..**.**    Ag
16a10 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  tB:    Called wh
16a20 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61  en there is data
16a30 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75   from both corou
16a40 74 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a  tines and A>B..*
16a50 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20  *.**    EofA:   
16a60 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74   Called when dat
16a70 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66  a is exhausted f
16a80 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a  rom selectA..**.
16a90 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43  **    EofB:    C
16aa0 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20  alled when data 
16ab0 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f  is exhausted fro
16ac0 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a  m selectB..**.**
16ad0 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
16ae0 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65  ion of the latte
16af0 72 20 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e  r five subroutin
16b00 65 73 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69  es depend on whi
16b10 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72  ch .** <operator
16b20 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a  > is used:.**.**
16b30 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
16b40 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20  UNION ALL       
16b50 20 20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20    UNION         
16b60 20 20 20 45 58 43 45 50 54 20 20 20 20 20 20 20     EXCEPT       
16b70 20 20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20     INTERSECT.** 
16b80 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d           -------
16b90 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ------  --------
16ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d  ---------  -----
16bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d  ---------  -----
16bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
16bd0 20 20 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20    AltB:   outA, 
16be0 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c  nextA      outA,
16bf0 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74   nextA       out
16c00 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20  A, nextA        
16c10 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41   nextA.**.**   A
16c20 65 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78  eqB:   outA, nex
16c30 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41  tA         nextA
16c40 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78               nex
16c50 74 41 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c  tA         outA,
16c60 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41   nextA.**.**   A
16c70 67 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78  gtB:   outB, nex
16c80 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65  tB      outB, ne
16c90 78 74 42 20 20 20 20 20 20 20 20 20 20 6e 65 78  xtB          nex
16ca0 74 42 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  tB            ne
16cb0 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41  xtB.**.**   EofA
16cc0 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20  :   outB, nextB 
16cd0 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42       outB, nextB
16ce0 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 20 20            halt  
16cf0 20 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a             halt.
16d00 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20  **.**   EofB:   
16d10 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
16d20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
16d30 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
16d40 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a         halt.**.*
16d50 2a 20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41  * In the AltB, A
16d60 65 71 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75  eqB, and AgtB su
16d70 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f  broutines, an EO
16d80 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67  F on A following
16d90 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73   nextA.** causes
16da0 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75   an immediate ju
16db0 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61  mp to EofA and a
16dc0 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f  n EOF on B follo
16dd0 77 69 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65  wing nextB cause
16de0 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74  s.** an immediat
16df0 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20  e jump to EofB. 
16e00 20 57 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64   Within EofA and
16e10 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f   EofB, and EOF o
16e20 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f  n entry or.** fo
16e30 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61  llowing nextX ca
16e40 75 73 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74  uses a jump to t
16e50 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65  he end of the se
16e60 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e  lect processing.
16e70 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65  .**.** Duplicate
16e80 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20   removal in the 
16e90 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61  UNION, EXCEPT, a
16ea0 6e 64 20 49 4e 54 45 52 53 45 43 54 20 63 61 73  nd INTERSECT cas
16eb0 65 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a  es is handled.**
16ec0 20 77 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70   within the outp
16ed0 75 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20  ut subroutine.  
16ee0 54 68 65 20 72 65 67 50 72 65 76 20 72 65 67 69  The regPrev regi
16ef0 73 74 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74  ster set holds t
16f00 68 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a  he previously.**
16f10 20 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20   output value.  
16f20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  A comparison is 
16f30 6d 61 64 65 20 61 67 61 69 6e 73 74 20 74 68 69  made against thi
16f40 73 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20  s value and the 
16f50 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69  output.** is ski
16f60 70 70 65 64 20 69 66 20 74 68 65 20 6e 65 78 74  pped if the next
16f70 20 72 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62   results would b
16f80 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
16f90 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a  e previous..**.*
16fa0 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  * The implementa
16fb0 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20  tion plan is to 
16fc0 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77  implement the tw
16fd0 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  o coroutines and
16fe0 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75   seven.** subrou
16ff0 74 69 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65  tines first, the
17000 6e 20 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f  n put the contro
17010 6c 20 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62  l logic at the b
17020 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69  ottom.  Like thi
17030 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
17040 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20    goto Init.**  
17050 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e     coA: coroutin
17060 65 20 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79  e for left query
17070 20 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a   (A).**     coB:
17080 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72   coroutine for r
17090 69 67 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a  ight query (B).*
170a0 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75  *    outA: outpu
170b0 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a  t one row of A.*
170c0 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75  *    outB: outpu
170d0 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28  t one row of B (
170e0 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20  UNION and UNION 
170f0 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20  ALL only).**    
17100 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  EofA: ....**    
17110 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  EofB: ....**    
17120 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  AltB: ....**    
17130 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  AeqB: ....**    
17140 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  AgtB: ....**    
17150 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65  Init: initialize
17160 20 63 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73   coroutine regis
17170 74 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ters.**         
17180 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20   yield coA.**   
17190 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 41 29         if eof(A)
171a0 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20   goto EofA.**   
171b0 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42         yield coB
171c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20  .**          if 
171d0 65 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42  eof(B) goto EofB
171e0 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d  .**    Cmpr: Com
171f0 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20  pare A, B.**    
17200 20 20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c        Jump AltB,
17210 20 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20   AeqB, AgtB.**  
17220 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a     End: ....**.*
17230 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20  * We call AltB, 
17240 41 65 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41  AeqB, AgtB, EofA
17250 2c 20 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72  , and EofB "subr
17260 6f 75 74 69 6e 65 73 22 20 62 75 74 20 74 68 65  outines" but the
17270 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74  y are not.** act
17280 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69  ually called usi
17290 6e 67 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65  ng Gosub and the
172a0 79 20 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e  y do not Return.
172b0 20 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20    EofA and EofB 
172c0 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c  loop.** until al
172d0 6c 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73  l data is exhaus
172e0 74 65 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f  ted then jump to
172f0 20 74 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e   the "end" labe.
17300 20 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a    AltB, AeqB,.**
17310 20 61 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74   and AgtB jump t
17320 6f 20 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74  o either L2 or t
17330 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72  o one of EofA or
17340 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65   EofB..*/.#ifnde
17350 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
17360 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74  MPOUND_SELECT.st
17370 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
17380 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50  lectOrderBy(.  P
17390 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
173a0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
173b0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
173c0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
173d0 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
173e0 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
173f0 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
17400 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
17410 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
17420 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
17430 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20  results */.){.  
17440 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
17450 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
17460 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65  unters */.  Sele
17470 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20  ct *pPrior;     
17480 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c    /* Another SEL
17490 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ECT immediately 
174a0 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20  to our left */. 
174b0 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
174c0 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
174d0 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20  te code to this 
174e0 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74  VDBE */.  Select
174f0 44 65 73 74 20 64 65 73 74 41 3b 20 20 20 20 20  Dest destA;     
17500 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66  /* Destination f
17510 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a  or coroutine A *
17520 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
17530 65 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65 73  estB;     /* Des
17540 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72  tination for cor
17550 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e  outine B */.  in
17560 74 20 72 65 67 41 64 64 72 41 3b 20 20 20 20 20  t regAddrA;     
17570 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
17580 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
17590 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-A coroutine *
175a0 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 42  /.  int regAddrB
175b0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
175c0 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
175d0 72 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75  r select-B corou
175e0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
175f0 64 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20  drSelectA;      
17600 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
17610 65 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75  e select-A corou
17620 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
17630 64 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20  drSelectB;      
17640 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
17650 65 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75  e select-B corou
17660 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
17670 67 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 20  gOutA;          
17680 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
17690 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70  ter for the outp
176a0 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-A subroutine 
176b0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42  */.  int regOutB
176c0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ;          /* Ad
176d0 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
176e0 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20  or the output-B 
176f0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
17700 69 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20  int addrOutA;   
17710 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
17720 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41   of the output-A
17730 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
17740 20 69 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20   int addrOutB = 
17750 30 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  0;     /* Addres
17760 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d  s of the output-
17770 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
17780 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20    int addrEofA; 
17790 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
177a0 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
177b0 2d 41 2d 65 78 68 61 75 73 74 65 64 20 73 75 62  -A-exhausted sub
177c0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
177d0 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 3b 20 20   addrEofA_noB;  
177e0 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 65 20     /* Alternate 
177f0 61 64 64 72 45 6f 66 41 20 69 66 20 42 20 69 73  addrEofA if B is
17800 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a   uninitialized *
17810 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 42  /.  int addrEofB
17820 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
17830 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
17840 63 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20 73  ct-B-exhausted s
17850 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
17860 6e 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20 20  nt addrAltB;    
17870 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
17880 6f 66 20 74 68 65 20 41 3c 42 20 73 75 62 72 6f  of the A<B subro
17890 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
178a0 64 64 72 41 65 71 42 3b 20 20 20 20 20 20 20 20  ddrAeqB;        
178b0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
178c0 68 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74 69  he A==B subrouti
178d0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
178e0 41 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  AgtB;         /*
178f0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
17900 41 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  A>B subroutine *
17910 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74  /.  int regLimit
17920 41 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d  A;        /* Lim
17930 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  it register for 
17940 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e  select-A */.  in
17950 74 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20 20  t regLimitB;    
17960 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67      /* Limit reg
17970 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
17980 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50  -A */.  int regP
17990 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  rev;          /*
179a0 20 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69   A range of regi
179b0 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70 72  sters to hold pr
179c0 65 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f  evious output */
179d0 0a 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69  .  int savedLimi
179e0 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65  t;       /* Save
179f0 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c  d value of p->iL
17a00 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61  imit */.  int sa
17a10 76 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20  vedOffset;      
17a20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f  /* Saved value o
17a30 66 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a  f p->iOffset */.
17a40 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b    int labelCmpr;
17a50 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c          /* Label
17a60 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f   for the start o
17a70 66 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f  f the merge algo
17a80 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c  rithm */.  int l
17a90 61 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20  abelEnd;        
17aa0 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68   /* Label for th
17ab0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65  e end of the ove
17ac0 72 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74  rall SELECT stmt
17ad0 20 2a 2f 0a 20 20 69 6e 74 20 6a 31 3b 20 20 20   */.  int j1;   
17ae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
17af0 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ump instructions
17b00 20 74 68 61 74 20 67 65 74 20 72 65 74 61 72 67   that get retarg
17b10 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  etted */.  int o
17b20 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
17b30 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c   /* One of TK_AL
17b40 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f  L, TK_UNION, TK_
17b50 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52  EXCEPT, TK_INTER
17b60 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  SECT */.  KeyInf
17b70 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b 20  o *pKeyDup = 0; 
17b80 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e  /* Comparison in
17b90 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75  formation for du
17ba0 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20  plicate removal 
17bb0 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
17bc0 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f  eyMerge;   /* Co
17bd0 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61  mparison informa
17be0 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67  tion for merging
17bf0 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74   rows */.  sqlit
17c00 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
17c10 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
17c20 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  nection */.  Exp
17c30 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
17c40 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
17c50 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
17c60 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20  nt nOrderBy;    
17c70 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
17c80 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  f terms in the O
17c90 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
17ca0 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74  /.  int *aPermut
17cb0 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70  e;        /* Map
17cc0 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52 20  ping from ORDER 
17cd0 42 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73 75  BY terms to resu
17ce0 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a  lt set columns *
17cf0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
17d00 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
17d10 69 6e 74 20 69 53 75 62 31 3b 20 20 20 20 20 20  int iSub1;      
17d20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20        /* EQP id 
17d30 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65  of left-hand que
17d40 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  ry */.  int iSub
17d50 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  2;            /*
17d60 20 45 51 50 20 69 64 20 6f 66 20 72 69 67 68 74   EQP id of right
17d70 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23  -hand query */.#
17d80 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
17d90 20 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20   p->pOrderBy!=0 
17da0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  );.  assert( pKe
17db0 79 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d  yDup==0 ); /* "M
17dc0 61 6e 61 67 65 64 22 20 63 6f 64 65 20 6e 65 65  anaged" code nee
17dd0 64 73 20 74 68 69 73 2e 20 20 54 69 63 6b 65 74  ds this.  Ticket
17de0 20 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20   #3382. */.  db 
17df0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
17e00 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
17e10 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
17e20 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c  0 );       /* Al
17e30 72 65 61 64 79 20 74 68 72 6f 77 6e 20 74 68 65  ready thrown the
17e40 20 65 72 72 6f 72 20 69 66 20 56 44 42 45 20 61   error if VDBE a
17e50 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20  lloc failed */. 
17e60 20 6c 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69   labelEnd = sqli
17e70 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
17e80 28 76 29 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72  (v);.  labelCmpr
17e90 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
17ea0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a 20 20  keLabel(v);...  
17eb0 2f 2a 20 50 61 74 63 68 20 75 70 20 74 68 65 20  /* Patch up the 
17ec0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
17ed0 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f    */.  op = p->o
17ee0 70 3b 20 20 0a 20 20 70 50 72 69 6f 72 20 3d 20  p;  .  pPrior = 
17ef0 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73  p->pPrior;.  ass
17f00 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72  ert( pPrior->pOr
17f10 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 70 4f  derBy==0 );.  pO
17f20 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
17f30 65 72 42 79 3b 0a 20 20 61 73 73 65 72 74 28 20  erBy;.  assert( 
17f40 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 6e 4f  pOrderBy );.  nO
17f50 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
17f60 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a 20  y->nExpr;..  /* 
17f70 46 6f 72 20 6f 70 65 72 61 74 6f 72 73 20 6f 74  For operators ot
17f80 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41  her than UNION A
17f90 4c 4c 20 77 65 20 68 61 76 65 20 74 6f 20 6d 61  LL we have to ma
17fa0 6b 65 20 73 75 72 65 20 74 68 61 74 0a 20 20 2a  ke sure that.  *
17fb0 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  * the ORDER BY c
17fc0 6c 61 75 73 65 20 63 6f 76 65 72 73 20 65 76 65  lause covers eve
17fd0 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 72  ry term of the r
17fe0 65 73 75 6c 74 20 73 65 74 2e 20 20 41 64 64 0a  esult set.  Add.
17ff0 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74 68    ** terms to th
18000 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
18010 65 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  e as necessary..
18020 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d 54    */.  if( op!=T
18030 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f 72  K_ALL ){.    for
18040 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63  (i=1; db->malloc
18050 46 61 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c 3d  Failed==0 && i<=
18060 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
18070 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
18080 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
18090 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
180a0 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d   for(j=0, pItem=
180b0 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e  pOrderBy->a; j<n
180c0 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20 70 49  OrderBy; j++, pI
180d0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
180e0 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75  assert( pItem->u
180f0 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30  .x.iOrderByCol>0
18100 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
18110 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
18120 72 42 79 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61  rByCol==i ) brea
18130 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
18140 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79   if( j==nOrderBy
18150 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
18160 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
18170 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45  Expr(db, TK_INTE
18180 47 45 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  GER, 0);.       
18190 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
181a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
181b0 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  EM;.        pNew
181c0 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e  ->flags |= EP_In
181d0 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20  tValue;.        
181e0 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d  pNew->u.iValue =
181f0 20 69 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64   i;.        pOrd
18200 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
18210 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
18220 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
18230 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66  New);.        if
18240 28 20 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72  ( pOrderBy ) pOr
18250 64 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42  derBy->a[nOrderB
18260 79 2b 2b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  y++].u.x.iOrderB
18270 79 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20  yCol = (u16)i;. 
18280 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
18290 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74  ..  /* Compute t
182a0 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65  he comparison pe
182b0 72 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65  rmutation and ke
182c0 79 69 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73  yinfo that is us
182d0 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65  ed with.  ** the
182e0 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 75 73 65   permutation use
182f0 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
18300 66 20 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20  f the next.  ** 
18310 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 73 20 63  row of results c
18320 6f 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74  omes from select
18330 41 20 6f 72 20 73 65 6c 65 63 74 42 2e 20 20 41  A or selectB.  A
18340 6c 73 6f 20 61 64 64 20 65 78 70 6c 69 63 69 74  lso add explicit
18350 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73  .  ** collations
18360 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
18370 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 73 6f   clause terms so
18380 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 73   that when the s
18390 75 62 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74  ubqueries.  ** t
183a0 6f 20 74 68 65 20 72 69 67 68 74 20 61 6e 64 20  o the right and 
183b0 74 68 65 20 6c 65 66 74 20 61 72 65 20 65 76 61  the left are eva
183c0 6c 75 61 74 65 64 2c 20 74 68 65 79 20 75 73 65  luated, they use
183d0 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 2a   the correct.  *
183e0 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a  * collation..  *
183f0 2f 0a 20 20 61 50 65 72 6d 75 74 65 20 3d 20 73  /.  aPermute = s
18400 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
18410 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74  w(db, sizeof(int
18420 29 2a 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 69  )*nOrderBy);.  i
18430 66 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20  f( aPermute ){. 
18440 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
18450 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
18460 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74      for(i=0, pIt
18470 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20  em=pOrderBy->a; 
18480 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c  i<nOrderBy; i++,
18490 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
184a0 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
184b0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e  u.x.iOrderByCol>
184c0 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70  0.          && p
184d0 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
184e0 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74  ByCol<=p->pEList
184f0 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->nExpr );.     
18500 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70   aPermute[i] = p
18510 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
18520 42 79 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d  ByCol - 1;.    }
18530 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d  .    pKeyMerge =
18540 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
18550 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73  rByKeyInfo(pPars
18560 65 2c 20 70 2c 20 31 29 3b 0a 20 20 7d 65 6c 73  e, p, 1);.  }els
18570 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65  e{.    pKeyMerge
18580 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
18590 52 65 61 74 74 61 63 68 20 74 68 65 20 4f 52 44  Reattach the ORD
185a0 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20  ER BY clause to 
185b0 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  the query..  */.
185c0 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
185d0 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72 69  pOrderBy;.  pPri
185e0 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  or->pOrderBy = s
185f0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
18600 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f  p(pParse->db, pO
18610 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f  rderBy, 0);..  /
18620 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e  * Allocate a ran
18630 67 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20  ge of temporary 
18640 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68  registers and th
18650 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65 64  e KeyInfo needed
18660 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f  .  ** for the lo
18670 67 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65 73  gic that removes
18680 20 64 75 70 6c 69 63 61 74 65 20 72 65 73 75 6c   duplicate resul
18690 74 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65 0a  t rows when the.
186a0 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73    ** operator is
186b0 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
186c0 6f 72 20 49 4e 54 45 52 53 45 43 54 20 28 62 75  or INTERSECT (bu
186d0 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29  t not UNION ALL)
186e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
186f0 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72  =TK_ALL ){.    r
18700 65 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65  egPrev = 0;.  }e
18710 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78  lse{.    int nEx
18720 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  pr = p->pEList->
18730 6e 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  nExpr;.    asser
18740 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78  t( nOrderBy>=nEx
18750 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  pr || db->malloc
18760 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65  Failed );.    re
18770 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e  gPrev = pParse->
18780 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72  nMem+1;.    pPar
18790 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70  se->nMem += nExp
187a0 72 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r+1;.    sqlite3
187b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
187c0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
187d0 50 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79 44  Prev);.    pKeyD
187e0 75 70 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  up = sqlite3KeyI
187f0 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78  nfoAlloc(db, nEx
18800 70 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  pr, 1);.    if( 
18810 70 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20 20  pKeyDup ){.     
18820 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
18830 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
18840 6c 65 28 70 4b 65 79 44 75 70 29 20 29 3b 0a 20  le(pKeyDup) );. 
18850 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
18860 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
18870 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 43       pKeyDup->aC
18880 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65  oll[i] = multiSe
18890 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
188a0 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20  se, p, i);.     
188b0 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72     pKeyDup->aSor
188c0 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20  tOrder[i] = 0;. 
188d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
188e0 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72 61 74 65  . .  /* Separate
188f0 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 74 68   the left and th
18900 65 20 72 69 67 68 74 20 71 75 65 72 79 20 66 72  e right query fr
18910 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20  om one another. 
18920 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20   */.  p->pPrior 
18930 3d 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70  = 0;.  pPrior->p
18940 4e 65 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Next = 0;.  sqli
18950 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47  te3ResolveOrderG
18960 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
18970 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22  , p->pOrderBy, "
18980 4f 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70  ORDER");.  if( p
18990 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30  Prior->pPrior==0
189a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
189b0 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70  esolveOrderGroup
189c0 42 79 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  By(pParse, pPrio
189d0 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  r, pPrior->pOrde
189e0 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20  rBy, "ORDER");. 
189f0 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
18a00 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73   the limit regis
18a10 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74  ters */.  comput
18a20 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
18a30 70 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c  pParse, p, label
18a40 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69  End);.  if( p->i
18a50 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f  Limit && op==TK_
18a60 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69  ALL ){.    regLi
18a70 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  mitA = ++pParse-
18a80 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69  >nMem;.    regLi
18a90 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  mitB = ++pParse-
18aa0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
18ab0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18ac0 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66  OP_Copy, p->iOff
18ad0 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74  set ? p->iOffset
18ae0 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a  +1 : p->iLimit,.
18af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b10 20 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20    regLimitA);.  
18b20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18b30 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
18b40 72 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69  regLimitA, regLi
18b50 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  mitB);.  }else{.
18b60 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20      regLimitA = 
18b70 72 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20  regLimitB = 0;. 
18b80 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
18b90 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
18ba0 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d  imit);.  p->pLim
18bb0 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  it = 0;.  sqlite
18bc0 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
18bd0 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70  p->pOffset);.  p
18be0 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a  ->pOffset = 0;..
18bf0 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70    regAddrA = ++p
18c00 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
18c10 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72  egAddrB = ++pPar
18c20 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f  se->nMem;.  regO
18c30 75 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  utA = ++pParse->
18c40 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20  nMem;.  regOutB 
18c50 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
18c60 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
18c70 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 41  tDestInit(&destA
18c80 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
18c90 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71   regAddrA);.  sq
18ca0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
18cb0 6e 69 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f  nit(&destB, SRT_
18cc0 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
18cd0 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  drB);..  /* Gene
18ce0 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65  rate a coroutine
18cf0 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
18d00 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
18d10 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65  t to the.  ** le
18d20 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  ft of the compou
18d30 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74 68  nd operator - th
18d40 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20 20  e "A" select..  
18d50 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41  */.  addrSelectA
18d60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
18d70 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31  rrentAddr(v) + 1
18d80 3b 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33  ;.  j1 = sqlite3
18d90 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
18da0 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20  _InitCoroutine, 
18db0 72 65 67 41 64 64 72 41 2c 20 30 2c 20 61 64 64  regAddrA, 0, add
18dc0 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 56 64 62  rSelectA);.  Vdb
18dd0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c 65  eComment((v, "le
18de0 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20  ft SELECT"));.  
18df0 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d  pPrior->iLimit =
18e00 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 65 78   regLimitA;.  ex
18e10 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
18e20 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69  iSub1, pParse->i
18e30 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
18e40 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
18e50 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
18e60 64 65 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65  destA);.  sqlite
18e70 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
18e80 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20  P_EndCoroutine, 
18e90 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c  regAddrA);.  sql
18ea0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
18eb0 28 76 2c 20 6a 31 29 3b 0a 0a 20 20 2f 2a 20 47  (v, j1);..  /* G
18ec0 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74  enerate a corout
18ed0 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ine to evaluate 
18ee0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
18ef0 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68  ment on .  ** th
18f00 65 20 72 69 67 68 74 20 2d 20 74 68 65 20 22 42  e right - the "B
18f10 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20  " select.  */.  
18f20 61 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73 71  addrSelectB = sq
18f30 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
18f40 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 6a  Addr(v) + 1;.  j
18f50 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
18f60 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74  ddOp3(v, OP_Init
18f70 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
18f80 64 72 42 2c 20 30 2c 20 61 64 64 72 53 65 6c 65  drB, 0, addrSele
18f90 63 74 42 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  ctB);.  VdbeComm
18fa0 65 6e 74 28 28 76 2c 20 22 72 69 67 68 74 20 53  ent((v, "right S
18fb0 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76 65  ELECT"));.  save
18fc0 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d  dLimit = p->iLim
18fd0 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73 65  it;.  savedOffse
18fe0 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a  t = p->iOffset;.
18ff0 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65    p->iLimit = re
19000 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f  gLimitB;.  p->iO
19010 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20 65  ffset = 0;  .  e
19020 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
19030 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e  (iSub2, pParse->
19040 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
19050 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
19060 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
19070 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20  B);.  p->iLimit 
19080 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20  = savedLimit;.  
19090 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76  p->iOffset = sav
190a0 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69  edOffset;.  sqli
190b0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
190c0 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65   OP_EndCoroutine
190d0 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20  , regAddrB);..  
190e0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
190f0 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
19100 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e  tputs the curren
19110 74 20 72 6f 77 20 6f 66 20 74 68 65 20 41 0a 20  t row of the A. 
19120 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68   ** select as th
19130 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f  e next output ro
19140 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  w of the compoun
19150 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20  d select..  */. 
19160 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
19170 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75  ((v, "Output rou
19180 74 69 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a 20  tine for A"));. 
19190 20 61 64 64 72 4f 75 74 41 20 3d 20 67 65 6e 65   addrOutA = gene
191a0 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75  rateOutputSubrou
191b0 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20  tine(pParse,.   
191c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c                p,
191d0 20 26 64 65 73 74 41 2c 20 70 44 65 73 74 2c 20   &destA, pDest, 
191e0 72 65 67 4f 75 74 41 2c 0a 20 20 20 20 20 20 20  regOutA,.       
191f0 20 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65            regPre
19200 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65  v, pKeyDup, labe
19210 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47  lEnd);.  .  /* G
19220 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
19230 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
19240 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  s the current ro
19250 77 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a 20  w of the B.  ** 
19260 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65  select as the ne
19270 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66  xt output row of
19280 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
19290 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lect..  */.  if(
192a0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f   op==TK_ALL || o
192b0 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
192c0 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
192d0 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72  nt((v, "Output r
192e0 6f 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b  outine for B"));
192f0 0a 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d 20  .    addrOutB = 
19300 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75  generateOutputSu
19310 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c  broutine(pParse,
19320 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19330 20 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44 65    p, &destB, pDe
19340 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20 20  st, regOutB,.   
19350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
19360 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20  gPrev, pKeyDup, 
19370 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 20  labelEnd);.  }. 
19380 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
19390 6e 72 65 66 28 70 4b 65 79 44 75 70 29 3b 0a 0a  nref(pKeyDup);..
193a0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
193b0 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75  subroutine to ru
193c0 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c  n when the resul
193d0 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 41  ts from select A
193e0 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73  .  ** are exhaus
193f0 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74  ted and only dat
19400 61 20 69 6e 20 73 65 6c 65 63 74 20 42 20 72 65  a in select B re
19410 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  mains..  */.  if
19420 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  ( op==TK_EXCEPT 
19430 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  || op==TK_INTERS
19440 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45  ECT ){.    addrE
19450 6f 66 41 5f 6e 6f 42 20 3d 20 61 64 64 72 45 6f  ofA_noB = addrEo
19460 66 41 20 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a 20  fA = labelEnd;. 
19470 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64   }else{  .    Vd
19480 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
19490 2c 20 22 65 6f 66 2d 41 20 73 75 62 72 6f 75 74  , "eof-A subrout
194a0 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72  ine"));.    addr
194b0 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64  EofA = sqlite3Vd
194c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
194d0 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61  osub, regOutB, a
194e0 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 61 64  ddrOutB);.    ad
194f0 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 73 71 6c  drEofA_noB = sql
19500 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19510 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
19520 64 64 72 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  ddrB, labelEnd);
19530 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19550 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
19560 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
19570 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19580 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
19590 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53  EofA);.    p->nS
195a0 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69  electRow += pPri
195b0 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  or->nSelectRow;.
195c0 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
195d0 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
195e0 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20  to run when the 
195f0 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c  results from sel
19600 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20 65  ect B.  ** are e
19610 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c  xhausted and onl
19620 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74  y data in select
19630 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f   A remains..  */
19640 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
19650 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
19660 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45 6f  ddrEofB = addrEo
19670 66 41 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  fA;.    if( p->n
19680 53 65 6c 65 63 74 52 6f 77 20 3e 20 70 50 72 69  SelectRow > pPri
19690 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29  or->nSelectRow )
196a0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
196b0 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
196c0 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a  Row;.  }else{  .
196d0 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
196e0 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20 73  ent((v, "eof-B s
196f0 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
19700 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71 6c    addrEofB = sql
19710 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19720 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
19730 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a  utA, addrOutA);.
19740 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19750 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
19760 64 2c 20 72 65 67 41 64 64 72 41 2c 20 6c 61 62  d, regAddrA, lab
19770 65 6c 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65  elEnd); VdbeCove
19780 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
19790 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
197a0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
197b0 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20  drEofB);.  }..  
197c0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
197d0 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
197e0 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a  ase of A<B.  */.
197f0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
19800 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75  t((v, "A-lt-B su
19810 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61  broutine"));.  a
19820 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74 65  ddrAltB = 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 73  , addrOutA);.  s
19860 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19870 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
19880 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41  gAddrA, addrEofA
19890 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
198a0 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
198b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
198c0 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72  to, 0, labelCmpr
198d0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
198e0 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
198f0 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d 3d   the case of A==
19900 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  B.  */.  if( op=
19910 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61  =TK_ALL ){.    a
19920 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c  ddrAeqB = addrAl
19930 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  tB;.  }else if( 
19940 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
19950 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42   ){.    addrAeqB
19960 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 20   = addrAltB;.   
19970 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d   addrAltB++;.  }
19980 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f  else{.    VdbeNo
19990 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
199a0 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -eq-B subroutine
199b0 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65 71  "));.    addrAeq
199c0 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33 56  B =.    sqlite3V
199d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
199e0 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c  Yield, regAddrA,
199f0 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65   addrEofA); Vdbe
19a00 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
19a10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19a20 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
19a30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20  , labelCmpr);.  
19a40 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
19a50 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20   code to handle 
19a60 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42 0a  the case of A>B.
19a70 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
19a80 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67 74  omment((v, "A-gt
19a90 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
19aa0 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20 73  ;.  addrAgtB = s
19ab0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
19ac0 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20  tAddr(v);.  if( 
19ad0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70  op==TK_ALL || op
19ae0 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
19af0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19b00 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
19b10 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75   regOutB, addrOu
19b20 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  tB);.  }.  sqlit
19b30 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19b40 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
19b50 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56  rB, addrEofB); V
19b60 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
19b70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19b80 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
19b90 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a  0, labelCmpr);..
19ba0 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72    /* This code r
19bb0 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74  uns once to init
19bc0 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e  ialize everythin
19bd0 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  g..  */.  sqlite
19be0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
19bf0 20 6a 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   j1);.  sqlite3V
19c00 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19c10 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c  Yield, regAddrA,
19c20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b 20   addrEofA_noB); 
19c30 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
19c40 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
19c50 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
19c60 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72  , regAddrB, addr
19c70 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72  EofB); VdbeCover
19c80 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d  age(v);..  /* Im
19c90 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e  plement the main
19ca0 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f   merge loop.  */
19cb0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
19cc0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61  solveLabel(v, la
19cd0 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69  belCmpr);.  sqli
19ce0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
19cf0 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c   OP_Permutation,
19d00 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a   0, 0, 0, (char*
19d10 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e  )aPermute, P4_IN
19d20 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74  TARRAY);.  sqlit
19d30 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
19d40 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74  OP_Compare, dest
19d50 41 2e 69 53 64 73 74 2c 20 64 65 73 74 42 2e 69  A.iSdst, destB.i
19d60 53 64 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a  Sdst, nOrderBy,.
19d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d80 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
19d90 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45  pKeyMerge, P4_KE
19da0 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65  YINFO);.  sqlite
19db0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
19dc0 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29   OPFLAG_PERMUTE)
19dd0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
19de0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
19df0 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72  , addrAltB, addr
19e00 41 65 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b  AeqB, addrAgtB);
19e10 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
19e20 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  ;..  /* Jump to 
19e30 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69  the this point i
19e40 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69  n order to termi
19e50 6e 61 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a  nate the query..
19e60 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
19e70 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
19e80 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20  , labelEnd);..  
19e90 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65  /* Set the numbe
19ea0 72 20 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c 75  r of output colu
19eb0 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  mns.  */.  if( p
19ec0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
19ed0 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 53  _Output ){.    S
19ee0 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20  elect *pFirst = 
19ef0 70 50 72 69 6f 72 3b 0a 20 20 20 20 77 68 69 6c  pPrior;.    whil
19f00 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f  e( pFirst->pPrio
19f10 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69  r ) pFirst = pFi
19f20 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  rst->pPrior;.   
19f30 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
19f40 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
19f50 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
19f60 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73  .  }..  /* Reass
19f70 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75  embly the compou
19f80 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68 61 74  nd query so that
19f90 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65   it will be free
19fa0 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a  d correctly.  **
19fb0 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
19fc0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66  function */.  if
19fd0 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
19fe0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
19ff0 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50  Delete(db, p->pP
1a000 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  rior);.  }.  p->
1a010 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
1a020 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74  .  pPrior->pNext
1a030 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42   = p;..  /*** TB
1a040 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72 6f  D:  Insert subro
1a050 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63  utine calls to c
1a060 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e 20  lose cursors on 
1a070 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a  incomplete.  ***
1a080 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a 2a  * subqueries ***
1a090 2a 2f 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70  */.  explainComp
1a0a0 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d  osite(pParse, p-
1a0b0 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62  >op, iSub1, iSub
1a0c0 32 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  2, 0);.  return 
1a0d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
1a0e0 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
1a0f0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
1a100 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
1a110 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1a120 56 49 45 57 29 0a 2f 2a 20 46 6f 72 77 61 72 64  VIEW)./* Forward
1a130 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   Declarations */
1a140 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
1a150 73 74 45 78 70 72 4c 69 73 74 28 73 71 6c 69 74  stExprList(sqlit
1a160 65 33 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20  e3*, ExprList*, 
1a170 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b  int, ExprList*);
1a180 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
1a190 73 74 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33  stSelect(sqlite3
1a1a0 2a 2c 20 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74  *, Select *, int
1a1b0 2c 20 45 78 70 72 4c 69 73 74 20 2a 29 3b 0a 0a  , ExprList *);..
1a1c0 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75  /*.** Scan throu
1a1d0 67 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  gh the expressio
1a1e0 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63  n pExpr.  Replac
1a1f0 65 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63  e every referenc
1a200 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e  e to.** a column
1a210 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72   in table number
1a220 20 69 54 61 62 6c 65 20 77 69 74 68 20 61 20 63   iTable with a c
1a230 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75  opy of the iColu
1a240 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69  mn-th.** entry i
1a250 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20  n pEList.  (But 
1a260 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63 65 73  leave references
1a270 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f   to the ROWID co
1a280 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67  lumn .** unchang
1a290 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ed.).**.** This 
1a2a0 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74 20  routine is part 
1a2b0 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e  of the flattenin
1a2c0 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20  g procedure.  A 
1a2d0 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73  subquery.** whos
1a2e0 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20  e result set is 
1a2f0 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73  defined by pELis
1a300 74 20 61 70 70 65 61 72 73 20 61 73 20 65 6e 74  t appears as ent
1a310 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f  ry in the.** FRO
1a320 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
1a330 4c 45 43 54 20 73 75 63 68 20 74 68 61 74 20 74  LECT such that t
1a340 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 61  he VDBE cursor a
1a350 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a  ssigned to that.
1a360 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65  ** FORM clause e
1a370 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20  ntry is iTable. 
1a380 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
1a390 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ke the necessary
1a3a0 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20   .** changes to 
1a3b0 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74  pExpr so that it
1a3c0 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79   refers directly
1a3d0 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74   to the source t
1a3e0 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73  able.** of the s
1a3f0 75 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74  ubquery rather t
1a400 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
1a410 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a   the subquery..*
1a420 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 73  /.static Expr *s
1a430 75 62 73 74 45 78 70 72 28 0a 20 20 73 71 6c 69  ubstExpr(.  sqli
1a440 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
1a450 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63  /* Report malloc
1a460 20 65 72 72 6f 72 73 20 74 6f 20 74 68 69 73 20   errors to this 
1a470 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
1a480 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
1a490 20 20 20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77      /* Expr in w
1a4a0 68 69 63 68 20 73 75 62 73 74 69 74 75 74 69 6f  hich substitutio
1a4b0 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e  n occurs */.  in
1a4c0 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
1a4d0 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65    /* Table to be
1a4e0 20 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a   substituted */.
1a4f0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
1a500 73 74 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74  st    /* Substit
1a510 75 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ute expressions 
1a520 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70  */.){.  if( pExp
1a530 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  r==0 ) return 0;
1a540 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
1a550 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
1a560 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Expr->iTable==iT
1a570 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20  able ){.    if( 
1a580 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pExpr->iColumn<0
1a590 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
1a5a0 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20  >op = TK_NULL;. 
1a5b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a5c0 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Expr *pNew;.    
1a5d0 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
1a5e0 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43  !=0 && pExpr->iC
1a5f0 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45  olumn<pEList->nE
1a600 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  xpr );.      ass
1a610 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
1a620 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  t==0 && pExpr->p
1a630 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
1a640 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
1a650 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 4c 69  ExprDup(db, pELi
1a660 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f  st->a[pExpr->iCo
1a670 6c 75 6d 6e 5d 2e 70 45 78 70 72 2c 20 30 29 3b  lumn].pExpr, 0);
1a680 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1a690 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
1a6a0 70 72 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  pr);.      pExpr
1a6b0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20   = pNew;.    }. 
1a6c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 45 78 70   }else{.    pExp
1a6d0 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73 74  r->pLeft = subst
1a6e0 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e  Expr(db, pExpr->
1a6f0 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70  pLeft, iTable, p
1a700 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 45 78 70  EList);.    pExp
1a710 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62 73  r->pRight = subs
1a720 74 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d  tExpr(db, pExpr-
1a730 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c  >pRight, iTable,
1a740 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66   pEList);.    if
1a750 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
1a760 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
1a770 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
1a780 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20  substSelect(db, 
1a790 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
1a7a0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1a7b0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1a7c0 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
1a7d0 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70  t(db, pExpr->x.p
1a7e0 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  List, iTable, pE
1a7f0 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  List);.    }.  }
1a800 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b  .  return pExpr;
1a810 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
1a820 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20  ubstExprList(.  
1a830 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
1a840 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d       /* Report m
1a850 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72  alloc errors her
1a860 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
1a870 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c  *pList,     /* L
1a880 69 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20  ist to scan and 
1a890 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65  in which to make
1a8a0 20 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a   substitutes */.
1a8b0 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1a8c0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
1a8d0 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65  to be substitute
1a8e0 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
1a8f0 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53  *pEList     /* S
1a900 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73  ubstitute values
1a910 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
1a920 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1a930 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
1a940 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
1a950 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c  pr; i++){.    pL
1a960 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20  ist->a[i].pExpr 
1a970 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
1a980 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
1a990 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  r, iTable, pELis
1a9a0 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  t);.  }.}.static
1a9b0 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63   void substSelec
1a9c0 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
1a9d0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70  ,         /* Rep
1a9e0 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  ort malloc error
1a9f0 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65  s here */.  Sele
1aa00 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
1aa10 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   /* SELECT state
1aa20 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f  ment in which to
1aa30 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69   make substituti
1aa40 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ons */.  int iTa
1aa50 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ble,          /*
1aa60 20 54 61 62 6c 65 20 74 6f 20 62 65 20 72 65 70   Table to be rep
1aa70 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  laced */.  ExprL
1aa80 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20  ist *pEList     
1aa90 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61  /* Substitute va
1aaa0 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63  lues */.){.  Src
1aab0 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73 74  List *pSrc;.  st
1aac0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1aad0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
1aae0 69 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65  i;.  if( !p ) re
1aaf0 74 75 72 6e 3b 0a 20 20 73 75 62 73 74 45 78 70  turn;.  substExp
1ab00 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c  rList(db, p->pEL
1ab10 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ist, iTable, pEL
1ab20 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70  ist);.  substExp
1ab30 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 47 72  rList(db, p->pGr
1ab40 6f 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70  oupBy, iTable, p
1ab50 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45  EList);.  substE
1ab60 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70  xprList(db, p->p
1ab70 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c  OrderBy, iTable,
1ab80 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70   pEList);.  p->p
1ab90 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78  Having = substEx
1aba0 70 72 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  pr(db, p->pHavin
1abb0 67 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  g, iTable, pELis
1abc0 74 29 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20  t);.  p->pWhere 
1abd0 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
1abe0 70 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c  p->pWhere, iTabl
1abf0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
1ac00 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 2d  bstSelect(db, p-
1ac10 3e 70 50 72 69 6f 72 2c 20 69 54 61 62 6c 65 2c  >pPrior, iTable,
1ac20 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 53 72 63   pEList);.  pSrc
1ac30 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73   = p->pSrc;.  as
1ac40 73 65 72 74 28 20 70 53 72 63 20 29 3b 20 20 2f  sert( pSrc );  /
1ac50 2a 20 45 76 65 6e 20 66 6f 72 20 28 53 45 4c 45  * Even for (SELE
1ac60 43 54 20 31 29 20 77 65 20 68 61 76 65 3a 20 70  CT 1) we have: p
1ac70 53 72 63 21 3d 30 20 62 75 74 20 70 53 72 63 2d  Src!=0 but pSrc-
1ac80 3e 6e 53 72 63 3d 3d 30 20 2a 2f 0a 20 20 69 66  >nSrc==0 */.  if
1ac90 28 20 41 4c 57 41 59 53 28 70 53 72 63 29 20 29  ( ALWAYS(pSrc) )
1aca0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63  {.    for(i=pSrc
1acb0 2d 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70 53  ->nSrc, pItem=pS
1acc0 72 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  rc->a; i>0; i--,
1acd0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
1ace0 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c   substSelect(db,
1acf0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c   pItem->pSelect,
1ad00 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1ad10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
1ad20 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
1ad30 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
1ad40 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
1ad50 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1ad60 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65  IEW) */..#if !de
1ad70 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1ad80 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
1ad90 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1ada0 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20  MIT_VIEW)./*.** 
1adb0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
1adc0 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
1add0 20 73 75 62 71 75 65 72 69 65 73 20 61 73 20 61   subqueries as a
1ade0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74   performance opt
1adf0 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68  imization..** Th
1ae00 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1ae10 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73  ns 1 if it makes
1ae20 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69   changes and 0 i
1ae30 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20  f no flattening 
1ae40 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f  occurs..**.** To
1ae50 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20   understand the 
1ae60 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74  concept of flatt
1ae70 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20  ening, consider 
1ae80 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
1ae90 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
1aea0 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
1aeb0 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61  (SELECT x+y AS a
1aec0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
1aed0 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a  <100) WHERE a>5.
1aee0 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  **.** The defaul
1aef0 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65  t way of impleme
1af00 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79  nting this query
1af10 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74   is to execute t
1af20 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66  he.** subquery f
1af30 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74  irst and store t
1af40 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  he results in a 
1af50 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
1af60 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65   then.** run the
1af70 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20   outer query on 
1af80 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74  that temporary t
1af90 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75  able.  This requ
1afa0 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73  ires two.** pass
1afb0 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61  es over the data
1afc0 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  .  Furthermore, 
1afd0 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70  because the temp
1afe0 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68  orary table.** h
1aff0 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74  as no indices, t
1b000 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1b010 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  on the outer que
1b020 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ry cannot be.** 
1b030 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a  optimized..**.**
1b040 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
1b050 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74  tempts to rewrit
1b060 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61  e queries such a
1b070 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f  s the above into
1b080 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61  .** a single fla
1b090 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74  t select, like t
1b0a0 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  his:.**.**     S
1b0b0 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
1b0c0 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
1b0d0 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a  00 AND a>5.**.**
1b0e0 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   The code genera
1b0f0 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d  ted for this sim
1b100 70 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73  pification gives
1b110 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
1b120 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73  .** but only has
1b130 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74   to scan the dat
1b140 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63  a once.  And bec
1b150 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67  ause indices mig
1b160 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20  ht .** exist on 
1b170 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20  the table t1, a 
1b180 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66  complete scan of
1b190 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   the data might 
1b1a0 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a  be.** avoided..*
1b1b0 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20  *.** Flattening 
1b1c0 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65  is only attempte
1b1d0 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  d if all of the 
1b1e0 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
1b1f0 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  ue:.**.**   (1) 
1b200 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
1b210 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
1b220 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73  y do not both us
1b230 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  e aggregates..**
1b240 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20 73  .**   (2)  The s
1b250 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  ubquery is not a
1b260 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74  n aggregate or t
1b270 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1b280 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
1b290 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20 73  .**   (3)  The s
1b2a0 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74  ubquery is not t
1b2b0 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
1b2c0 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72   of a left outer
1b2d0 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20   join.**        
1b2e0 28 4f 72 69 67 69 6e 61 6c 6c 79 20 74 69 63 6b  (Originally tick
1b2f0 65 74 20 23 33 30 36 2e 20 20 53 74 72 65 6e 67  et #306.  Streng
1b300 74 68 65 6e 65 64 20 62 79 20 74 69 63 6b 65 74  thened by ticket
1b310 20 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20   #3300).**.**   
1b320 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (4)  The subquer
1b330 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43  y is not DISTINC
1b340 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  T..**.**  (**)  
1b350 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73  At one point res
1b360 74 72 69 63 74 69 6f 6e 73 20 28 34 29 20 61 6e  trictions (4) an
1b370 64 20 28 35 29 20 64 65 66 69 6e 65 64 20 61 20  d (5) defined a 
1b380 73 75 62 73 65 74 20 6f 66 20 44 49 53 54 49 4e  subset of DISTIN
1b390 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62  CT.**        sub
1b3a0 2d 71 75 65 72 69 65 73 20 74 68 61 74 20 77 65  -queries that we
1b3b0 72 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f 6d  re excluded from
1b3c0 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
1b3d0 6f 6e 2e 20 52 65 73 74 72 69 63 74 69 6f 6e 20  on. Restriction 
1b3e0 0a 2a 2a 20 20 20 20 20 20 20 20 28 34 29 20 68  .**        (4) h
1b3f0 61 73 20 73 69 6e 63 65 20 62 65 65 6e 20 65 78  as since been ex
1b400 70 61 6e 64 65 64 20 74 6f 20 65 78 63 6c 75 64  panded to exclud
1b410 65 20 61 6c 6c 20 44 49 53 54 49 4e 43 54 20 73  e all DISTINCT s
1b420 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a  ubqueries..**.**
1b430 20 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71     (6)  The subq
1b440 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
1b450 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20  e aggregates or 
1b460 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1b470 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  is not.**       
1b480 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a   DISTINCT..**.**
1b490 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71     (7)  The subq
1b4a0 75 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20  uery has a FROM 
1b4b0 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20  clause.  TODO:  
1b4c0 46 6f 72 20 73 75 62 71 75 65 72 69 65 73 20 77  For subqueries w
1b4d0 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20  ithout.**       
1b4e0 20 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20   A FROM clause, 
1b4f0 63 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20  consider adding 
1b500 61 20 46 52 4f 4d 20 63 6c 6f 73 65 20 77 69 74  a FROM close wit
1b510 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a  h the special.**
1b520 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 73 71          table sq
1b530 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74 20 63  lite_once that c
1b540 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73 69 6e  onsists of a sin
1b550 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69  gle row containi
1b560 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 73  ng a.**        s
1b570 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  ingle NULL..**.*
1b580 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75 62  *   (8)  The sub
1b590 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1b5a0 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
1b5b0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1b5c0 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
1b5d0 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62 71     (9)  The subq
1b5e0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
1b5f0 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
1b600 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
1b610 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20  not use.**      
1b620 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a    aggregates..**
1b630 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20 73  .**  (10)  The s
1b640 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1b650 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20   use aggregates 
1b660 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1b670 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20  ry does not.**  
1b680 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e        use LIMIT.
1b690 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68  .**.**  (11)  Th
1b6a0 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
1b6b0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
1b6c0 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20  o not both have 
1b6d0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73  ORDER BY clauses
1b6e0 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e  ..**.**  (**)  N
1b6f0 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20  ot implemented. 
1b700 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f 20 72   Subsumed into r
1b710 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29 2e 20  estriction (3). 
1b720 20 57 61 73 20 70 72 65 76 69 6f 75 73 6c 79 0a   Was previously.
1b730 2a 2a 20 20 20 20 20 20 20 20 61 20 73 65 70 61  **        a sepa
1b740 72 61 74 65 20 72 65 73 74 72 69 63 74 69 6f 6e  rate restriction
1b750 20 64 65 72 69 76 69 6e 67 20 66 72 6f 6d 20 74   deriving from t
1b760 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a  icket #350..**.*
1b770 2a 20 20 28 31 33 29 20 20 54 68 65 20 73 75 62  *  (13)  The sub
1b780 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20  query and outer 
1b790 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74  query do not bot
1b7a0 68 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a  h use LIMIT..**.
1b7b0 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20 73 75  **  (14)  The su
1b7c0 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
1b7d0 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a  use OFFSET..**.*
1b7e0 2a 20 20 28 31 35 29 20 20 54 68 65 20 6f 75 74  *  (15)  The out
1b7f0 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
1b800 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75  part of a compou
1b810 6e 64 20 73 65 6c 65 63 74 20 6f 72 20 74 68 65  nd select or the
1b820 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75  .**        subqu
1b830 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ery does not hav
1b840 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  e a LIMIT clause
1b850 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65  ..**        (See
1b860 20 74 69 63 6b 65 74 20 23 32 33 33 39 20 61 6e   ticket #2339 an
1b870 64 20 74 69 63 6b 65 74 20 5b 30 32 61 38 65 38  d ticket [02a8e8
1b880 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28  1d44])..**.**  (
1b890 31 36 29 20 20 54 68 65 20 6f 75 74 65 72 20 71  16)  The outer q
1b8a0 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61  uery is not an a
1b8b0 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20  ggregate or the 
1b8c0 73 75 62 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a  subquery does.**
1b8d0 20 20 20 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74          not cont
1b8e0 61 69 6e 20 4f 52 44 45 52 20 42 59 2e 20 20 28  ain ORDER BY.  (
1b8f0 54 69 63 6b 65 74 20 23 32 39 34 32 29 20 20 54  Ticket #2942)  T
1b900 68 69 73 20 75 73 65 64 20 74 6f 20 6e 6f 74 20  his used to not 
1b910 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20 20 20 20  matter.**       
1b920 20 75 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f 64   until we introd
1b930 75 63 65 64 20 74 68 65 20 67 72 6f 75 70 5f 63  uced the group_c
1b940 6f 6e 63 61 74 28 29 20 66 75 6e 63 74 69 6f 6e  oncat() function
1b950 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20  .  .**.**  (17) 
1b960 20 54 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   The sub-query i
1b970 73 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64  s not a compound
1b980 20 73 65 6c 65 63 74 2c 20 6f 72 20 69 74 20 69   select, or it i
1b990 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a  s a UNION ALL .*
1b9a0 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e  *        compoun
1b9b0 64 20 63 6c 61 75 73 65 20 6d 61 64 65 20 75 70  d clause made up
1b9c0 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e   entirely of non
1b9d0 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69  -aggregate queri
1b9e0 65 73 2c 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20  es, and .**     
1b9f0 20 20 20 74 68 65 20 70 61 72 65 6e 74 20 71 75     the parent qu
1ba00 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ery:.**.**      
1ba10 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 69 74 73      * is not its
1ba20 65 6c 66 20 70 61 72 74 20 6f 66 20 61 20 63 6f  elf part of a co
1ba30 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a  mpound select,.*
1ba40 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20  *          * is 
1ba50 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
1ba60 20 6f 72 20 44 49 53 54 49 4e 43 54 20 71 75 65   or DISTINCT que
1ba70 72 79 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ry, and.**      
1ba80 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 20 6a      * is not a j
1ba90 6f 69 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  oin.**.**       
1baa0 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64 20   The parent and 
1bab0 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63 6f  sub-query may co
1bac0 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61 75  ntain WHERE clau
1bad0 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a  ses. Subject to.
1bae0 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73 20  **        rules 
1baf0 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20 28  (11), (13) and (
1bb00 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61 6c  14), they may al
1bb10 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52  so contain ORDER
1bb20 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c   BY,.**        L
1bb30 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
1bb40 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20 73 75  clauses.  The su
1bb50 62 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 75 73  bquery cannot us
1bb60 65 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a  e any compound.*
1bb70 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f  *        operato
1bb80 72 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49  r other than UNI
1bb90 4f 4e 20 41 4c 4c 20 62 65 63 61 75 73 65 20 61  ON ALL because a
1bba0 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63 6f 6d  ll the other com
1bbb0 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  pound.**        
1bbc0 6f 70 65 72 61 74 6f 72 73 20 68 61 76 65 20 61  operators have a
1bbd0 6e 20 69 6d 70 6c 69 65 64 20 44 49 53 54 49 4e  n implied DISTIN
1bbe0 43 54 20 77 68 69 63 68 20 69 73 20 64 69 73 61  CT which is disa
1bbf0 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 20 20 20  llowed by.**    
1bc00 20 20 20 20 72 65 73 74 72 69 63 74 69 6f 6e 20      restriction 
1bc10 28 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  (4)..**.**      
1bc20 20 20 41 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d    Also, each com
1bc30 70 6f 6e 65 6e 74 20 6f 66 20 74 68 65 20 73 75  ponent of the su
1bc40 62 2d 71 75 65 72 79 20 6d 75 73 74 20 72 65 74  b-query must ret
1bc50 75 72 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  urn the same num
1bc60 62 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66  ber.**        of
1bc70 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e   result columns.
1bc80 20 54 68 69 73 20 69 73 20 61 63 74 75 61 6c 6c   This is actuall
1bc90 79 20 61 20 72 65 71 75 69 72 65 6d 65 6e 74 20  y a requirement 
1bca0 66 6f 72 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64  for any compound
1bcb0 0a 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43  .**        SELEC
1bcc0 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74  T statement, but
1bcd0 20 61 6c 6c 20 74 68 65 20 63 6f 64 65 20 68 65   all the code he
1bce0 72 65 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20  re does is make 
1bcf0 73 75 72 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20  sure that no.** 
1bd00 20 20 20 20 20 20 20 73 75 63 68 20 28 69 6c 6c         such (ill
1bd10 65 67 61 6c 29 20 73 75 62 2d 71 75 65 72 79 20  egal) sub-query 
1bd20 69 73 20 66 6c 61 74 74 65 6e 65 64 2e 20 54 68  is flattened. Th
1bd30 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65  e caller will de
1bd40 74 65 63 74 20 74 68 65 0a 2a 2a 20 20 20 20 20  tect the.**     
1bd50 20 20 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20     syntax error 
1bd60 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65 74  and return a det
1bd70 61 69 6c 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a  ailed message..*
1bd80 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49 66 20 74  *.**  (18)  If t
1bd90 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
1bda0 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
1bdb0 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d  t, then all term
1bdc0 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20  s of the.**     
1bdd0 20 20 20 4f 52 44 45 52 20 62 79 20 63 6c 61 75     ORDER by clau
1bde0 73 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  se of the parent
1bdf0 20 6d 75 73 74 20 62 65 20 73 69 6d 70 6c 65 20   must be simple 
1be00 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a  references to .*
1be10 2a 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73  *        columns
1be20 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   of the sub-quer
1be30 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20  y..**.**  (19)  
1be40 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1be50 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
1be60 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1be70 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20  ry does not.**  
1be80 20 20 20 20 20 20 68 61 76 65 20 61 20 57 48 45        have a WHE
1be90 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  RE clause..**.**
1bea0 20 20 28 32 30 29 20 20 49 66 20 74 68 65 20 73    (20)  If the s
1beb0 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
1bec0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74  mpound select, t
1bed0 68 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f 74 20  hen it must not 
1bee0 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e  use.**        an
1bef0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1bf00 2e 20 20 54 69 63 6b 65 74 20 23 33 37 37 33 2e  .  Ticket #3773.
1bf10 20 20 57 65 20 63 6f 75 6c 64 20 72 65 6c 61 78    We could relax
1bf20 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
1bf30 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d 65 77  .**        somew
1bf40 68 61 74 20 62 79 20 73 61 79 69 6e 67 20 74 68  hat by saying th
1bf50 61 74 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20  at the terms of 
1bf60 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1bf70 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20  use must.**     
1bf80 20 20 20 61 70 70 65 61 72 20 61 73 20 75 6e 6d     appear as unm
1bf90 6f 64 69 66 69 65 64 20 72 65 73 75 6c 74 20 63  odified result c
1bfa0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75  olumns in the ou
1bfb0 74 65 72 20 71 75 65 72 79 2e 20 20 42 75 74 20  ter query.  But 
1bfc0 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76  we.**        hav
1bfd0 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 61  e other optimiza
1bfe0 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f  tions in mind to
1bff0 20 64 65 61 6c 20 77 69 74 68 20 74 68 61 74 20   deal with that 
1c000 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31  case..**.**  (21
1c010 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1c020 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
1c030 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
1c040 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20  query is not.** 
1c050 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e         DISTINCT.
1c060 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 5b 37    (See ticket [7
1c070 35 32 65 31 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a  52e1646fc])..**.
1c080 2a 2a 20 20 28 32 32 29 20 20 54 68 65 20 73 75  **  (22)  The su
1c090 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20  bquery is not a 
1c0a0 72 65 63 75 72 73 69 76 65 20 43 54 45 2e 0a 2a  recursive CTE..*
1c0b0 2a 0a 2a 2a 20 20 28 32 33 29 20 20 54 68 65 20  *.**  (23)  The 
1c0c0 70 61 72 65 6e 74 20 69 73 20 6e 6f 74 20 61 20  parent is not a 
1c0d0 72 65 63 75 72 73 69 76 65 20 43 54 45 2c 20 6f  recursive CTE, o
1c0e0 72 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  r the sub-query 
1c0f0 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 20 20 20 20  is not a.**     
1c100 20 20 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72     compound quer
1c110 79 2e 20 54 68 69 73 20 72 65 73 74 72 69 63 74  y. This restrict
1c120 69 6f 6e 20 69 73 20 62 65 63 61 75 73 65 20 74  ion is because t
1c130 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 0a  ransforming the.
1c140 2a 2a 20 20 20 20 20 20 20 20 70 61 72 65 6e 74  **        parent
1c150 20 74 6f 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71   to a compound q
1c160 75 65 72 79 20 63 6f 6e 66 75 73 65 73 20 74 68  uery confuses th
1c170 65 20 63 6f 64 65 20 74 68 61 74 20 68 61 6e 64  e code that hand
1c180 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 72 65  les.**        re
1c190 63 75 72 73 69 76 65 20 71 75 65 72 69 65 73 20  cursive queries 
1c1a0 69 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 29  in multiSelect()
1c1b0 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  ..**.**.** In th
1c1c0 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20  is routine, the 
1c1d0 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  "p" parameter is
1c1e0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1c1f0 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a  e outer query..*
1c200 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69  * The subquery i
1c210 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72  s p->pSrc->a[iFr
1c220 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74  om].  isAgg is t
1c230 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72  rue if the outer
1c240 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61   query.** uses a
1c250 67 67 72 65 67 61 74 65 73 20 61 6e 64 20 73 75  ggregates and su
1c260 62 71 75 65 72 79 49 73 41 67 67 20 69 73 20 74  bqueryIsAgg is t
1c270 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75  rue if the subqu
1c280 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61  ery uses aggrega
1c290 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c  tes..**.** If fl
1c2a0 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20  attening is not 
1c2b0 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20  attempted, this 
1c2c0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
1c2d0 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30  op and returns 0
1c2e0 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69  ..** If flatteni
1c2f0 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20  ng is attempted 
1c300 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
1c310 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c  urns 1..**.** Al
1c320 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  l of the express
1c330 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73  ion analysis mus
1c340 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20  t occur on both 
1c350 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1c360 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75  and.** the subqu
1c370 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20  ery before this 
1c380 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f  routine runs..*/
1c390 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74  .static int flat
1c3a0 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50  tenSubquery(.  P
1c3b0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1c3c0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
1c3d0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
1c3e0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
1c3f0 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f   /* The parent o
1c400 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73  r outer SELECT s
1c410 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
1c420 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  t iFrom,        
1c430 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
1c440 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74  ->pSrc->a[] of t
1c450 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72  he inner subquer
1c460 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67  y */.  int isAgg
1c470 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
1c480 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c  rue if outer SEL
1c490 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61  ECT uses aggrega
1c4a0 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
1c4b0 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49 73    int subqueryIs
1c4c0 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69  Agg    /* True i
1c4d0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
1c4e0 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
1c4f0 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20  nctions */.){.  
1c500 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76  const char *zSav
1c510 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  edAuthContext = 
1c520 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
1c530 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a  text;.  Select *
1c540 70 50 61 72 65 6e 74 3b 0a 20 20 53 65 6c 65 63  pParent;.  Selec
1c550 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f  t *pSub;       /
1c560 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72  * The inner quer
1c570 79 20 6f 72 20 22 73 75 62 71 75 65 72 79 22 20  y or "subquery" 
1c580 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  */.  Select *pSu
1c590 62 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  b1;      /* Poin
1c5a0 74 65 72 20 74 6f 20 74 68 65 20 72 69 67 68 74  ter to the right
1c5b0 6d 6f 73 74 20 73 65 6c 65 63 74 20 69 6e 20 73  most select in s
1c5c0 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53 72  ub-query */.  Sr
1c5d0 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20  cList *pSrc;    
1c5e0 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
1c5f0 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
1c600 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63  r query */.  Src
1c610 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20  List *pSubSrc;  
1c620 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
1c630 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  use of the subqu
1c640 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ery */.  ExprLis
1c650 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20  t *pList;    /* 
1c660 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  The result set o
1c670 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
1c680 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65  y */.  int iPare
1c690 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44  nt;        /* VD
1c6a0 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
1c6b0 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65 73   of the pSub res
1c6c0 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61 62  ult set temp tab
1c6d0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  le */.  int i;  
1c6e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1c6f0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
1c700 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
1c710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c720 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
1c730 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
1c740 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1c750 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54  pSubitem;   /* T
1c760 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
1c770 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1c780 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  Parse->db;..  /*
1c790 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
1c7a0 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70   flattening is p
1c7b0 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72  ermitted.  Retur
1c7c0 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f  n 0 if not..  */
1c7d0 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
1c7e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
1c7f0 70 50 72 69 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a  pPrior==0 );  /*
1c800 20 55 6e 61 62 6c 65 20 74 6f 20 66 6c 61 74 74   Unable to flatt
1c810 65 6e 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  en compound quer
1c820 69 65 73 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74  ies */.  if( Opt
1c830 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65  imizationDisable
1c840 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65  d(db, SQLITE_Que
1c850 72 79 46 6c 61 74 74 65 6e 65 72 29 20 29 20 72  ryFlattener) ) r
1c860 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20  eturn 0;.  pSrc 
1c870 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
1c880 65 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72  ert( pSrc && iFr
1c890 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70  om>=0 && iFrom<p
1c8a0 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70  Src->nSrc );.  p
1c8b0 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d  Subitem = &pSrc-
1c8c0 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61  >a[iFrom];.  iPa
1c8d0 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d  rent = pSubitem-
1c8e0 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62  >iCursor;.  pSub
1c8f0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65   = pSubitem->pSe
1c900 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20  lect;.  assert( 
1c910 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  pSub!=0 );.  if(
1c920 20 69 73 41 67 67 20 26 26 20 73 75 62 71 75 65   isAgg && subque
1c930 72 79 49 73 41 67 67 20 29 20 72 65 74 75 72 6e  ryIsAgg ) return
1c940 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1c950 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1c960 6f 6e 20 28 31 29 20 20 2a 2f 0a 20 20 69 66 28  on (1)  */.  if(
1c970 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 26   subqueryIsAgg &
1c980 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29  & pSrc->nSrc>1 )
1c990 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1c9a0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1c9b0 6f 6e 20 28 32 29 20 20 2a 2f 0a 20 20 70 53 75  on (2)  */.  pSu
1c9c0 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72  bSrc = pSub->pSr
1c9d0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75  c;.  assert( pSu
1c9e0 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69  bSrc );.  /* Pri
1c9f0 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e  or to version 3.
1ca00 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20  1.2, when LIMIT 
1ca10 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20 74  and OFFSET had t
1ca20 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73  o be simple cons
1ca30 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20  tants,.  ** not 
1ca40 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73  arbitrary expres
1ca50 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77  ssions, we allow
1ca60 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e  ed some combinin
1ca70 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f  g of LIMIT and O
1ca80 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75  FFSET.  ** becau
1ca90 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65  se they could be
1caa0 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d   computed at com
1cab0 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20  pile-time.  But 
1cac0 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f  when LIMIT and O
1cad0 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d  FFSET.  ** becam
1cae0 65 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72  e arbitrary expr
1caf0 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65  essions, we were
1cb00 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72   forced to add r
1cb10 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29  estrictions (13)
1cb20 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20  .  ** and (14). 
1cb30 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1cb40 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d  Limit && p->pLim
1cb50 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  it ) return 0;  
1cb60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1cb70 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20  estriction (13) 
1cb80 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1cb90 4f 66 66 73 65 74 20 29 20 72 65 74 75 72 6e 20  Offset ) return 
1cba0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1cbb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1cbc0 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20  estriction (14) 
1cbd0 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c  */.  if( (p->sel
1cbe0 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f  Flags & SF_Compo
1cbf0 75 6e 64 29 21 3d 30 20 26 26 20 70 53 75 62 2d  und)!=0 && pSub-
1cc00 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72  >pLimit ){.    r
1cc10 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1cc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc40 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1cc50 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20  on (15) */.  }. 
1cc60 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53   if( pSubSrc->nS
1cc70 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  rc==0 ) return 0
1cc80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1cc90 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1cca0 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20  iction (7)  */. 
1ccb0 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c   if( pSub->selFl
1ccc0 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
1ccd0 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
1cce0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1ccf0 69 63 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a 20  iction (5)  */. 
1cd00 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
1cd10 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63  t && (pSrc->nSrc
1cd20 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a  >1 || isAgg) ){.
1cd30 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1cd40 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1cd50 63 74 69 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f  ctions (8)(9) */
1cd60 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73  .  }.  if( (p->s
1cd70 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
1cd80 74 69 6e 63 74 29 21 3d 30 20 26 26 20 73 75 62  tinct)!=0 && sub
1cd90 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20  queryIsAgg ){.  
1cda0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1cdb0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1cdc0 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a  ion (6)  */.  }.
1cdd0 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
1cde0 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65  y && pSub->pOrde
1cdf0 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75  rBy ){.     retu
1ce00 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1ce10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce30 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1ce40 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  11) */.  }.  if(
1ce50 20 69 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e   isAgg && pSub->
1ce60 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75 72  pOrderBy ) retur
1ce70 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1ce80 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1ce90 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28  on (16) */.  if(
1cea0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1ceb0 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
1cec0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1ced0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1cee0 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69 66 28  on (19) */.  if(
1cef0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1cf00 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
1cf10 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20  SF_Distinct)!=0 
1cf20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
1cf30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73  ;         /* Res
1cf40 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f  triction (21) */
1cf50 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d  .  }.  if( pSub-
1cf60 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
1cf70 65 63 75 72 73 69 76 65 20 29 20 72 65 74 75 72  ecursive ) retur
1cf80 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  n 0;          /*
1cf90 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 32   Restriction (22
1cfa0 29 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e  )  */.  if( (p->
1cfb0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
1cfc0 63 75 72 73 69 76 65 29 20 26 26 20 70 53 75 62  cursive) && pSub
1cfd0 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74 75 72  ->pPrior ) retur
1cfe0 6e 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 28 32  n 0;       /* (2
1cff0 33 29 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 42 53  3)  */..  /* OBS
1d000 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a  OLETE COMMENT 1:
1d010 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f  .  ** Restrictio
1d020 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73 75 62  n 3:  If the sub
1d030 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c  query is a join,
1d040 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
1d050 75 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a  ubquery is .  **
1d060 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68 65   not used as the
1d070 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
1d080 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e  f an outer join.
1d090 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68    Examples of wh
1d0a0 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e  y this.  ** is n
1d0b0 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
1d0c0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
1d0d0 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1d0e0 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20   (t2 JOIN t3).  
1d0f0 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c  **.  ** If we fl
1d100 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c  atten the above,
1d110 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20   we would get.  
1d120 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
1d130 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  (t1 LEFT OUTER J
1d140 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a  OIN t2) JOIN t3.
1d150 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20    **.  ** which 
1d160 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68  is not at all th
1d170 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20  e same thing..  
1d180 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45  **.  ** OBSOLETE
1d190 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a   COMMENT 2:.  **
1d1a0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a   Restriction 12:
1d1b0 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
1d1c0 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f  y is the right o
1d1d0 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74  perand of a left
1d1e0 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e   outer.  ** join
1d1f0 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
1d200 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20  subquery has no 
1d210 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20  WHERE clause..  
1d220 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f  ** An examples o
1d230 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f  f why this is no
1d240 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a  t allowed:.  **.
1d250 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20    **         t1 
1d260 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
1d270 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  (SELECT * FROM t
1d280 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a  2 WHERE t2.x>0).
1d290 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20    **.  ** If we 
1d2a0 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76  flatten the abov
1d2b0 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a  e, we would get.
1d2c0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
1d2d0 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52    (t1 LEFT OUTER
1d2e0 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20   JOIN t2) WHERE 
1d2f0 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a  t2.x>0.  **.  **
1d300 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20   But the t2.x>0 
1d310 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73  test will always
1d320 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20   fail on a NULL 
1d330 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68  row of t2, which
1d340 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c  .  ** effectivel
1d350 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f  y converts the O
1d360 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61  UTER JOIN into a
1d370 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20  n INNER JOIN..  
1d380 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56 45  **.  ** THIS OVE
1d390 52 52 49 44 45 53 20 4f 42 53 4f 4c 45 54 45 20  RRIDES OBSOLETE 
1d3a0 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20 32  COMMENTS 1 AND 2
1d3b0 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63   ABOVE:.  ** Tic
1d3c0 6b 65 74 20 23 33 33 30 30 20 73 68 6f 77 73 20  ket #3300 shows 
1d3d0 74 68 61 74 20 66 6c 61 74 74 65 6e 69 6e 67 20  that flattening 
1d3e0 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f  the right term o
1d3f0 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20  f a LEFT JOIN.  
1d400 2a 2a 20 69 73 20 66 72 61 75 67 68 74 20 77 69  ** is fraught wi
1d410 74 68 20 64 61 6e 67 65 72 2e 20 20 42 65 73 74  th danger.  Best
1d420 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 77 68   to avoid the wh
1d430 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49 66 20 74  ole thing.  If t
1d440 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79  he.  ** subquery
1d450 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74 65   is the right te
1d460 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  rm of a LEFT JOI
1d470 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66  N, then do not f
1d480 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69  latten..  */.  i
1d490 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f  f( (pSubitem->jo
1d4a0 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
1d4b0 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  R)!=0 ){.    ret
1d4c0 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
1d4d0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 37 3a   Restriction 17:
1d4e0 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
1d4f0 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
1d500 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74 20  SELECT, then it 
1d510 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e  must.  ** use on
1d520 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  ly the UNION ALL
1d530 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e   operator. And n
1d540 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70 6c  one of the simpl
1d550 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65 73  e select queries
1d560 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20  .  ** that make 
1d570 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  up the compound 
1d580 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f 77  SELECT are allow
1d590 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67 61  ed to be aggrega
1d5a0 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a 20  te or distinct. 
1d5b0 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a   ** queries..  *
1d5c0 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50  /.  if( pSub->pP
1d5d0 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20  rior ){.    if( 
1d5e0 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
1d5f0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
1d600 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  ;  /* Restrictio
1d610 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  n 20 */.    }.  
1d620 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20 28    if( isAgg || (
1d630 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1d640 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c  _Distinct)!=0 ||
1d650 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29   pSrc->nSrc!=1 )
1d660 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
1d670 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
1d680 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75 62  pSub1=pSub; pSub
1d690 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d 3e  1; pSub1=pSub1->
1d6a0 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 74  pPrior){.      t
1d6b0 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d  estcase( (pSub1-
1d6c0 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
1d6d0 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
1d6e0 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74  egate))==SF_Dist
1d6f0 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74 65  inct );.      te
1d700 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e  stcase( (pSub1->
1d710 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
1d720 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
1d730 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65  gate))==SF_Aggre
1d740 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20 61 73  gate );.      as
1d750 73 65 72 74 28 20 70 53 75 62 2d 3e 70 53 72 63  sert( pSub->pSrc
1d760 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
1d770 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67   (pSub1->selFlag
1d780 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
1d790 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 21  |SF_Aggregate))!
1d7a0 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53  =0.       || (pS
1d7b0 75 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70  ub1->pPrior && p
1d7c0 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  Sub1->op!=TK_ALL
1d7d0 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75  ) .       || pSu
1d7e0 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31  b1->pSrc->nSrc<1
1d7f0 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62 2d  .       || pSub-
1d800 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
1d810 70 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e  pSub1->pEList->n
1d820 45 78 70 72 0a 20 20 20 20 20 20 29 7b 0a 20 20  Expr.      ){.  
1d830 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1d840 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
1d850 73 74 63 61 73 65 28 20 70 53 75 62 31 2d 3e 70  stcase( pSub1->p
1d860 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20  Src->nSrc>1 );. 
1d870 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73     }..    /* Res
1d880 74 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a  triction 18. */.
1d890 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
1d8a0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  rBy ){.      int
1d8b0 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ii;.      for(i
1d8c0 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65  i=0; ii<p->pOrde
1d8d0 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  rBy->nExpr; ii++
1d8e0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1d8f0 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69  ->pOrderBy->a[ii
1d900 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
1d910 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
1d920 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d930 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20   }..  /***** If 
1d940 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
1d950 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20  int, flattening 
1d960 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a  is permitted. **
1d970 2a 2a 2a 2f 0a 0a 20 20 2f 2a 20 41 75 74 68 6f  ***/..  /* Autho
1d980 72 69 7a 65 20 74 68 65 20 73 75 62 71 75 65 72  rize the subquer
1d990 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a  y */.  pParse->z
1d9a0 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53  AuthContext = pS
1d9b0 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20  ubitem->zName;. 
1d9c0 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73   TESTONLY(i =) s
1d9d0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1d9e0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
1d9f0 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b  ELECT, 0, 0, 0);
1da00 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d  .  testcase( i==
1da10 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20  SQLITE_DENY );. 
1da20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
1da30 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75  ntext = zSavedAu
1da40 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a  thContext;..  /*
1da50 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
1da60 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
1da70 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1da80 2c 20 74 68 65 6e 20 28 62 79 20 72 65 73 74 72  , then (by restr
1da90 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20  ictions.  ** 17 
1daa0 61 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69 74  and 18 above) it
1dab0 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e   must be a UNION
1dac0 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61 72   ALL and the par
1dad0 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20 0a  ent query must .
1dae0 20 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20 66    ** be of the f
1daf0 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  orm:.  **.  **  
1db00 20 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d     SELECT <expr-
1db10 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62  list> FROM (<sub
1db20 2d 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65 2d  -query>) <where-
1db30 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20  clause> .  **.  
1db40 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  ** followed by a
1db50 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d  ny ORDER BY, LIM
1db60 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54  IT and/or OFFSET
1db70 20 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20 62   clauses. This b
1db80 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65  lock.  ** create
1db90 73 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66 20  s N-1 copies of 
1dba0 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
1dbb0 20 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52 44   without any ORD
1dbc0 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20  ER BY, LIMIT or 
1dbd0 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61  .  ** OFFSET cla
1dbe0 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74  uses and joins t
1dbf0 68 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74 2d  hem to the left-
1dc00 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65  hand-side of the
1dc10 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75   original.  ** u
1dc20 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f  sing UNION ALL o
1dc30 70 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68 69  perators. In thi
1dc40 73 20 63 61 73 65 20 4e 20 69 73 20 74 68 65 20  s case N is the 
1dc50 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c 65  number of simple
1dc60 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74 61  .  ** select sta
1dc70 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63  tements in the c
1dc80 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72  ompound sub-quer
1dc90 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61  y..  **.  ** Exa
1dca0 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mple:.  **.  ** 
1dcb0 20 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20 46      SELECT a+1 F
1dcc0 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20 20  ROM (.  **      
1dcd0 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20    SELECT x FROM 
1dce0 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  tab.  **        
1dcf0 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
1dd00 20 20 20 20 20 20 53 45 4c 45 43 54 20 79 20 46        SELECT y F
1dd10 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20  ROM tab.  **    
1dd20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
1dd30 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
1dd40 20 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74   abs(z*2) FROM t
1dd50 61 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20 57  ab2.  **     ) W
1dd60 48 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52 20  HERE a!=5 ORDER 
1dd70 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  BY 1.  **.  ** T
1dd80 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a  ransformed into:
1dd90 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
1dda0 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 74  ELECT x+1 FROM t
1ddb0 61 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35 0a  ab WHERE x+1!=5.
1ddc0 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41    **     UNION A
1ddd0 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  LL.  **     SELE
1dde0 43 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62 20  CT y+1 FROM tab 
1ddf0 57 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a  WHERE y+1!=5.  *
1de00 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a  *     UNION ALL.
1de10 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
1de20 61 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20  abs(z*2)+1 FROM 
1de30 74 61 62 32 20 57 48 45 52 45 20 61 62 73 28 7a  tab2 WHERE abs(z
1de40 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20  *2)+1!=5.  **   
1de50 20 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a    ORDER BY 1.  *
1de60 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74  *.  ** We call t
1de70 68 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e  his the "compoun
1de80 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74  d-subquery flatt
1de90 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66  ening"..  */.  f
1dea0 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70 50  or(pSub=pSub->pP
1deb0 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75 62  rior; pSub; pSub
1dec0 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a  =pSub->pPrior){.
1ded0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77      Select *pNew
1dee0 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
1def0 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
1df00 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70 72  rderBy;.    Expr
1df10 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c   *pLimit = p->pL
1df20 69 6d 69 74 3b 0a 20 20 20 20 45 78 70 72 20 2a  imit;.    Expr *
1df30 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
1df40 66 73 65 74 3b 0a 20 20 20 20 53 65 6c 65 63 74  fset;.    Select
1df50 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50   *pPrior = p->pP
1df60 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  rior;.    p->pOr
1df70 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70  derBy = 0;.    p
1df80 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20  ->pSrc = 0;.    
1df90 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
1dfa0 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
1dfb0 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74  ;.    p->pOffset
1dfc0 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d   = 0;.    pNew =
1dfd0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
1dfe0 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20  p(db, p, 0);.   
1dff0 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
1e000 66 66 73 65 74 3b 0a 20 20 20 20 70 2d 3e 70 4c  ffset;.    p->pL
1e010 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
1e020 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
1e030 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70   pOrderBy;.    p
1e040 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20  ->pSrc = pSrc;. 
1e050 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c     p->op = TK_AL
1e060 4c 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  L;.    if( pNew=
1e070 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  =0 ){.      p->p
1e080 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
1e090 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e0a0 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20   pNew->pPrior = 
1e0b0 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66  pPrior;.      if
1e0c0 28 20 70 50 72 69 6f 72 20 29 20 70 50 72 69 6f  ( pPrior ) pPrio
1e0d0 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b  r->pNext = pNew;
1e0e0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65  .      pNew->pNe
1e0f0 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 2d  xt = p;.      p-
1e100 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a  >pPrior = pNew;.
1e110 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62      }.    if( db
1e120 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1e130 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1e140 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74 74    /* Begin flatt
1e150 65 6e 69 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d  ening the iFrom-
1e160 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  th entry of the 
1e170 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a  FROM clause .  *
1e180 2a 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  * in the outer q
1e190 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75  uery..  */.  pSu
1e1a0 62 20 3d 20 70 53 75 62 31 20 3d 20 70 53 75 62  b = pSub1 = pSub
1e1b0 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a  item->pSelect;..
1e1c0 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
1e1d0 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20  transient table 
1e1e0 73 74 72 75 63 74 75 72 65 20 61 73 73 6f 63 69  structure associ
1e1f0 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  ated with the.  
1e200 2a 2a 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2f  ** subquery.  */
1e210 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1e220 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a  (db, pSubitem->z
1e230 44 61 74 61 62 61 73 65 29 3b 0a 20 20 73 71 6c  Database);.  sql
1e240 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1e250 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  Subitem->zName);
1e260 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1e270 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a  (db, pSubitem->z
1e280 41 6c 69 61 73 29 3b 0a 20 20 70 53 75 62 69 74  Alias);.  pSubit
1e290 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
1e2a0 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a  0;.  pSubitem->z
1e2b0 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75 62  Name = 0;.  pSub
1e2c0 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30  item->zAlias = 0
1e2d0 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 53  ;.  pSubitem->pS
1e2e0 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  elect = 0;..  /*
1e2f0 20 44 65 66 65 72 20 64 65 6c 65 74 69 6e 67 20   Defer deleting 
1e300 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  the Table object
1e310 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1e320 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
1e330 72 79 20 75 6e 74 69 6c 20 63 6f 64 65 20 67 65  ry until code ge
1e340 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  neration is.  **
1e350 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65   complete, since
1e360 20 74 68 65 72 65 20 6d 61 79 20 73 74 69 6c 6c   there may still
1e370 20 65 78 69 73 74 20 45 78 70 72 2e 70 54 61 62   exist Expr.pTab
1e380 20 65 6e 74 72 69 65 73 20 74 68 61 74 0a 20 20   entries that.  
1e390 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  ** refer to the 
1e3a0 73 75 62 71 75 65 72 79 20 65 76 65 6e 20 61 66  subquery even af
1e3b0 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20  ter flattening. 
1e3c0 20 54 69 63 6b 65 74 20 23 33 33 34 36 2e 0a 20   Ticket #3346.. 
1e3d0 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74 65   **.  ** pSubite
1e3e0 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c 77 61 79  m->pTab is alway
1e3f0 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74 65  s non-NULL by te
1e400 73 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  st restrictions 
1e410 61 6e 64 20 74 65 73 74 73 20 61 62 6f 76 65 2e  and tests above.
1e420 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41  .  */.  if( ALWA
1e430 59 53 28 70 53 75 62 69 74 65 6d 2d 3e 70 54 61  YS(pSubitem->pTa
1e440 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 54 61 62  b!=0) ){.    Tab
1e450 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20  le *pTabToDel = 
1e460 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a  pSubitem->pTab;.
1e470 20 20 20 20 69 66 28 20 70 54 61 62 54 6f 44 65      if( pTabToDe
1e480 6c 2d 3e 6e 52 65 66 3d 3d 31 20 29 7b 0a 20 20  l->nRef==1 ){.  
1e490 20 20 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c      Parse *pTopl
1e4a0 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
1e4b0 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
1e4c0 73 65 29 3b 0a 20 20 20 20 20 20 70 54 61 62 54  se);.      pTabT
1e4d0 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69  oDel->pNextZombi
1e4e0 65 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70  e = pToplevel->p
1e4f0 5a 6f 6d 62 69 65 54 61 62 3b 0a 20 20 20 20 20  ZombieTab;.     
1e500 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d   pToplevel->pZom
1e510 62 69 65 54 61 62 20 3d 20 70 54 61 62 54 6f 44  bieTab = pTabToD
1e520 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  el;.    }else{. 
1e530 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e       pTabToDel->
1e540 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  nRef--;.    }.  
1e550 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62    pSubitem->pTab
1e560 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
1e570 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f  The following lo
1e580 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  op runs once for
1e590 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 61 20   each term in a 
1e5a0 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
1e5b0 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e  y.  ** flattenin
1e5c0 67 20 28 61 73 20 64 65 73 63 72 69 62 65 64 20  g (as described 
1e5d0 61 62 6f 76 65 29 2e 20 20 49 66 20 77 65 20 61  above).  If we a
1e5e0 72 65 20 64 6f 69 6e 67 20 61 20 64 69 66 66 65  re doing a diffe
1e5f0 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f  rent kind.  ** o
1e600 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61  f flattening - a
1e610 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68 65   flattening othe
1e620 72 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e  r than a compoun
1e630 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74  d-subquery flatt
1e640 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65  ening -.  ** the
1e650 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79  n this loop only
1e660 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a   runs once..  **
1e670 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
1e680 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74 68 65  moves all of the
1e690 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f   FROM elements o
1e6a0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
1e6b0 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  nto the.  ** the
1e6c0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1e6d0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
1e6e0 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74    Before doing t
1e6f0 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20  his, remember.  
1e700 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  ** the cursor nu
1e710 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69  mber for the ori
1e720 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72  ginal outer quer
1e730 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69  y FROM element i
1e740 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20  n.  ** iParent. 
1e750 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75 72   The iParent cur
1e760 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  sor will never b
1e770 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71 75  e used.  Subsequ
1e780 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69  ent code.  ** wi
1e790 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73 69  ll scan expressi
1e7a0 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ons looking for 
1e7b0 69 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63  iParent referenc
1e7c0 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20  es and replace. 
1e7d0 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65   ** those refere
1e7e0 6e 63 65 73 20 77 69 74 68 20 65 78 70 72 65 73  nces with expres
1e7f0 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c  sions that resol
1e800 76 65 20 74 6f 20 74 68 65 20 73 75 62 71 75 65  ve to the subque
1e810 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65  ry FROM.  ** ele
1e820 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77  ments we are now
1e830 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a   copying in..  *
1e840 2f 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74 3d  /.  for(pParent=
1e850 70 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61 72  p; pParent; pPar
1e860 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72  ent=pParent->pPr
1e870 69 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e  ior, pSub=pSub->
1e880 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74  pPrior){.    int
1e890 20 6e 53 75 62 53 72 63 3b 0a 20 20 20 20 75 38   nSubSrc;.    u8
1e8a0 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20   jointype = 0;. 
1e8b0 20 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75     pSubSrc = pSu
1e8c0 62 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20  b->pSrc;     /* 
1e8d0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 73  FROM clause of s
1e8e0 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 6e  ubquery */.    n
1e8f0 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63  SubSrc = pSubSrc
1e900 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75 6d 62  ->nSrc;  /* Numb
1e910 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 73  er of terms in s
1e920 75 62 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61  ubquery FROM cla
1e930 75 73 65 20 2a 2f 0a 20 20 20 20 70 53 72 63 20  use */.    pSrc 
1e940 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b  = pParent->pSrc;
1e950 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
1e960 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
1e970 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20 20 69   query */..    i
1e980 66 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20 20  f( pSrc ){.     
1e990 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
1e9a0 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72 73 74  ==p );  /* First
1e9b0 20 74 69 6d 65 20 74 68 72 6f 75 67 68 20 74 68   time through th
1e9c0 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  e loop */.      
1e9d0 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69  jointype = pSubi
1e9e0 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20  tem->jointype;. 
1e9f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ea00 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 21  assert( pParent!
1ea10 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e  =p );  /* 2nd an
1ea20 64 20 73 75 62 73 65 71 75 65 6e 74 20 74 69 6d  d subsequent tim
1ea30 65 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c  es through the l
1ea40 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 70 53 72  oop */.      pSr
1ea50 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72  c = pParent->pSr
1ea60 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
1ea70 73 74 41 70 70 65 6e 64 28 64 62 2c 20 30 2c 20  stAppend(db, 0, 
1ea80 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
1ea90 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20   pSrc==0 ){.    
1eaa0 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
1eab0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1eac0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1ead0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1eae0 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72    /* The subquer
1eaf0 79 20 75 73 65 73 20 61 20 73 69 6e 67 6c 65 20  y uses a single 
1eb00 73 6c 6f 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  slot of the FROM
1eb10 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
1eb20 75 74 65 72 0a 20 20 20 20 2a 2a 20 71 75 65 72  uter.    ** quer
1eb30 79 2e 20 20 49 66 20 74 68 65 20 73 75 62 71 75  y.  If the subqu
1eb40 65 72 79 20 68 61 73 20 6d 6f 72 65 20 74 68 61  ery has more tha
1eb50 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e  n one element in
1eb60 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65   its FROM clause
1eb70 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 65 78  ,.    ** then ex
1eb80 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71  pand the outer q
1eb90 75 65 72 79 20 74 6f 20 6d 61 6b 65 20 73 70 61  uery to make spa
1eba0 63 65 20 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c  ce for it to hol
1ebb0 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20  d all elements. 
1ebc0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 75 62     ** of the sub
1ebd0 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20  query..    **.  
1ebe0 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
1ebf0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53    **.    **    S
1ec00 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62  ELECT * FROM tab
1ec10 41 2c 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f  A, (SELECT * FRO
1ec20 4d 20 73 75 62 31 2c 20 73 75 62 32 29 2c 20 74  M sub1, sub2), t
1ec30 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  abB;.    **.    
1ec40 2a 2a 20 54 68 65 20 6f 75 74 65 72 20 71 75 65  ** The outer que
1ec50 72 79 20 68 61 73 20 33 20 73 6c 6f 74 73 20 69  ry has 3 slots i
1ec60 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73  n its FROM claus
1ec70 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20  e.  One slot of 
1ec80 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72  the.    ** outer
1ec90 20 71 75 65 72 79 20 28 74 68 65 20 6d 69 64 64   query (the midd
1eca0 6c 65 20 73 6c 6f 74 29 20 69 73 20 75 73 65 64  le slot) is used
1ecb0 20 62 79 20 74 68 65 20 73 75 62 71 75 65 72 79   by the subquery
1ecc0 2e 20 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20  .  The next.    
1ecd0 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  ** block of code
1ece0 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 74 68 65   will expand the
1ecf0 20 6f 75 74 20 71 75 65 72 79 20 74 6f 20 34 20   out query to 4 
1ed00 73 6c 6f 74 73 2e 20 20 54 68 65 20 6d 69 64 64  slots.  The midd
1ed10 6c 65 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20 69  le.    ** slot i
1ed20 73 20 65 78 70 61 6e 64 65 64 20 74 6f 20 74 77  s expanded to tw
1ed30 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72  o slots in order
1ed40 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66   to make space f
1ed50 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 77  or the.    ** tw
1ed60 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  o elements in th
1ed70 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1ed80 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
1ed90 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53     */.    if( nS
1eda0 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20  ubSrc>1 ){.     
1edb0 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d   pParent->pSrc =
1edc0 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53   pSrc = sqlite3S
1edd0 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62  rcListEnlarge(db
1ede0 2c 20 70 53 72 63 2c 20 6e 53 75 62 53 72 63 2d  , pSrc, nSubSrc-
1edf0 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20  1,iFrom+1);.    
1ee00 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1ee10 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
1ee20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1ee30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
1ee40 72 61 6e 73 66 65 72 20 74 68 65 20 46 52 4f 4d  ransfer the FROM
1ee50 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 72   clause terms fr
1ee60 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72 79 20  om the subquery 
1ee70 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  into the.    ** 
1ee80 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20  outer query..   
1ee90 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
1eea0 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29   i<nSubSrc; i++)
1eeb0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49  {.      sqlite3I
1eec0 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
1eed0 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d  pSrc->a[i+iFrom]
1eee0 2e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 20 20  .pUsing);.      
1eef0 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d  pSrc->a[i+iFrom]
1ef00 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d   = pSubSrc->a[i]
1ef10 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
1ef20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30  pSubSrc->a[i], 0
1ef30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63  , sizeof(pSubSrc
1ef40 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a  ->a[i]));.    }.
1ef50 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f      pSrc->a[iFro
1ef60 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f  m].jointype = jo
1ef70 69 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f  intype;.  .    /
1ef80 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73  * Now begin subs
1ef90 74 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72  tituting subquer
1efa0 79 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70  y result set exp
1efb0 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20  ressions for .  
1efc0 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20    ** references 
1efd0 74 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69  to the iParent i
1efe0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1eff0 79 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a  y..    ** .    *
1f000 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
1f010 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43  *.    **   SELEC
1f020 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d  T a+5, b*10 FROM
1f030 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20   (SELECT x*3 AS 
1f040 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f  a, y+10 AS b FRO
1f050 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b  M t1) WHERE a>b;
1f060 0a 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20 20  .    **   \     
1f070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f080 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73  \_____________ s
1f090 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  ubquery ________
1f0a0 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20  __/          /. 
1f0b0 20 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f     **    \______
1f0c0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20  _______________ 
1f0d0 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f  outer query ____
1f0e0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1f0f0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20  __________/.    
1f100 2a 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f  **.    ** We loo
1f110 6b 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65  k at every expre
1f120 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74  ssion in the out
1f130 65 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65  er query and eve
1f140 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a  ry place we see.
1f150 20 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75      ** "a" we su
1f160 62 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61  bstitute "x*3" a
1f170 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77  nd every place w
1f180 65 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62  e see "b" we sub
1f190 73 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a  stitute "y+10"..
1f1a0 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c 69 73 74      */.    pList
1f1b0 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69   = pParent->pELi
1f1c0 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  st;.    for(i=0;
1f1d0 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
1f1e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
1f1f0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
1f200 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  me==0 ){.       
1f210 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73   char *zName = s
1f220 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
1f230 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  b, pList->a[i].z
1f240 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 73  Span);.        s
1f250 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e  qlite3Dequote(zN
1f260 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  ame);.        pL
1f270 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
1f280 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  = zName;.      }
1f290 0a 20 20 20 20 7d 0a 20 20 20 20 73 75 62 73 74  .    }.    subst
1f2a0 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61  ExprList(db, pPa
1f2b0 72 65 6e 74 2d 3e 70 45 4c 69 73 74 2c 20 69 50  rent->pEList, iP
1f2c0 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
1f2d0 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 69 73  ist);.    if( is
1f2e0 41 67 67 20 29 7b 0a 20 20 20 20 20 20 73 75 62  Agg ){.      sub
1f2f0 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
1f300 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79  Parent->pGroupBy
1f310 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
1f320 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
1f330 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
1f340 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
1f350 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
1f360 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  g, iParent, pSub
1f370 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  ->pEList);.    }
1f380 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
1f390 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
1f3a0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
1f3b0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
1f3c0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1f3d0 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d  pOrderBy = pSub-
1f3e0 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20  >pOrderBy;.     
1f3f0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1f400 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
1f410 66 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64  f( pParent->pOrd
1f420 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73 75  erBy ){.      su
1f430 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
1f440 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42  pParent->pOrderB
1f450 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  y, iParent, pSub
1f460 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  ->pEList);.    }
1f470 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
1f480 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20 70  Where ){.      p
1f490 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
1f4a0 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d  xprDup(db, pSub-
1f4b0 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20  >pWhere, 0);.   
1f4c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57   }else{.      pW
1f4d0 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  here = 0;.    }.
1f4e0 20 20 20 20 69 66 28 20 73 75 62 71 75 65 72 79      if( subquery
1f4f0 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20 61  IsAgg ){.      a
1f500 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
1f510 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20  pHaving==0 );.  
1f520 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61      pParent->pHa
1f530 76 69 6e 67 20 3d 20 70 50 61 72 65 6e 74 2d 3e  ving = pParent->
1f540 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50  pWhere;.      pP
1f550 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20  arent->pWhere = 
1f560 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50  pWhere;.      pP
1f570 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d  arent->pHaving =
1f580 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
1f590 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c  Parent->pHaving,
1f5a0 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
1f5b0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70  pEList);.      p
1f5c0 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20  Parent->pHaving 
1f5d0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
1f5e0 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48  (db, pParent->pH
1f5f0 61 76 69 6e 67 2c 20 0a 20 20 20 20 20 20 20 20  aving, .        
1f600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f610 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1f620 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75  3ExprDup(db, pSu
1f630 62 2d 3e 70 48 61 76 69 6e 67 2c 20 30 29 29 3b  b->pHaving, 0));
1f640 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1f650 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79  Parent->pGroupBy
1f660 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ==0 );.      pPa
1f670 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 20 3d  rent->pGroupBy =
1f680 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1f690 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 47  Dup(db, pSub->pG
1f6a0 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20 20 20 20  roupBy, 0);.    
1f6b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
1f6c0 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73  rent->pWhere = s
1f6d0 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61  ubstExpr(db, pPa
1f6e0 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 69 50  rent->pWhere, iP
1f6f0 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
1f700 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ist);.      pPar
1f710 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 71  ent->pWhere = sq
1f720 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
1f730 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
1f740 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 20 20 7d  , pWhere);.    }
1f750 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  .  .    /* The f
1f760 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79 20 69  lattened query i
1f770 73 20 64 69 73 74 69 6e 63 74 20 69 66 20 65 69  s distinct if ei
1f780 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f  ther the inner o
1f790 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74  r the.    ** out
1f7a0 65 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74  er query is dist
1f7b0 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  inct. .    */.  
1f7c0 20 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c    pParent->selFl
1f7d0 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c  ags |= pSub->sel
1f7e0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
1f7f0 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20  nct;.  .    /*. 
1f800 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e     ** SELECT ...
1f810 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e   FROM (SELECT ..
1f820 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54  . LIMIT a OFFSET
1f830 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53   b) LIMIT x OFFS
1f840 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  ET y;.    **.   
1f850 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74   ** One is tempt
1f860 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64  ed to try to add
1f870 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62   a and b to comb
1f880 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20  ine the limits. 
1f890 20 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a 2a   But this.    **
1f8a0 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69   does not work i
1f8b0 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69  f either limit i
1f8c0 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20  s negative..    
1f8d0 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  */.    if( pSub-
1f8e0 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >pLimit ){.     
1f8f0 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74   pParent->pLimit
1f900 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b   = pSub->pLimit;
1f910 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69  .      pSub->pLi
1f920 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  mit = 0;.    }. 
1f930 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c   }..  /* Finiall
1f940 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69  y, delete what i
1f950 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75  s left of the su
1f960 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72  bquery and retur
1f970 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a  n.  ** success..
1f980 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65    */.  sqlite3Se
1f990 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
1f9a0 53 75 62 31 29 3b 0a 0a 20 20 72 65 74 75 72 6e  Sub1);..  return
1f9b0 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
1f9c0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1f9d0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
1f9e0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
1f9f0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
1fa00 0a 2f 2a 0a 2a 2a 20 42 61 73 65 64 20 6f 6e 20  ./*.** Based on 
1fa10 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1fa20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75  the AggInfo stru
1fa30 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64 20  cture indicated 
1fa40 62 79 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  by the first.** 
1fa50 61 72 67 75 6d 65 6e 74 2c 20 74 68 69 73 20 66  argument, this f
1fa60 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69  unction checks i
1fa70 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1fa80 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
1fa90 20 20 20 2a 20 74 68 65 20 71 75 65 72 79 20 63     * the query c
1faa0 6f 6e 74 61 69 6e 73 20 6a 75 73 74 20 61 20 73  ontains just a s
1fab0 69 6e 67 6c 65 20 61 67 67 72 65 67 61 74 65 20  ingle aggregate 
1fac0 66 75 6e 63 74 69 6f 6e 2c 0a 2a 2a 20 20 20 20  function,.**    
1fad0 2a 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  * the aggregate 
1fae0 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 69 74 68  function is eith
1faf0 65 72 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  er min() or max(
1fb00 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 2a 20 74  ), and.**    * t
1fb10 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
1fb20 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  he aggregate fun
1fb30 63 74 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ction is a colum
1fb40 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  n value..**.** I
1fb50 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f  f all of the abo
1fb60 76 65 20 61 72 65 20 74 72 75 65 2c 20 74 68 65  ve are true, the
1fb70 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  n WHERE_ORDERBY_
1fb80 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44  MIN or WHERE_ORD
1fb90 45 52 42 59 5f 4d 41 58 0a 2a 2a 20 69 73 20 72  ERBY_MAX.** is r
1fba0 65 74 75 72 6e 65 64 20 61 73 20 61 70 70 72 6f  eturned as appro
1fbb0 70 72 69 61 74 65 2e 20 41 6c 73 6f 2c 20 2a 70  priate. Also, *p
1fbc0 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20 74  pMinMax is set t
1fbd0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 0a  o point to the .
1fbe0 2a 2a 20 6c 69 73 74 20 6f 66 20 61 72 67 75 6d  ** list of argum
1fbf0 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 74  ents passed to t
1fc00 68 65 20 61 67 67 72 65 67 61 74 65 20 62 65 66  he aggregate bef
1fc10 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
1fc20 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20  *.** Or, if the 
1fc30 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65  conditions above
1fc40 20 61 72 65 20 6e 6f 74 20 6d 65 74 2c 20 2a 70   are not met, *p
1fc50 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20 74  pMinMax is set t
1fc60 6f 20 30 20 61 6e 64 0a 2a 2a 20 57 48 45 52 45  o 0 and.** WHERE
1fc70 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 20  _ORDERBY_NORMAL 
1fc80 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1fc90 73 74 61 74 69 63 20 75 38 20 6d 69 6e 4d 61 78  static u8 minMax
1fca0 51 75 65 72 79 28 41 67 67 49 6e 66 6f 20 2a 70  Query(AggInfo *p
1fcb0 41 67 67 49 6e 66 6f 2c 20 45 78 70 72 4c 69 73  AggInfo, ExprLis
1fcc0 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a 20  t **ppMinMax){. 
1fcd0 20 69 6e 74 20 65 52 65 74 20 3d 20 57 48 45 52   int eRet = WHER
1fce0 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
1fcf0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
1fd00 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20  turn value */.. 
1fd10 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a   *ppMinMax = 0;.
1fd20 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e    if( pAggInfo->
1fd30 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20 20  nFunc==1 ){.    
1fd40 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 41  Expr *pExpr = pA
1fd50 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d  ggInfo->aFunc[0]
1fd60 2e 70 45 78 70 72 3b 20 2f 2a 20 41 67 67 72 65  .pExpr; /* Aggre
1fd70 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  gate function */
1fd80 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
1fd90 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  EList = pExpr->x
1fda0 2e 70 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20  .pList;      /* 
1fdb0 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 67 67  Arguments to agg
1fdc0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20   function */..  
1fdd0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1fde0 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op==TK_AGG_FUNC
1fdf0 54 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20  TION );.    if( 
1fe00 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
1fe10 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26 20 70 45  ->nExpr==1 && pE
1fe20 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
1fe30 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
1fe40 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  UMN ){.      con
1fe50 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 20 3d  st char *zFunc =
1fe60 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1fe70 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
1fe80 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63  te3StrICmp(zFunc
1fe90 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20  , "min")==0 ){. 
1fea0 20 20 20 20 20 20 20 65 52 65 74 20 3d 20 57 48         eRet = WH
1feb0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b  ERE_ORDERBY_MIN;
1fec0 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d  .        *ppMinM
1fed0 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20  ax = pEList;.   
1fee0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
1fef0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e  ite3StrICmp(zFun
1ff00 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a  c, "max")==0 ){.
1ff10 20 20 20 20 20 20 20 20 65 52 65 74 20 3d 20 57          eRet = W
1ff20 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58  HERE_ORDERBY_MAX
1ff30 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69 6e  ;.        *ppMin
1ff40 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  Max = pEList;.  
1ff50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1ff60 0a 20 20 61 73 73 65 72 74 28 20 2a 70 70 4d 69  .  assert( *ppMi
1ff70 6e 4d 61 78 3d 3d 30 20 7c 7c 20 28 2a 70 70 4d  nMax==0 || (*ppM
1ff80 69 6e 4d 61 78 29 2d 3e 6e 45 78 70 72 3d 3d 31  inMax)->nExpr==1
1ff90 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 52 65   );.  return eRe
1ffa0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  t;.}../*.** The 
1ffb0 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
1ffc0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
1ffd0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
1ffe0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75   an aggregate qu
1fff0 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ery..** The seco
20000 6e 64 20 61 72 67 6d 65 6e 74 20 69 73 20 74 68  nd argment is th
20010 65 20 61 73 73 6f 63 69 61 74 65 64 20 61 67 67  e associated agg
20020 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65  regate-info obje
20030 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  ct. This .** fun
20040 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20 74  ction tests if t
20050 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20  he SELECT is of 
20060 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
20070 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
20080 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a  ) FROM <tbl>.**.
20090 2a 2a 20 77 68 65 72 65 20 74 61 62 6c 65 20 69  ** where table i
200a0 73 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  s a database tab
200b0 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73 65  le, not a sub-se
200c0 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 49 66  lect or view. If
200d0 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f   the query.** do
200e0 65 73 20 6d 61 74 63 68 20 74 68 69 73 20 70 61  es match this pa
200f0 74 74 65 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f  ttern, then a po
20100 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61 62  inter to the Tab
20110 6c 65 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73  le object repres
20120 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20  enting.** <tbl> 
20130 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
20140 65 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74  erwise, 0 is ret
20150 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
20160 20 54 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65   Table *isSimple
20170 43 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c  Count(Select *p,
20180 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
20190 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  fo){.  Table *pT
201a0 61 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70  ab;.  Expr *pExp
201b0 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  r;..  assert( !p
201c0 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20  ->pGroupBy );.. 
201d0 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 7c   if( p->pWhere |
201e0 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  | p->pEList->nEx
201f0 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e  pr!=1 .   || p->
20200 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c  pSrc->nSrc!=1 ||
20210 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
20220 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20 20  Select.  ){.    
20230 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
20240 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  pTab = p->pSrc->
20250 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78  a[0].pTab;.  pEx
20260 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  pr = p->pEList->
20270 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73  a[0].pExpr;.  as
20280 73 65 72 74 28 20 70 54 61 62 20 26 26 20 21 70  sert( pTab && !p
20290 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26 20  Tab->pSelect && 
202a0 70 45 78 70 72 20 29 3b 0a 0a 20 20 69 66 28 20  pExpr );..  if( 
202b0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
202c0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
202d0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
202e0 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72  AGG_FUNCTION ) r
202f0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e  eturn 0;.  if( N
20300 45 56 45 52 28 70 41 67 67 49 6e 66 6f 2d 3e 6e  EVER(pAggInfo->n
20310 46 75 6e 63 3d 3d 30 29 20 29 20 72 65 74 75 72  Func==0) ) retur
20320 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41 67 67  n 0;.  if( (pAgg
20330 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70  Info->aFunc[0].p
20340 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 26  Func->funcFlags&
20350 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e  SQLITE_FUNC_COUN
20360 54 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  T)==0 ) return 0
20370 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66  ;.  if( pExpr->f
20380 6c 61 67 73 26 45 50 5f 44 69 73 74 69 6e 63 74  lags&EP_Distinct
20390 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
203a0 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
203b0 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f 75  /*.** If the sou
203c0 72 63 65 2d 6c 69 73 74 20 69 74 65 6d 20 70 61  rce-list item pa
203d0 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
203e0 65 6e 74 20 77 61 73 20 61 75 67 6d 65 6e 74 65  ent was augmente
203f0 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44  d with an.** IND
20400 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
20410 74 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61  then try to loca
20420 74 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  te the specified
20430 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 72 65   index. If there
20440 0a 2a 2a 20 77 61 73 20 73 75 63 68 20 61 20 63  .** was such a c
20450 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6e 61  lause and the na
20460 6d 65 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74  med index cannot
20470 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   be found, retur
20480 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52  n .** SQLITE_ERR
20490 4f 52 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20  OR and leave an 
204a0 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e  error in pParse.
204b0 20 4f 74 68 65 72 77 69 73 65 2c 20 70 6f 70 75   Otherwise, popu
204c0 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e  late .** pFrom->
204d0 70 49 6e 64 65 78 20 61 6e 64 20 72 65 74 75 72  pIndex and retur
204e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  n SQLITE_OK..*/.
204f0 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78  int sqlite3Index
20500 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65  edByLookup(Parse
20510 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74   *pParse, struct
20520 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
20530 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72  From){.  if( pFr
20540 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70 46 72 6f  om->pTab && pFro
20550 6d 2d 3e 7a 49 6e 64 65 78 20 29 7b 0a 20 20 20  m->zIndex ){.   
20560 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
20570 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
20580 63 68 61 72 20 2a 7a 49 6e 64 65 78 20 3d 20 70  char *zIndex = p
20590 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 3b 0a 20 20  From->zIndex;.  
205a0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
205b0 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
205c0 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20 20 20  ->pIndex; .     
205d0 20 20 20 70 49 64 78 20 26 26 20 73 71 6c 69 74     pIdx && sqlit
205e0 65 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e  e3StrICmp(pIdx->
205f0 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 29 3b 20  zName, zIndex); 
20600 0a 20 20 20 20 20 20 20 20 70 49 64 78 3d 70 49  .        pIdx=pI
20610 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b  dx->pNext.    );
20620 0a 20 20 20 20 69 66 28 20 21 70 49 64 78 20 29  .    if( !pIdx )
20630 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
20640 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
20650 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20  "no such index: 
20660 25 73 22 2c 20 7a 49 6e 64 65 78 2c 20 30 29 3b  %s", zIndex, 0);
20670 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63  .      pParse->c
20680 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
20690 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
206a0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
206b0 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49 6e 64  .    pFrom->pInd
206c0 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20  ex = pIdx;.  }. 
206d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
206e0 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63  K;.}./*.** Detec
206f0 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  t compound SELEC
20700 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  T statements tha
20710 74 20 75 73 65 20 61 6e 20 4f 52 44 45 52 20 42  t use an ORDER B
20720 59 20 63 6c 61 75 73 65 20 77 69 74 68 20 0a 2a  Y clause with .*
20730 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65  * an alternative
20740 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
20750 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  nce..**.**    SE
20760 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  LECT ... FROM t1
20770 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e   EXCEPT SELECT .
20780 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52  .. FROM t2 ORDER
20790 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e   BY .. COLLATE .
207a0 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61  ...**.** These a
207b0 72 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20  re rewritten as 
207c0 61 20 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a  a subquery:.**.*
207d0 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
207e0 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46  OM (SELECT ... F
207f0 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53 45  ROM t1 EXCEPT SE
20800 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32  LECT ... FROM t2
20810 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42  ).**     ORDER B
20820 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e  Y ... COLLATE ..
20830 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61  ..**.** This tra
20840 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e  nsformation is n
20850 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65  ecessary because
20860 20 74 68 65 20 6d 75 6c 74 69 53 65 6c 65 63 74   the multiSelect
20870 4f 72 64 65 72 42 79 28 29 20 72 6f 75 74 69 6e  OrderBy() routin
20880 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68 61 74 20  e.** above that 
20890 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
208a0 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e  de for a compoun
208b0 64 20 53 45 4c 45 43 54 20 77 69 74 68 20 61 6e  d SELECT with an
208c0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
208d0 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65 72 67 65  .** uses a merge
208e0 20 61 6c 67 6f 72 69 74 68 6d 20 74 68 61 74 20   algorithm that 
208f0 72 65 71 75 69 72 65 73 20 74 68 65 20 73 61 6d  requires the sam
20900 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
20910 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72  ence on the.** r
20920 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73  esult columns as
20930 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   on the ORDER BY
20940 20 63 6c 61 75 73 65 2e 20 20 53 65 65 20 74 69   clause.  See ti
20950 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77  cket.** http://w
20960 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72  ww.sqlite.org/sr
20970 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37 34 64 32  c/info/6709574d2
20980 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61  a.**.** This tra
20990 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f  nsformation is o
209a0 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f 72 20 45  nly needed for E
209b0 58 43 45 50 54 2c 20 49 4e 54 45 52 53 45 43 54  XCEPT, INTERSECT
209c0 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20  , and UNION..** 
209d0 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  The UNION ALL op
209e0 65 72 61 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e  erator works fin
209f0 65 20 77 69 74 68 20 6d 75 6c 74 69 53 65 6c 65  e with multiSele
20a00 63 74 4f 72 64 65 72 42 79 28 29 20 65 76 65 6e  ctOrderBy() even
20a10 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61   when.** there a
20a20 72 65 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73  re COLLATE terms
20a30 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
20a40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20a50 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53  convertCompoundS
20a60 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 28  electToSubquery(
20a70 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
20a80 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
20a90 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a  nt i;.  Select *
20aa0 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a  pNew;.  Select *
20ab0 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pX;.  sqlite3 *d
20ac0 62 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  b;.  struct Expr
20ad0 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20  List_item *a;.  
20ae0 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 53 72 63  SrcList *pNewSrc
20af0 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
20b00 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79  e;.  Token dummy
20b10 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  ;..  if( p->pPri
20b20 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  or==0 ) return W
20b30 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69  RC_Continue;.  i
20b40 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  f( p->pOrderBy==
20b50 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
20b60 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70  ontinue;.  for(p
20b70 58 3d 70 3b 20 70 58 20 26 26 20 28 70 58 2d 3e  X=p; pX && (pX->
20b80 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58  op==TK_ALL || pX
20b90 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29  ->op==TK_SELECT)
20ba0 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29  ; pX=pX->pPrior)
20bb0 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d 30 20 29  {}.  if( pX==0 )
20bc0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
20bd0 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70  inue;.  a = p->p
20be0 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f  OrderBy->a;.  fo
20bf0 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d  r(i=p->pOrderBy-
20c00 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20  >nExpr-1; i>=0; 
20c10 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 5b  i--){.    if( a[
20c20 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  i].pExpr->flags 
20c30 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62  & EP_Collate ) b
20c40 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
20c50 69 3c 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  i<0 ) return WRC
20c60 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a  _Continue;..  /*
20c70 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
20c80 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65  s point, that me
20c90 61 6e 73 20 74 68 65 20 74 72 61 6e 73 66 6f 72  ans the transfor
20ca0 6d 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72  mation is requir
20cb0 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65  ed. */..  pParse
20cc0 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
20cd0 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  se;.  db = pPars
20ce0 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20  e->db;.  pNew = 
20cf0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
20d00 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
20d10 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
20d20 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
20d30 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d  WRC_Abort;.  mem
20d40 73 65 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73  set(&dummy, 0, s
20d50 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20  izeof(dummy));. 
20d60 20 70 4e 65 77 53 72 63 20 3d 20 73 71 6c 69 74   pNewSrc = sqlit
20d70 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46  e3SrcListAppendF
20d80 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 30  romTerm(pParse,0
20d90 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77  ,0,0,&dummy,pNew
20da0 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20 70 4e 65  ,0,0);.  if( pNe
20db0 77 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  wSrc==0 ) return
20dc0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 2a 70   WRC_Abort;.  *p
20dd0 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70  New = *p;.  p->p
20de0 53 72 63 20 3d 20 70 4e 65 77 53 72 63 3b 0a 20  Src = pNewSrc;. 
20df0 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c   p->pEList = sql
20e00 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
20e10 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73 71  nd(pParse, 0, sq
20e20 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
20e30 5f 41 4c 4c 2c 20 30 29 29 3b 0a 20 20 70 2d 3e  _ALL, 0));.  p->
20e40 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a  op = TK_SELECT;.
20e50 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b    p->pWhere = 0;
20e60 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42  .  pNew->pGroupB
20e70 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  y = 0;.  pNew->p
20e80 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20 20 70 4e  Having = 0;.  pN
20e90 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30  ew->pOrderBy = 0
20ea0 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  ;.  p->pPrior = 
20eb0 30 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  0;.  p->pNext = 
20ec0 30 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  0;.  p->selFlags
20ed0 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64   &= ~SF_Compound
20ee0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ;.  assert( pNew
20ef0 2d 3e 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a 20  ->pPrior!=0 );. 
20f00 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 2d 3e 70   pNew->pPrior->p
20f10 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70  Next = pNew;.  p
20f20 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b  New->pLimit = 0;
20f30 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74  .  pNew->pOffset
20f40 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57   = 0;.  return W
20f50 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
20f60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
20f70 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72  MIT_CTE./*.** Ar
20f80 67 75 6d 65 6e 74 20 70 57 69 74 68 20 28 77 68  gument pWith (wh
20f90 69 63 68 20 6d 61 79 20 62 65 20 4e 55 4c 4c 29  ich may be NULL)
20fa0 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c 69 6e   points to a lin
20fb0 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e 65 73 74  ked list of nest
20fc0 65 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f 6e 74  ed .** WITH cont
20fd0 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e 65 72  exts, from inner
20fe0 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e 20 49   to outermost. I
20ff0 66 20 74 68 65 20 74 61 62 6c 65 20 69 64 65 6e  f the table iden
21000 74 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 46 52  tified by .** FR
21010 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e  OM clause elemen
21020 74 20 70 49 74 65 6d 20 69 73 20 72 65 61 6c 6c  t pItem is reall
21030 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65  y a common-table
21040 2d 65 78 70 72 65 73 73 69 6f 6e 20 28 43 54 45  -expression (CTE
21050 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  ) .** then retur
21060 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
21070 68 65 20 43 54 45 20 64 65 66 69 6e 69 74 69 6f  he CTE definitio
21080 6e 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c 65  n for that table
21090 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 72  . Otherwise.** r
210a0 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  eturn NULL..**.*
210b0 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  * If a non-NULL 
210c0 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65  value is returne
210d0 64 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74 65 78  d, set *ppContex
210e0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
210f0 65 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65 63 74  e With.** object
21100 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e   that the return
21110 65 64 20 43 54 45 20 62 65 6c 6f 6e 67 73 20 74  ed CTE belongs t
21120 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  o..*/.static str
21130 75 63 74 20 43 74 65 20 2a 73 65 61 72 63 68 57  uct Cte *searchW
21140 69 74 68 28 0a 20 20 57 69 74 68 20 2a 70 57 69  ith(.  With *pWi
21150 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
21160 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
21170 74 20 6f 75 74 65 72 6d 6f 73 74 20 57 49 54 48  t outermost WITH
21180 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
21190 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
211a0 20 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f 2a 20   *pItem,     /* 
211b0 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d  FROM clause elem
211c0 65 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65 20 2a  ent to resolve *
211d0 2f 0a 20 20 57 69 74 68 20 2a 2a 70 70 43 6f 6e  /.  With **ppCon
211e0 74 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20  text            
211f0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49 54 48      /* OUT: WITH
21200 20 63 6c 61 75 73 65 20 72 65 74 75 72 6e 20 76   clause return v
21210 61 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20  alue belongs to 
21220 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
21230 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28  ar *zName;.  if(
21240 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
21250 65 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65 20 3d  e==0 && (zName =
21260 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d   pItem->zName)!=
21270 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a 70  0 ){.    With *p
21280 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 57 69 74  ;.    for(p=pWit
21290 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75 74 65  h; p; p=p->pOute
212a0 72 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  r){.      int i;
212b0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
212c0 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b  i<p->nCte; i++){
212d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
212e0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d  ite3StrICmp(zNam
212f0 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  e, p->a[i].zName
21300 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
21310 20 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d 20 70    *ppContext = p
21320 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
21330 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20  rn &p->a[i];.   
21340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
21350 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
21360 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63  n 0;.}../* The c
21370 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6d 61  ode generator ma
21380 69 6e 74 61 69 6e 73 20 61 20 73 74 61 63 6b 20  intains a stack 
21390 6f 66 20 61 63 74 69 76 65 20 57 49 54 48 20 63  of active WITH c
213a0 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74 68 20 74  lauses.** with t
213b0 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 57 49  he inner-most WI
213c0 54 48 20 63 6c 61 75 73 65 20 62 65 69 6e 67 20  TH clause being 
213d0 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  at the top of th
213e0 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  e stack..**.** T
213f0 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75 73 68  his routine push
21400 65 73 20 74 68 65 20 57 49 54 48 20 63 6c 61 75  es the WITH clau
21410 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  se passed as the
21420 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
21430 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74 6f 70  .** onto the top
21440 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20 49   of the stack. I
21450 66 20 61 72 67 75 6d 65 6e 74 20 62 46 72 65 65  f argument bFree
21460 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
21470 68 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75  his.** WITH clau
21480 73 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  se will never be
21490 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65   popped from the
214a0 20 73 74 61 63 6b 2e 20 49 6e 20 74 68 69 73 20   stack. In this 
214b0 63 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f 75 6c  case it.** shoul
214c0 64 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67  d be freed along
214d0 20 77 69 74 68 20 74 68 65 20 50 61 72 73 65 20   with the Parse 
214e0 6f 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68 65 72  object. In other
214f0 20 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a 2a 20   cases, when.** 
21500 62 46 72 65 65 3d 3d 30 2c 20 74 68 65 20 57 69  bFree==0, the Wi
21510 74 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62  th object will b
21520 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69  e freed along wi
21530 74 68 20 74 68 65 20 53 45 4c 45 43 54 20 0a 2a  th the SELECT .*
21540 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74 68  * statement with
21550 20 77 68 69 63 68 20 69 74 20 69 73 20 61 73 73   which it is ass
21560 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64  ociated..*/.void
21570 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68   sqlite3WithPush
21580 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
21590 57 69 74 68 20 2a 70 57 69 74 68 2c 20 75 38 20  With *pWith, u8 
215a0 62 46 72 65 65 29 7b 0a 20 20 61 73 73 65 72 74  bFree){.  assert
215b0 28 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20 70 50  ( bFree==0 || pP
215c0 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 30 20 29  arse->pWith==0 )
215d0 3b 0a 20 20 69 66 28 20 70 57 69 74 68 20 29 7b  ;.  if( pWith ){
215e0 0a 20 20 20 20 70 57 69 74 68 2d 3e 70 4f 75 74  .    pWith->pOut
215f0 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69  er = pParse->pWi
21600 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  th;.    pParse->
21610 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20  pWith = pWith;. 
21620 20 20 20 70 50 61 72 73 65 2d 3e 62 46 72 65 65     pParse->bFree
21630 57 69 74 68 20 3d 20 62 46 72 65 65 3b 0a 20 20  With = bFree;.  
21640 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
21650 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20  function checks 
21660 69 66 20 61 72 67 75 6d 65 6e 74 20 70 46 72 6f  if argument pFro
21670 6d 20 72 65 66 65 72 73 20 74 6f 20 61 20 43 54  m refers to a CT
21680 45 20 64 65 63 6c 61 72 65 64 20 62 79 20 0a 2a  E declared by .*
21690 2a 20 61 20 57 49 54 48 20 63 6c 61 75 73 65 20  * a WITH clause 
216a0 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 63 75 72  on the stack cur
216b0 72 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65  rently maintaine
216c0 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e  d by the parser.
216d0 20 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72   And,.** if curr
216e0 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67  ently processing
216f0 20 61 20 43 54 45 20 65 78 70 72 65 73 73 69 6f   a CTE expressio
21700 6e 2c 20 69 66 20 69 74 20 69 73 20 61 20 72 65  n, if it is a re
21710 63 75 72 73 69 76 65 0a 2a 2a 20 72 65 66 65 72  cursive.** refer
21720 65 6e 63 65 20 74 6f 20 74 68 65 20 63 75 72 72  ence to the curr
21730 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49  ent CTE..**.** I
21740 66 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e  f pFrom falls in
21750 74 6f 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  to either of the
21760 20 74 77 6f 20 63 61 74 65 67 6f 72 69 65 73 20   two categories 
21770 61 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54  above, pFrom->pT
21780 61 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20  ab.** and other 
21790 66 69 65 6c 64 73 20 61 72 65 20 70 6f 70 75 6c  fields are popul
217a0 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79  ated accordingly
217b0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f  . The caller sho
217c0 75 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46  uld check.** (pF
217d0 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f  rom->pTab!=0) to
217e0 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   determine wheth
217f0 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 75 63 63  er or not a succ
21800 65 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20  essful match.** 
21810 77 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  was found..**.**
21820 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
21830 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64  a match is found
21840 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
21850 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72  eturned if no er
21860 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49  ror.** occurs. I
21870 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20  f an error does 
21880 6f 63 63 75 72 2c 20 61 6e 20 65 72 72 6f 72 20  occur, an error 
21890 6d 65 73 73 61 67 65 20 69 73 20 73 74 6f 72 65  message is store
218a0 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73  d in the.** pars
218b0 65 72 20 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f  er and some erro
218c0 72 20 63 6f 64 65 20 6f 74 68 65 72 20 74 68 61  r code other tha
218d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  n SQLITE_OK retu
218e0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
218f0 69 6e 74 20 77 69 74 68 45 78 70 61 6e 64 28 0a  int withExpand(.
21900 20 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65    Walker *pWalke
21910 72 2c 20 0a 20 20 73 74 72 75 63 74 20 53 72 63  r, .  struct Src
21920 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
21930 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  .){.  Parse *pPa
21940 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
21950 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33  Parse;.  sqlite3
21960 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
21970 62 3b 0a 20 20 73 74 72 75 63 74 20 43 74 65 20  b;.  struct Cte 
21980 2a 70 43 74 65 3b 20 20 20 20 20 20 20 20 20 20  *pCte;          
21990 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 65 64 20       /* Matched 
219a0 43 54 45 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20  CTE (or NULL if 
219b0 6e 6f 20 6d 61 74 63 68 29 20 2a 2f 0a 20 20 57  no match) */.  W
219c0 69 74 68 20 2a 70 57 69 74 68 3b 20 20 20 20 20  ith *pWith;     
219d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
219e0 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 74 68  * WITH clause th
219f0 61 74 20 70 43 74 65 20 62 65 6c 6f 6e 67 73 20  at pCte belongs 
21a00 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  to */..  assert(
21a10 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
21a20 29 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73 65 61  );..  pCte = sea
21a30 72 63 68 57 69 74 68 28 70 50 61 72 73 65 2d 3e  rchWith(pParse->
21a40 70 57 69 74 68 2c 20 70 46 72 6f 6d 2c 20 26 70  pWith, pFrom, &p
21a50 57 69 74 68 29 3b 0a 20 20 69 66 28 20 70 43 74  With);.  if( pCt
21a60 65 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  e ){.    Table *
21a70 70 54 61 62 3b 0a 20 20 20 20 45 78 70 72 4c 69  pTab;.    ExprLi
21a80 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20  st *pEList;.    
21a90 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20  Select *pSel;.  
21aa0 20 20 53 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b    Select *pLeft;
21ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ac0 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c  /* Left-most SEL
21ad0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
21ae0 0a 20 20 20 20 69 6e 74 20 62 4d 61 79 52 65 63  .    int bMayRec
21af0 75 72 73 69 76 65 3b 20 20 20 20 20 20 20 20 20  ursive;         
21b00 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 6f     /* True if co
21b10 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65 64 20 62 79  mpound joined by
21b20 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a   UNION [ALL] */.
21b30 20 20 20 20 57 69 74 68 20 2a 70 53 61 76 65 64      With *pSaved
21b40 57 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  With;           
21b50 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c    /* Initial val
21b60 75 65 20 6f 66 20 70 50 61 72 73 65 2d 3e 70 57  ue of pParse->pW
21b70 69 74 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49  ith */..    /* I
21b80 66 20 70 43 74 65 2d 3e 7a 45 72 72 20 69 73 20  f pCte->zErr is 
21b90 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74 68 69 73  non-NULL at this
21ba0 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69   point, then thi
21bb0 73 20 69 73 20 61 6e 20 69 6c 6c 65 67 61 6c 0a  s is an illegal.
21bc0 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65      ** recursive
21bd0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 43 54   reference to CT
21be0 45 20 70 43 74 65 2e 20 4c 65 61 76 65 20 61 6e  E pCte. Leave an
21bf0 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65   error in pParse
21c00 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20   and return.    
21c10 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20 70 43 74  ** early. If pCt
21c20 65 2d 3e 7a 45 72 72 20 69 73 20 4e 55 4c 4c 2c  e->zErr is NULL,
21c30 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 6e 6f   then this is no
21c40 74 20 61 20 72 65 63 75 72 73 69 76 65 20 72 65  t a recursive re
21c50 66 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20  ference..    ** 
21c60 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 70 72  In this case, pr
21c70 6f 63 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69  oceed.  */.    i
21c80 66 28 20 70 43 74 65 2d 3e 7a 45 72 72 20 29 7b  f( pCte->zErr ){
21c90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
21ca0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70  rorMsg(pParse, p
21cb0 43 74 65 2d 3e 7a 45 72 72 2c 20 70 43 74 65 2d  Cte->zErr, pCte-
21cc0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72  >zName);.      r
21cd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
21ce0 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61  OR;.    }..    a
21cf0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
21d00 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 72  ab==0 );.    pFr
21d10 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
21d20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
21d30 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
21d40 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 69 66  (Table));.    if
21d50 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
21d60 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
21d70 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31    pTab->nRef = 1
21d80 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d  ;.    pTab->zNam
21d90 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
21da0 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e  Dup(db, pCte->zN
21db0 61 6d 65 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e  ame);.    pTab->
21dc0 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20  iPKey = -1;.    
21dd0 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20  pTab->nRowEst = 
21de0 31 30 34 38 35 37 36 3b 0a 20 20 20 20 70 54 61  1048576;.    pTa
21df0 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  b->tabFlags |= T
21e00 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20  F_Ephemeral;.   
21e10 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20   pFrom->pSelect 
21e20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
21e30 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65  up(db, pCte->pSe
21e40 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  lect, 0);.    if
21e50 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
21e60 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ed ) return SQLI
21e70 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 61 73  TE_NOMEM;.    as
21e80 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65  sert( pFrom->pSe
21e90 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  lect );..    /* 
21ea0 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73  Check if this is
21eb0 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45   a recursive CTE
21ec0 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20 3d 20  . */.    pSel = 
21ed0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pFrom->pSelect;.
21ee0 20 20 20 20 62 4d 61 79 52 65 63 75 72 73 69 76      bMayRecursiv
21ef0 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d  e = ( pSel->op==
21f00 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e  TK_ALL || pSel->
21f10 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
21f20 20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75      if( bMayRecu
21f30 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69  rsive ){.      i
21f40 6e 74 20 69 3b 0a 20 20 20 20 20 20 53 72 63 4c  nt i;.      SrcL
21f50 69 73 74 20 2a 70 53 72 63 20 3d 20 70 46 72 6f  ist *pSrc = pFro
21f60 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63  m->pSelect->pSrc
21f70 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
21f80 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69   i<pSrc->nSrc; i
21f90 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  ++){.        str
21fa0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
21fb0 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72 63 2d   *pItem = &pSrc-
21fc0 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  >a[i];.        i
21fd0 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  f( pItem->zDatab
21fe0 61 73 65 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  ase==0 .        
21ff0 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65   && pItem->zName
22000 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26  !=0 .         &&
22010 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
22020 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c  mp(pItem->zName,
22030 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20   pCte->zName).  
22040 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
22050 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62       pItem->pTab
22060 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20   = pTab;.       
22070 20 20 20 70 49 74 65 6d 2d 3e 69 73 52 65 63 75     pItem->isRecu
22080 72 73 69 76 65 20 3d 20 31 3b 0a 20 20 20 20 20  rsive = 1;.     
22090 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b       pTab->nRef+
220a0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 65  +;.          pSe
220b0 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  l->selFlags |= S
220c0 46 5f 52 65 63 75 72 73 69 76 65 3b 0a 20 20 20  F_Recursive;.   
220d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
220e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c     }..    /* Onl
220f0 79 20 6f 6e 65 20 72 65 63 75 72 73 69 76 65 20  y one recursive 
22100 72 65 66 65 72 65 6e 63 65 20 69 73 20 70 65 72  reference is per
22110 6d 69 74 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20  mitted. */ .    
22120 69 66 28 20 70 54 61 62 2d 3e 6e 52 65 66 3e 32  if( pTab->nRef>2
22130 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
22140 33 45 72 72 6f 72 4d 73 67 28 0a 20 20 20 20 20  3ErrorMsg(.     
22150 20 20 20 20 20 70 50 61 72 73 65 2c 20 22 6d 75       pParse, "mu
22160 6c 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65  ltiple reference
22170 73 20 74 6f 20 72 65 63 75 72 73 69 76 65 20 74  s to recursive t
22180 61 62 6c 65 3a 20 25 73 22 2c 20 70 43 74 65 2d  able: %s", pCte-
22190 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a  >zName.      );.
221a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
221b0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
221c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
221d0 62 2d 3e 6e 52 65 66 3d 3d 31 20 7c 7c 20 28 28  b->nRef==1 || ((
221e0 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53  pSel->selFlags&S
221f0 46 5f 52 65 63 75 72 73 69 76 65 29 20 26 26 20  F_Recursive) && 
22200 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 32 20 29 29  pTab->nRef==2 ))
22210 3b 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a 45 72  ;..    pCte->zEr
22220 72 20 3d 20 22 63 69 72 63 75 6c 61 72 20 72 65  r = "circular re
22230 66 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a 20 20  ference: %s";.  
22240 20 20 70 53 61 76 65 64 57 69 74 68 20 3d 20 70    pSavedWith = p
22250 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20  Parse->pWith;.  
22260 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
22270 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 73 71 6c  = pWith;.    sql
22280 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
22290 57 61 6c 6b 65 72 2c 20 62 4d 61 79 52 65 63 75  Walker, bMayRecu
222a0 72 73 69 76 65 20 3f 20 70 53 65 6c 2d 3e 70 50  rsive ? pSel->pP
222b0 72 69 6f 72 20 3a 20 70 53 65 6c 29 3b 0a 0a 20  rior : pSel);.. 
222c0 20 20 20 66 6f 72 28 70 4c 65 66 74 3d 70 53 65     for(pLeft=pSe
222d0 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72  l; pLeft->pPrior
222e0 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74 2d 3e 70  ; pLeft=pLeft->p
222f0 50 72 69 6f 72 29 3b 0a 20 20 20 20 70 45 4c 69  Prior);.    pELi
22300 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70 45 4c 69  st = pLeft->pELi
22310 73 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 65  st;.    if( pCte
22320 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20 20 20 20 20  ->pCols ){.     
22330 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78   if( pEList->nEx
22340 70 72 21 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d  pr!=pCte->pCols-
22350 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
22360 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
22370 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
22380 20 25 73 20 68 61 73 20 25 64 20 76 61 6c 75 65   %s has %d value
22390 73 20 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73  s for %d columns
223a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ",.            p
223b0 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69  Cte->zName, pELi
223c0 73 74 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d  st->nExpr, pCte-
223d0 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20  >pCols->nExpr.  
223e0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
223f0 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
22400 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20 20   pSavedWith;.   
22410 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
22420 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
22430 7d 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d  }.      pEList =
22440 20 70 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20   pCte->pCols;.  
22450 20 20 7d 0a 0a 20 20 20 20 73 65 6c 65 63 74 43    }..    selectC
22460 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
22470 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  st(pParse, pELis
22480 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  t, &pTab->nCol, 
22490 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20  &pTab->aCol);.  
224a0 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73    if( bMayRecurs
224b0 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ive ){.      if(
224c0 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20   pSel->selFlags 
224d0 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29  & SF_Recursive )
224e0 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e  {.        pCte->
224f0 7a 45 72 72 20 3d 20 22 6d 75 6c 74 69 70 6c 65  zErr = "multiple
22500 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72   recursive refer
22510 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20 20 20 20  ences: %s";.    
22520 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22530 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20 22 72   pCte->zErr = "r
22540 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
22550 63 65 20 69 6e 20 61 20 73 75 62 71 75 65 72 79  ce in a subquery
22560 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20  : %s";.      }. 
22570 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
22580 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
22590 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pSel);.    }.   
225a0 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20 30 3b   pCte->zErr = 0;
225b0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69  .    pParse->pWi
225c0 74 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b  th = pSavedWith;
225d0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
225e0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
225f0 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
22600 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a  TE_OMIT_CTE./*.*
22610 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20  * If the SELECT 
22620 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
22630 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 68 61  cond argument ha
22640 73 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20  s an associated 
22650 57 49 54 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c  WITH .** clause,
22660 20 70 6f 70 20 69 74 20 66 72 6f 6d 20 74 68 65   pop it from the
22670 20 73 74 61 63 6b 20 73 74 6f 72 65 64 20 61 73   stack stored as
22680 20 70 61 72 74 20 6f 66 20 74 68 65 20 50 61 72   part of the Par
22690 73 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  se object..**.**
226a0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
226b0 73 20 75 73 65 64 20 61 73 20 74 68 65 20 78 53  s used as the xS
226c0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 28 29  electCallback2()
226d0 20 63 61 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20   callback by.** 
226e0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
226f0 61 6e 64 28 29 20 77 68 65 6e 20 77 61 6c 6b 69  and() when walki
22700 6e 67 20 61 20 53 45 4c 45 43 54 20 74 72 65 65  ng a SELECT tree
22710 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 61 62 6c   to resolve tabl
22720 65 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f  e.** names and o
22730 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65  ther FROM clause
22740 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73   elements. .*/.s
22750 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
22760 74 50 6f 70 57 69 74 68 28 57 61 6c 6b 65 72 20  tPopWith(Walker 
22770 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
22780 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *p){.  Parse *p
22790 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
227a0 3e 70 50 61 72 73 65 3b 0a 20 20 57 69 74 68 20  >pParse;.  With 
227b0 2a 70 57 69 74 68 20 3d 20 66 69 6e 64 52 69 67  *pWith = findRig
227c0 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68  htmost(p)->pWith
227d0 3b 0a 20 20 69 66 28 20 70 57 69 74 68 21 3d 30  ;.  if( pWith!=0
227e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
227f0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70  pParse->pWith==p
22800 57 69 74 68 20 29 3b 0a 20 20 20 20 70 50 61 72  With );.    pPar
22810 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
22820 68 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 7d 0a 7d  h->pOuter;.  }.}
22830 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 73  .#else.#define s
22840 65 6c 65 63 74 50 6f 70 57 69 74 68 20 30 0a 23  electPopWith 0.#
22850 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
22860 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 57  s routine is a W
22870 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66  alker callback f
22880 6f 72 20 22 65 78 70 61 6e 64 69 6e 67 22 20 61  or "expanding" a
22890 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
228a0 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67  t..** "Expanding
228b0 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74 68  " means to do th
228c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
228d0 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20  **    (1)  Make 
228e0 73 75 72 65 20 56 44 42 45 20 63 75 72 73 6f 72  sure VDBE cursor
228f0 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65   numbers have be
22900 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65  en assigned to e
22910 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  very.**         
22920 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46  element of the F
22930 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ROM clause..**.*
22940 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69  *    (2)  Fill i
22950 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e  n the pTabList->
22960 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20  a[].pTab fields 
22970 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74  in the SrcList t
22980 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  hat .**         
22990 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61  defines FROM cla
229a0 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73  use.  When views
229b0 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46   appear in the F
229c0 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20  ROM clause,.**  
229d0 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62         fill pTab
229e0 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63  List->a[].pSelec
229f0 74 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  t with a copy of
22a00 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
22a10 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  ement.**        
22a20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
22a30 20 74 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f   the view.  A co
22a40 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68  py is made of th
22a50 65 20 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a  e view's SELECT.
22a60 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61 74 65  **         state
22a70 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20  ment so that we 
22a80 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66  can freely modif
22a90 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74  y or delete that
22aa0 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20   statement.**   
22ab0 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f        without wo
22ac0 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73  rrying about mes
22ad0 73 69 6e 67 20 75 70 20 74 68 65 20 70 72 65 73  sing up the pres
22ae0 69 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74  istent represent
22af0 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20  ation.**        
22b00 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a   of the view..**
22b10 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64 20  .**    (3)  Add 
22b20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45  terms to the WHE
22b30 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63  RE clause to acc
22b40 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55  omodate the NATU
22b50 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20  RAL keyword.**  
22b60 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20         on joins 
22b70 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55  and the ON and U
22b80 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a  SING clause of j
22b90 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  oins..**.**    (
22ba0 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73  4)  Scan the lis
22bb0 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  t of columns in 
22bc0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 28  the result set (
22bd0 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a  pEList) looking.
22be0 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20 69  **         for i
22bf0 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
22c00 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  "*" operator or 
22c10 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72  the TABLE.* oper
22c20 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ator..**        
22c30 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e   If found, expan
22c40 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65  d each "*" to be
22c50 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
22c60 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20   every table.** 
22c70 20 20 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c          and TABL
22c80 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20  E.* to be every 
22c90 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e  column in TABLE.
22ca0 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
22cb0 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  t selectExpander
22cc0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
22cd0 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
22ce0 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
22cf0 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
22d00 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a  .  int i, j, k;.
22d10 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
22d20 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
22d30 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  *pEList;.  struc
22d40 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
22d50 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pFrom;.  sqlite3
22d60 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
22d70 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c 20 2a  b;.  Expr *pE, *
22d80 70 52 69 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a  pRight, *pExpr;.
22d90 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 20 3d    u16 selFlags =
22da0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 0a 20   p->selFlags;.. 
22db0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
22dc0 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 69  SF_Expanded;.  i
22dd0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
22de0 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75  led  ){.    retu
22df0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
22e00 7d 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d  }.  if( NEVER(p-
22e10 3e 70 53 72 63 3d 3d 30 29 20 7c 7c 20 28 73 65  >pSrc==0) || (se
22e20 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61  lFlags & SF_Expa
22e30 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20  nded)!=0 ){.    
22e40 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
22e50 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74  ;.  }.  pTabList
22e60 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45   = p->pSrc;.  pE
22e70 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
22e80 3b 0a 20 20 73 71 6c 69 74 65 33 57 69 74 68 50  ;.  sqlite3WithP
22e90 75 73 68 28 70 50 61 72 73 65 2c 20 66 69 6e 64  ush(pParse, find
22ea0 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57  Rightmost(p)->pW
22eb0 69 74 68 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 4d  ith, 0);..  /* M
22ec0 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20  ake sure cursor 
22ed0 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
22ee0 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c  n assigned to al
22ef0 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a  l entries in.  *
22f00 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
22f10 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  e of the SELECT 
22f20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
22f30 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
22f40 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
22f50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b  arse, pTabList);
22f60 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65  ..  /* Look up e
22f70 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64  very table named
22f80 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
22f90 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63  use of the selec
22fa0 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  t.  If.  ** an e
22fb0 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
22fc0 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62   clause is a sub
22fd0 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66  query instead of
22fe0 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77   a table or view
22ff0 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61  ,.  ** then crea
23000 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74  te a transient t
23010 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
23020 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73  o describe the s
23030 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  ubquery..  */.  
23040 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
23050 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
23060 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
23070 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
23080 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
23090 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
230a0 3e 69 73 52 65 63 75 72 73 69 76 65 3d 3d 30 20  >isRecursive==0 
230b0 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29  || pFrom->pTab )
230c0 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  ;.    if( pFrom-
230d0 3e 69 73 52 65 63 75 72 73 69 76 65 20 29 20 63  >isRecursive ) c
230e0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
230f0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20   pFrom->pTab!=0 
23100 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
23110 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 61   statement has a
23120 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72 65 70  lready been prep
23130 61 72 65 64 2e 20 20 54 68 65 72 65 20 69 73 20  ared.  There is 
23140 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a  no need.      **
23150 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20   to go further. 
23160 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
23170 20 69 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66   i==0 );.#ifndef
23180 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
23190 0a 20 20 20 20 20 20 73 65 6c 65 63 74 50 6f 70  .      selectPop
231a0 57 69 74 68 28 70 57 61 6c 6b 65 72 2c 20 70 29  With(pWalker, p)
231b0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  ;.#endif.      r
231c0 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
231d0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
231e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20  QLITE_OMIT_CTE. 
231f0 20 20 20 69 66 28 20 77 69 74 68 45 78 70 61 6e     if( withExpan
23200 64 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d  d(pWalker, pFrom
23210 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ) ) return WRC_A
23220 62 6f 72 74 3b 0a 20 20 20 20 69 66 28 20 70 46  bort;.    if( pF
23230 72 6f 6d 2d 3e 70 54 61 62 20 29 20 7b 7d 20 65  rom->pTab ) {} e
23240 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  lse.#endif.    i
23250 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d  f( pFrom->zName=
23260 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  =0 ){.#ifndef SQ
23270 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
23280 52 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  RY.      Select 
23290 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSel = pFrom->p
232a0 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a  Select;.      /*
232b0 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20   A sub-query in 
232c0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
232d0 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20  of a SELECT */. 
232e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65       assert( pSe
232f0 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  l!=0 );.      as
23300 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
23310 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  b==0 );.      sq
23320 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
23330 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a  pWalker, pSel);.
23340 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61        pFrom->pTa
23350 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
23360 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
23370 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
23380 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
23390 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  b==0 ) return WR
233a0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70  C_Abort;.      p
233b0 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  Tab->nRef = 1;. 
233c0 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
233d0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
233e0 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 71  f(db, "sqlite_sq
233f0 5f 25 70 22 2c 20 28 76 6f 69 64 2a 29 70 54 61  _%p", (void*)pTa
23400 62 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  b);.      while(
23410 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b   pSel->pPrior ){
23420 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50   pSel = pSel->pP
23430 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 65  rior; }.      se
23440 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  lectColumnsFromE
23450 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
23460 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 20 26 70  pSel->pEList, &p
23470 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  Tab->nCol, &pTab
23480 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70  ->aCol);.      p
23490 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  Tab->iPKey = -1;
234a0 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f  .      pTab->nRo
234b0 77 45 73 74 20 3d 20 31 30 34 38 35 37 36 3b 0a  wEst = 1048576;.
234c0 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46        pTab->tabF
234d0 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d  lags |= TF_Ephem
234e0 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20  eral;.#endif.   
234f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
23500 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62   An ordinary tab
23510 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20  le or view name 
23520 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
23530 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  se */.      asse
23540 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
23550 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f  =0 );.      pFro
23560 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
23570 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
23580 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20  bleItem(pParse, 
23590 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20 20  0, pFrom);.     
235a0 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72   if( pTab==0 ) r
235b0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
235c0 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d  .      if( pTab-
235d0 3e 6e 52 65 66 3d 3d 30 78 66 66 66 66 20 29 7b  >nRef==0xffff ){
235e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
235f0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
23600 20 22 74 6f 6f 20 6d 61 6e 79 20 72 65 66 65 72   "too many refer
23610 65 6e 63 65 73 20 74 6f 20 5c 22 25 73 5c 22 3a  ences to \"%s\":
23620 20 6d 61 78 20 36 35 35 33 35 22 2c 0a 20 20 20   max 65535",.   
23630 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
23640 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 46  ame);.        pF
23650 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20  rom->pTab = 0;. 
23660 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
23670 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
23680 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65  .      pTab->nRe
23690 66 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69 6e 65  f++;.#if !define
236a0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
236b0 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20  EW) || !defined 
236c0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
236d0 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20  TUALTABLE).     
236e0 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
236f0 63 74 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28  ct || IsVirtual(
23700 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
23710 20 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65 72   /* We reach her
23720 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74  e if the named t
23730 61 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c 79  able is a really
23740 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20   a view */.     
23750 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 69     if( sqlite3Vi
23760 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
23770 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29  (pParse, pTab) )
23780 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
23790 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
237a0 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  t( pFrom->pSelec
237b0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
237c0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  pFrom->pSelect =
237d0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
237e0 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c  p(db, pTab->pSel
237f0 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ect, 0);.       
23800 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
23810 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f  ct(pWalker, pFro
23820 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  m->pSelect);.   
23830 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
23840 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65  }..    /* Locate
23850 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 64   the index named
23860 20 62 79 20 74 68 65 20 49 4e 44 45 58 45 44 20   by the INDEXED 
23870 42 59 20 63 6c 61 75 73 65 2c 20 69 66 20 61 6e  BY clause, if an
23880 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  y. */.    if( sq
23890 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f  lite3IndexedByLo
238a0 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 46 72  okup(pParse, pFr
238b0 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  om) ){.      ret
238c0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
238d0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
238e0 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b  rocess NATURAL k
238f0 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20  eywords, and ON 
23900 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
23910 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f  s of joins..  */
23920 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
23930 63 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74  cFailed || sqlit
23940 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61  eProcessJoin(pPa
23950 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72  rse, p) ){.    r
23960 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
23970 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65  .  }..  /* For e
23980 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63  very "*" that oc
23990 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75  curs in the colu
239a0 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20  mn list, insert 
239b0 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a  the names of.  *
239c0 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  * all columns in
239d0 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e   all tables.  An
239e0 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c  d for every TABL
239f0 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e  E.* insert the n
23a00 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c  ames.  ** of all
23a10 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c   columns in TABL
23a20 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69  E.  The parser i
23a30 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61  nserted a specia
23a40 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a  l expression.  *
23a50 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c  * with the TK_AL
23a60 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65  L operator for e
23a70 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20  ach "*" that it 
23a80 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c  found in the col
23a90 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54  umn list..  ** T
23aa0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
23ab0 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f  e just has to lo
23ac0 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20  cate the TK_ALL 
23ad0 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20  expressions and 
23ae0 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68  expand.  ** each
23af0 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74   one to the list
23b00 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
23b10 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20  in all tables.. 
23b20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72   **.  ** The fir
23b30 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65  st loop just che
23b40 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68  cks to see if th
23b50 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20  ere are any "*" 
23b60 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74  operators.  ** t
23b70 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69  hat need expandi
23b80 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b  ng..  */.  for(k
23b90 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; k<pEList->nE
23ba0 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 70  xpr; k++){.    p
23bb0 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d  E = pEList->a[k]
23bc0 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
23bd0 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  pE->op==TK_ALL )
23be0 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65   break;.    asse
23bf0 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  rt( pE->op!=TK_D
23c00 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74  OT || pE->pRight
23c10 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
23c20 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  t( pE->op!=TK_DO
23c30 54 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21  T || (pE->pLeft!
23c40 3d 30 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d  =0 && pE->pLeft-
23c50 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20  >op==TK_ID) );. 
23c60 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
23c70 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69  K_DOT && pE->pRi
23c80 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  ght->op==TK_ALL 
23c90 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
23ca0 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  f( k<pEList->nEx
23cb0 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  pr ){.    /*.   
23cc0 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65   ** If we get he
23cd0 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  re it means the 
23ce0 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61  result set conta
23cf0 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
23d00 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  "*".    ** opera
23d10 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
23d20 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20  o be expanded.  
23d30 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63  Loop through eac
23d40 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  h expression.   
23d50 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
23d60 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64  t set and expand
23d70 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65   them one by one
23d80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72  ..    */.    str
23d90 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
23da0 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61  m *a = pEList->a
23db0 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
23dc0 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e  pNew = 0;.    in
23dd0 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65  t flags = pParse
23de0 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  ->db->flags;.   
23df0 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d   int longNames =
23e00 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
23e10 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
23e20 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
23e30 20 20 20 20 20 20 20 20 26 26 20 28 66 6c 61 67          && (flag
23e40 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74  s & SQLITE_Short
23e50 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20  ColNames)==0;.. 
23e60 20 20 20 2f 2a 20 57 68 65 6e 20 70 72 6f 63 65     /* When proce
23e70 73 73 69 6e 67 20 46 52 4f 4d 2d 63 6c 61 75 73  ssing FROM-claus
23e80 65 20 73 75 62 71 75 65 72 69 65 73 2c 20 69 74  e subqueries, it
23e90 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 63   is always the c
23ea0 61 73 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ase.    ** that 
23eb0 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  full_column_name
23ec0 73 3d 4f 46 46 20 61 6e 64 20 73 68 6f 72 74 5f  s=OFF and short_
23ed0 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 3d 4f 4e 2e  column_names=ON.
23ee0 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c    The.    ** sql
23ef0 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
23f00 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65 20  elect() routine 
23f10 6d 61 6b 65 73 20 69 74 20 73 6f 2e 20 2a 2f 0a  makes it so. */.
23f20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e      assert( (p->
23f30 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65  selFlags & SF_Ne
23f40 73 74 65 64 46 72 6f 6d 29 3d 3d 30 0a 20 20 20  stedFrom)==0.   
23f50 20 20 20 20 20 20 20 7c 7c 20 28 28 66 6c 61 67         || ((flag
23f60 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43  s & SQLITE_FullC
23f70 6f 6c 4e 61 6d 65 73 29 3d 3d 30 20 26 26 0a 20  olNames)==0 &&. 
23f80 20 20 20 20 20 20 20 20 20 20 20 20 20 28 66 6c               (fl
23f90 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f  ags & SQLITE_Sho
23fa0 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 29 20  rtColNames)!=0) 
23fb0 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b  );..    for(k=0;
23fc0 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
23fd0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 70 45  ; k++){.      pE
23fe0 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20   = a[k].pExpr;. 
23ff0 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45       pRight = pE
24000 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
24010 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d  assert( pE->op!=
24020 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74  TK_DOT || pRight
24030 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
24040 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20   pE->op!=TK_ALL 
24050 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  && (pE->op!=TK_D
24060 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70  OT || pRight->op
24070 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20  !=TK_ALL) ){.   
24080 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72       /* This par
24090 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69  ticular expressi
240a0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  on does not need
240b0 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e   to be expanded.
240c0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
240d0 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
240e0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
240f0 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61  (pParse, pNew, a
24100 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [k].pExpr);.    
24110 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
24120 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
24130 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d  a[pNew->nExpr-1]
24140 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e  .zName = a[k].zN
24150 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ame;.          p
24160 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78  New->a[pNew->nEx
24170 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b  pr-1].zSpan = a[
24180 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20  k].zSpan;.      
24190 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d      a[k].zName =
241a0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b   0;.          a[
241b0 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20  k].zSpan = 0;.  
241c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
241d0 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a  a[k].pExpr = 0;.
241e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
241f0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70       /* This exp
24200 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22  ression is a "*"
24210 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20   or a "TABLE.*" 
24220 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  and needs to be.
24230 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e          ** expan
24240 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ded. */.        
24250 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20  int tableSeen = 
24260 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  0;      /* Set t
24270 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d  o 1 when TABLE m
24280 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20  atches */.      
24290 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d    char *zTName =
242a0 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 74 65 78   0;       /* tex
242b0 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42  t of name of TAB
242c0 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  LE */.        if
242d0 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ( pE->op==TK_DOT
242e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
242f0 73 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21  sert( pE->pLeft!
24300 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
24310 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
24320 50 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65  Property(pE->pLe
24330 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  ft, EP_IntValue)
24340 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   );.          zT
24350 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74  Name = pE->pLeft
24360 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
24370 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
24380 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
24390 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
243a0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
243b0 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
243c0 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
243d0 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
243e0 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74            Select
243f0 20 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pSub = pFrom->
24400 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20  pSelect;.       
24410 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d     char *zTabNam
24420 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61  e = pFrom->zAlia
24430 73 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  s;.          con
24440 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61  st char *zSchema
24450 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
24460 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
24470 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
24480 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
24490 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d        zTabName =
244a0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
244b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
244c0 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
244d0 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b  ocFailed ) break
244e0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
244f0 70 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62  pSub==0 || (pSub
24500 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
24510 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29  NestedFrom)==0 )
24520 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  {.            pS
24530 75 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ub = 0;.        
24540 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26      if( zTName &
24550 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
24560 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d  (zTName, zTabNam
24570 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)!=0 ){.       
24580 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
24590 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
245a0 20 20 20 20 20 20 20 20 20 20 20 69 44 62 20 3d             iDb =
245b0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
245c0 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
245d0 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
245e0 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d        zSchemaNam
245f0 65 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d  e = iDb>=0 ? db-
24600 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20  >aDb[iDb].zName 
24610 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20 20 20 20  : "*";.         
24620 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72   }.          for
24630 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
24640 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
24650 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
24660 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  e = pTab->aCol[j
24670 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
24680 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e       char *zColn
24690 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d  ame;  /* The com
246a0 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  puted column nam
246b0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
246c0 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20   char *zToFree; 
246d0 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74    /* Malloced st
246e0 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73 20  ring that needs 
246f0 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20  to be freed */. 
24700 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65 6e             Token
24710 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43   sColname;  /* C
24720 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e  omputed column n
24730 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a  ame as a token *
24740 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  /..            a
24750 73 73 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b 0a  ssert( zName );.
24760 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
24770 7a 54 4e 61 6d 65 20 26 26 20 70 53 75 62 0a 20  zTName && pSub. 
24780 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
24790 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e 4e  qlite3MatchSpanN
247a0 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69 73 74  ame(pSub->pEList
247b0 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c  ->a[j].zSpan, 0,
247c0 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a 20   zTName, 0)==0. 
247d0 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
247e0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
247f0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
24800 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
24810 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20   /* If a column 
24820 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68 69  is marked as 'hi
24830 64 64 65 6e 27 20 28 63 75 72 72 65 6e 74 6c 79  dden' (currently
24840 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 0a 20   only possible. 
24850 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f             ** fo
24860 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  r virtual tables
24870 29 2c 20 64 6f 20 6e 6f 74 20 69 6e 63 6c 75 64  ), do not includ
24880 65 20 69 74 20 69 6e 20 74 68 65 20 65 78 70 61  e it in the expa
24890 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 20  nded.           
248a0 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c   ** result-set l
248b0 69 73 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ist..           
248c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
248d0 69 66 28 20 49 73 48 69 64 64 65 6e 43 6f 6c 75  if( IsHiddenColu
248e0 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  mn(&pTab->aCol[j
248f0 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
24900 20 20 20 20 61 73 73 65 72 74 28 49 73 56 69 72      assert(IsVir
24910 74 75 61 6c 28 70 54 61 62 29 29 3b 0a 20 20 20  tual(pTab));.   
24920 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
24930 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
24940 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74   }.            t
24950 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 0a 20  ableSeen = 1;.. 
24960 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
24970 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20  >0 && zTName==0 
24980 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
24990 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 6a 6f 69   if( (pFrom->joi
249a0 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
249b0 41 4c 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  AL)!=0.         
249c0 20 20 20 20 20 20 20 26 26 20 74 61 62 6c 65 41         && tableA
249d0 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54  ndColumnIndex(pT
249e0 61 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65  abList, i, zName
249f0 2c 20 30 2c 20 30 29 0a 20 20 20 20 20 20 20 20  , 0, 0).        
24a00 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
24a10 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
24a20 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f   NATURAL join, o
24a30 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c  mit the join col
24a40 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20  umns from the . 
24a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
24a60 2a 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 72  * table to the r
24a70 69 67 68 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e  ight of the join
24a80 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
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 20 20 7d 0a 20 20              }.  
24ab0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
24ac0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64  sqlite3IdListInd
24ad0 65 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67  ex(pFrom->pUsing
24ae0 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20  , zName)>=0 ){. 
24af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24b00 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68  * In a join with
24b10 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c   a USING clause,
24b20 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e   omit columns in
24b30 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
24b40 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c       ** using cl
24b50 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61  ause from the ta
24b60 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ble on the right
24b70 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
24b80 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
24b90 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
24ba0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
24bb0 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20           pRight 
24bc0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
24bd0 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b  , TK_ID, zName);
24be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f  .            zCo
24bf0 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  lname = zName;. 
24c00 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72             zToFr
24c10 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ee = 0;.        
24c20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65      if( longName
24c30 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e  s || pTabList->n
24c40 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20  Src>1 ){.       
24c50 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65         Expr *pLe
24c60 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ft;.            
24c70 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65    pLeft = sqlite
24c80 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c  3Expr(db, TK_ID,
24c90 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20   zTabName);.    
24ca0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
24cb0 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
24cc0 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70  Parse, TK_DOT, p
24cd0 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29  Left, pRight, 0)
24ce0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
24cf0 69 66 28 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20  if( zSchemaName 
24d00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
24d10 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74     pLeft = sqlit
24d20 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44  e3Expr(db, TK_ID
24d30 2c 20 7a 53 63 68 65 6d 61 4e 61 6d 65 29 3b 0a  , zSchemaName);.
24d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d50 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  pExpr = sqlite3P
24d60 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
24d70 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 45 78 70  DOT, pLeft, pExp
24d80 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 0);.         
24d90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
24da0 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d       if( longNam
24db0 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  es ){.          
24dc0 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d        zColname =
24dd0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
24de0 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61  db, "%s.%s", zTa
24df0 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20  bName, zName);. 
24e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
24e10 54 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d  ToFree = zColnam
24e20 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
24e30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
24e40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
24e50 20 20 20 20 70 45 78 70 72 20 3d 20 70 52 69 67      pExpr = pRig
24e60 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ht;.            
24e70 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e  }.            pN
24e80 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
24e90 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
24ea0 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 29 3b  e, pNew, pExpr);
24eb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 43 6f  .            sCo
24ec0 6c 6e 61 6d 65 2e 7a 20 3d 20 7a 43 6f 6c 6e 61  lname.z = zColna
24ed0 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
24ee0 73 43 6f 6c 6e 61 6d 65 2e 6e 20 3d 20 73 71 6c  sColname.n = sql
24ef0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f  ite3Strlen30(zCo
24f00 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  lname);.        
24f10 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
24f20 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73  istSetName(pPars
24f30 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61  e, pNew, &sColna
24f40 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  me, 0);.        
24f50 20 20 20 20 69 66 28 20 70 4e 65 77 20 26 26 20      if( pNew && 
24f60 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
24f70 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21 3d 30  F_NestedFrom)!=0
24f80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24f90 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
24fa0 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26 70 4e  t_item *pX = &pN
24fb0 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
24fc0 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  r-1];.          
24fd0 20 20 20 20 69 66 28 20 70 53 75 62 20 29 7b 0a      if( pSub ){.
24fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ff0 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69  pX->zSpan = sqli
25000 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
25010 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  pSub->pEList->a[
25020 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20  j].zSpan);.     
25030 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
25040 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d  ase( pX->zSpan==
25050 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
25060 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25070 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53            pX->zS
25080 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  pan = sqlite3MPr
25090 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 2e  intf(db, "%s.%s.
250a0 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
250b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250d0 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a 54 61  zSchemaName, zTa
250e0 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29  bName, zColname)
250f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
25100 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
25110 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  zSpan==0 );.    
25120 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
25130 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 62 53            pX->bS
25140 70 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a 20 20  panIsTab = 1;.  
25150 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
25160 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
25170 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46 72 65  bFree(db, zToFre
25180 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
25190 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
251a0 20 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e    if( !tableSeen
251b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
251c0 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20  ( zTName ){.    
251d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
251e0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
251f0 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20  "no such table: 
25200 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20  %s", zTName);.  
25210 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
25220 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
25230 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
25240 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70  e, "no tables sp
25250 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20  ecified");.     
25260 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
25270 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
25280 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
25290 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 45 4c  stDelete(db, pEL
252a0 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c  ist);.    p->pEL
252b0 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ist = pNew;.  }.
252c0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  #if SQLITE_MAX_C
252d0 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 70  OLUMN.  if( p->p
252e0 45 4c 69 73 74 20 26 26 20 70 2d 3e 70 45 4c 69  EList && p->pELi
252f0 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c  st->nExpr>db->aL
25300 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
25310 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20  T_COLUMN] ){.   
25320 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
25330 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
25340 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65  ny columns in re
25350 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20 7d 0a  sult set");.  }.
25360 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
25370 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
25380 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75  ./*.** No-op rou
25390 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72  tine for the par
253a0 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a  se-tree walker..
253b0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
253c0 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 57  routine is the W
253d0 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
253e0 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65 73 73  ack then express
253f0 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72 65  ion trees.** are
25400 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75 74 20   walked without 
25410 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65 69 6e  any actions bein
25420 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63 68 20  g taken at each 
25430 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61 62 6c  node.  Presumabl
25440 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  y,.** when this 
25450 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
25460 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78 70 72  for Walker.xExpr
25470 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a  Callback then .*
25480 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74  * Walker.xSelect
25490 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 74 20  Callback is set 
254a0 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20  to do something 
254b0 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65 72 79  useful for every
254c0 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e   .** subquery in
254d0 20 74 68 65 20 70 61 72 73 65 72 20 74 72 65 65   the parser tree
254e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
254f0 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c  exprWalkNoop(Wal
25500 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78  ker *NotUsed, Ex
25510 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20  pr *NotUsed2){. 
25520 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
25530 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
25540 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
25550 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
25560 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
25570 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20 61 20  ine "expands" a 
25580 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
25590 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20   and all of its 
255a0 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46  subqueries..** F
255b0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
255c0 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61  formation on wha
255d0 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20 22 65  t it means to "e
255e0 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43 54 0a  xpand" a SELECT.
255f0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20 73 65  ** statement, se
25600 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e  e the comment on
25610 20 74 68 65 20 73 65 6c 65 63 74 45 78 70 61 6e   the selectExpan
25620 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63  d worker callbac
25630 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45  k above..**.** E
25640 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c 45 43  xpanding a SELEC
25650 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 74  T statement is t
25660 68 65 20 66 69 72 73 74 20 73 74 65 70 20 69 6e  he first step in
25670 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a   processing a.**
25680 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
25690 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20 73  t.  The SELECT s
256a0 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20 62 65  tatement must be
256b0 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65   expanded before
256c0 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  .** name resolut
256d0 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ion is performed
256e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68  ..**.** If anyth
256f0 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20  ing goes wrong, 
25700 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
25710 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
25720 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20   pParse..** The 
25730 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
25740 20 63 61 6e 20 64 65 74 65 63 74 20 74 68 65 20   can detect the 
25750 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69  problem by looki
25760 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e 6e 45  ng at pParse->nE
25770 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61  rr.** and/or pPa
25780 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
25790 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ailed..*/.static
257a0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c   void sqlite3Sel
257b0 65 63 74 45 78 70 61 6e 64 28 50 61 72 73 65 20  ectExpand(Parse 
257c0 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
257d0 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c  *pSelect){.  Wal
257e0 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28  ker w;.  memset(
257f0 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
25800 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  );.  w.xExprCall
25810 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e  back = exprWalkN
25820 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  oop;.  w.pParse 
25830 3d 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20  = pParse;.  if( 
25840 70 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f  pParse->hasCompo
25850 75 6e 64 20 29 7b 0a 20 20 20 20 77 2e 78 53 65  und ){.    w.xSe
25860 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63  lectCallback = c
25870 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65  onvertCompoundSe
25880 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 3b 0a  lectToSubquery;.
25890 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
258a0 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63  elect(&w, pSelec
258b0 74 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53 65 6c  t);.  }.  w.xSel
258c0 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  ectCallback = se
258d0 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20 20  lectExpander;.  
258e0 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
258f0 6b 32 20 3d 20 73 65 6c 65 63 74 50 6f 70 57 69  k2 = selectPopWi
25900 74 68 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  th;.  sqlite3Wal
25910 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c  kSelect(&w, pSel
25920 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  ect);.}...#ifnde
25930 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
25940 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69  BQUERY./*.** Thi
25950 73 20 69 73 20 61 20 57 61 6c 6b 65 72 2e 78 53  s is a Walker.xS
25960 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 63 61  electCallback ca
25970 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73  llback for the s
25980 71 6c 69 74 65 33 53 65 6c 65 63 74 54 79 70 65  qlite3SelectType
25990 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66  Info().** interf
259a0 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  ace..**.** For e
259b0 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  ach FROM-clause 
259c0 73 75 62 71 75 65 72 79 2c 20 61 64 64 20 43 6f  subquery, add Co
259d0 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43  lumn.zType and C
259e0 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69  olumn.zColl.** i
259f0 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
25a00 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
25a10 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74  e that represent
25a20 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
25a30 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73 75 62 71  .** of that subq
25a40 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  uery..**.** The 
25a50 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
25a60 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20  that represents 
25a70 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 77  the result set w
25a80 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a  as constructed.*
25a90 2a 20 62 79 20 73 65 6c 65 63 74 45 78 70 61 6e  * by selectExpan
25aa0 64 65 72 28 29 20 62 75 74 20 74 68 65 20 74 79  der() but the ty
25ab0 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  pe and collation
25ac0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73   information was
25ad0 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20 74   omitted.** at t
25ae0 68 61 74 20 70 6f 69 6e 74 20 62 65 63 61 75 73  hat point becaus
25af0 65 20 69 64 65 6e 74 69 66 69 65 72 73 20 68 61  e identifiers ha
25b00 64 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 72  d not yet been r
25b10 65 73 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a  esolved.  This.*
25b20 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
25b30 6c 65 64 20 61 66 74 65 72 20 69 64 65 6e 74 69  led after identi
25b40 66 69 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e  fier resolution.
25b50 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
25b60 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72  selectAddSubquer
25b70 79 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72  yTypeInfo(Walker
25b80 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
25b90 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a  t *p){.  Parse *
25ba0 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b  pParse;.  int i;
25bb0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
25bc0 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
25bd0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
25be0 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  om;..  assert( p
25bf0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
25c00 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20 69 66  Resolved );.  if
25c10 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
25c20 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 29   SF_HasTypeInfo)
25c30 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65  ==0 ){.    p->se
25c40 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61 73  lFlags |= SF_Has
25c50 54 79 70 65 49 6e 66 6f 3b 0a 20 20 20 20 70 50  TypeInfo;.    pP
25c60 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
25c70 70 50 61 72 73 65 3b 0a 20 20 20 20 70 54 61 62  pParse;.    pTab
25c80 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
25c90 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72      for(i=0, pFr
25ca0 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
25cb0 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
25cc0 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
25cd0 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
25ce0 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ab = pFrom->pTab
25cf0 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  ;.      if( ALWA
25d00 59 53 28 70 54 61 62 21 3d 30 29 20 26 26 20 28  YS(pTab!=0) && (
25d10 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
25d20 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d   TF_Ephemeral)!=
25d30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
25d40 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  A sub-query in t
25d50 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
25d60 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  f a SELECT */.  
25d70 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
25d80 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  el = pFrom->pSel
25d90 65 63 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ect;.        if(
25da0 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 20   pSel ){.       
25db0 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e     while( pSel->
25dc0 70 50 72 69 6f 72 20 29 20 70 53 65 6c 20 3d 20  pPrior ) pSel = 
25dd0 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  pSel->pPrior;.  
25de0 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 41 64          selectAd
25df0 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
25e00 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  llation(pParse, 
25e10 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20  pTab, pSel);.   
25e20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
25e30 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
25e40 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  f.../*.** This r
25e50 6f 75 74 69 6e 65 20 61 64 64 73 20 64 61 74 61  outine adds data
25e60 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69  type and collati
25e70 6e 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f  ng sequence info
25e80 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68  rmation to.** th
25e90 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
25ea0 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63  es of all FROM-c
25eb0 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73  lause subqueries
25ec0 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20   in a.** SELECT 
25ed0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
25ee0 20 55 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e   Use this routin
25ef0 65 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73  e after name res
25f00 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  olution..*/.stat
25f10 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
25f20 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f  electAddTypeInfo
25f30 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
25f40 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
25f50 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
25f60 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
25f70 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d   Walker w;.  mem
25f80 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
25f90 66 28 77 29 29 3b 0a 20 20 77 2e 78 53 65 6c 65  f(w));.  w.xSele
25fa0 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65  ctCallback2 = se
25fb0 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54  lectAddSubqueryT
25fc0 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78  ypeInfo;.  w.xEx
25fd0 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
25fe0 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70  rWalkNoop;.  w.p
25ff0 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
26000 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
26010 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29  ect(&w, pSelect)
26020 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
26030 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
26040 73 65 74 73 20 75 70 20 61 20 53 45 4c 45 43 54  sets up a SELECT
26050 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70   statement for p
26060 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a  rocessing.  The.
26070 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  ** following is 
26080 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a  accomplished:.**
26090 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20  .**     *  VDBE 
260a0 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61  Cursor numbers a
260b0 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  re assigned to a
260c0 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74  ll FROM-clause t
260d0 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  erms..**     *  
260e0 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20  Ephemeral Table 
260f0 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61  objects are crea
26100 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d  ted for all FROM
26110 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69  -clause subqueri
26120 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e  es..**     *  ON
26130 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
26140 65 73 20 61 72 65 20 73 68 69 66 74 65 64 20 69  es are shifted i
26150 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d  nto WHERE statem
26160 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57  ents.**     *  W
26170 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64  ildcards "*" and
26180 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65   "TABLE.*" in re
26190 73 75 6c 74 20 73 65 74 73 20 61 72 65 20 65 78  sult sets are ex
261a0 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a  panded..**     *
261b0 20 20 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e    Identifiers in
261c0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20   expression are 
261d0 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65  matched to table
261e0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
261f0 75 74 69 6e 65 20 61 63 74 73 20 72 65 63 75 72  utine acts recur
26200 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75  sively on all su
26210 62 71 75 65 72 69 65 73 20 77 69 74 68 69 6e 20  bqueries within 
26220 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76  the SELECT..*/.v
26230 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
26240 74 50 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a  tPrep(.  Parse *
26250 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
26260 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
26270 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
26280 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
26290 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
262a0 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
262b0 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65  coded. */.  Name
262c0 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e  Context *pOuterN
262d0 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65  C  /* Name conte
262e0 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72  xt for container
262f0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
26300 20 2a 64 62 3b 0a 20 20 69 66 28 20 4e 45 56 45   *db;.  if( NEVE
26310 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(p==0) ) return
26320 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
26330 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  >db;.  if( db->m
26340 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
26350 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73  turn;.  if( p->s
26360 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73  elFlags & SF_Has
26370 54 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72  TypeInfo ) retur
26380 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  n;.  sqlite3Sele
26390 63 74 45 78 70 61 6e 64 28 70 50 61 72 73 65 2c  ctExpand(pParse,
263a0 20 70 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73   p);.  if( pPars
263b0 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
263c0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
263d0 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52  turn;.  sqlite3R
263e0 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65  esolveSelectName
263f0 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75  s(pParse, p, pOu
26400 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50  terNC);.  if( pP
26410 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
26420 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
26430 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
26440 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49  e3SelectAddTypeI
26450 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  nfo(pParse, p);.
26460 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74  }../*.** Reset t
26470 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
26480 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  umulator..**.** 
26490 54 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  The aggregate ac
264a0 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73  cumulator is a s
264b0 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c  et of memory cel
264c0 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20  ls that hold.** 
264d0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73  intermediate res
264e0 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75  ults while calcu
264f0 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67  lating an aggreg
26500 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ate.  This.** ro
26510 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
26520 63 6f 64 65 20 74 68 61 74 20 73 74 6f 72 65 73  code that stores
26530 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66   NULLs in all of
26540 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a   those memory.**
26550 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   cells..*/.stati
26560 63 20 76 6f 69 64 20 72 65 73 65 74 41 63 63 75  c void resetAccu
26570 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70  mulator(Parse *p
26580 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
26590 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
265a0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
265b0 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
265c0 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
265d0 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69  func *pFunc;.  i
265e0 6e 74 20 6e 52 65 67 20 3d 20 70 41 67 67 49 6e  nt nReg = pAggIn
265f0 66 6f 2d 3e 6e 46 75 6e 63 20 2b 20 70 41 67 67  fo->nFunc + pAgg
26600 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  Info->nColumn;. 
26610 20 69 66 28 20 6e 52 65 67 3d 3d 30 20 29 20 72   if( nReg==0 ) r
26620 65 74 75 72 6e 3b 0a 23 69 66 64 65 66 20 53 51  eturn;.#ifdef SQ
26630 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
26640 56 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20  Verify that all 
26650 41 67 67 49 6e 66 6f 20 72 65 67 69 73 74 65 72  AggInfo register
26660 73 20 61 72 65 20 77 69 74 68 69 6e 20 74 68 65  s are within the
26670 20 72 61 6e 67 65 20 73 70 65 63 69 66 69 65 64   range specified
26680 20 62 79 0a 20 20 2a 2a 20 41 67 67 49 6e 66 6f   by.  ** AggInfo
26690 2e 6d 6e 52 65 67 2e 2e 41 67 67 49 6e 66 6f 2e  .mnReg..AggInfo.
266a0 6d 78 52 65 67 20 2a 2f 0a 20 20 61 73 73 65 72  mxReg */.  asser
266b0 74 28 20 6e 52 65 67 3d 3d 70 41 67 67 49 6e 66  t( nReg==pAggInf
266c0 6f 2d 3e 6d 78 52 65 67 2d 70 41 67 67 49 6e 66  o->mxReg-pAggInf
266d0 6f 2d 3e 6d 6e 52 65 67 2b 31 20 29 3b 0a 20 20  o->mnReg+1 );.  
266e0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
266f0 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  nfo->nColumn; i+
26700 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
26710 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69  pAggInfo->aCol[i
26720 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f  ].iMem>=pAggInfo
26730 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20  ->mnReg.        
26740 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   && pAggInfo->aC
26750 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67  ol[i].iMem<=pAgg
26760 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20  Info->mxReg );. 
26770 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
26780 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
26790 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
267a0 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  t( pAggInfo->aFu
267b0 6e 63 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67  nc[i].iMem>=pAgg
267c0 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20  Info->mnReg.    
267d0 20 20 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f       && pAggInfo
267e0 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3c  ->aFunc[i].iMem<
267f0 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67  =pAggInfo->mxReg
26800 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   );.  }.#endif. 
26810 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
26820 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p3(v, OP_Null, 0
26830 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  , pAggInfo->mnRe
26840 67 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52  g, pAggInfo->mxR
26850 65 67 29 3b 0a 20 20 66 6f 72 28 70 46 75 6e 63  eg);.  for(pFunc
26860 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
26870 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  , i=0; i<pAggInf
26880 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
26890 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Func++){.    if(
268a0 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
268b0 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  t>=0 ){.      Ex
268c0 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e  pr *pE = pFunc->
268d0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
268e0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
268f0 70 65 72 74 79 28 70 45 2c 20 45 50 5f 78 49 73  perty(pE, EP_xIs
26900 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
26910 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74   if( pE->x.pList
26920 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69  ==0 || pE->x.pLi
26930 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  st->nExpr!=1 ){.
26940 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
26950 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
26960 22 44 49 53 54 49 4e 43 54 20 61 67 67 72 65 67  "DISTINCT aggreg
26970 61 74 65 73 20 6d 75 73 74 20 68 61 76 65 20 65  ates must have e
26980 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20  xactly one ".   
26990 20 20 20 20 20 20 20 20 22 61 72 67 75 6d 65 6e          "argumen
269a0 74 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75  t");.        pFu
269b0 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  nc->iDistinct = 
269c0 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -1;.      }else{
269d0 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  .        KeyInfo
269e0 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79   *pKeyInfo = key
269f0 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
26a00 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70  (pParse, pE->x.p
26a10 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  List, 0, 0);.   
26a20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
26a30 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
26a40 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e  nEphemeral, pFun
26a50 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c  c->iDistinct, 0,
26a60 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
26a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
26a80 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
26a90 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
26aa0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
26ab0 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
26ac0 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65  e OP_AggFinalize
26ad0 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72   opcode for ever
26ae0 79 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  y aggregate func
26af0 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41  tion.** in the A
26b00 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ggInfo structure
26b10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
26b20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
26b30 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61  tions(Parse *pPa
26b40 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
26b50 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
26b60 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
26b70 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  be;.  int i;.  s
26b80 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
26b90 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d  nc *pF;.  for(i=
26ba0 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pF=pAggInfo->
26bb0 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66  aFunc; i<pAggInf
26bc0 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
26bd0 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  F++){.    ExprLi
26be0 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e  st *pList = pF->
26bf0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
26c00 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
26c10 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d  rHasProperty(pF-
26c20 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  >pExpr, EP_xIsSe
26c30 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 73 71 6c  lect) );.    sql
26c40 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
26c50 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70  , OP_AggFinal, p
26c60 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f  F->iMem, pList ?
26c70 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
26c80 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
26c90 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
26ca0 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34  d*)pF->pFunc, P4
26cb0 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d  _FUNCDEF);.  }.}
26cc0 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74  ../*.** Update t
26cd0 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d  he accumulator m
26ce0 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20  emory cells for 
26cf0 61 6e 20 61 67 67 72 65 67 61 74 65 20 62 61 73  an aggregate bas
26d00 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72  ed on.** the cur
26d10 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
26d20 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
26d30 76 6f 69 64 20 75 70 64 61 74 65 41 63 63 75 6d  void updateAccum
26d40 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50  ulator(Parse *pP
26d50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
26d60 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
26d70 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
26d80 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
26d90 69 6e 74 20 72 65 67 48 69 74 20 3d 20 30 3b 0a  int regHit = 0;.
26da0 20 20 69 6e 74 20 61 64 64 72 48 69 74 54 65 73    int addrHitTes
26db0 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20  t = 0;.  struct 
26dc0 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
26dd0 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
26de0 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70  fo_col *pC;..  p
26df0 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
26e00 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69  ode = 1;.  for(i
26e10 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d  =0, pF=pAggInfo-
26e20 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e  >aFunc; i<pAggIn
26e30 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
26e40 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e  pF++){.    int n
26e50 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64  Arg;.    int add
26e60 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69  rNext = 0;.    i
26e70 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45  nt regAgg;.    E
26e80 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
26e90 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c   pF->pExpr->x.pL
26ea0 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ist;.    assert(
26eb0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
26ec0 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f  y(pF->pExpr, EP_
26ed0 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
26ee0 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
26ef0 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73       nArg = pLis
26f00 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
26f10 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33  regAgg = sqlite3
26f20 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
26f30 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20  rse, nArg);.    
26f40 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
26f50 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
26f60 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c  , pList, regAgg,
26f70 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
26f80 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
26f90 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20      nArg = 0;.  
26fa0 20 20 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a      regAgg = 0;.
26fb0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
26fc0 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
26fd0 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74  {.      addrNext
26fe0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
26ff0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
27000 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d    assert( nArg==
27010 31 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 44  1 );.      codeD
27020 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20  istinct(pParse, 
27030 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61  pF->iDistinct, a
27040 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41  ddrNext, 1, regA
27050 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  gg);.    }.    i
27060 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75  f( pF->pFunc->fu
27070 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
27080 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29  _FUNC_NEEDCOLL )
27090 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
270a0 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  *pColl = 0;.    
270b0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
270c0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
270d0 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
270e0 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
270f0 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21  =0 );  /* pList!
27100 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20  =0 if pF->pFunc 
27110 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a  has NEEDCOLL */.
27120 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
27130 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21  Item=pList->a; !
27140 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b  pColl && j<nArg;
27150 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   j++, pItem++){.
27160 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
27170 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
27180 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
27190 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
271a0 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f  }.      if( !pCo
271b0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ll ){.        pC
271c0 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
271d0 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
271e0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
271f0 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67  egHit==0 && pAgg
27200 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74  Info->nAccumulat
27210 6f 72 20 29 20 72 65 67 48 69 74 20 3d 20 2b 2b  or ) regHit = ++
27220 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
27230 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
27240 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c  ddOp4(v, OP_Coll
27250 53 65 71 2c 20 72 65 67 48 69 74 2c 20 30 2c 20  Seq, regHit, 0, 
27260 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c  0, (char *)pColl
27270 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
27280 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
27290 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
272a0 5f 41 67 67 53 74 65 70 2c 20 30 2c 20 72 65 67  _AggStep, 0, reg
272b0 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20  Agg, pF->iMem,. 
272c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272d0 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e       (void*)pF->
272e0 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
272f0 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  F);.    sqlite3V
27300 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28  dbeChangeP5(v, (
27310 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71  u8)nArg);.    sq
27320 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
27330 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
27340 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72  rse, regAgg, nAr
27350 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  g);.    sqlite3R
27360 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
27370 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20  pParse, regAgg, 
27380 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61  nArg);.    if( a
27390 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ddrNext ){.     
273a0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
273b0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
273c0 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Next);.      sql
273d0 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
273e0 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
273f0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f  }.  }..  /* Befo
27400 72 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68  re populating th
27410 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65  e accumulator re
27420 67 69 73 74 65 72 73 2c 20 63 6c 65 61 72 20 74  gisters, clear t
27430 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
27440 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
27450 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 72   if any of the r
27460 65 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76  equired column v
27470 61 6c 75 65 73 20 61 72 65 20 61 6c 72 65 61 64  alues are alread
27480 79 20 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20  y present .  ** 
27490 69 6e 20 72 65 67 69 73 74 65 72 73 2c 20 73 71  in registers, sq
274a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 20  lite3ExprCode() 
274b0 6d 61 79 20 75 73 65 20 4f 50 5f 53 43 6f 70 79  may use OP_SCopy
274c0 20 74 6f 20 63 6f 70 79 20 74 68 65 20 76 61 6c   to copy the val
274d0 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69  ue.  ** to pC->i
274e0 4d 65 6d 2e 20 42 75 74 20 62 79 20 74 68 65 20  Mem. But by the 
274f0 74 69 6d 65 20 74 68 65 20 76 61 6c 75 65 20 69  time the value i
27500 73 20 75 73 65 64 2c 20 74 68 65 20 6f 72 69 67  s used, the orig
27510 69 6e 61 6c 20 72 65 67 69 73 74 65 72 0a 20 20  inal register.  
27520 2a 2a 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ** may have been
27530 20 75 73 65 64 2c 20 69 6e 76 61 6c 69 64 61 74   used, invalidat
27540 69 6e 67 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ing the underlyi
27550 6e 67 20 62 75 66 66 65 72 20 68 6f 6c 64 69 6e  ng buffer holdin
27560 67 20 74 68 65 0a 20 20 2a 2a 20 74 65 78 74 20  g the.  ** text 
27570 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53  or blob value. S
27580 65 65 20 74 69 63 6b 65 74 20 5b 38 38 33 30 33  ee ticket [88303
27590 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a  4dcb5]..  **.  *
275a0 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69  * Another soluti
275b0 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 63  on would be to c
275c0 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 53 43 6f  hange the OP_SCo
275d0 70 79 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20  py used to copy 
275e0 63 61 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75  cached.  ** valu
275f0 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79  es to an OP_Copy
27600 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67  ..  */.  if( reg
27610 48 69 74 20 29 7b 0a 20 20 20 20 61 64 64 72 48  Hit ){.    addrH
27620 69 74 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33  itTest = sqlite3
27630 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
27640 5f 49 66 2c 20 72 65 67 48 69 74 29 3b 20 56 64  _If, regHit); Vd
27650 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
27660 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
27670 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
27680 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  e);.  for(i=0, p
27690 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  C=pAggInfo->aCol
276a0 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41  ; i<pAggInfo->nA
276b0 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c  ccumulator; i++,
276c0 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   pC++){.    sqli
276d0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
276e0 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70  se, pC->pExpr, p
276f0 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20  C->iMem);.  }.  
27700 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
27710 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Mode = 0;.  sqli
27720 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
27730 72 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  r(pParse);.  if(
27740 20 61 64 64 72 48 69 74 54 65 73 74 20 29 7b 0a   addrHitTest ){.
27750 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
27760 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 48  umpHere(v, addrH
27770 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  itTest);.  }.}..
27780 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
27790 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e  le OP_Explain in
277a0 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65  struction to the
277b0 20 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e   VDBE to explain
277c0 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75   a simple.** cou
277d0 6e 74 28 2a 29 20 71 75 65 72 79 20 28 22 53 45  nt(*) query ("SE
277e0 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
277f0 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69  OM pTab")..*/.#i
27800 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
27810 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63  T_EXPLAIN.static
27820 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d   void explainSim
27830 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73  pleCount(.  Pars
27840 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
27850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
27860 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
27870 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
27880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27890 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67    /* Table being
278a0 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e   queried */.  In
278b0 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
278c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
278d0 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f   Index used to o
278e0 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72  ptimize scan, or
278f0 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66   NULL */.){.  if
27900 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
27910 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72  n==2 ){.    char
27920 20 2a 7a 45 71 70 20 3d 20 73 71 6c 69 74 65 33   *zEqp = sqlite3
27930 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e  MPrintf(pParse->
27940 64 62 2c 20 22 53 43 41 4e 20 54 41 42 4c 45 20  db, "SCAN TABLE 
27950 25 73 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20  %s%s%s",.       
27960 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20   pTab->zName, . 
27970 20 20 20 20 20 20 20 70 49 64 78 20 3f 20 22 20         pIdx ? " 
27980 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49  USING COVERING I
27990 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a 20 20 20  NDEX " : "",.   
279a0 20 20 20 20 20 70 49 64 78 20 3f 20 70 49 64 78       pIdx ? pIdx
279b0 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20  ->zName : "".   
279c0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
279d0 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20  dbeAddOp4(.     
279e0 20 20 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65     pParse->pVdbe
279f0 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50  , OP_Explain, pP
27a00 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c  arse->iSelectId,
27a10 20 30 2c 20 30 2c 20 7a 45 71 70 2c 20 50 34 5f   0, 0, zEqp, P4_
27a20 44 59 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20  DYNAMIC.    );. 
27a30 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
27a40 69 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c  ine explainSimpl
27a50 65 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65  eCount(a,b,c).#e
27a60 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ndif../*.** Gene
27a70 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
27a80 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
27a90 6e 74 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  nt given in the 
27aa0 70 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a  p argument.  .**
27ab0 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
27ac0 61 72 65 20 72 65 74 75 72 6e 65 64 20 61 63 63  are returned acc
27ad0 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 53 65  ording to the Se
27ae0 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75  lectDest structu
27af0 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65  re..** See comme
27b00 6e 74 73 20 69 6e 20 73 71 6c 69 74 65 49 6e 74  nts in sqliteInt
27b10 2e 68 20 66 6f 72 20 66 75 72 74 68 65 72 20 69  .h for further i
27b20 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nformation..**.*
27b30 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
27b40 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
27b50 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66  r of errors.  If
27b60 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a   any errors are.
27b70 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  ** encountered, 
27b80 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69  then an appropri
27b90 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ate error messag
27ba0 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20  e is left in.** 
27bb0 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
27bc0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
27bd0 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65  ine does NOT fre
27be0 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72  e the Select str
27bf0 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e  ucture passed in
27c00 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  .  The.** callin
27c10 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73  g function needs
27c20 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a   to do that..*/.
27c30 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
27c40 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
27c50 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
27c60 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
27c70 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
27c80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
27c90 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
27ca0 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
27cb0 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  d. */.  SelectDe
27cc0 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 20 2f  st *pDest      /
27cd0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
27ce0 68 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  h the query resu
27cf0 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
27d00 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
27d10 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
27d20 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ers */.  WhereIn
27d30 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
27d40 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73  /* Return from s
27d50 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
27d60 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  () */.  Vdbe *v;
27d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27d80 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61  * The virtual ma
27d90 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73  chine under cons
27da0 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
27db0 74 20 69 73 41 67 67 3b 20 20 20 20 20 20 20 20  t isAgg;        
27dc0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
27dd0 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69   select lists li
27de0 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f  ke "count(*)" */
27df0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
27e00 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73  ist;      /* Lis
27e10 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
27e20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72  extract. */.  Sr
27e30 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
27e40 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
27e50 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74  tables to select
27e60 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20   from */.  Expr 
27e70 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20  *pWhere;        
27e80 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
27e90 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
27ea0 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
27eb0 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20  t *pGroupBy;    
27ec0 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20  /* The GROUP BY 
27ed0 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
27ee0 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  NULL */.  Expr *
27ef0 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20  pHaving;        
27f00 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63   /* The HAVING c
27f10 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
27f20 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ULL */.  int rc 
27f30 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
27f40 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
27f50 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  rn from this fun
27f60 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69  ction */.  Disti
27f70 6e 63 74 43 74 78 20 73 44 69 73 74 69 6e 63 74  nctCtx sDistinct
27f80 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77  ; /* Info on how
27f90 20 74 6f 20 63 6f 64 65 20 74 68 65 20 44 49 53   to code the DIS
27fa0 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f  TINCT keyword */
27fb0 0a 20 20 53 6f 72 74 43 74 78 20 73 53 6f 72 74  .  SortCtx sSort
27fc0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66  ;         /* Inf
27fd0 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65  o on how to code
27fe0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
27ff0 61 75 73 65 20 2a 2f 0a 20 20 41 67 67 49 6e 66  ause */.  AggInf
28000 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20  o sAggInfo;     
28010 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
28020 75 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74  used by aggregat
28030 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69  e queries */.  i
28040 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20  nt iEnd;        
28050 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
28060 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74   of the end of t
28070 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71  he query */.  sq
28080 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
28090 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
280a0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
280b0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
280c0 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
280d0 20 20 69 6e 74 20 69 52 65 73 74 6f 72 65 53 65    int iRestoreSe
280e0 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d  lectId = pParse-
280f0 3e 69 53 65 6c 65 63 74 49 64 3b 0a 20 20 70 50  >iSelectId;.  pP
28100 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 20  arse->iSelectId 
28110 3d 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  = pParse->iNextS
28120 65 6c 65 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69  electId++;.#endi
28130 66 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  f..  db = pParse
28140 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ->db;.  if( p==0
28150 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
28160 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e  iled || pParse->
28170 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75  nErr ){.    retu
28180 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
28190 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
281a0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
281b0 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
281c0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d   ) return 1;.  m
281d0 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c  emset(&sAggInfo,
281e0 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49   0, sizeof(sAggI
281f0 6e 66 6f 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  nfo));..  assert
28200 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
28210 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
28220 21 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29  !=SRT_DistFifo )
28230 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
28240 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44  OrderBy==0 || pD
28250 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
28260 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  Fifo );.  assert
28270 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
28280 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
28290 21 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20  !=SRT_DistQueue 
282a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
282b0 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70  pOrderBy==0 || p
282c0 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54  Dest->eDest!=SRT
282d0 5f 51 75 65 75 65 20 29 3b 0a 20 20 69 66 28 20  _Queue );.  if( 
282e0 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
282f0 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 61  (pDest) ){.    a
28300 73 73 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65  ssert(pDest->eDe
28310 73 74 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c  st==SRT_Exists |
28320 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
28330 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20  SRT_Union || .  
28340 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e           pDest->
28350 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70  eDest==SRT_Excep
28360 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  t || pDest->eDes
28370 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 7c  t==SRT_Discard |
28380 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65  |.           pDe
28390 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 51  st->eDest==SRT_Q
283a0 75 65 75 65 20 20 7c 7c 20 70 44 65 73 74 2d 3e  ueue  || pDest->
283b0 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46  eDest==SRT_DistF
283c0 69 66 6f 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ifo ||.         
283d0 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
283e0 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 7c 7c  SRT_DistQueue ||
283f0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
28400 52 54 5f 46 69 66 6f 29 3b 0a 20 20 20 20 2f 2a  RT_Fifo);.    /*
28410 20 49 66 20 4f 52 44 45 52 20 42 59 20 6d 61 6b   If ORDER BY mak
28420 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65  es no difference
28430 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 74   in the output t
28440 68 65 6e 20 6e 65 69 74 68 65 72 20 64 6f 65 73  hen neither does
28450 0a 20 20 20 20 2a 2a 20 44 49 53 54 49 4e 43 54  .    ** DISTINCT
28460 20 73 6f 20 69 74 20 63 61 6e 20 62 65 20 72 65   so it can be re
28470 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20  moved too. */.  
28480 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
28490 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
284a0 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 2d  OrderBy);.    p-
284b0 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
284c0 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26     p->selFlags &
284d0 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a  = ~SF_Distinct;.
284e0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c    }.  sqlite3Sel
284f0 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20  ectPrep(pParse, 
28500 70 2c 20 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28  p, 0);.  memset(
28510 26 73 53 6f 72 74 2c 20 30 2c 20 73 69 7a 65 6f  &sSort, 0, sizeo
28520 66 28 73 53 6f 72 74 29 29 3b 0a 20 20 73 53 6f  f(sSort));.  sSo
28530 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  rt.pOrderBy = p-
28540 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 54 61  >pOrderBy;.  pTa
28550 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
28560 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
28570 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 50 61  EList;.  if( pPa
28580 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
28590 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
285a0 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
285b0 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 73 41 67  _end;.  }.  isAg
285c0 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  g = (p->selFlags
285d0 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29   & SF_Aggregate)
285e0 21 3d 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  !=0;.  assert( p
285f0 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20 20 2f  EList!=0 );..  /
28600 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69  * Begin generati
28610 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  ng code..  */.  
28620 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
28630 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
28640 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  ( v==0 ) goto se
28650 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20  lect_end;..  /* 
28660 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65  If writing to me
28670 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69  mory or generati
28680 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e  ng a set.  ** on
28690 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  ly a single colu
286a0 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74  mn may be output
286b0 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
286c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
286d0 45 52 59 0a 20 20 69 66 28 20 63 68 65 63 6b 46  ERY.  if( checkF
286e0 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c  orMultiColumnSel
286f0 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ectError(pParse,
28700 20 70 44 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e   pDest, pEList->
28710 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 67 6f  nExpr) ){.    go
28720 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
28730 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
28740 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
28750 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65  r all sub-querie
28760 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
28770 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21 64  ause.  */.#if !d
28780 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
28790 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
287a0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
287b0 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72  OMIT_VIEW).  for
287c0 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72  (i=0; !p->pPrior
287d0 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e   && i<pTabList->
287e0 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
287f0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
28800 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54  tem *pItem = &pT
28810 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20  abList->a[i];.  
28820 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
28830 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  t;.    Select *p
28840 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65  Sub = pItem->pSe
28850 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74 20 69 73  lect;.    int is
28860 41 67 67 53 75 62 3b 0a 0a 20 20 20 20 69 66 28  AggSub;..    if(
28870 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69   pSub==0 ) conti
28880 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f 6d  nue;..    /* Som
28890 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64 65 20  etimes the code 
288a0 66 6f 72 20 61 20 73 75 62 71 75 65 72 79 20 77  for a subquery w
288b0 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64  ill be generated
288c0 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 2a   more than.    *
288d0 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65 20 73  * once, if the s
288e0 75 62 71 75 65 72 79 20 69 73 20 70 61 72 74 20  ubquery is part 
288f0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
28900 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20 4a 4f  use in a LEFT JO
28910 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 65  IN,.    ** for e
28920 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61 74  xample.  In that
28930 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72 65   case, do not re
28940 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64  generate the cod
28950 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20 20  e to manifest.  
28960 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72 20 74    ** a view or t
28970 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 6f  he co-routine to
28980 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69 65   implement a vie
28990 77 2e 20 20 54 68 65 20 66 69 72 73 74 20 69 6e  w.  The first in
289a0 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69 73  stance.    ** is
289b0 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74 68 6f   sufficient, tho
289c0 75 67 68 20 74 68 65 20 73 75 62 72 6f 75 74 69  ugh the subrouti
289d0 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 20 74  ne to manifest t
289e0 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e 65 65  he view does nee
289f0 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69  d.    ** to be i
28a00 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a 2f  nvoked again. */
28a10 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
28a20 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a 20  addrFillSub ){. 
28a30 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
28a40 76 69 61 43 6f 72 6f 75 74 69 6e 65 3d 3d 30 20  viaCoroutine==0 
28a50 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
28a60 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
28a70 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74 65 6d 2d  OP_Gosub, pItem-
28a80 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 49 74 65  >regReturn, pIte
28a90 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 3b  m->addrFillSub);
28aa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
28ab0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a  ontinue;.    }..
28ac0 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74      /* Increment
28ad0 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62   Parse.nHeight b
28ae0 79 20 74 68 65 20 68 65 69 67 68 74 20 6f 66 20  y the height of 
28af0 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 70 72  the largest expr
28b00 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72  ession.    ** tr
28b10 65 65 20 72 65 66 65 72 72 65 64 20 74 6f 20 62  ee referred to b
28b20 79 20 74 68 69 73 2c 20 74 68 65 20 70 61 72 65  y this, the pare
28b30 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20 63  nt select. The c
28b40 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20 20  hild select.    
28b50 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65  ** may contain e
28b60 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 20  xpression trees 
28b70 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a  of at most.    *
28b80 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  * (SQLITE_MAX_EX
28b90 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e 6e  PR_DEPTH-Parse.n
28ba0 48 65 69 67 68 74 29 20 68 65 69 67 68 74 2e 20  Height) height. 
28bb0 54 68 69 73 20 69 73 20 61 20 62 69 74 0a 20 20  This is a bit.  
28bc0 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72    ** more conser
28bd0 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63 65  vative than nece
28be0 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68 20  ssary, but much 
28bf0 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66 6f  easier than enfo
28c00 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20  rcing.    ** an 
28c10 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20  exact limit..   
28c20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   */.    pParse->
28c30 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69 74  nHeight += sqlit
28c40 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
28c50 68 74 28 70 29 3b 0a 0a 20 20 20 20 69 73 41 67  ht(p);..    isAg
28c60 67 53 75 62 20 3d 20 28 70 53 75 62 2d 3e 73 65  gSub = (pSub->se
28c70 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
28c80 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 20 20 69  egate)!=0;.    i
28c90 66 28 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65  f( flattenSubque
28ca0 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 69 2c  ry(pParse, p, i,
28cb0 20 69 73 41 67 67 2c 20 69 73 41 67 67 53 75 62   isAgg, isAggSub
28cc0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
28cd0 69 73 20 73 75 62 71 75 65 72 79 20 63 61 6e 20  is subquery can 
28ce0 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f  be absorbed into
28cf0 20 69 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a   its parent. */.
28d00 20 20 20 20 20 20 69 66 28 20 69 73 41 67 67 53        if( isAggS
28d10 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73  ub ){.        is
28d20 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Agg = 1;.       
28d30 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
28d40 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20  SF_Aggregate;.  
28d50 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20      }.      i = 
28d60 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  -1;.    }else if
28d70 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
28d80 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 20 20 26  ==1.           &
28d90 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
28da0 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
28db0 5f 53 75 62 71 43 6f 72 6f 75 74 69 6e 65 29 0a  _SubqCoroutine).
28dc0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
28dd0 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d 72  Implement a co-r
28de0 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
28df0 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65   return a single
28e00 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75   row of the resu
28e10 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20  lt.      ** set 
28e20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69  on each invocati
28e30 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
28e40 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 20 3d     int addrTop =
28e50 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
28e60 65 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a 20 20  entAddr(v)+1;.  
28e70 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65      pItem->regRe
28e80 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  turn = ++pParse-
28e90 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
28ea0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
28eb0 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
28ec0 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  ne, pItem->regRe
28ed0 74 75 72 6e 2c 20 30 2c 20 61 64 64 72 54 6f 70  turn, 0, addrTop
28ee0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
28ef0 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
28f00 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
28f10 65 29 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  e));.      pItem
28f20 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20  ->addrFillSub = 
28f30 61 64 64 72 54 6f 70 3b 0a 20 20 20 20 20 20 73  addrTop;.      s
28f40 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
28f50 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
28f60 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d  Coroutine, pItem
28f70 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
28f80 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
28f90 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65  teger(pItem->iSe
28fa0 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61 72  lectId, (u8)pPar
28fb0 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
28fc0 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
28fd0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
28fe0 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20  pSub, &dest);.  
28ff0 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d      pItem->pTab-
29000 3e 6e 52 6f 77 45 73 74 20 3d 20 28 75 6e 73 69  >nRowEst = (unsi
29010 67 6e 65 64 29 70 53 75 62 2d 3e 6e 53 65 6c 65  gned)pSub->nSele
29020 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 70 49 74  ctRow;.      pIt
29030 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65  em->viaCoroutine
29040 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65   = 1;.      pIte
29050 6d 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 64  m->regResult = d
29060 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 20 20 20  est.iSdst;.     
29070 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
29080 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f  p1(v, OP_EndCoro
29090 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65  utine, pItem->re
290a0 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
290b0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
290c0 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 2d 31  ere(v, addrTop-1
290d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
290e0 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
290f0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  e(pParse);.    }
29100 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 47  else{.      /* G
29110 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
29120 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 66  tine that will f
29130 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ill an ephemeral
29140 20 74 61 62 6c 65 20 77 69 74 68 0a 20 20 20 20   table with.    
29150 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74    ** the content
29160 20 6f 66 20 74 68 69 73 20 73 75 62 71 75 65 72   of this subquer
29170 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  y.  pItem->addrF
29180 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f 69 6e  illSub will poin
29190 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68  t.      ** to th
291a0 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
291b0 20 67 65 6e 65 72 61 74 65 64 20 73 75 62 72 6f   generated subro
291c0 75 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d 3e 72  utine.  pItem->r
291d0 65 67 52 65 74 75 72 6e 0a 20 20 20 20 20 20 2a  egReturn.      *
291e0 2a 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20  * is a register 
291f0 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c  allocated to hol
29200 64 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  d the subroutine
29210 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 0a   return address.
29220 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
29230 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20 20 20 20  nt topAddr;.    
29240 20 20 69 6e 74 20 6f 6e 63 65 41 64 64 72 20 3d    int onceAddr =
29250 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65   0;.      int re
29260 74 41 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73  tAddr;.      ass
29270 65 72 74 28 20 70 49 74 65 6d 2d 3e 61 64 64 72  ert( pItem->addr
29280 46 69 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20  FillSub==0 );.  
29290 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65      pItem->regRe
292a0 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  turn = ++pParse-
292b0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70  >nMem;.      top
292c0 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
292d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
292e0 6e 74 65 67 65 72 2c 20 30 2c 20 70 49 74 65 6d  nteger, 0, pItem
292f0 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
29300 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46      pItem->addrF
29310 69 6c 6c 53 75 62 20 3d 20 74 6f 70 41 64 64 72  illSub = topAddr
29320 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  +1;.      if( pI
29330 74 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65  tem->isCorrelate
29340 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
29350 2f 2a 20 49 66 20 74 68 65 20 73 75 62 71 75 65  /* If the subque
29360 72 79 20 69 73 20 6e 6f 74 20 63 6f 72 72 65 6c  ry is not correl
29370 61 74 65 64 20 61 6e 64 20 69 66 20 77 65 20 61  ated and if we a
29380 72 65 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66  re not inside of
29390 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72  .        ** a tr
293a0 69 67 67 65 72 2c 20 74 68 65 6e 20 77 65 20 6f  igger, then we o
293b0 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70  nly need to comp
293c0 75 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ute the value of
293d0 20 74 68 65 20 73 75 62 71 75 65 72 79 0a 20 20   the subquery.  
293e0 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a        ** once. *
293f0 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 41 64  /.        onceAd
29400 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  dr = sqlite3Code
29410 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56 64  Once(pParse); Vd
29420 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
29430 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
29440 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c  nt((v, "material
29450 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74  ize \"%s\"", pIt
29460 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
29470 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
29480 20 20 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70          VdbeNoop
29490 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74  Comment((v, "mat
294a0 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22  erialize \"%s\""
294b0 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
294c0 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Name));.      }.
294d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
294e0 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
294f0 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c  t, SRT_EphemTab,
29500 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
29510 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
29520 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d  etInteger(pItem-
29530 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29  >iSelectId, (u8)
29540 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
29550 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71  ectId);.      sq
29560 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
29570 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
29580 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70  ;.      pItem->p
29590 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 28  Tab->nRowEst = (
295a0 75 6e 73 69 67 6e 65 64 29 70 53 75 62 2d 3e 6e  unsigned)pSub->n
295b0 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
295c0 20 69 66 28 20 6f 6e 63 65 41 64 64 72 20 29 20   if( onceAddr ) 
295d0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
295e0 65 72 65 28 76 2c 20 6f 6e 63 65 41 64 64 72 29  ere(v, onceAddr)
295f0 3b 0a 20 20 20 20 20 20 72 65 74 41 64 64 72 20  ;.      retAddr 
29600 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
29610 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
29620 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
29630 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  rn);.      VdbeC
29640 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20  omment((v, "end 
29650 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  %s", pItem->pTab
29660 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
29670 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
29680 67 65 50 31 28 76 2c 20 74 6f 70 41 64 64 72 2c  geP1(v, topAddr,
29690 20 72 65 74 41 64 64 72 29 3b 0a 20 20 20 20 20   retAddr);.     
296a0 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d   sqlite3ClearTem
296b0 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65  pRegCache(pParse
296c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
296d0 20 2f 2a 70 50 61 72 73 65 2d 3e 6e 45 72 72 20   /*pParse->nErr 
296e0 7c 7c 2a 2f 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ||*/ db->mallocF
296f0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 67  ailed ){.      g
29700 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
29710 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
29720 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c  ->nHeight -= sql
29730 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65  ite3SelectExprHe
29740 69 67 68 74 28 70 29 3b 0a 20 20 20 20 70 54 61  ight(p);.    pTa
29750 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
29760 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61  .    if( !Ignora
29770 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74  bleOrderby(pDest
29780 29 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74  ) ){.      sSort
29790 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70  .pOrderBy = p->p
297a0 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20  OrderBy;.    }. 
297b0 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d   }.  pEList = p-
297c0 3e 70 45 4c 69 73 74 3b 0a 23 65 6e 64 69 66 0a  >pEList;.#endif.
297d0 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57    pWhere = p->pW
297e0 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79  here;.  pGroupBy
297f0 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
29800 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70    pHaving = p->p
29810 48 61 76 69 6e 67 3b 0a 20 20 73 44 69 73 74 69  Having;.  sDisti
29820 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20 28 70 2d  nct.isTnct = (p-
29830 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
29840 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69  istinct)!=0;..#i
29850 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
29860 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
29870 54 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  T.  /* If there 
29880 69 73 20 61 72 65 20 61 20 73 65 71 75 65 6e 63  is are a sequenc
29890 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f  e of queries, do
298a0 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65   the earlier one
298b0 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20  s first..  */.  
298c0 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
298d0 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53  .    rc = multiS
298e0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
298f0 20 70 44 65 73 74 29 3b 0a 20 20 20 20 65 78 70   pDest);.    exp
29900 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70  lainSetInteger(p
29910 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
29920 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74  , iRestoreSelect
29930 49 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  Id);.    return 
29940 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rc;.  }.#endif..
29950 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
29960 20 62 6f 74 68 20 61 20 47 52 4f 55 50 20 42 59   both a GROUP BY
29970 20 61 6e 64 20 61 6e 20 4f 52 44 45 52 20 42 59   and an ORDER BY
29980 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 79   clause and they
29990 20 61 72 65 0a 20 20 2a 2a 20 69 64 65 6e 74 69   are.  ** identi
299a0 63 61 6c 2c 20 74 68 65 6e 20 64 69 73 61 62 6c  cal, then disabl
299b0 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  e the ORDER BY c
299c0 6c 61 75 73 65 20 73 69 6e 63 65 20 74 68 65 20  lause since the 
299d0 47 52 4f 55 50 20 42 59 0a 20 20 2a 2a 20 77 69  GROUP BY.  ** wi
299e0 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74  ll cause element
299f0 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20 69 6e  s to come out in
29a00 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64   the correct ord
29a10 65 72 2e 20 20 54 68 69 73 20 69 73 0a 20 20 2a  er.  This is.  *
29a20 2a 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  * an optimizatio
29a30 6e 20 2d 20 74 68 65 20 63 6f 72 72 65 63 74 20  n - the correct 
29a40 61 6e 73 77 65 72 20 73 68 6f 75 6c 64 20 72 65  answer should re
29a50 73 75 6c 74 20 72 65 67 61 72 64 6c 65 73 73 2e  sult regardless.
29a60 0a 20 20 2a 2a 20 55 73 65 20 74 68 65 20 53 51  .  ** Use the SQ
29a70 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65  LITE_GroupByOrde
29a80 72 20 66 6c 61 67 20 77 69 74 68 20 53 51 4c 49  r flag with SQLI
29a90 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
29aa0 4d 49 5a 45 52 0a 20 20 2a 2a 20 74 6f 20 64 69  MIZER.  ** to di
29ab0 73 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6d  sable this optim
29ac0 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65 73 74  ization for test
29ad0 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a 20 20  ing purposes..  
29ae0 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
29af0 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
29b00 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 73 53 6f  p->pGroupBy, sSo
29b10 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29  rt.pOrderBy, -1)
29b20 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
29b30 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
29b40 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 47  led(db, SQLITE_G
29b50 72 6f 75 70 42 79 4f 72 64 65 72 29 20 29 7b 0a  roupByOrder) ){.
29b60 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72      sSort.pOrder
29b70 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  By = 0;.  }..  /
29b80 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69  * If the query i
29b90 73 20 44 49 53 54 49 4e 43 54 20 77 69 74 68 20  s DISTINCT with 
29ba0 61 6e 20 4f 52 44 45 52 20 42 59 20 62 75 74 20  an ORDER BY but 
29bb0 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
29bc0 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69  ate, and .  ** i
29bd0 66 20 74 68 65 20 73 65 6c 65 63 74 2d 6c 69 73  f the select-lis
29be0 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  t is the same as
29bf0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 6c 69   the ORDER BY li
29c00 73 74 2c 20 74 68 65 6e 20 74 68 69 73 20 71 75  st, then this qu
29c10 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20  ery.  ** can be 
29c20 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 47  rewritten as a G
29c30 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74 68 65  ROUP BY. In othe
29c40 72 20 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20  r words, this:. 
29c50 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
29c60 45 43 54 20 44 49 53 54 49 4e 43 54 20 78 79 7a  ECT DISTINCT xyz
29c70 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20   FROM ... ORDER 
29c80 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a  BY xyz.  **.  **
29c90 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20   is transformed 
29ca0 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
29cb0 20 20 53 45 4c 45 43 54 20 78 79 7a 20 46 52 4f    SELECT xyz FRO
29cc0 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20 78  M ... GROUP BY x
29cd0 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  yz.  **.  ** The
29ce0 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73 20   second form is 
29cf0 70 72 65 66 65 72 72 65 64 20 61 73 20 61 20 73  preferred as a s
29d00 69 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f 72 20  ingle index (or 
29d10 74 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79 20  temp-table) may 
29d20 62 65 20 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f  be .  ** used fo
29d30 72 20 62 6f 74 68 20 74 68 65 20 4f 52 44 45 52  r both the ORDER
29d40 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54   BY and DISTINCT
29d50 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 41 73 20   processing. As 
29d60 6f 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a  originally .  **
29d70 20 77 72 69 74 74 65 6e 20 74 68 65 20 71 75 65   written the que
29d80 72 79 20 6d 75 73 74 20 75 73 65 20 61 20 74 65  ry must use a te
29d90 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 61 74 20  mp-table for at 
29da0 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65  least one of the
29db0 20 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42 59 20   ORDER .  ** BY 
29dc0 61 6e 64 20 44 49 53 54 49 4e 43 54 2c 20 61 6e  and DISTINCT, an
29dd0 64 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 73 65  d an index or se
29de0 70 61 72 61 74 65 20 74 65 6d 70 2d 74 61 62 6c  parate temp-tabl
29df0 65 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72 2e  e for the other.
29e00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e  .  */.  if( (p->
29e10 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
29e20 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
29e30 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69  gate))==SF_Disti
29e40 6e 63 74 20 0a 20 20 20 26 26 20 73 71 6c 69 74  nct .   && sqlit
29e50 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
29e60 65 28 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  e(sSort.pOrderBy
29e70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 29  , p->pEList, -1)
29e80 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e  ==0.  ){.    p->
29e90 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
29ea0 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 70 2d  Distinct;.    p-
29eb0 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
29ec0 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
29ed0 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 29  b, p->pEList, 0)
29ee0 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d  ;.    pGroupBy =
29ef0 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
29f00 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
29f10 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 4e 6f 74   = 0;.    /* Not
29f20 69 63 65 20 74 68 61 74 20 65 76 65 6e 20 74 68  ice that even th
29f30 6f 75 67 68 74 20 53 46 5f 44 69 73 74 69 6e 63  ought SF_Distinc
29f40 74 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72  t has been clear
29f50 65 64 20 66 72 6f 6d 20 70 2d 3e 73 65 6c 46 6c  ed from p->selFl
29f60 61 67 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20  ags,.    ** the 
29f70 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
29f80 20 69 73 20 73 74 69 6c 6c 20 73 65 74 2e 20 20   is still set.  
29f90 48 65 6e 63 65 2c 20 69 73 54 6e 63 74 20 72 65  Hence, isTnct re
29fa0 70 72 65 73 65 6e 74 73 20 74 68 65 0a 20 20 20  presents the.   
29fb0 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 73 65 74   ** original set
29fc0 74 69 6e 67 20 6f 66 20 74 68 65 20 53 46 5f 44  ting of the SF_D
29fd0 69 73 74 69 6e 63 74 20 66 6c 61 67 2c 20 6e 6f  istinct flag, no
29fe0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  t the current se
29ff0 74 74 69 6e 67 20 2a 2f 0a 20 20 20 20 61 73 73  tting */.    ass
2a000 65 72 74 28 20 73 44 69 73 74 69 6e 63 74 2e 69  ert( sDistinct.i
2a010 73 54 6e 63 74 20 29 3b 0a 20 20 7d 0a 0a 20 20  sTnct );.  }..  
2a020 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
2a030 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
2a040 65 2c 20 74 68 65 6e 20 74 68 69 73 20 73 6f 72  e, then this sor
2a050 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ting.  ** index 
2a060 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62 65 69  might end up bei
2a070 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74 68 65  ng unused if the
2a080 20 64 61 74 61 20 63 61 6e 20 62 65 20 0a 20 20   data can be .  
2a090 2a 2a 20 65 78 74 72 61 63 74 65 64 20 69 6e 20  ** extracted in 
2a0a0 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72  pre-sorted order
2a0b0 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68  .  If that is th
2a0c0 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65  e case, then the
2a0d0 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68  .  ** OP_OpenEph
2a0e0 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
2a0f0 6f 6e 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67  on will be chang
2a100 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70  ed to an OP_Noop
2a110 20 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66 69   once.  ** we fi
2a120 67 75 72 65 20 6f 75 74 20 74 68 61 74 20 74 68  gure out that th
2a130 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
2a140 69 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20  is not needed.  
2a150 54 68 65 20 61 64 64 72 53 6f 72 74 49 6e 64 65  The addrSortInde
2a160 78 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20  x.  ** variable 
2a170 69 73 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c  is used to facil
2a180 69 74 61 74 65 20 74 68 61 74 20 63 68 61 6e 67  itate that chang
2a190 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 53  e..  */.  if( sS
2a1a0 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ort.pOrderBy ){.
2a1b0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
2a1c0 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49  yInfo;.    pKeyI
2a1d0 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
2a1e0 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
2a1f0 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  , sSort.pOrderBy
2a200 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 53 6f  , 0, 0);.    sSo
2a210 72 74 2e 69 45 43 75 72 73 6f 72 20 3d 20 70 50  rt.iECursor = pP
2a220 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
2a230 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74    sSort.addrSort
2a240 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71  Index =.      sq
2a250 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2a260 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
2a270 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 73  ral,.          s
2a280 53 6f 72 74 2e 69 45 43 75 72 73 6f 72 2c 20 73  Sort.iECursor, s
2a290 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e  Sort.pOrderBy->n
2a2a0 45 78 70 72 2b 31 2b 70 45 4c 69 73 74 2d 3e 6e  Expr+1+pEList->n
2a2b0 45 78 70 72 2c 20 30 2c 0a 20 20 20 20 20 20 20  Expr, 0,.       
2a2c0 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
2a2d0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 0a 20  fo, P4_KEYINFO. 
2a2e0 20 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b       );.  }else{
2a2f0 0a 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53  .    sSort.addrS
2a300 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20  ortIndex = -1;. 
2a310 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
2a320 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e  output is destin
2a330 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61  ed for a tempora
2a340 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74  ry table, open t
2a350 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  hat table..  */.
2a360 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65    if( pDest->eDe
2a370 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
2a380 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
2a390 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2a3a0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
2a3b0 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70  Dest->iSDParm, p
2a3c0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
2a3d0 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
2a3e0 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20   limiter..  */. 
2a3f0 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56   iEnd = sqlite3V
2a400 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
2a410 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  .  p->nSelectRow
2a420 20 3d 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34   = LARGEST_INT64
2a430 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  ;.  computeLimit
2a440 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
2a450 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20 69 66  , p, iEnd);.  if
2a460 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20 26  ( p->iLimit==0 &
2a470 26 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74  & sSort.addrSort
2a480 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20 20 20  Index>=0 ){.    
2a490 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
2a4a0 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f  (v, sSort.addrSo
2a4b0 72 74 49 6e 64 65 78 29 2d 3e 6f 70 63 6f 64 65  rtIndex)->opcode
2a4c0 20 3d 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e   = OP_SorterOpen
2a4d0 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f 72 74  ;.    sSort.sort
2a4e0 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46 4c 41  Flags |= SORTFLA
2a4f0 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20 20 7d  G_UseSorter;.  }
2a500 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69  ..  /* Open a vi
2a510 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75  rtual index to u
2a520 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69  se for the disti
2a530 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  nct set..  */.  
2a540 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
2a550 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 7b  & SF_Distinct ){
2a560 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74  .    sDistinct.t
2a570 61 62 54 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  abTnct = pParse-
2a580 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 44 69  >nTab++;.    sDi
2a590 73 74 69 6e 63 74 2e 61 64 64 72 54 6e 63 74 20  stinct.addrTnct 
2a5a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2a5b0 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
2a5c0 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20  hemeral,.       
2a5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5e0 20 20 20 20 20 20 20 20 20 73 44 69 73 74 69 6e           sDistin
2a5f0 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c 20 30  ct.tabTnct, 0, 0
2a600 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2a610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a620 20 20 28 63 68 61 72 2a 29 6b 65 79 49 6e 66 6f    (char*)keyInfo
2a630 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
2a640 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 30  rse, p->pEList,0
2a650 2c 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ,0),.           
2a660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a670 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29       P4_KEYINFO)
2a680 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2a690 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52  eChangeP5(v, BTR
2a6a0 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20  EE_UNORDERED);. 
2a6b0 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e     sDistinct.eTn
2a6c0 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44  ctType = WHERE_D
2a6d0 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45  ISTINCT_UNORDERE
2a6e0 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
2a6f0 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
2a700 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54  ype = WHERE_DIST
2a710 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a  INCT_NOOP;.  }..
2a720 20 20 69 66 28 20 21 69 73 41 67 67 20 26 26 20    if( !isAgg && 
2a730 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20  pGroupBy==0 ){. 
2a740 20 20 20 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61     /* No aggrega
2a750 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64  te functions and
2a760 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61   no GROUP BY cla
2a770 75 73 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 77  use */.    u16 w
2a780 63 74 72 6c 46 6c 61 67 73 20 3d 20 28 73 44 69  ctrlFlags = (sDi
2a790 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20  stinct.isTnct ? 
2a7a0 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
2a7b0 4e 43 54 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f  NCT : 0);..    /
2a7c0 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61  * Begin the data
2a7d0 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20  base scan. */.  
2a7e0 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
2a7f0 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
2a800 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
2a810 57 68 65 72 65 2c 20 73 53 6f 72 74 2e 70 4f 72  Where, sSort.pOr
2a820 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20  derBy,.         
2a830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a840 20 20 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 2c        p->pEList,
2a850 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 30 29 3b   wctrlFlags, 0);
2a860 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d  .    if( pWInfo=
2a870 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
2a880 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 73 71  _end;.    if( sq
2a890 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74  lite3WhereOutput
2a8a0 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29  RowCount(pWInfo)
2a8b0 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   < p->nSelectRow
2a8c0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65   ){.      p->nSe
2a8d0 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  lectRow = sqlite
2a8e0 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43  3WhereOutputRowC
2a8f0 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20  ount(pWInfo);.  
2a900 20 20 7d 0a 20 20 20 20 69 66 28 20 73 44 69 73    }.    if( sDis
2a910 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20  tinct.isTnct && 
2a920 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69  sqlite3WhereIsDi
2a930 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 20 29  stinct(pWInfo) )
2a940 7b 0a 20 20 20 20 20 20 73 44 69 73 74 69 6e 63  {.      sDistinc
2a950 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 73 71  t.eTnctType = sq
2a960 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74  lite3WhereIsDist
2a970 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20  inct(pWInfo);.  
2a980 20 20 7d 0a 20 20 20 20 69 66 28 20 73 53 6f 72    }.    if( sSor
2a990 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  t.pOrderBy ){.  
2a9a0 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74      sSort.nOBSat
2a9b0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 49   = sqlite3WhereI
2a9c0 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29  sOrdered(pWInfo)
2a9d0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 53 6f 72  ;.      if( sSor
2a9e0 74 2e 6e 4f 42 53 61 74 3d 3d 73 53 6f 72 74 2e  t.nOBSat==sSort.
2a9f0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
2aa00 29 7b 0a 20 20 20 20 20 20 20 20 73 53 6f 72 74  ){.        sSort
2aa10 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  .pOrderBy = 0;. 
2aa20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
2aa30 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20    /* If sorting 
2aa40 69 6e 64 65 78 20 74 68 61 74 20 77 61 73 20 63  index that was c
2aa50 72 65 61 74 65 64 20 62 79 20 61 20 70 72 69 6f  reated by a prio
2aa60 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  r OP_OpenEphemer
2aa70 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72  al .    ** instr
2aa80 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20  uction ended up 
2aa90 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64  not being needed
2aaa0 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68  , then change th
2aab0 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
2aac0 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61  al.    ** into a
2aad0 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a  n OP_Noop..    *
2aae0 2f 0a 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e  /.    if( sSort.
2aaf0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30  addrSortIndex>=0
2ab00 20 26 26 20 73 53 6f 72 74 2e 70 4f 72 64 65 72   && sSort.pOrder
2ab10 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  By==0 ){.      s
2ab20 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2ab30 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e  ToNoop(v, sSort.
2ab40 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a  addrSortIndex);.
2ab50 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73      }..    /* Us
2ab60 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69  e the standard i
2ab70 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20  nner loop. */.  
2ab80 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
2ab90 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c  p(pParse, p, pEL
2aba0 69 73 74 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c  ist, -1, &sSort,
2abb0 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65   &sDistinct, pDe
2abc0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
2abd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
2abe0 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62 65  hereContinueLabe
2abf0 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20 20 20  l(pWInfo),.     
2ac00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2ac10 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b  qlite3WhereBreak
2ac20 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a  Label(pWInfo));.
2ac30 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20  .    /* End the 
2ac40 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f  database scan lo
2ac50 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  op..    */.    s
2ac60 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
2ac70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  WInfo);.  }else{
2ac80 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73  .    /* This cas
2ac90 65 20 77 68 65 6e 20 74 68 65 72 65 20 65 78 69  e when there exi
2aca0 73 74 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  st aggregate fun
2acb0 63 74 69 6f 6e 73 20 6f 72 20 61 20 47 52 4f 55  ctions or a GROU
2acc0 50 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20  P BY clause.    
2acd0 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a 20 20  ** or both */.  
2ace0 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
2acf0 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  C;    /* Name co
2ad00 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73  ntext for proces
2ad10 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 20 69  sing aggregate i
2ad20 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
2ad30 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20    int iAMem;    
2ad40 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
2ad50 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 73  em address for s
2ad60 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47  toring current G
2ad70 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69  ROUP BY */.    i
2ad80 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20  nt iBMem;       
2ad90 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
2ada0 61 64 64 72 65 73 73 20 66 6f 72 20 70 72 65 76  address for prev
2adb0 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f  ious GROUP BY */
2adc0 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61  .    int iUseFla
2add0 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20  g;       /* Mem 
2ade0 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20  address holding 
2adf0 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20  flag indicating 
2ae00 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20  that at least.  
2ae10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77        ** one row
2ae30 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f   of the input to
2ae40 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 20   the aggregator 
2ae50 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20  has been.       
2ae60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae70 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f   ** processed */
2ae80 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46  .    int iAbortF
2ae90 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20  lag;     /* Mem 
2aea0 61 64 64 72 65 73 73 20 77 68 69 63 68 20 63 61  address which ca
2aeb0 75 73 65 73 20 71 75 65 72 79 20 61 62 6f 72 74  uses query abort
2aec0 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a   if positive */.
2aed0 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53      int groupByS
2aee0 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20  ort;    /* Rows 
2aef0 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65  come from source
2af00 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64   in GROUP BY ord
2af10 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  er */.    int ad
2af20 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a  drEnd;        /*
2af30 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73 69   End of processi
2af40 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45  ng for this SELE
2af50 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f  CT */.    int so
2af60 72 74 50 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a  rtPTab = 0;   /*
2af70 20 50 73 65 75 64 6f 74 61 62 6c 65 20 75 73 65   Pseudotable use
2af80 64 20 74 6f 20 64 65 63 6f 64 65 20 73 6f 72 74  d to decode sort
2af90 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ing results */. 
2afa0 20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74 20 3d     int sortOut =
2afb0 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70 75 74   0;    /* Output
2afc0 20 72 65 67 69 73 74 65 72 20 66 72 6f 6d 20 74   register from t
2afd0 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 0a 20 20  he sorter */..  
2afe0 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20    /* Remove any 
2aff0 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20  and all aliases 
2b000 62 65 74 77 65 65 6e 20 74 68 65 20 72 65 73 75  between the resu
2b010 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20  lt set and the. 
2b020 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63     ** GROUP BY c
2b030 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  lause..    */.  
2b040 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
2b050 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20  {.      int k;  
2b060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b070 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2b080 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73  unter */.      s
2b090 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
2b0a0 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20  tem *pItem;  /* 
2b0b0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
2b0c0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
2b0d0 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20   list */..      
2b0e0 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d  for(k=p->pEList-
2b0f0 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d  >nExpr, pItem=p-
2b100 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b  >pEList->a; k>0;
2b110 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   k--, pItem++){.
2b120 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75          pItem->u
2b130 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20  .x.iAlias = 0;. 
2b140 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
2b150 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  (k=pGroupBy->nEx
2b160 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70  pr, pItem=pGroup
2b170 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c  By->a; k>0; k--,
2b180 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
2b190 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41     pItem->u.x.iA
2b1a0 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  lias = 0;.      
2b1b0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  }.      if( p->n
2b1c0 53 65 6c 65 63 74 52 6f 77 3e 31 30 30 20 29 20  SelectRow>100 ) 
2b1d0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
2b1e0 31 30 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  100;.    }else{.
2b1f0 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
2b200 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  Row = 1;.    }..
2b210 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20   .    /* Create 
2b220 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20  a label to jump 
2b230 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20  to when we want 
2b240 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71 75 65  to abort the que
2b250 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e  ry */.    addrEn
2b260 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
2b270 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
2b280 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f    /* Convert TK_
2b290 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74  COLUMN nodes int
2b2a0 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  o TK_AGG_COLUMN 
2b2b0 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73  and make entries
2b2c0 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49   in.    ** sAggI
2b2d0 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41  nfo for all TK_A
2b2e0 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65  GG_FUNCTION node
2b2f0 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  s in expressions
2b300 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53   of the.    ** S
2b310 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
2b320 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  .    */.    mems
2b330 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
2b340 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e  of(sNC));.    sN
2b350 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
2b360 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  e;.    sNC.pSrcL
2b370 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
2b380 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f      sNC.pAggInfo
2b390 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20   = &sAggInfo;.  
2b3a0 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67    sAggInfo.mnReg
2b3b0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
2b3c0 31 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  1;.    sAggInfo.
2b3d0 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d  nSortingColumn =
2b3e0 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f   pGroupBy ? pGro
2b3f0 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31 20 3a 20  upBy->nExpr+1 : 
2b400 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  0;.    sAggInfo.
2b410 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
2b420 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBy;.    sqlite3
2b430 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
2b440 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29  st(&sNC, pEList)
2b450 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2b460 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
2b470 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f 72 64  &sNC, sSort.pOrd
2b480 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70  erBy);.    if( p
2b490 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  Having ){.      
2b4a0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2b4b0 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73 4e  zeAggregates(&sN
2b4c0 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  C, pHaving);.   
2b4d0 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e   }.    sAggInfo.
2b4e0 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73  nAccumulator = s
2b4f0 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
2b500 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2b510 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20  sAggInfo.nFunc; 
2b520 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
2b530 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2b540 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61 46  erty(sAggInfo.aF
2b550 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50  unc[i].pExpr, EP
2b560 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
2b570 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73       sNC.ncFlags
2b580 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63   |= NC_InAggFunc
2b590 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
2b5a0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
2b5b0 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f  t(&sNC, sAggInfo
2b5c0 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d  .aFunc[i].pExpr-
2b5d0 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  >x.pList);.     
2b5e0 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20   sNC.ncFlags &= 
2b5f0 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20  ~NC_InAggFunc;. 
2b600 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66     }.    sAggInf
2b610 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72 73 65  o.mxReg = pParse
2b620 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20  ->nMem;.    if( 
2b630 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2b640 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
2b650 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63  nd;..    /* Proc
2b660 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65  essing for aggre
2b670 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55 50  gates with GROUP
2b680 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66 66   BY is very diff
2b690 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a  erent and.    **
2b6a0 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c   much more compl
2b6b0 65 78 20 74 68 61 6e 20 61 67 67 72 65 67 61 74  ex than aggregat
2b6c0 65 73 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f  es without a GRO
2b6d0 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20  UP BY..    */.  
2b6e0 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
2b6f0 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  {.      KeyInfo 
2b700 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b  *pKeyInfo;  /* K
2b710 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  eying informatio
2b720 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20  n for the group 
2b730 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  by clause */.   
2b740 20 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20     int j1;      
2b750 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42         /* A-vs-B
2b760 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d   comparision jum
2b770 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  p */.      int a
2b780 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f  ddrOutputRow;  /
2b790 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f  * Start of subro
2b7a0 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
2b7b0 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20  ts a result row 
2b7c0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  */.      int reg
2b7d0 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20  OutputRow;   /* 
2b7e0 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72  Return address r
2b7f0 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70  egister for outp
2b800 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ut subroutine */
2b810 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53  .      int addrS
2b820 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65  etAbort;   /* Se
2b830 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67  t the abort flag
2b840 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20   and return */. 
2b850 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70       int addrTop
2b860 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20  OfLoop;  /* Top 
2b870 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f  of the input loo
2b880 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  p */.      int a
2b890 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f  ddrSortingIdx; /
2b8a0 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  * The OP_OpenEph
2b8b0 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73  emeral for the s
2b8c0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a  orting index */.
2b8d0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 52 65        int addrRe
2b8e0 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75 62  set;      /* Sub
2b8f0 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65  routine for rese
2b900 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75  tting the accumu
2b910 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69  lator */.      i
2b920 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20 20 20  nt regReset;    
2b930 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64     /* Return add
2b940 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
2b950 72 20 72 65 73 65 74 20 73 75 62 72 6f 75 74 69  r reset subrouti
2b960 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  ne */..      /* 
2b970 49 66 20 74 68 65 72 65 20 69 73 20 61 20 47 52  If there is a GR
2b980 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 77 65  OUP BY clause we
2b990 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f   might need a so
2b9a0 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20  rting index to. 
2b9b0 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e       ** implemen
2b9c0 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20  t it.  Allocate 
2b9d0 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64  that sorting ind
2b9e0 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74  ex now.  If it t
2b9f0 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a  urns out.      *
2ba00 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  * that we do not
2ba10 20 6e 65 65 64 20 69 74 20 61 66 74 65 72 20 61   need it after a
2ba20 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74 65  ll, the OP_Sorte
2ba30 72 4f 70 65 6e 20 69 6e 73 74 72 75 63 74 69 6f  rOpen instructio
2ba40 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20  n.      ** will 
2ba50 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
2ba60 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20  o a Noop.  .    
2ba70 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49    */.      sAggI
2ba80 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d  nfo.sortingIdx =
2ba90 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
2baa0 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  .      pKeyInfo 
2bab0 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
2bac0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47  rList(pParse, pG
2bad0 72 6f 75 70 42 79 2c 20 30 2c 20 30 29 3b 0a 20  roupBy, 0, 0);. 
2bae0 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67       addrSorting
2baf0 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Idx = sqlite3Vdb
2bb00 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f  eAddOp4(v, OP_So
2bb10 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20  rterOpen, .     
2bb20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f       sAggInfo.so
2bb30 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49 6e  rtingIdx, sAggIn
2bb40 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
2bb50 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30 2c  n, .          0,
2bb60 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
2bb70 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a  , P4_KEYINFO);..
2bb80 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
2bb90 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  ize memory locat
2bba0 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f  ions used by GRO
2bbb0 55 50 20 42 59 20 61 67 67 72 65 67 61 74 65 20  UP BY aggregate 
2bbc0 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20  processing.     
2bbd0 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c   */.      iUseFl
2bbe0 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ag = ++pParse->n
2bbf0 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72  Mem;.      iAbor
2bc00 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65  tFlag = ++pParse
2bc10 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65  ->nMem;.      re
2bc20 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70  gOutputRow = ++p
2bc30 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2bc40 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
2bc50 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
2bc60 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
2bc70 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b 70    regReset = ++p
2bc80 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2bc90 20 20 20 61 64 64 72 52 65 73 65 74 20 3d 20 73     addrReset = s
2bca0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
2bcb0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 41  bel(v);.      iA
2bcc0 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
2bcd0 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50  em + 1;.      pP
2bce0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47  arse->nMem += pG
2bcf0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
2bd00 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61       iBMem = pPa
2bd10 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
2bd20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
2bd30 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  m += pGroupBy->n
2bd40 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
2bd50 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2bd60 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
2bd70 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20  iAbortFlag);.   
2bd80 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2bd90 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20  v, "clear abort 
2bda0 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
2bdb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2bdc0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
2bdd0 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20  0, iUseFlag);.  
2bde0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2bdf0 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 61 63  (v, "indicate ac
2be00 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22  cumulator empty"
2be10 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
2be20 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2be30 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d  P_Null, 0, iAMem
2be40 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79  , iAMem+pGroupBy
2be50 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20  ->nExpr-1);..   
2be60 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f     /* Begin a lo
2be70 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74  op that will ext
2be80 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20  ract all source 
2be90 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59  rows in GROUP BY
2bea0 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a   order..      **
2beb0 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f   This might invo
2bec0 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74 65  lve two separate
2bed0 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f   loops with an O
2bee0 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65  P_Sort in betwee
2bef0 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69  n, or.      ** i
2bf00 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e  t might be a sin
2bf10 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73  gle loop that us
2bf20 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65  es an index to e
2bf30 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69  xtract informati
2bf40 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  on.      ** in t
2bf50 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20 74  he right order t
2bf60 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20  o begin with..  
2bf70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
2bf80 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2bf90 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52  , OP_Gosub, regR
2bfa0 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29  eset, addrReset)
2bfb0 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d  ;.      pWInfo =
2bfc0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2bfd0 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
2bfe0 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 47 72  ist, pWhere, pGr
2bff0 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20 20 20 20  oupBy, 0,.      
2c000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c010 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45             WHERE
2c020 5f 47 52 4f 55 50 42 59 2c 20 30 29 3b 0a 20 20  _GROUPBY, 0);.  
2c030 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d      if( pWInfo==
2c040 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
2c050 65 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 73  end;.      if( s
2c060 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64  qlite3WhereIsOrd
2c070 65 72 65 64 28 70 57 49 6e 66 6f 29 3d 3d 70 47  ered(pWInfo)==pG
2c080 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 29 7b  roupBy->nExpr ){
2c090 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
2c0a0 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c  optimizer is abl
2c0b0 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77  e to deliver row
2c0c0 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72  s in group by or
2c0d0 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a  der so.        *
2c0e0 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65  * we do not have
2c0f0 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f   to sort.  The O
2c100 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
2c110 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20  table will be.  
2c120 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c        ** cancell
2c130 65 64 20 6c 61 74 65 72 20 62 65 63 61 75 73 65  ed later because
2c140 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74   we still need t
2c150 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79 49 6e  o use the pKeyIn
2c160 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  fo.        */.  
2c170 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72        groupBySor
2c180 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  t = 0;.      }el
2c190 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52  se{.        /* R
2c1a0 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f  ows are coming o
2c1b0 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e  ut in undetermin
2c1c0 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68 61  ed order.  We ha
2c1d0 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20 20  ve to push.     
2c1e0 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20 69     ** each row i
2c1f0 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e  nto a sorting in
2c200 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20 74  dex, terminate t
2c210 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20  he first loop,. 
2c220 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c         ** then l
2c230 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f 72  oop over the sor
2c240 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f 72  ting index in or
2c250 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 6f  der to get the o
2c260 75 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a 2a  utput.        **
2c270 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72   in sorted order
2c280 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2c290 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b      int regBase;
2c2a0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67  .        int reg
2c2b0 52 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20 20  Record;.        
2c2c0 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  int nCol;.      
2c2d0 20 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a    int nGroupBy;.
2c2e0 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e  .        explain
2c2f0 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65  TempTable(pParse
2c300 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  , .            (
2c310 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
2c320 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   && (p->selFlags
2c330 26 53 46 5f 44 69 73 74 69 6e 63 74 29 3d 3d 30  &SF_Distinct)==0
2c340 29 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) ?.            
2c350 20 20 20 20 20 20 20 20 22 44 49 53 54 49 4e 43          "DISTINC
2c360 54 22 20 3a 20 22 47 52 4f 55 50 20 42 59 22 29  T" : "GROUP BY")
2c370 3b 0a 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70  ;..        group
2c380 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20  BySort = 1;.    
2c390 20 20 20 20 6e 47 72 6f 75 70 42 79 20 3d 20 70      nGroupBy = p
2c3a0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
2c3b0 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e          nCol = n
2c3c0 47 72 6f 75 70 42 79 20 2b 20 31 3b 0a 20 20 20  GroupBy + 1;.   
2c3d0 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42       j = nGroupB
2c3e0 79 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  y+1;.        for
2c3f0 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f  (i=0; i<sAggInfo
2c400 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  .nColumn; i++){.
2c410 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 41            if( sA
2c420 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69  ggInfo.aCol[i].i
2c430 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20  SorterColumn>=j 
2c440 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  ){.            n
2c450 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Col++;.         
2c460 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20     j++;.        
2c470 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2c480 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d 20        regBase = 
2c490 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
2c4a0 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c  nge(pParse, nCol
2c4b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2c4c0 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
2c4d0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
2c4e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
2c4f0 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
2c500 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42  , pGroupBy, regB
2c510 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ase, 0);.       
2c520 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2c530 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  p2(v, OP_Sequenc
2c540 65 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  e, sAggInfo.sort
2c550 69 6e 67 49 64 78 2c 72 65 67 42 61 73 65 2b 6e  ingIdx,regBase+n
2c560 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20  GroupBy);.      
2c570 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31    j = nGroupBy+1
2c580 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
2c590 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  0; i<sAggInfo.nC
2c5a0 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
2c5b0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
2c5c0 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20  gInfo_col *pCol 
2c5d0 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  = &sAggInfo.aCol
2c5e0 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [i];.          i
2c5f0 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72  f( pCol->iSorter
2c600 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20  Column>=j ){.   
2c610 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20           int r1 
2c620 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20  = j + regBase;. 
2c630 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72             int r
2c640 32 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  2;..            
2c650 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
2c660 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50  CodeGetColumn(pP
2c670 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
2c680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c690 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62        pCol->pTab
2c6a0 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c  , pCol->iColumn,
2c6b0 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72   pCol->iTable, r
2c6c0 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  1, 0);.         
2c6d0 20 20 20 69 66 28 20 72 31 21 3d 72 32 20 29 7b     if( r1!=r2 ){
2c6e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
2c6f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2c700 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32  (v, OP_SCopy, r2
2c710 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20  , r1);.         
2c720 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2c730 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   j++;.          
2c740 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2c750 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20      regRecord = 
2c760 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
2c770 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
2c780 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2c790 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
2c7a0 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20  ecord, regBase, 
2c7b0 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29  nCol, regRecord)
2c7c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2c7d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2c7e0 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20  P_SorterInsert, 
2c7f0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
2c800 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Idx, regRecord);
2c810 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2c820 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
2c830 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64  Parse, regRecord
2c840 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2c850 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
2c860 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  ge(pParse, regBa
2c870 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  se, nCol);.     
2c880 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
2c890 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
2c8a0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72      sAggInfo.sor
2c8b0 74 69 6e 67 49 64 78 50 54 61 62 20 3d 20 73 6f  tingIdxPTab = so
2c8c0 72 74 50 54 61 62 20 3d 20 70 50 61 72 73 65 2d  rtPTab = pParse-
2c8d0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
2c8e0 20 73 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69 74   sortOut = sqlit
2c8f0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
2c900 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
2c910 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2c920 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
2c930 2c 20 73 6f 72 74 50 54 61 62 2c 20 73 6f 72 74  , sortPTab, sort
2c940 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  Out, nCol);.    
2c950 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2c960 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
2c970 65 72 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f  erSort, sAggInfo
2c980 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64  .sortingIdx, add
2c990 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56  rEnd);.        V
2c9a0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2c9b0 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29  GROUP BY sort"))
2c9c0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
2c9d0 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49  );.        sAggI
2c9e0 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64  nfo.useSortingId
2c9f0 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73  x = 1;.        s
2ca00 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
2ca10 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
2ca20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
2ca30 45 76 61 6c 75 61 74 65 20 74 68 65 20 63 75 72  Evaluate the cur
2ca40 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65  rent GROUP BY te
2ca50 72 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e  rms and store in
2ca60 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20   b0, b1, b2.... 
2ca70 20 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d       ** (b0 is m
2ca80 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69  emory location i
2ca90 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42  BMem+0, b1 is iB
2caa0 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f  Mem+1, and so fo
2cab0 72 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68  rth).      ** Th
2cac0 65 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63  en compare the c
2cad0 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20  urrent GROUP BY 
2cae0 74 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68  terms against th
2caf0 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73  e GROUP BY terms
2cb00 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  .      ** from t
2cb10 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20  he previous row 
2cb20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
2cb30 20 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e   in a0, a1, a2..
2cb40 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2cb50 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d   addrTopOfLoop =
2cb60 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2cb70 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
2cb80 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
2cb90 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
2cba0 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70  .      if( group
2cbb0 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
2cbc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2cbd0 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
2cbe0 44 61 74 61 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Data, sAggInfo.s
2cbf0 6f 72 74 69 6e 67 49 64 78 2c 20 73 6f 72 74 4f  ortingIdx, sortO
2cc00 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ut);.      }.   
2cc10 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47     for(j=0; j<pG
2cc20 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a  roupBy->nExpr; j
2cc30 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
2cc40 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
2cc50 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2cc60 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2cc70 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50 54  P_Column, sortPT
2cc80 61 62 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b  ab, j, iBMem+j);
2cc90 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a  .          if( j
2cca0 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
2ccb0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
2ccc0 4c 41 47 5f 43 4c 45 41 52 43 41 43 48 45 29 3b  LAG_CLEARCACHE);
2ccd0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2cce0 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e            sAggIn
2ccf0 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  fo.directMode = 
2cd00 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  1;.          sql
2cd10 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
2cd20 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61  rse, pGroupBy->a
2cd30 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d  [j].pExpr, iBMem
2cd40 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  +j);.        }. 
2cd50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
2cd60 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2cd70 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41  , OP_Compare, iA
2cd80 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f  Mem, iBMem, pGro
2cd90 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  upBy->nExpr,.   
2cda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cdb0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71         (char*)sq
2cdc0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28  lite3KeyInfoRef(
2cdd0 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45  pKeyInfo), P4_KE
2cde0 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31  YINFO);.      j1
2cdf0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
2ce00 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
2ce10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2ce20 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
2ce30 2c 20 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29  , j1+1, 0, j1+1)
2ce40 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
2ce50 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
2ce60 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
2ce70 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68  runs whenever th
2ce80 65 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67  e GROUP BY chang
2ce90 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61  es..      ** Cha
2cea0 6e 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f 55  nges in the GROU
2ceb0 50 20 42 59 20 61 72 65 20 64 65 74 65 63 74 65  P BY are detecte
2cec0 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75  d by the previou
2ced0 73 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20  s code.      ** 
2cee0 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65  block.  If there
2cef0 20 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73   were no changes
2cf00 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20  , this block is 
2cf10 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a  skipped..      *
2cf20 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  *.      ** This 
2cf30 63 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72 72  code copies curr
2cf40 65 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65 72  ent group by ter
2cf50 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e  ms in b0,b1,b2,.
2cf60 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  ...      ** over
2cf70 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49   to a0,a1,a2.  I
2cf80 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65  t then calls the
2cf90 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
2cfa0 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  ne.      ** and 
2cfb0 72 65 73 65 74 73 20 74 68 65 20 61 67 67 72 65  resets the aggre
2cfc0 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
2cfd0 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 70 72   registers in pr
2cfe0 65 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20  eparation.      
2cff0 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  ** for the next 
2d000 47 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a  GROUP BY batch..
2d010 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
2d020 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
2d030 76 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65 6d  ve(pParse, iBMem
2d040 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42  , iAMem, pGroupB
2d050 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  y->nExpr);.     
2d060 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2d070 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
2d080 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64  regOutputRow, ad
2d090 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
2d0a0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2d0b0 28 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20  (v, "output one 
2d0c0 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71  row"));.      sq
2d0d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2d0e0 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62  v, OP_IfPos, iAb
2d0f0 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64  ortFlag, addrEnd
2d100 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
2d110 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  v);.      VdbeCo
2d120 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b  mment((v, "check
2d130 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
2d140 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2d150 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
2d160 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61  sub, regReset, a
2d170 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20  ddrReset);.     
2d180 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2d190 20 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61   "reset accumula
2d1a0 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
2d1b0 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 67 67  * Update the agg
2d1c0 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
2d1d0 6f 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ors based on the
2d1e0 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20   content of.    
2d1f0 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74    ** the current
2d200 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20   row.      */.  
2d210 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2d220 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
2d230 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75        updateAccu
2d240 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
2d250 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
2d260 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2d270 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
2d280 72 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b  r, 1, iUseFlag);
2d290 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
2d2a0 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65  nt((v, "indicate
2d2b0 20 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c   data in accumul
2d2c0 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
2d2d0 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f  /* End of the lo
2d2e0 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  op.      */.    
2d2f0 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72    if( groupBySor
2d300 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
2d310 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2d320 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c  , OP_SorterNext,
2d330 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
2d340 67 49 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c  gIdx, addrTopOfL
2d350 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 56 64  oop);.        Vd
2d360 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2d370 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2d380 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
2d390 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
2d3a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2d3b0 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
2d3c0 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 29 3b  addrSortingIdx);
2d3d0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2d3e0 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66 69  /* Output the fi
2d3f0 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c  nal row of resul
2d400 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
2d410 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2d420 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
2d430 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64  regOutputRow, ad
2d440 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
2d450 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2d460 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61  (v, "output fina
2d470 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20  l row"));..     
2d480 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68   /* Jump over th
2d490 65 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20  e subroutines.  
2d4a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
2d4b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2d4c0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
2d4d0 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f  drEnd);..      /
2d4e0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
2d4f0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
2d500 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  puts a single ro
2d510 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a  w of the result.
2d520 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54        ** set.  T
2d530 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66  his subroutine f
2d540 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68  irst looks at th
2d550 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20  e iUseFlag.  If 
2d560 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a  iUseFlag.      *
2d570 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  * is less than o
2d580 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c  r equal to zero,
2d590 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
2d5a0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a  is a no-op.  If.
2d5b0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f        ** the pro
2d5c0 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f  cessing calls fo
2d5d0 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 61  r the query to a
2d5e0 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f  bort, this subro
2d5f0 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69  utine.      ** i
2d600 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41  ncrements the iA
2d610 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20  bortFlag memory 
2d620 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20  location before 
2d630 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20  returning in.   
2d640 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73     ** order to s
2d650 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72  ignal the caller
2d660 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20   to abort..     
2d670 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65   */.      addrSe
2d680 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33  tAbort = sqlite3
2d690 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2d6a0 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
2d6b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2d6c0 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41  P_Integer, 1, iA
2d6d0 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  bortFlag);.     
2d6e0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2d6f0 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67   "set abort flag
2d700 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
2d710 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
2d720 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75  OP_Return, regOu
2d730 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
2d740 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
2d750 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f  veLabel(v, addrO
2d760 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
2d770 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d   addrOutputRow =
2d780 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2d790 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
2d7a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2d7b0 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op2(v, OP_IfPos,
2d7c0 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f   iUseFlag, addrO
2d7d0 75 74 70 75 74 52 6f 77 2b 32 29 3b 20 56 64 62  utputRow+2); Vdb
2d7e0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
2d7f0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2d800 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73  (v, "Groupby res
2d810 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e  ult generator en
2d820 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20  try point"));.  
2d830 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2d840 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
2d850 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
2d860 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a  );.      finaliz
2d870 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50  eAggFunctions(pP
2d880 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
2d890 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
2d8a0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
2d8b0 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72  e, pHaving, addr
2d8c0 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c  OutputRow+1, SQL
2d8d0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
2d8e0 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
2d8f0 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
2d900 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 2c  , p->pEList, -1,
2d910 20 26 73 53 6f 72 74 2c 0a 20 20 20 20 20 20 20   &sSort,.       
2d920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
2d930 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74  sDistinct, pDest
2d940 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2d950 20 20 20 20 20 20 20 20 61 64 64 72 4f 75 74 70          addrOutp
2d960 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74  utRow+1, addrSet
2d970 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73 71  Abort);.      sq
2d980 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
2d990 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
2d9a0 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  gOutputRow);.   
2d9b0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2d9c0 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20  v, "end groupby 
2d9d0 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72  result generator
2d9e0 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  "));..      /* G
2d9f0 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
2da00 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72  tine that will r
2da10 65 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62  eset the group-b
2da20 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20  y accumulator.  
2da30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
2da40 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
2da50 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73 65  abel(v, addrRese
2da60 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41  t);.      resetA
2da70 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
2da80 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
2da90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2daa0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
2dab0 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a  urn, regReset);.
2dac0 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65       .    } /* e
2dad0 6e 64 69 66 20 70 47 72 6f 75 70 42 79 2e 20 20  ndif pGroupBy.  
2dae0 42 65 67 69 6e 20 61 67 67 72 65 67 61 74 65 20  Begin aggregate 
2daf0 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 20  queries without 
2db00 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20  GROUP BY: */.   
2db10 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 45 78   else {.      Ex
2db20 70 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20 30  prList *pDel = 0
2db30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2db40 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54  _OMIT_BTREECOUNT
2db50 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
2db60 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  ab;.      if( (p
2db70 54 61 62 20 3d 20 69 73 53 69 6d 70 6c 65 43 6f  Tab = isSimpleCo
2db80 75 6e 74 28 70 2c 20 26 73 41 67 67 49 6e 66 6f  unt(p, &sAggInfo
2db90 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
2dba0 20 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c 65 43   /* If isSimpleC
2dbb0 6f 75 6e 74 28 29 20 72 65 74 75 72 6e 73 20 61  ount() returns a
2dbc0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 61   pointer to a Ta
2dbd0 62 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 74  ble structure, t
2dbe0 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  hen.        ** t
2dbf0 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
2dc00 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
2dc10 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2dc20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
2dc30 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74  count(*) FROM <t
2dc40 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  bl>.        **. 
2dc50 20 20 20 20 20 20 20 2a 2a 20 77 68 65 72 65 20         ** where 
2dc60 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
2dc70 75 72 65 20 72 65 74 75 72 6e 65 64 20 72 65 70  ure returned rep
2dc80 72 65 73 65 6e 74 73 20 74 61 62 6c 65 20 3c 74  resents table <t
2dc90 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  bl>..        **.
2dca0 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
2dcb0 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 6f 20  statement is so 
2dcc0 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20 69  common that it i
2dcd0 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 70 65 63  s optimized spec
2dce0 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20 20  ially. The.     
2dcf0 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20 69     ** OP_Count i
2dd00 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 65 78  nstruction is ex
2dd10 65 63 75 74 65 64 20 65 69 74 68 65 72 20 6f 6e  ecuted either on
2dd20 20 74 68 65 20 69 6e 74 6b 65 79 20 74 61 62 6c   the intkey tabl
2dd30 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  e that.        *
2dd40 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64  * contains the d
2dd50 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20 3c 74  ata for table <t
2dd60 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66  bl> or on one of
2dd70 20 69 74 73 20 69 6e 64 65 78 65 73 2e 20 49 74   its indexes. It
2dd80 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 62  .        ** is b
2dd90 65 74 74 65 72 20 74 6f 20 65 78 65 63 75 74 65  etter to execute
2dda0 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69 6e   the op on an in
2ddb0 64 65 78 2c 20 61 73 20 69 6e 64 65 78 65 73 20  dex, as indexes 
2ddc0 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20 20  are almost.     
2ddd0 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 70 72     ** always spr
2dde0 65 61 64 20 61 63 72 6f 73 73 20 6c 65 73 73 20  ead across less 
2ddf0 70 61 67 65 73 20 74 68 61 6e 20 74 68 65 69 72  pages than their
2de00 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
2de10 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  ables..        *
2de20 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  /.        const 
2de30 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
2de40 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
2de50 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
2de60 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
2de70 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 73     const int iCs
2de80 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
2de90 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  ++;     /* Curso
2dea0 72 20 74 6f 20 73 63 61 6e 20 62 2d 74 72 65 65  r to scan b-tree
2deb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65   */.        Inde
2dec0 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
2ded0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dee0 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
2def0 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  iable */.       
2df00 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
2df10 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  fo = 0;         
2df20 20 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f        /* Keyinfo
2df30 20 66 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e 64   for scanned ind
2df40 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e  ex */.        In
2df50 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30 3b 20  dex *pBest = 0; 
2df60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df70 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65 78     /* Best index
2df80 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f   found so far */
2df90 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f  .        int iRo
2dfa0 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b  ot = pTab->tnum;
2dfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2dfc0 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 73 63   Root page of sc
2dfd0 61 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f 0a  anned b-tree */.
2dfe0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2dff0 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
2e000 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
2e010 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61         sqlite3Ta
2e020 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
2e030 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
2e040 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
2e050 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ;..        /* Se
2e060 61 72 63 68 20 66 6f 72 20 74 68 65 20 69 6e 64  arch for the ind
2e070 65 78 20 74 68 61 74 20 68 61 73 20 74 68 65 20  ex that has the 
2e080 6c 6f 77 65 73 74 20 73 63 61 6e 20 63 6f 73 74  lowest scan cost
2e090 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
2e0a0 20 20 20 20 20 2a 2a 20 28 32 30 31 31 2d 30 34       ** (2011-04
2e0b0 2d 31 35 29 20 44 6f 20 6e 6f 74 20 64 6f 20 61  -15) Do not do a
2e0c0 20 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20 61 6e   full scan of an
2e0d0 20 75 6e 6f 72 64 65 72 65 64 20 69 6e 64 65 78   unordered index
2e0e0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
2e0f0 20 20 20 20 20 2a 2a 20 28 32 30 31 33 2d 31 30       ** (2013-10
2e100 2d 30 33 29 20 44 6f 20 6e 6f 74 20 63 6f 75 6e  -03) Do not coun
2e110 74 20 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e  t the entries in
2e120 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78   a partial index
2e130 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
2e140 20 20 20 20 20 2a 2a 20 49 6e 20 70 72 61 63 74       ** In pract
2e150 69 63 65 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  ice the KeyInfo 
2e160 73 74 72 75 63 74 75 72 65 20 77 69 6c 6c 20 6e  structure will n
2e170 6f 74 20 62 65 20 75 73 65 64 2e 20 49 74 20 69  ot be used. It i
2e180 73 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20 20 20  s only .        
2e190 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 6b 65 65  ** passed to kee
2e1a0 70 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 68 61  p OP_OpenRead ha
2e1b0 70 70 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ppy..        */.
2e1c0 20 20 20 20 20 20 20 20 69 66 28 20 21 48 61 73          if( !Has
2e1d0 52 6f 77 69 64 28 70 54 61 62 29 20 29 20 70 42  Rowid(pTab) ) pB
2e1e0 65 73 74 20 3d 20 73 71 6c 69 74 65 33 50 72 69  est = sqlite3Pri
2e1f0 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
2e200 62 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  b);.        for(
2e210 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
2e220 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
2e230 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
2e240 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
2e250 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20  bUnordered==0.  
2e260 20 20 20 20 20 20 20 20 20 26 26 20 70 49 64 78           && pIdx
2e270 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d  ->szIdxRow<pTab-
2e280 3e 73 7a 54 61 62 52 6f 77 0a 20 20 20 20 20 20  >szTabRow.      
2e290 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e 70 50       && pIdx->pP
2e2a0 61 72 74 49 64 78 57 68 65 72 65 3d 3d 30 0a 20  artIdxWhere==0. 
2e2b0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 21 70            && (!p
2e2c0 42 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e 73 7a  Best || pIdx->sz
2e2d0 49 64 78 52 6f 77 3c 70 42 65 73 74 2d 3e 73 7a  IdxRow<pBest->sz
2e2e0 49 64 78 52 6f 77 29 0a 20 20 20 20 20 20 20 20  IdxRow).        
2e2f0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
2e300 20 70 42 65 73 74 20 3d 20 70 49 64 78 3b 0a 20   pBest = pIdx;. 
2e310 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e320 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2e330 20 70 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20   pBest ){.      
2e340 20 20 20 20 69 52 6f 6f 74 20 3d 20 70 42 65 73      iRoot = pBes
2e350 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20  t->tnum;.       
2e360 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
2e370 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e  lite3KeyInfoOfIn
2e380 64 65 78 28 70 50 61 72 73 65 2c 20 70 42 65 73  dex(pParse, pBes
2e390 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  t);.        }.. 
2e3a0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61         /* Open a
2e3b0 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f   read-only curso
2e3c0 72 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 4f  r, execute the O
2e3d0 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74  P_Count, close t
2e3e0 68 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20  he cursor. */.  
2e3f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2e400 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
2e410 5f 4f 70 65 6e 52 65 61 64 2c 20 69 43 73 72 2c  _OpenRead, iCsr,
2e420 20 69 52 6f 6f 74 2c 20 69 44 62 2c 20 31 29 3b   iRoot, iDb, 1);
2e430 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65  .        if( pKe
2e440 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  yInfo ){.       
2e450 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2e460 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63  angeP4(v, -1, (c
2e470 68 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  har *)pKeyInfo, 
2e480 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
2e490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
2e4a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2e4b0 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43  (v, OP_Count, iC
2e4c0 73 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  sr, sAggInfo.aFu
2e4d0 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20  nc[0].iMem);.   
2e4e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2e4f0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
2e500 73 65 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20  se, iCsr);.     
2e510 20 20 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65     explainSimple
2e520 43 6f 75 6e 74 28 70 50 61 72 73 65 2c 20 70 54  Count(pParse, pT
2e530 61 62 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20  ab, pBest);.    
2e540 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
2e550 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54  * SQLITE_OMIT_BT
2e560 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20  REECOUNT */.    
2e570 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43    {.        /* C
2e580 68 65 63 6b 20 69 66 20 74 68 65 20 71 75 65 72  heck if the quer
2e590 79 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74  y is of one of t
2e5a0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72  he following for
2e5b0 6d 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ms:.        **. 
2e5c0 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45         **   SELE
2e5d0 43 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e  CT min(x) FROM .
2e5e0 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ...        **   
2e5f0 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52  SELECT max(x) FR
2e600 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a  OM ....        *
2e610 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20  *.        ** If 
2e620 69 74 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20  it is, then ask 
2e630 74 68 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72  the code in wher
2e640 65 2e 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74  e.c to attempt t
2e650 6f 20 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20  o sort results. 
2e660 20 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20         ** as if 
2e670 74 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52  there was an "OR
2e680 44 45 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52  DER ON x" or "OR
2e690 44 45 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63  DER ON x DESC" c
2e6a0 6c 61 75 73 65 2e 20 0a 20 20 20 20 20 20 20 20  lause. .        
2e6b0 2a 2a 20 49 66 20 77 68 65 72 65 2e 63 20 69 73  ** If where.c is
2e6c0 20 61 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65   able to produce
2e6d0 20 72 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20   results sorted 
2e6e0 69 6e 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74  in this order, t
2e6f0 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hen.        ** a
2e700 64 64 20 76 64 62 65 20 63 6f 64 65 20 74 6f 20  dd vdbe code to 
2e710 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
2e720 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70   processing loop
2e730 20 61 66 74 65 72 20 74 68 65 20 0a 20 20 20 20   after the .    
2e740 20 20 20 20 2a 2a 20 66 69 72 73 74 20 69 74 65      ** first ite
2e750 72 61 74 69 6f 6e 20 28 73 69 6e 63 65 20 74 68  ration (since th
2e760 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  e first iteratio
2e770 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 73  n of the loop is
2e780 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61   .        ** gua
2e790 72 61 6e 74 65 65 64 20 74 6f 20 6f 70 65 72 61  ranteed to opera
2e7a0 74 65 20 6f 6e 20 74 68 65 20 72 6f 77 20 77 69  te on the row wi
2e7b0 74 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f  th the minimum o
2e7c0 72 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20 20  r maximum .     
2e7d0 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78     ** value of x
2e7e0 2c 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72  , the only row r
2e7f0 65 71 75 69 72 65 64 29 2e 0a 20 20 20 20 20 20  equired)..      
2e800 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2e810 41 20 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d  A special flag m
2e820 75 73 74 20 62 65 20 70 61 73 73 65 64 20 74 6f  ust be passed to
2e830 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2e840 69 6e 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79  in() to slightly
2e850 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69  .        ** modi
2e860 66 79 20 62 65 68 61 76 69 6f 72 20 61 73 20 66  fy behavior as f
2e870 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20 20  ollows:.        
2e880 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
2e890 2b 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69  + If the query i
2e8a0 73 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28  s a "SELECT min(
2e8b0 78 29 22 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f  x)", then the lo
2e8c0 6f 70 20 63 6f 64 65 64 20 62 79 0a 20 20 20 20  op coded by.    
2e8d0 20 20 20 20 2a 2a 20 20 20 20 20 77 68 65 72 65      **     where
2e8e0 2e 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74  .c should not it
2e8f0 65 72 61 74 65 20 6f 76 65 72 20 61 6e 79 20 76  erate over any v
2e900 61 6c 75 65 73 20 77 69 74 68 20 61 20 4e 55 4c  alues with a NUL
2e910 4c 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20  L value.        
2e920 2a 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a 20 20  **     for x..  
2e930 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2e940 20 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70 74 69   **   + The opti
2e950 6d 69 7a 65 72 20 63 6f 64 65 20 69 6e 20 77 68  mizer code in wh
2e960 65 72 65 2e 63 20 28 74 68 65 20 74 68 69 6e 67  ere.c (the thing
2e970 20 74 68 61 74 20 64 65 63 69 64 65 73 20 77 68   that decides wh
2e980 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  ich.        **  
2e990 20 20 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69     index or indi
2e9a0 63 65 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75  ces to use) shou
2e9b0 6c 64 20 70 6c 61 63 65 20 61 20 64 69 66 66 65  ld place a diffe
2e9c0 72 65 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e  rent priority on
2e9d0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20   .        **    
2e9e0 20 73 61 74 69 73 66 79 69 6e 67 20 74 68 65 20   satisfying the 
2e9f0 27 4f 52 44 45 52 20 42 59 27 20 63 6c 61 75 73  'ORDER BY' claus
2ea00 65 20 74 68 61 6e 20 69 74 20 64 6f 65 73 20 69  e than it does i
2ea10 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a 20  n other cases.. 
2ea20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65         **     Re
2ea30 66 65 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20  fer to code and 
2ea40 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72  comments in wher
2ea50 65 2e 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  e.c for details.
2ea60 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2ea70 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d      ExprList *pM
2ea80 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20  inMax = 0;.     
2ea90 20 20 20 75 38 20 66 6c 61 67 20 3d 20 57 48 45     u8 flag = WHE
2eaa0 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41  RE_ORDERBY_NORMA
2eab0 4c 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  L;.        .    
2eac0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
2ead0 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20  GroupBy==0 );.  
2eae0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c        assert( fl
2eaf0 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ag==0 );.       
2eb00 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d   if( p->pHaving=
2eb10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2eb20 66 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65  flag = minMaxQue
2eb30 72 79 28 26 73 41 67 67 49 6e 66 6f 2c 20 26 70  ry(&sAggInfo, &p
2eb40 4d 69 6e 4d 61 78 29 3b 0a 20 20 20 20 20 20 20  MinMax);.       
2eb50 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
2eb60 74 28 20 66 6c 61 67 3d 3d 30 20 7c 7c 20 28 70  t( flag==0 || (p
2eb70 4d 69 6e 4d 61 78 21 3d 30 20 26 26 20 70 4d 69  MinMax!=0 && pMi
2eb80 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 29 20  nMax->nExpr==1) 
2eb90 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  );..        if( 
2eba0 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  flag ){.        
2ebb0 20 20 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69    pMinMax = sqli
2ebc0 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
2ebd0 62 2c 20 70 4d 69 6e 4d 61 78 2c 20 30 29 3b 0a  b, pMinMax, 0);.
2ebe0 20 20 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d            pDel =
2ebf0 20 70 4d 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20   pMinMax;.      
2ec00 20 20 20 20 69 66 28 20 70 4d 69 6e 4d 61 78 20      if( pMinMax 
2ec10 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  && !db->mallocFa
2ec20 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
2ec30 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30      pMinMax->a[0
2ec40 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c  ].sortOrder = fl
2ec50 61 67 21 3d 57 48 45 52 45 5f 4f 52 44 45 52 42  ag!=WHERE_ORDERB
2ec60 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20  Y_MIN ?1:0;.    
2ec70 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d          pMinMax-
2ec80 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20  >a[0].pExpr->op 
2ec90 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  = TK_COLUMN;.   
2eca0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ecb0 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a   }.  .        /*
2ecc0 20 54 68 69 73 20 63 61 73 65 20 72 75 6e 73 20   This case runs 
2ecd0 69 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  if the aggregate
2ece0 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59   has no GROUP BY
2ecf0 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20   clause.  The.  
2ed00 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
2ed10 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70  ing is much simp
2ed20 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72 65 20  ler since there 
2ed30 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  is only a single
2ed40 20 72 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20   row.        ** 
2ed50 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20  of output..     
2ed60 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65     */.        re
2ed70 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  setAccumulator(p
2ed80 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
2ed90 29 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  );.        pWInf
2eda0 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
2edb0 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
2edc0 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
2edd0 70 4d 69 6e 4d 61 78 2c 30 2c 66 6c 61 67 2c 30  pMinMax,0,flag,0
2ede0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2edf0 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  WInfo==0 ){.    
2ee00 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2ee10 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
2ee20 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  pDel);.         
2ee30 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
2ee40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2ee50 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75      updateAccumu
2ee60 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
2ee70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
2ee80 20 20 61 73 73 65 72 74 28 20 70 4d 69 6e 4d 61    assert( pMinMa
2ee90 78 3d 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d  x==0 || pMinMax-
2eea0 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20  >nExpr==1 );.   
2eeb0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2eec0 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70  WhereIsOrdered(p
2eed0 57 49 6e 66 6f 29 3e 30 20 29 7b 0a 20 20 20 20  WInfo)>0 ){.    
2eee0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2eef0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
2ef00 74 6f 2c 20 30 2c 20 73 71 6c 69 74 65 33 57 68  to, 0, sqlite3Wh
2ef10 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57  ereBreakLabel(pW
2ef20 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 20 20  Info));.        
2ef30 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2ef40 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64 65 78  , "%s() by index
2ef50 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2ef60 20 20 20 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f     (flag==WHERE_
2ef70 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e  ORDERBY_MIN?"min
2ef80 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20 20 20  ":"max")));.    
2ef90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
2efa0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
2efb0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 66  Info);.        f
2efc0 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
2efd0 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67  ons(pParse, &sAg
2efe0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  gInfo);.      }.
2eff0 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72  .      sSort.pOr
2f000 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
2f010 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
2f020 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76  lse(pParse, pHav
2f030 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 53 51  ing, addrEnd, SQ
2f040 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
2f050 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  ;.      selectIn
2f060 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
2f070 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31  p, p->pEList, -1
2f080 2c 20 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  , 0, 0, .       
2f090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2f0a0 44 65 73 74 2c 20 61 64 64 72 45 6e 64 2c 20 61  Dest, addrEnd, a
2f0b0 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 73  ddrEnd);.      s
2f0c0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
2f0d0 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a  lete(db, pDel);.
2f0e0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2f0f0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
2f100 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  l(v, addrEnd);. 
2f110 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66     .  } /* endif
2f120 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
2f130 20 2a 2f 0a 0a 20 20 69 66 28 20 73 44 69 73 74   */..  if( sDist
2f140 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 3d 3d  inct.eTnctType==
2f150 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
2f160 4e 4f 52 44 45 52 45 44 20 29 7b 0a 20 20 20 20  NORDERED ){.    
2f170 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
2f180 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e  (pParse, "DISTIN
2f190 43 54 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  CT");.  }..  /* 
2f1a0 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
2f1b0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
2f1c0 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20  then we need to 
2f1d0 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74 73  sort the results
2f1e0 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74  .  ** and send t
2f1f0 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62  hem to the callb
2f200 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  ack one by one..
2f210 20 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74    */.  if( sSort
2f220 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  .pOrderBy ){.   
2f230 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
2f240 65 28 70 50 61 72 73 65 2c 20 73 53 6f 72 74 2e  e(pParse, sSort.
2f250 6e 4f 42 53 61 74 3e 30 20 3f 20 22 52 49 47 48  nOBSat>0 ? "RIGH
2f260 54 20 50 41 52 54 20 4f 46 20 4f 52 44 45 52 20  T PART OF ORDER 
2f270 42 59 22 3a 22 4f 52 44 45 52 20 42 59 22 29 3b  BY":"ORDER BY");
2f280 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72  .    generateSor
2f290 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c  tTail(pParse, p,
2f2a0 20 26 73 53 6f 72 74 2c 20 70 45 4c 69 73 74 2d   &sSort, pEList-
2f2b0 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b 0a  >nExpr, pDest);.
2f2c0 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68    }..  /* Jump h
2f2d0 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73  ere to skip this
2f2e0 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71   query.  */.  sq
2f2f0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
2f300 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a  Label(v, iEnd);.
2f310 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54  .  /* The SELECT
2f320 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
2f330 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74  y coded.   Set t
2f340 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74  he return code t
2f350 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  o 0.  ** to indi
2f360 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a  cate no errors..
2f370 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a    */.  rc = 0;..
2f380 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d    /* Control jum
2f390 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e  ps to here if an
2f3a0 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
2f3b0 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20  tered above, or 
2f3c0 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  upon.  ** succes
2f3d0 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74  sful coding of t
2f3e0 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a  he SELECT..  */.
2f3f0 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65 78  select_end:.  ex
2f400 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
2f410 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
2f420 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63  d, iRestoreSelec
2f430 74 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e  tId);..  /* Iden
2f440 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  tify column name
2f450 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f 66 20  s if results of 
2f460 74 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 74  the SELECT are t
2f470 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  o be output..  *
2f480 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
2f490 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e  TE_OK && pDest->
2f4a0 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
2f4b0 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  t ){.    generat
2f4c0 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
2f4d0 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
2f4e0 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73  EList);.  }..  s
2f4f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2f500 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b   sAggInfo.aCol);
2f510 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
2f520 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  (db, sAggInfo.aF
2f530 75 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  unc);.  return r
2f540 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  c;.}..#if define
2f550 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
2f560 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a  TREE_EXPLAIN)./*
2f570 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68  .** Generate a h
2f580 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 64 65  uman-readable de
2f590 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 61 20 74  scription of a t
2f5a0 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74  he Select object
2f5b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2f5c0 20 65 78 70 6c 61 69 6e 4f 6e 65 53 65 6c 65 63   explainOneSelec
2f5d0 74 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53  t(Vdbe *pVdbe, S
2f5e0 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 73 71 6c  elect *p){.  sql
2f5f0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
2f600 66 28 70 56 64 62 65 2c 20 22 53 45 4c 45 43 54  f(pVdbe, "SELECT
2f610 20 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65   ");.  if( p->se
2f620 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
2f630 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
2f640 74 65 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70  te) ){.    if( p
2f650 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2f660 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
2f670 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2f680 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 44  Printf(pVdbe, "D
2f690 49 53 54 49 4e 43 54 20 22 29 3b 0a 20 20 20 20  ISTINCT ");.    
2f6a0 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c  }.    if( p->sel
2f6b0 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
2f6c0 67 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71  gate ){.      sq
2f6d0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2f6e0 74 66 28 70 56 64 62 65 2c 20 22 61 67 67 5f 66  tf(pVdbe, "agg_f
2f6f0 6c 61 67 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20  lag ");.    }.  
2f700 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2f710 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20 73  NL(pVdbe);.    s
2f720 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2f730 6e 74 66 28 70 56 64 62 65 2c 20 22 20 20 20 22  ntf(pVdbe, "   "
2f740 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
2f750 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28  ExplainExprList(
2f760 70 56 64 62 65 2c 20 70 2d 3e 70 45 4c 69 73 74  pVdbe, p->pEList
2f770 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c  );.  sqlite3Expl
2f780 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20  ainNL(pVdbe);.  
2f790 69 66 28 20 70 2d 3e 70 53 72 63 20 26 26 20 70  if( p->pSrc && p
2f7a0 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 20 29 7b 0a  ->pSrc->nSrc ){.
2f7b0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
2f7c0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2f7d0 6e 74 66 28 70 56 64 62 65 2c 20 22 46 52 4f 4d  ntf(pVdbe, "FROM
2f7e0 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
2f7f0 45 78 70 6c 61 69 6e 50 75 73 68 28 70 56 64 62  ExplainPush(pVdb
2f800 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  e);.    for(i=0;
2f810 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63   i<p->pSrc->nSrc
2f820 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
2f830 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2f840 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70  m *pItem = &p->p
2f850 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
2f860 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2f870 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 7b 25  rintf(pVdbe, "{%
2f880 64 2c 2a 7d 20 3d 20 22 2c 20 70 49 74 65 6d 2d  d,*} = ", pItem-
2f890 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
2f8a0 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c   if( pItem->pSel
2f8b0 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ect ){.        s
2f8c0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65 6c  qlite3ExplainSel
2f8d0 65 63 74 28 70 56 64 62 65 2c 20 70 49 74 65 6d  ect(pVdbe, pItem
2f8e0 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
2f8f0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
2f900 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Tab ){.         
2f910 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2f920 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 28  rintf(pVdbe, " (
2f930 74 61 62 6e 61 6d 65 3d 25 73 29 22 2c 20 70 49  tabname=%s)", pI
2f940 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
2f950 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2f960 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74     }else if( pIt
2f970 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  em->zName ){.   
2f980 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
2f990 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2f9a0 20 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e   "%s", pItem->zN
2f9b0 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
2f9c0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
2f9d0 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20  Alias ){.       
2f9e0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2f9f0 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 28  rintf(pVdbe, " (
2fa00 41 53 20 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e  AS %s)", pItem->
2fa10 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d  zAlias);.      }
2fa20 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
2fa30 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
2fa40 4c 45 46 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LEFT ){.        
2fa50 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2fa60 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 4c 45  intf(pVdbe, " LE
2fa70 46 54 2d 4a 4f 49 4e 22 29 3b 0a 20 20 20 20 20  FT-JOIN");.     
2fa80 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
2fa90 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29  ExplainNL(pVdbe)
2faa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2fab0 74 65 33 45 78 70 6c 61 69 6e 50 6f 70 28 70 56  te3ExplainPop(pV
2fac0 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  dbe);.  }.  if( 
2fad0 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20  p->pWhere ){.   
2fae0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2faf0 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 57 48  rintf(pVdbe, "WH
2fb00 45 52 45 20 22 29 3b 0a 20 20 20 20 73 71 6c 69  ERE ");.    sqli
2fb10 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
2fb20 56 64 62 65 2c 20 70 2d 3e 70 57 68 65 72 65 29  Vdbe, p->pWhere)
2fb30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2fb40 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20  lainNL(pVdbe);. 
2fb50 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f   }.  if( p->pGro
2fb60 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  upBy ){.    sqli
2fb70 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2fb80 28 70 56 64 62 65 2c 20 22 47 52 4f 55 50 42 59  (pVdbe, "GROUPBY
2fb90 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
2fba0 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28  ExplainExprList(
2fbb0 70 56 64 62 65 2c 20 70 2d 3e 70 47 72 6f 75 70  pVdbe, p->pGroup
2fbc0 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  By);.    sqlite3
2fbd0 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29  ExplainNL(pVdbe)
2fbe0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
2fbf0 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 73 71  Having ){.    sq
2fc00 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2fc10 74 66 28 70 56 64 62 65 2c 20 22 48 41 56 49 4e  tf(pVdbe, "HAVIN
2fc20 47 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  G ");.    sqlite
2fc30 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56 64  3ExplainExpr(pVd
2fc40 62 65 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b  be, p->pHaving);
2fc50 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2fc60 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20  ainNL(pVdbe);.  
2fc70 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  }.  if( p->pOrde
2fc80 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
2fc90 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2fca0 70 56 64 62 65 2c 20 22 4f 52 44 45 52 42 59 20  pVdbe, "ORDERBY 
2fcb0 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ");.    sqlite3E
2fcc0 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70  xplainExprList(p
2fcd0 56 64 62 65 2c 20 70 2d 3e 70 4f 72 64 65 72 42  Vdbe, p->pOrderB
2fce0 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  y);.    sqlite3E
2fcf0 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b  xplainNL(pVdbe);
2fd00 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4c  .  }.  if( p->pL
2fd10 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
2fd20 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2fd30 28 70 56 64 62 65 2c 20 22 4c 49 4d 49 54 20 22  (pVdbe, "LIMIT "
2fd40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2fd50 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62 65 2c  plainExpr(pVdbe,
2fd60 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
2fd70 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
2fd80 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20  L(pVdbe);.  }.  
2fd90 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29  if( p->pOffset )
2fda0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
2fdb0 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
2fdc0 2c 20 22 4f 46 46 53 45 54 20 22 29 3b 0a 20 20  , "OFFSET ");.  
2fdd0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2fde0 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70  Expr(pVdbe, p->p
2fdf0 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c  Offset);.    sql
2fe00 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56  ite3ExplainNL(pV
2fe10 64 62 65 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64  dbe);.  }.}.void
2fe20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53   sqlite3ExplainS
2fe30 65 6c 65 63 74 28 56 64 62 65 20 2a 70 56 64 62  elect(Vdbe *pVdb
2fe40 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
2fe50 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
2fe60 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2fe70 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 28 6e  rintf(pVdbe, "(n
2fe80 75 6c 6c 2d 73 65 6c 65 63 74 29 22 29 3b 0a 20  ull-select)");. 
2fe90 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
2fea0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2feb0 75 73 68 28 70 56 64 62 65 29 3b 0a 20 20 77 68  ush(pVdbe);.  wh
2fec0 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 65 78  ile( p ){.    ex
2fed0 70 6c 61 69 6e 4f 6e 65 53 65 6c 65 63 74 28 70  plainOneSelect(p
2fee0 56 64 62 65 2c 20 70 29 3b 0a 20 20 20 20 70 20  Vdbe, p);.    p 
2fef0 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  = p->pNext;.    
2ff00 69 66 28 20 70 3d 3d 30 20 29 20 62 72 65 61 6b  if( p==0 ) break
2ff10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2ff20 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20  lainNL(pVdbe);. 
2ff30 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2ff40 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2ff50 25 73 5c 6e 22 2c 20 73 65 6c 65 63 74 4f 70 4e  %s\n", selectOpN
2ff60 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d  ame(p->op));.  }
2ff70 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69  .  sqlite3Explai
2ff80 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2ff90 45 4e 44 22 29 3b 0a 20 20 73 71 6c 69 74 65 33  END");.  sqlite3
2ffa0 45 78 70 6c 61 69 6e 50 6f 70 28 70 56 64 62 65  ExplainPop(pVdbe
2ffb0 29 3b 0a 7d 0a 0a 2f 2a 20 45 6e 64 20 6f 66 20  );.}../* End of 
2ffc0 74 68 65 20 73 74 72 75 63 74 75 72 65 20 64 65  the structure de
2ffd0 62 75 67 20 70 72 69 6e 74 69 6e 67 20 63 6f 64  bug printing cod
2ffe0 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e.**************
2fff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
30030 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
30040 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
30050 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 20 2a  _TREE_EXPLAIN) *
30060 2f 0a                                            /.