/ Hex Artifact Content
Login

Artifact 2270f57439f69f4b2fd97452203b5da53a51d668:


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 49 6e 73 65 72 74 20 63 6f 64  /*.** Insert cod
3d80: 65 20 69 6e 74 6f 20 22 76 22 20 74 68 61 74 20  e into "v" that 
3d90: 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72 65  will push the re
3da0: 63 6f 72 64 20 69 6e 20 72 65 67 69 73 74 65 72  cord in register
3db0: 20 72 65 67 44 61 74 61 0a 2a 2a 20 69 6e 74 6f   regData.** into
3dc0: 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a   the sorter..*/.
3dd0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73 68  static void push
3de0: 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50 61  OntoSorter(.  Pa
3df0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
3e00: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
3e10: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f 72 74  ontext */.  Sort
3e20: 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20 20  Ctx *pSort,     
3e30: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
3e40: 6e 20 61 62 6f 75 74 20 74 68 65 20 4f 52 44 45  n about the ORDE
3e50: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
3e60: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
3e70: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77  ,       /* The w
3e80: 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74  hole SELECT stat
3e90: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72  ement */.  int r
3ea0: 65 67 44 61 74 61 20 20 20 20 20 20 20 20 20 20  egData          
3eb0: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
3ec0: 6c 64 69 6e 67 20 64 61 74 61 20 74 6f 20 62 65  lding data to be
3ed0: 20 73 6f 72 74 65 64 20 2a 2f 0a 29 7b 0a 20 20   sorted */.){.  
3ee0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
3ef0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6e  ->pVdbe;.  int n
3f00: 45 78 70 72 20 3d 20 70 53 6f 72 74 2d 3e 70 4f  Expr = pSort->pO
3f10: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
3f20: 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d   int regRecord =
3f30: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
3f40: 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 20 3d  .  int regBase =
3f50: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
3f60: 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d 20  .  int nOBSat = 
3f70: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20  pSort->nOBSat;. 
3f80: 20 69 6e 74 20 6f 70 3b 0a 0a 20 20 70 50 61 72   int op;..  pPar
3f90: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70  se->nMem += nExp
3fa0: 72 2b 32 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e  r+2;        /* n
3fb0: 45 78 70 72 2b 32 20 72 65 67 69 73 74 65 72 73  Expr+2 registers
3fc0: 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 72 65   allocated at re
3fd0: 67 42 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  gBase */.  sqlit
3fe0: 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
3ff0: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
4000: 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
4010: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ist(pParse, pSor
4020: 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72 65 67  t->pOrderBy, reg
4030: 42 61 73 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69  Base, 0);.  sqli
4040: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
4050: 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 53   OP_Sequence, pS
4060: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72  ort->iECursor, r
4070: 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20  egBase+nExpr);. 
4080: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
4090: 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67  Move(pParse, reg
40a0: 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e 45  Data, regBase+nE
40b0: 78 70 72 2b 31 2c 20 31 29 3b 0a 20 20 73 71 6c  xpr+1, 1);.  sql
40c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
40d0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
40e0: 20 72 65 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c   regBase+nOBSat,
40f0: 20 6e 45 78 70 72 2b 32 2d 6e 4f 42 53 61 74 2c   nExpr+2-nOBSat,
4100: 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 69 66  regRecord);.  if
4110: 28 20 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20  ( nOBSat>0 ){.  
4120: 20 20 69 6e 74 20 72 65 67 50 72 65 76 4b 65 79    int regPrevKey
4130: 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74  ;   /* The first
4140: 20 6e 4f 42 53 61 74 20 63 6f 6c 75 6d 6e 73 20   nOBSat columns 
4150: 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  of the previous 
4160: 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  row */.    int a
4170: 64 64 72 46 69 72 73 74 3b 20 20 20 20 2f 2a 20  ddrFirst;    /* 
4180: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f  Address of the O
4190: 50 5f 49 66 4e 6f 74 20 6f 70 63 6f 64 65 20 2a  P_IfNot opcode *
41a0: 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4a 6d  /.    int addrJm
41b0: 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  p;      /* Addre
41c0: 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4a 75 6d  ss of the OP_Jum
41d0: 70 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  p opcode */.    
41e0: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20  VdbeOp *pOp;    
41f0: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 68 61 74    /* Opcode that
4200: 20 6f 70 65 6e 73 20 74 68 65 20 73 6f 72 74 65   opens the sorte
4210: 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65  r */.    int nKe
4220: 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  y;         /* Nu
4230: 6d 62 65 72 20 6f 66 20 73 6f 72 74 69 6e 67 20  mber of sorting 
4240: 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69 6e 63  key columns, inc
4250: 6c 75 64 69 6e 67 20 4f 50 5f 53 65 71 75 65 6e  luding OP_Sequen
4260: 63 65 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66  ce */.    KeyInf
4270: 6f 20 2a 70 4b 49 3b 20 20 20 20 20 2f 2a 20 4f  o *pKI;     /* O
4280: 72 69 67 69 6e 61 6c 20 4b 65 79 49 6e 66 6f 20  riginal KeyInfo 
4290: 6f 6e 20 74 68 65 20 73 6f 72 74 65 72 20 74 61  on the sorter ta
42a0: 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 65 67 50  ble */..    regP
42b0: 72 65 76 4b 65 79 20 3d 20 70 50 61 72 73 65 2d  revKey = pParse-
42c0: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
42d0: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f  rse->nMem += pSo
42e0: 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20  rt->nOBSat;.    
42f0: 6e 4b 65 79 20 3d 20 6e 45 78 70 72 20 2d 20 70  nKey = nExpr - p
4300: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 20 2b 20 31  Sort->nOBSat + 1
4310: 3b 0a 20 20 20 20 61 64 64 72 46 69 72 73 74 20  ;.    addrFirst 
4320: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
4330: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op1(v, OP_IfNot,
4340: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b   regBase+nExpr);
4350: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
4360: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
4370: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
4380: 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76 4b 65  mpare, regPrevKe
4390: 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53 6f 72  y, regBase, pSor
43a0: 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20  t->nOBSat);.    
43b0: 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
43c0: 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74 2d  eGetOp(v, pSort-
43d0: 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b  >addrSortIndex);
43e0: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
43f0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
4400: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  d ) return;.    
4410: 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79 20 2b  pOp->p2 = nKey +
4420: 20 31 3b 0a 20 20 20 20 70 4b 49 20 3d 20 70 4f   1;.    pKI = pO
4430: 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a  p->p4.pKeyInfo;.
4440: 20 20 20 20 6d 65 6d 73 65 74 28 70 4b 49 2d 3e      memset(pKI->
4450: 61 53 6f 72 74 4f 72 64 65 72 2c 20 30 2c 20 70  aSortOrder, 0, p
4460: 4b 49 2d 3e 6e 46 69 65 6c 64 29 3b 20 2f 2a 20  KI->nField); /* 
4470: 4d 61 6b 65 73 20 4f 50 5f 4a 75 6d 70 20 62 65  Makes OP_Jump be
4480: 6c 6f 77 20 74 65 73 74 61 62 6c 65 20 2a 2f 0a  low testable */.
4490: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
44a0: 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28  hangeP4(v, -1, (
44b0: 63 68 61 72 2a 29 70 4b 49 2c 20 50 34 5f 4b 45  char*)pKI, P4_KE
44c0: 59 49 4e 46 4f 29 3b 0a 20 20 20 20 70 4f 70 2d  YINFO);.    pOp-
44d0: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 6b  >p4.pKeyInfo = k
44e0: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
44f0: 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  st(pParse, pSort
4500: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 6e 4f 42 53  ->pOrderBy, nOBS
4510: 61 74 2c 20 31 29 3b 0a 20 20 20 20 61 64 64 72  at, 1);.    addr
4520: 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Jmp = sqlite3Vdb
4530: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
4540: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4550: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
4560: 70 2c 20 61 64 64 72 4a 6d 70 2b 31 2c 20 30 2c  p, addrJmp+1, 0,
4570: 20 61 64 64 72 4a 6d 70 2b 31 29 3b 20 56 64 62   addrJmp+1); Vdb
4580: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
4590: 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b    pSort->labelBk
45a0: 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Out = sqlite3Vdb
45b0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
45c0: 20 20 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74     pSort->regRet
45d0: 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  urn = ++pParse->
45e0: 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
45f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4600: 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e  P_Gosub, pSort->
4610: 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74  regReturn, pSort
4620: 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20  ->labelBkOut);. 
4630: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4640: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74  dOp1(v, OP_Reset
4650: 53 6f 72 74 65 72 2c 20 70 53 6f 72 74 2d 3e 69  Sorter, pSort->i
4660: 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71  ECursor);.    sq
4670: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
4680: 65 28 76 2c 20 61 64 64 72 46 69 72 73 74 29 3b  e(v, addrFirst);
4690: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
46a0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 6f 76  AddOp3(v, OP_Mov
46b0: 65 2c 20 72 65 67 42 61 73 65 2c 20 72 65 67 50  e, regBase, regP
46c0: 72 65 76 4b 65 79 2c 20 70 53 6f 72 74 2d 3e 6e  revKey, pSort->n
46d0: 4f 42 53 61 74 29 3b 0a 20 20 20 20 73 71 6c 69  OBSat);.    sqli
46e0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
46f0: 76 2c 20 61 64 64 72 4a 6d 70 29 3b 0a 20 20 7d  v, addrJmp);.  }
4700: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f  .  if( pSort->so
4710: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
4720: 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a  AG_UseSorter ){.
4730: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 53 6f 72 74      op = OP_Sort
4740: 65 72 49 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73  erInsert;.  }els
4750: 65 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 49  e{.    op = OP_I
4760: 64 78 49 6e 73 65 72 74 3b 0a 20 20 7d 0a 20 20  dxInsert;.  }.  
4770: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4780: 32 28 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d 3e  2(v, op, pSort->
4790: 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63  iECursor, regRec
47a0: 6f 72 64 29 3b 0a 20 20 69 66 28 20 70 53 65 6c  ord);.  if( pSel
47b0: 65 63 74 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ect->iLimit ){. 
47c0: 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64     int addr1, ad
47d0: 64 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69  dr2;.    int iLi
47e0: 6d 69 74 3b 0a 20 20 20 20 69 66 28 20 70 53 65  mit;.    if( pSe
47f0: 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 20 29 7b  lect->iOffset ){
4800: 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20  .      iLimit = 
4810: 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74  pSelect->iOffset
4820: 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  +1;.    }else{. 
4830: 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53       iLimit = pS
4840: 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20  elect->iLimit;. 
4850: 20 20 20 7d 0a 20 20 20 20 61 64 64 72 31 20 3d     }.    addr1 =
4860: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4870: 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p1(v, OP_IfZero,
4880: 20 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f   iLimit); VdbeCo
4890: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
48a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
48b0: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 69  (v, OP_AddImm, i
48c0: 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20  Limit, -1);.    
48d0: 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
48e0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
48f0: 47 6f 74 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74  Goto);.    sqlit
4900: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
4910: 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71  , addr1);.    sq
4920: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
4930: 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 53 6f 72  v, OP_Last, pSor
4940: 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20  t->iECursor);.  
4950: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4960: 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65  Op1(v, OP_Delete
4970: 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  , pSort->iECurso
4980: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  r);.    sqlite3V
4990: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
49a0: 64 64 72 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ddr2);.  }.}../*
49b0: 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20  .** Add code to 
49c0: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46  implement the OF
49d0: 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76  FSET.*/.static v
49e0: 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28 0a  oid codeOffset(.
49f0: 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
4a00: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
4a10: 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56  code into this V
4a20: 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 73  M */.  int iOffs
4a30: 65 74 2c 20 20 20 20 20 20 2f 2a 20 52 65 67 69  et,      /* Regi
4a40: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65  ster holding the
4a50: 20 6f 66 66 73 65 74 20 63 6f 75 6e 74 65 72 20   offset counter 
4a60: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  */.  int iContin
4a70: 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68  ue     /* Jump h
4a80: 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65 20  ere to skip the 
4a90: 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a  current record *
4aa0: 2f 0a 29 7b 0a 20 20 69 66 28 20 69 4f 66 66 73  /.){.  if( iOffs
4ab0: 65 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  et>0 ){.    int 
4ac0: 61 64 64 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  addr;.    sqlite
4ad0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4ae0: 50 5f 41 64 64 49 6d 6d 2c 20 69 4f 66 66 73 65  P_AddImm, iOffse
4af0: 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64 64 72  t, -1);.    addr
4b00: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
4b10: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 65 67  dOp1(v, OP_IfNeg
4b20: 2c 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65  , iOffset); Vdbe
4b30: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
4b40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4b50: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
4b60: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
4b70: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
4b80: 2c 20 22 73 6b 69 70 20 4f 46 46 53 45 54 20 72  , "skip OFFSET r
4b90: 65 63 6f 72 64 73 22 29 29 3b 0a 20 20 20 20 73  ecords"));.    s
4ba0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
4bb0: 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 7d  re(v, addr);.  }
4bc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f  .}../*.** Add co
4bd0: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63 68 65  de that will che
4be0: 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
4bf0: 74 68 65 20 4e 20 72 65 67 69 73 74 65 72 73 20  the N registers 
4c00: 73 74 61 72 74 69 6e 67 20 61 74 20 69 4d 65 6d  starting at iMem
4c10: 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69 73 74 69  .** form a disti
4c20: 6e 63 74 20 65 6e 74 72 79 2e 20 20 69 54 61 62  nct entry.  iTab
4c30: 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20 69 6e   is a sorting in
4c40: 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20 70  dex that holds p
4c50: 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65  reviously.** see
4c60: 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f  n combinations o
4c70: 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73 2e 20  f the N values. 
4c80: 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20   A new entry is 
4c90: 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20  made in iTab.** 
4ca0: 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 4e  if the current N
4cb0: 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65 77 2e   values are new.
4cc0: 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f  .**.** A jump to
4cd0: 20 61 64 64 72 52 65 70 65 61 74 20 69 73 20 6d   addrRepeat is m
4ce0: 61 64 65 20 61 6e 64 20 74 68 65 20 4e 2b 31 20  ade and the N+1 
4cf0: 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70 70 65  values are poppe
4d00: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74  d from the.** st
4d10: 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70 20 4e  ack if the top N
4d20: 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f   elements are no
4d30: 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73  t distinct..*/.s
4d40: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 44  tatic void codeD
4d50: 69 73 74 69 6e 63 74 28 0a 20 20 50 61 72 73 65  istinct(.  Parse
4d60: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
4d70: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
4d80: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
4d90: 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54  text */.  int iT
4da0: 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ab,          /* 
4db0: 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  A sorting index 
4dc0: 75 73 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72  used to test for
4dd0: 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20 2a 2f   distinctness */
4de0: 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70 65 61  .  int addrRepea
4df0: 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f  t,    /* Jump to
4e00: 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64 69 73   here if not dis
4e10: 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4e  tinct */.  int N
4e20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
4e30: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
4e40: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65  nts */.  int iMe
4e50: 6d 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m           /* F
4e60: 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  irst element */.
4e70: 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  ){.  Vdbe *v;.  
4e80: 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20 3d 20 70  int r1;..  v = p
4e90: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
4ea0: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
4eb0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
4ec0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4ed0: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
4ee0: 6e 64 2c 20 69 54 61 62 2c 20 61 64 64 72 52 65  nd, iTab, addrRe
4ef0: 70 65 61 74 2c 20 69 4d 65 6d 2c 20 4e 29 3b 20  peat, iMem, N); 
4f00: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
4f10: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
4f20: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
4f30: 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20  ecord, iMem, N, 
4f40: 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  r1);.  sqlite3Vd
4f50: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
4f60: 64 78 49 6e 73 65 72 74 2c 20 69 54 61 62 2c 20  dxInsert, iTab, 
4f70: 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  r1);.  sqlite3Re
4f80: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
4f90: 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 23 69 66  rse, r1);.}..#if
4fa0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4fb0: 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
4fc0: 47 65 6e 65 72 61 74 65 20 61 6e 20 65 72 72 6f  Generate an erro
4fd0: 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e 20 61  r message when a
4fe0: 20 53 45 4c 45 43 54 20 69 73 20 75 73 65 64 20   SELECT is used 
4ff0: 77 69 74 68 69 6e 20 61 20 73 75 62 65 78 70 72  within a subexpr
5000: 65 73 73 69 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70  ession.** (examp
5010: 6c 65 3a 20 20 22 61 20 49 4e 20 28 53 45 4c 45  le:  "a IN (SELE
5020: 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 6c 65 29  CT * FROM table)
5030: 22 29 20 62 75 74 20 69 74 20 68 61 73 20 6d 6f  ") but it has mo
5040: 72 65 20 74 68 61 6e 20 31 20 72 65 73 75 6c 74  re than 1 result
5050: 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57 65 20  .** column.  We 
5060: 64 6f 20 74 68 69 73 20 69 6e 20 61 20 73 75 62  do this in a sub
5070: 72 6f 75 74 69 6e 65 20 62 65 63 61 75 73 65 20  routine because 
5080: 74 68 65 20 65 72 72 6f 72 20 75 73 65 64 20 74  the error used t
5090: 6f 20 6f 63 63 75 72 0a 2a 2a 20 69 6e 20 6d 75  o occur.** in mu
50a0: 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2e 20 20  ltiple places.  
50b0: 28 54 68 65 20 65 72 72 6f 72 20 6f 6e 6c 79 20  (The error only 
50c0: 6f 63 63 75 72 73 20 69 6e 20 6f 6e 65 20 70 6c  occurs in one pl
50d0: 61 63 65 20 6e 6f 77 2c 20 62 75 74 20 77 65 0a  ace now, but we.
50e0: 2a 2a 20 72 65 74 61 69 6e 20 74 68 65 20 73 75  ** retain the su
50f0: 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 69 6e 69  broutine to mini
5100: 6d 69 7a 65 20 63 6f 64 65 20 64 69 73 72 75 70  mize code disrup
5110: 74 69 6f 6e 2e 29 0a 2a 2f 0a 73 74 61 74 69 63  tion.).*/.static
5120: 20 69 6e 74 20 63 68 65 63 6b 46 6f 72 4d 75 6c   int checkForMul
5130: 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72  tiColumnSelectEr
5140: 72 6f 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ror(.  Parse *pP
5150: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
5160: 61 72 73 65 20 63 6f 6e 74 65 78 74 2e 20 2a 2f  arse context. */
5170: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
5180: 44 65 73 74 2c 20 20 20 2f 2a 20 44 65 73 74 69  Dest,   /* Desti
5190: 6e 61 74 69 6f 6e 20 6f 66 20 53 45 4c 45 43 54  nation of SELECT
51a0: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
51b0: 74 20 6e 45 78 70 72 20 20 20 20 20 20 20 20 20  t nExpr         
51c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
51d0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 72  result columns r
51e0: 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43  eturned by SELEC
51f0: 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44  T */.){.  int eD
5200: 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65  est = pDest->eDe
5210: 73 74 3b 0a 20 20 69 66 28 20 6e 45 78 70 72 3e  st;.  if( nExpr>
5220: 31 20 26 26 20 28 65 44 65 73 74 3d 3d 53 52 54  1 && (eDest==SRT
5230: 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53  _Mem || eDest==S
5240: 52 54 5f 53 65 74 29 20 29 7b 0a 20 20 20 20 73  RT_Set) ){.    s
5250: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
5260: 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73  Parse, "only a s
5270: 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c  ingle result all
5280: 6f 77 65 64 20 66 6f 72 20 22 0a 20 20 20 20 20  owed for ".     
5290: 20 20 22 61 20 53 45 4c 45 43 54 20 74 68 61 74    "a SELECT that
52a0: 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
52b0: 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20  xpression");.   
52c0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c   return 1;.  }el
52d0: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  se{.    return 0
52e0: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
52f0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
5300: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  ne generates the
5310: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e   code for the in
5320: 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65  side of the inne
5330: 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53  r loop.** of a S
5340: 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ELECT..**.** If 
5350: 73 72 63 54 61 62 20 69 73 20 6e 65 67 61 74 69  srcTab is negati
5360: 76 65 2c 20 74 68 65 6e 20 74 68 65 20 70 45 4c  ve, then the pEL
5370: 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  ist expressions.
5380: 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ** are evaluated
5390: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   in order to get
53a0: 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68   the data for th
53b0: 69 73 20 72 6f 77 2e 20 20 49 66 20 73 72 63 54  is row.  If srcT
53c0: 61 62 20 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72  ab is.** zero or
53d0: 20 6d 6f 72 65 2c 20 74 68 65 6e 20 64 61 74 61   more, then data
53e0: 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20   is pulled from 
53f0: 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c 69 73  srcTab and pELis
5400: 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 0a  t is used only .
5410: 2a 2a 20 74 6f 20 67 65 74 20 6e 75 6d 62 65 72  ** to get number
5420: 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65   columns and the
5430: 20 64 61 74 61 74 79 70 65 20 66 6f 72 20 65 61   datatype for ea
5440: 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74  ch column..*/.st
5450: 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
5460: 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72  InnerLoop(.  Par
5470: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
5480: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
5490: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
54a0: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
54b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
54c0: 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74 20 73  omplete select s
54d0: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
54e0: 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  oded */.  ExprLi
54f0: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20  st *pEList,     
5500: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c    /* List of val
5510: 75 65 73 20 62 65 69 6e 67 20 65 78 74 72 61 63  ues being extrac
5520: 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63  ted */.  int src
5530: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
5540: 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20 66 72   /* Pull data fr
5550: 6f 6d 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  om this table */
5560: 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72  .  SortCtx *pSor
5570: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  t,         /* If
5580: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20   not NULL, info 
5590: 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73  on how to proces
55a0: 73 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20  s ORDER BY */.  
55b0: 44 69 73 74 69 6e 63 74 43 74 78 20 2a 70 44 69  DistinctCtx *pDi
55c0: 73 74 69 6e 63 74 2c 20 2f 2a 20 49 66 20 6e 6f  stinct, /* If no
55d0: 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20  t NULL, info on 
55e0: 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20 44  how to process D
55f0: 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20 53 65 6c  ISTINCT */.  Sel
5600: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
5610: 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64       /* How to d
5620: 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65  ispose of the re
5630: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sults */.  int i
5640: 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20  Continue,       
5650: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
5660: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
5670: 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69   next row */.  i
5680: 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20  nt iBreak       
5690: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
56a0: 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  ere to break out
56b0: 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
56c0: 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  op */.){.  Vdbe 
56d0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
56e0: 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  be;.  int i;.  i
56f0: 6e 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20  nt hasDistinct; 
5700: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
5710: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
5720: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
5730: 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  t */.  int regRe
5740: 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20  sult;           
5750: 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d     /* Start of m
5760: 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 72 65  emory holding re
5770: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e  sult set */.  in
5780: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
5790: 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77  >eDest;   /* How
57a0: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72   to dispose of r
57b0: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
57c0: 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69  iParm = pDest->i
57d0: 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72 73 74  SDParm; /* First
57e0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73   argument to dis
57f0: 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a  posal method */.
5800: 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c    int nResultCol
5810: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
5820: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   Number of resul
5830: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20  t columns */..  
5840: 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 61  assert( v );.  a
5850: 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
5860: 20 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e 63   );.  hasDistinc
5870: 74 20 3d 20 70 44 69 73 74 69 6e 63 74 20 3f 20  t = pDistinct ? 
5880: 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74  pDistinct->eTnct
5890: 54 79 70 65 20 3a 20 57 48 45 52 45 5f 44 49 53  Type : WHERE_DIS
58a0: 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66  TINCT_NOOP;.  if
58b0: 28 20 70 53 6f 72 74 20 26 26 20 70 53 6f 72 74  ( pSort && pSort
58c0: 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20  ->pOrderBy==0 ) 
58d0: 70 53 6f 72 74 20 3d 20 30 3b 0a 20 20 69 66 28  pSort = 0;.  if(
58e0: 20 70 53 6f 72 74 3d 3d 30 20 26 26 20 21 68 61   pSort==0 && !ha
58f0: 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
5900: 20 61 73 73 65 72 74 28 20 69 43 6f 6e 74 69 6e   assert( iContin
5910: 75 65 21 3d 30 20 29 3b 0a 20 20 20 20 63 6f 64  ue!=0 );.    cod
5920: 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
5930: 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65  ffset, iContinue
5940: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c  );.  }..  /* Pul
5950: 6c 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  l the requested 
5960: 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20  columns..  */.  
5970: 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70 45 4c  nResultCol = pEL
5980: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69  ist->nExpr;..  i
5990: 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d  f( pDest->iSdst=
59a0: 3d 30 20 29 7b 0a 20 20 20 20 70 44 65 73 74 2d  =0 ){.    pDest-
59b0: 3e 69 53 64 73 74 20 3d 20 70 50 61 72 73 65 2d  >iSdst = pParse-
59c0: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
59d0: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
59e0: 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65  sultCol;.  }else
59f0: 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73   if( pDest->iSds
5a00: 74 2b 6e 52 65 73 75 6c 74 43 6f 6c 20 3e 20 70  t+nResultCol > p
5a10: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20  Parse->nMem ){. 
5a20: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e     /* This is an
5a30: 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e   error condition
5a40: 20 74 68 61 74 20 63 61 6e 20 72 65 73 75 6c 74   that can result
5a50: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77  , for example, w
5a60: 68 65 6e 20 61 20 53 45 4c 45 43 54 0a 20 20 20  hen a SELECT.   
5a70: 20 2a 2a 20 6f 6e 20 74 68 65 20 72 69 67 68 74   ** on the right
5a80: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 6e  -hand side of an
5a90: 20 49 4e 53 45 52 54 20 63 6f 6e 74 61 69 6e 73   INSERT contains
5aa0: 20 6d 6f 72 65 20 72 65 73 75 6c 74 20 63 6f 6c   more result col
5ab0: 75 6d 6e 73 20 74 68 61 6e 0a 20 20 20 20 2a 2a  umns than.    **
5ac0: 20 74 68 65 72 65 20 61 72 65 20 63 6f 6c 75 6d   there are colum
5ad0: 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ns in the table 
5ae0: 6f 6e 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68  on the left.  Th
5af0: 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20  e error will be 
5b00: 63 61 75 67 68 74 0a 20 20 20 20 2a 2a 20 61 6e  caught.    ** an
5b10: 64 20 72 65 70 6f 72 74 65 64 20 6c 61 74 65 72  d reported later
5b20: 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 20 74  .  But we need t
5b30: 6f 20 6d 61 6b 65 20 73 75 72 65 20 65 6e 6f 75  o make sure enou
5b40: 67 68 20 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c  gh memory is all
5b50: 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 74 6f  ocated.    ** to
5b60: 20 61 76 6f 69 64 20 6f 74 68 65 72 20 73 70 75   avoid other spu
5b70: 72 69 6f 75 73 20 65 72 72 6f 72 73 20 69 6e 20  rious errors in 
5b80: 74 68 65 20 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f  the meantime. */
5b90: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
5ba0: 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  m += nResultCol;
5bb0: 0a 20 20 7d 0a 20 20 70 44 65 73 74 2d 3e 6e 53  .  }.  pDest->nS
5bc0: 64 73 74 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  dst = nResultCol
5bd0: 3b 0a 20 20 72 65 67 52 65 73 75 6c 74 20 3d 20  ;.  regResult = 
5be0: 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20  pDest->iSdst;.  
5bf0: 69 66 28 20 73 72 63 54 61 62 3e 3d 30 20 29 7b  if( srcTab>=0 ){
5c00: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
5c10: 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29  nResultCol; i++)
5c20: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
5c30: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
5c40: 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20  Column, srcTab, 
5c50: 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 29 3b  i, regResult+i);
5c60: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
5c70: 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 45 4c  nt((v, "%s", pEL
5c80: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
5c90: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
5ca0: 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f   if( eDest!=SRT_
5cb0: 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a  Exists ){.    /*
5cc0: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
5cd0: 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53  ion is an EXISTS
5ce0: 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
5cf0: 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20  , the actual.   
5d00: 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72   ** values retur
5d10: 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43  ned by the SELEC
5d20: 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72  T are not requir
5d30: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
5d40: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
5d50: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
5d60: 45 4c 69 73 74 2c 20 72 65 67 52 65 73 75 6c 74  EList, regResult
5d70: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
5d80: 20 20 20 20 28 65 44 65 73 74 3d 3d 53 52 54 5f      (eDest==SRT_
5d90: 4f 75 74 70 75 74 7c 7c 65 44 65 73 74 3d 3d 53  Output||eDest==S
5da0: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 29 3f 53 51  RT_Coroutine)?SQ
5db0: 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 3a 30 29  LITE_ECEL_DUP:0)
5dc0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
5dd0: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
5de0: 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74 20  ord was present 
5df0: 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  on the SELECT st
5e00: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64  atement.  ** and
5e10: 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62 65   this row has be
5e20: 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20  en seen before, 
5e30: 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65  then do not make
5e40: 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70   this row.  ** p
5e50: 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c  art of the resul
5e60: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61  t..  */.  if( ha
5e70: 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
5e80: 20 73 77 69 74 63 68 28 20 70 44 69 73 74 69 6e   switch( pDistin
5e90: 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 29 7b  ct->eTnctType ){
5ea0: 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
5eb0: 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
5ec0: 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64  ED: {.        Vd
5ed0: 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20  beOp *pOp;      
5ee0: 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67        /* No long
5ef0: 65 72 20 72 65 71 75 69 72 65 64 20 4f 70 65 6e  er required Open
5f00: 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e  Ephemeral instr.
5f10: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
5f20: 69 4a 75 6d 70 3b 20 20 20 20 20 20 20 20 20 20  iJump;          
5f30: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74      /* Jump dest
5f40: 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ination */.     
5f50: 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20     int regPrev; 
5f60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
5f70: 65 76 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74 65  evious row conte
5f80: 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f  nt */..        /
5f90: 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
5fa0: 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75   for the previou
5fb0: 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20  s row */.       
5fc0: 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72 73   regPrev = pPars
5fd0: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20  e->nMem+1;.     
5fe0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
5ff0: 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a  += nResultCol;..
6000: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67          /* Chang
6010: 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  e the OP_OpenEph
6020: 65 6d 65 72 61 6c 20 63 6f 64 65 64 20 65 61 72  emeral coded ear
6030: 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e 75  lier to an OP_Nu
6040: 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  ll.        ** se
6050: 74 73 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61 72  ts the MEM_Clear
6060: 65 64 20 62 69 74 20 6f 6e 20 74 68 65 20 66 69  ed bit on the fi
6070: 72 73 74 20 72 65 67 69 73 74 65 72 20 6f 66 20  rst register of 
6080: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  the.        ** p
6090: 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e 20 20  revious value.  
60a0: 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20  This will cause 
60b0: 74 68 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77 20  the OP_Ne below 
60c0: 74 6f 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20  to always.      
60d0: 20 20 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68 65    ** fail on the
60e0: 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
60f0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 65 76 65   of the loop eve
6100: 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20  n if the first. 
6110: 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 69 73         ** row is
6120: 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20 20   all NULLs..    
6130: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
6140: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6150: 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69  ToNoop(v, pDisti
6160: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
6170: 20 20 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71          pOp = sq
6180: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
6190: 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64  , pDistinct->add
61a0: 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20  rTnct);.        
61b0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
61c0: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  _Null;.        p
61d0: 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20 20  Op->p1 = 1;.    
61e0: 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72 65      pOp->p2 = re
61f0: 67 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 20 20  gPrev;..        
6200: 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56  iJump = sqlite3V
6210: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
6220: 29 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a  ) + nResultCol;.
6230: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
6240: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69   i<nResultCol; i
6250: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 43  ++){.          C
6260: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
6270: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
6280: 65 71 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  eq(pParse, pELis
6290: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
62a0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
62b0: 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 20 29 7b 0a  nResultCol-1 ){.
62c0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
62d0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
62e0: 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73 75 6c   OP_Ne, regResul
62f0: 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65 67 50  t+i, iJump, regP
6300: 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20  rev+i);.        
6310: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
6320: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  (v);.          }
6330: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
6340: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6350: 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65  Op3(v, OP_Eq, re
6360: 67 52 65 73 75 6c 74 2b 69 2c 20 69 43 6f 6e 74  gResult+i, iCont
6370: 69 6e 75 65 2c 20 72 65 67 50 72 65 76 2b 69 29  inue, regPrev+i)
6380: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64  ;.            Vd
6390: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
63a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
63b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
63c0: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
63d0: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
63e0: 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
63f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
6400: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
6410: 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  (v, SQLITE_NULLE
6420: 51 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  Q);.        }.  
6430: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
6440: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
6450: 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d 70 20 29  Addr(v)==iJump )
6460: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6470: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6480: 50 5f 43 6f 70 79 2c 20 72 65 67 52 65 73 75 6c  P_Copy, regResul
6490: 74 2c 20 72 65 67 50 72 65 76 2c 20 6e 52 65 73  t, regPrev, nRes
64a0: 75 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20  ultCol-1);.     
64b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
64c0: 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57 48  }..      case WH
64d0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
64e0: 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  QUE: {.        s
64f0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6500: 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69  ToNoop(v, pDisti
6510: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
6520: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6530: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65       }..      de
6540: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20  fault: {.       
6550: 20 61 73 73 65 72 74 28 20 70 44 69 73 74 69 6e   assert( pDistin
6560: 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57  ct->eTnctType==W
6570: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
6580: 4f 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20 20  ORDERED );.     
6590: 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28     codeDistinct(
65a0: 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63  pParse, pDistinc
65b0: 74 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e  t->tabTnct, iCon
65c0: 74 69 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f  tinue, nResultCo
65d0: 6c 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  l, regResult);. 
65e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
65f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
6600: 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 29 7b 0a  if( pSort==0 ){.
6610: 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74        codeOffset
6620: 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  (v, p->iOffset, 
6630: 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  iContinue);.    
6640: 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  }.  }..  switch(
6650: 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a   eDest ){.    /*
6660: 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77   In this mode, w
6670: 72 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20  rite each query 
6680: 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65  result to the ke
6690: 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  y of the tempora
66a0: 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  ry.    ** table 
66b0: 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69  iParm..    */.#i
66c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
66d0: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
66e0: 54 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55  T.    case SRT_U
66f0: 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  nion: {.      in
6700: 74 20 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d  t r1;.      r1 =
6710: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
6720: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
6730: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6740: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
6750: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
6760: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29   nResultCol, r1)
6770: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6780: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6790: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
67a0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
67b0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
67c0: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
67d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
67e0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74   }..    /* Const
67f0: 72 75 63 74 20 61 20 72 65 63 6f 72 64 20 66 72  ruct a record fr
6800: 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72 65 73  om the query res
6810: 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64  ult, but instead
6820: 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e   of.    ** savin
6830: 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75  g that record, u
6840: 73 65 20 69 74 20 61 73 20 61 20 6b 65 79 20 74  se it as a key t
6850: 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74  o delete element
6860: 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  s from.    ** th
6870: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
6880: 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a  e iParm..    */.
6890: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63      case SRT_Exc
68a0: 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ept: {.      sql
68b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
68c0: 2c 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20  , OP_IdxDelete, 
68d0: 69 50 61 72 6d 2c 20 72 65 67 52 65 73 75 6c 74  iParm, regResult
68e0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
68f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6900: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
6910: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
6920: 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20  _SELECT */..    
6930: 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
6940: 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e  ult as data usin
6950: 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a  g a unique key..
6960: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
6970: 53 52 54 5f 46 69 66 6f 3a 0a 20 20 20 20 63 61  SRT_Fifo:.    ca
6980: 73 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3a  se SRT_DistFifo:
6990: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
69a0: 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
69b0: 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20  T_EphemTab: {.  
69c0: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
69d0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
69e0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 74 65  Parse);.      te
69f0: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
6a00: 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  RT_Table );.    
6a10: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
6a20: 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
6a30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6a40: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6a50: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
6a60: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
6a70: 6f 6c 2c 20 72 31 29 3b 0a 23 69 66 6e 64 65 66  ol, r1);.#ifndef
6a80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
6a90: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
6aa0: 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29  ==SRT_DistFifo )
6ab0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
6ac0: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
6ad0: 69 73 20 44 69 73 74 46 69 66 6f 2c 20 74 68 65  is DistFifo, the
6ae0: 6e 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b  n cursor (iParm+
6af0: 31 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20  1) is open.     
6b00: 20 20 20 2a 2a 20 6f 6e 20 61 6e 20 65 70 68 65     ** on an ephe
6b10: 6d 65 72 61 6c 20 69 6e 64 65 78 2e 20 49 66 20  meral index. If 
6b20: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
6b30: 69 73 20 61 6c 72 65 61 64 79 20 70 72 65 73 65  is already prese
6b40: 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  nt.        ** in
6b50: 20 74 68 65 20 69 6e 64 65 78 2c 20 64 6f 20 6e   the index, do n
6b60: 6f 74 20 77 72 69 74 65 20 69 74 20 74 6f 20 74  ot write it to t
6b70: 68 65 20 6f 75 74 70 75 74 2e 20 49 66 20 6e 6f  he output. If no
6b80: 74 2c 20 61 64 64 20 74 68 65 0a 20 20 20 20 20  t, add the.     
6b90: 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 72 6f     ** current ro
6ba0: 77 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 61  w to the index a
6bb0: 6e 64 20 70 72 6f 63 65 65 64 20 77 69 74 68 20  nd proceed with 
6bc0: 77 72 69 74 69 6e 67 20 69 74 20 74 6f 20 74 68  writing it to th
6bd0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  e.        ** out
6be0: 70 75 74 20 74 61 62 6c 65 20 61 73 20 77 65 6c  put table as wel
6bf0: 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  l.  */.        i
6c00: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
6c10: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
6c20: 28 76 29 20 2b 20 34 3b 0a 20 20 20 20 20 20 20  (v) + 4;.       
6c30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6c40: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e  p4Int(v, OP_Foun
6c50: 64 2c 20 69 50 61 72 6d 2b 31 2c 20 61 64 64 72  d, iParm+1, addr
6c60: 2c 20 72 31 2c 20 30 29 3b 20 56 64 62 65 43 6f  , r1, 0); VdbeCo
6c70: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
6c80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6c90: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
6ca0: 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72  sert, iParm+1, r
6cb0: 31 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  1);.        asse
6cc0: 72 74 28 20 70 53 6f 72 74 3d 3d 30 20 29 3b 0a  rt( pSort==0 );.
6cd0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
6ce0: 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29       if( pSort )
6cf0: 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  {.        pushOn
6d00: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
6d10: 20 70 53 6f 72 74 2c 20 70 2c 20 72 31 29 3b 0a   pSort, p, r1);.
6d20: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6d30: 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71       int r2 = sq
6d40: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
6d50: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
6d60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6d70: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
6d80: 64 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20  d, iParm, r2);. 
6d90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6da0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
6db0: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
6dc0: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73  , r2);.        s
6dd0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6de0: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
6df0: 45 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71  END);.        sq
6e00: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
6e10: 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
6e20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
6e30: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
6e40: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
6e50: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6e60: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
6e70: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
6e80: 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  RY.    /* If we 
6e90: 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73  are creating a s
6ea0: 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20  et for an "expr 
6eb0: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
6ec0: 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20   construct,.    
6ed0: 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68  ** then there sh
6ee0: 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65  ould be a single
6ef0: 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61   item on the sta
6f00: 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a  ck.  Write this.
6f10: 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f      ** item into
6f20: 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77   the set table w
6f30: 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a  ith bogus data..
6f40: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
6f50: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
6f60: 20 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c 74   assert( nResult
6f70: 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Col==1 );.      
6f80: 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20 3d  pDest->affSdst =
6f90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6fa0: 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72     sqlite3Compar
6fb0: 65 41 66 66 69 6e 69 74 79 28 70 45 4c 69 73 74  eAffinity(pEList
6fc0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44  ->a[0].pExpr, pD
6fd0: 65 73 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20  est->affSdst);. 
6fe0: 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29       if( pSort )
6ff0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20  {.        /* At 
7000: 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f 75  first glance you
7010: 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65 20   would think we 
7020: 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f  could optimize o
7030: 75 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ut the.        *
7040: 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74 68  * ORDER BY in th
7050: 69 73 20 63 61 73 65 20 73 69 6e 63 65 20 74 68  is case since th
7060: 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72 69  e order of entri
7070: 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20 20  es in the set.  
7080: 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f        ** does no
7090: 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20 74  t matter.  But t
70a0: 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 61 20  here might be a 
70b0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69 6e  LIMIT clause, in
70c0: 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a   which.        *
70d0: 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64 65 72  * case the order
70e0: 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a   does matter */.
70f0: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
7100: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70  Sorter(pParse, p
7110: 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75  Sort, p, regResu
7120: 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  lt);.      }else
7130: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31  {.        int r1
7140: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7150: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
7160: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7170: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
7180: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
7190: 75 6c 74 2c 31 2c 72 31 2c 20 26 70 44 65 73 74  ult,1,r1, &pDest
71a0: 2d 3e 61 66 66 53 64 73 74 2c 20 31 29 3b 0a 20  ->affSdst, 1);. 
71b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
71c0: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
71d0: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
71e0: 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20  gResult, 1);.   
71f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7200: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
7210: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
7220: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
7230: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
7240: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
7250: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
7260: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
7270: 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69  * If any row exi
7280: 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  st in the result
7290: 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61   set, record tha
72a0: 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74  t fact and abort
72b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
72c0: 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a  e SRT_Exists: {.
72d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
72e0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
72f0: 74 65 67 65 72 2c 20 31 2c 20 69 50 61 72 6d 29  teger, 1, iParm)
7300: 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;.      /* The L
7310: 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c  IMIT clause will
7320: 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
7330: 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
7340: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7350: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
7360: 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c   is a scalar sel
7370: 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74  ect that is part
7380: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
7390: 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73  n, then.    ** s
73a0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
73b0: 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69   in the appropri
73c0: 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  ate memory cell 
73d0: 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20  and break out.  
73e0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e    ** of the scan
73f0: 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
7400: 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
7410: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
7420: 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b  nResultCol==1 );
7430: 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74  .      if( pSort
7440: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68   ){.        push
7450: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
7460: 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67  e, pSort, p, reg
7470: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d  Result);.      }
7480: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
7490: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
74a0: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73  e(pParse, regRes
74b0: 75 6c 74 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a  ult, iParm, 1);.
74c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c          /* The L
74d0: 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c  IMIT clause will
74e0: 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65   jump out of the
74f0: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
7500: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
7510: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
7520: 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
7530: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
7540: 59 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20 53  Y */..    case S
7550: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 20 20  RT_Coroutine:   
7560: 20 20 20 20 2f 2a 20 53 65 6e 64 20 64 61 74 61      /* Send data
7570: 20 74 6f 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65   to a co-routine
7580: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
7590: 5f 4f 75 74 70 75 74 3a 20 7b 20 20 20 20 20 20  _Output: {      
75a0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
75b0: 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20  results */.     
75c0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
75d0: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
75e0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
75f0: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  e( eDest==SRT_Ou
7600: 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66  tput );.      if
7610: 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  ( pSort ){.     
7620: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
7630: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
7640: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
7650: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7660: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
7670: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  d, regResult, nR
7680: 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a 20  esultCol, r1);. 
7690: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
76a0: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 53  orter(pParse, pS
76b0: 6f 72 74 2c 20 70 2c 20 72 31 29 3b 0a 20 20 20  ort, p, r1);.   
76c0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
76d0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
76e0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 65  e, r1);.      }e
76f0: 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d 53  lse if( eDest==S
7700: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  RT_Coroutine ){.
7710: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7720: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
7730: 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53  Yield, pDest->iS
7740: 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65  DParm);.      }e
7750: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
7760: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7770: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
7780: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
7790: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  ltCol);.        
77a0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
77b0: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
77c0: 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74  Parse, regResult
77d0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
77e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
77f0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
7800: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
7810: 54 45 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  TE.    /* Write 
7820: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f  the results into
7830: 20 61 20 70 72 69 6f 72 69 74 79 20 71 75 65 75   a priority queu
7840: 65 20 74 68 61 74 20 69 73 20 6f 72 64 65 72 20  e that is order 
7850: 61 63 63 6f 72 64 69 6e 67 20 74 6f 0a 20 20 20  according to.   
7860: 20 2a 2a 20 70 44 65 73 74 2d 3e 70 4f 72 64 65   ** pDest->pOrde
7870: 72 42 79 20 28 69 6e 20 70 53 4f 29 2e 20 20 70  rBy (in pSO).  p
7880: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 28 69  Dest->iSDParm (i
7890: 6e 20 69 50 61 72 6d 29 20 69 73 20 74 68 65 20  n iParm) is the 
78a0: 63 75 72 73 6f 72 20 66 6f 72 20 61 6e 0a 20 20  cursor for an.  
78b0: 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20    ** index with 
78c0: 70 53 4f 2d 3e 6e 45 78 70 72 2b 32 20 63 6f 6c  pSO->nExpr+2 col
78d0: 75 6d 6e 73 2e 20 20 42 75 69 6c 64 20 61 20 6b  umns.  Build a k
78e0: 65 79 20 75 73 69 6e 67 20 70 53 4f 20 66 6f 72  ey using pSO for
78f0: 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 2a   the first.    *
7900: 2a 20 70 53 4f 2d 3e 6e 45 78 70 72 20 63 6f 6c  * pSO->nExpr col
7910: 75 6d 6e 73 2c 20 74 68 65 6e 20 6d 61 6b 65 20  umns, then make 
7920: 73 75 72 65 20 61 6c 6c 20 6b 65 79 73 20 61 72  sure all keys ar
7930: 65 20 75 6e 69 71 75 65 20 62 79 20 61 64 64 69  e unique by addi
7940: 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6e 61  ng a.    ** fina
7950: 6c 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 63 6f  l OP_Sequence co
7960: 6c 75 6d 6e 2e 20 20 54 68 65 20 6c 61 73 74 20  lumn.  The last 
7970: 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 72 65  column is the re
7980: 63 6f 72 64 20 61 73 20 61 20 62 6c 6f 62 2e 0a  cord as a blob..
7990: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
79a0: 53 52 54 5f 44 69 73 74 51 75 65 75 65 3a 0a 20  SRT_DistQueue:. 
79b0: 20 20 20 63 61 73 65 20 53 52 54 5f 51 75 65 75     case SRT_Queu
79c0: 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  e: {.      int n
79d0: 4b 65 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  Key;.      int r
79e0: 31 2c 20 72 32 2c 20 72 33 3b 0a 20 20 20 20 20  1, r2, r3;.     
79f0: 20 69 6e 74 20 61 64 64 72 54 65 73 74 20 3d 20   int addrTest = 
7a00: 30 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  0;.      ExprLis
7a10: 74 20 2a 70 53 4f 3b 0a 20 20 20 20 20 20 70 53  t *pSO;.      pS
7a20: 4f 20 3d 20 70 44 65 73 74 2d 3e 70 4f 72 64 65  O = pDest->pOrde
7a30: 72 42 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72  rBy;.      asser
7a40: 74 28 20 70 53 4f 20 29 3b 0a 20 20 20 20 20 20  t( pSO );.      
7a50: 6e 4b 65 79 20 3d 20 70 53 4f 2d 3e 6e 45 78 70  nKey = pSO->nExp
7a60: 72 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  r;.      r1 = sq
7a70: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
7a80: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72  pParse);.      r
7a90: 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
7aa0: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
7ab0: 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 72  nKey+2);.      r
7ac0: 33 20 3d 20 72 32 2b 6e 4b 65 79 2b 31 3b 0a 20  3 = r2+nKey+1;. 
7ad0: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
7ae0: 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b  SRT_DistQueue ){
7af0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
7b00: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  he destination i
7b10: 73 20 44 69 73 74 51 75 65 75 65 2c 20 74 68 65  s DistQueue, the
7b20: 6e 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b  n cursor (iParm+
7b30: 31 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20  1) is open.     
7b40: 20 20 20 2a 2a 20 6f 6e 20 61 20 73 65 63 6f 6e     ** on a secon
7b50: 64 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65  d ephemeral inde
7b60: 78 20 74 68 61 74 20 68 6f 6c 64 73 20 61 6c 6c  x that holds all
7b70: 20 76 61 6c 75 65 73 20 65 76 65 72 79 20 70 72   values every pr
7b80: 65 76 69 6f 75 73 6c 79 0a 20 20 20 20 20 20 20  eviously.       
7b90: 20 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65   ** added to the
7ba0: 20 71 75 65 75 65 2e 20 2a 2f 0a 20 20 20 20 20   queue. */.     
7bb0: 20 20 20 61 64 64 72 54 65 73 74 20 3d 20 73 71     addrTest = sq
7bc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
7bd0: 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
7be0: 69 50 61 72 6d 2b 31 2c 20 30 2c 20 0a 20 20 20  iParm+1, 0, .   
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c10: 20 20 20 20 20 72 65 67 52 65 73 75 6c 74 2c 20       regResult, 
7c20: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
7c30: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
7c40: 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e(v);.      }.  
7c50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7c60: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
7c70: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
7c80: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72  t, nResultCol, r
7c90: 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44  3);.      if( eD
7ca0: 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65  est==SRT_DistQue
7cb0: 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ue ){.        sq
7cc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7cd0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
7ce0: 20 69 50 61 72 6d 2b 31 2c 20 72 33 29 3b 0a 20   iParm+1, r3);. 
7cf0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7d00: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
7d10: 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55  FLAG_USESEEKRESU
7d20: 4c 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  LT);.      }.   
7d30: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4b     for(i=0; i<nK
7d40: 65 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ey; i++){.      
7d50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7d60: 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
7d70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7d80: 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65             regRe
7d90: 73 75 6c 74 20 2b 20 70 53 4f 2d 3e 61 5b 69 5d  sult + pSO->a[i]
7da0: 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
7db0: 20 2d 20 31 2c 0a 20 20 20 20 20 20 20 20 20 20   - 1,.          
7dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7dd0: 72 32 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r2+i);.      }. 
7de0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7df0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71  AddOp2(v, OP_Seq
7e00: 75 65 6e 63 65 2c 20 69 50 61 72 6d 2c 20 72 32  uence, iParm, r2
7e10: 2b 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 73 71  +nKey);.      sq
7e20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
7e30: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
7e40: 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 2c 20 72 31  , r2, nKey+2, r1
7e50: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7e60: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7e70: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
7e80: 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 69 66  m, r1);.      if
7e90: 28 20 61 64 64 72 54 65 73 74 20 29 20 73 71 6c  ( addrTest ) sql
7ea0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
7eb0: 28 76 2c 20 61 64 64 72 54 65 73 74 29 3b 0a 20  (v, addrTest);. 
7ec0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
7ed0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
7ee0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  e, r1);.      sq
7ef0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
7f00: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 32  Range(pParse, r2
7f10: 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20  , nKey+2);.     
7f20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
7f30: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
7f40: 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 0a 0a 23 69  MIT_CTE */....#i
7f50: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
7f60: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a  E_OMIT_TRIGGER).
7f70: 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74      /* Discard t
7f80: 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69  he results.  Thi
7f90: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45  s is used for SE
7fa0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
7fb0: 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68  inside.    ** th
7fc0: 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47  e body of a TRIG
7fd0: 47 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73  GER.  The purpos
7fe0: 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74  e of such select
7ff0: 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20  s is to call.   
8000: 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64   ** user-defined
8010: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
8020: 68 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74  have side effect
8030: 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61  s.  We do not ca
8040: 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20  re.    ** about 
8050: 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c  the actual resul
8060: 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ts of the select
8070: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
8080: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
8090: 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54  sert( eDest==SRT
80a0: 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20  _Discard );.    
80b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
80c0: 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
80d0: 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Jump to the end 
80e0: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74  of the loop if t
80f0: 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63  he LIMIT is reac
8100: 68 65 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66  hed.  Except, if
8110: 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61  .  ** there is a
8120: 20 73 6f 72 74 65 72 2c 20 69 6e 20 77 68 69 63   sorter, in whic
8130: 68 20 63 61 73 65 20 74 68 65 20 73 6f 72 74 65  h case the sorte
8140: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6c 69  r has already li
8150: 6d 69 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 6f  mited.  ** the o
8160: 75 74 70 75 74 20 66 6f 72 20 75 73 2e 0a 20 20  utput for us..  
8170: 2a 2f 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d  */.  if( pSort==
8180: 30 20 26 26 20 70 2d 3e 69 4c 69 6d 69 74 20 29  0 && p->iLimit )
8190: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
81a0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
81b0: 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  Zero, p->iLimit,
81c0: 20 69 42 72 65 61 6b 2c 20 2d 31 29 3b 20 56 64   iBreak, -1); Vd
81d0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
81e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
81f0: 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f  cate a KeyInfo o
8200: 62 6a 65 63 74 20 73 75 66 66 69 63 69 65 6e 74  bject sufficient
8210: 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 66   for an index of
8220: 20 4e 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61   N key columns a
8230: 6e 64 0a 2a 2a 20 58 20 65 78 74 72 61 20 63 6f  nd.** X extra co
8240: 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79 49 6e 66  lumns..*/.KeyInf
8250: 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
8260: 6f 41 6c 6c 6f 63 28 73 71 6c 69 74 65 33 20 2a  oAlloc(sqlite3 *
8270: 64 62 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20 58  db, int N, int X
8280: 29 7b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 20  ){.  KeyInfo *p 
8290: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
82a0: 63 5a 65 72 6f 28 30 2c 20 0a 20 20 20 20 20 20  cZero(0, .      
82b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
82c0: 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 28  eof(KeyInfo) + (
82d0: 4e 2b 58 29 2a 28 73 69 7a 65 6f 66 28 43 6f 6c  N+X)*(sizeof(Col
82e0: 6c 53 65 71 2a 29 2b 31 29 29 3b 0a 20 20 69 66  lSeq*)+1));.  if
82f0: 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53  ( p ){.    p->aS
8300: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
8310: 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a  &p->aColl[N+X];.
8320: 20 20 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20      p->nField = 
8330: 28 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e 6e  (u16)N;.    p->n
8340: 58 46 69 65 6c 64 20 3d 20 28 75 31 36 29 58 3b  XField = (u16)X;
8350: 0a 20 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45 4e  .    p->enc = EN
8360: 43 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62  C(db);.    p->db
8370: 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e 52   = db;.    p->nR
8380: 65 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ef = 1;.  }else{
8390: 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
83a0: 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  ailed = 1;.  }. 
83b0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
83c0: 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61  .** Deallocate a
83d0: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a   KeyInfo object.
83e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4b  */.void sqlite3K
83f0: 65 79 49 6e 66 6f 55 6e 72 65 66 28 4b 65 79 49  eyInfoUnref(KeyI
8400: 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  nfo *p){.  if( p
8410: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
8420: 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  p->nRef>0 );.   
8430: 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20   p->nRef--;.    
8440: 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29  if( p->nRef==0 )
8450: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
8460: 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , p);.  }.}../*.
8470: 2a 2a 20 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f  ** Make a new po
8480: 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e  inter to a KeyIn
8490: 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79  fo object.*/.Key
84a0: 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79  Info *sqlite3Key
84b0: 49 6e 66 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20  InfoRef(KeyInfo 
84c0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  *p){.  if( p ){.
84d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
84e0: 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e  Ref>0 );.    p->
84f0: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  nRef++;.  }.  re
8500: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65  turn p;.}..#ifde
8510: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
8520: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
8530: 20 69 66 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62   if a KeyInfo ob
8540: 6a 65 63 74 20 63 61 6e 20 62 65 20 63 68 61 6e  ject can be chan
8550: 67 65 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f  ge.  The KeyInfo
8560: 20 6f 62 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f   object.** can o
8570: 6e 6c 79 20 62 65 20 63 68 61 6e 67 65 64 20 69  nly be changed i
8580: 66 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 61  f this is just a
8590: 20 73 69 6e 67 6c 65 20 72 65 66 65 72 65 6e 63   single referenc
85a0: 65 20 74 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e  e to the object.
85b0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
85c0: 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ine is used only
85d0: 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72   inside of asser
85e0: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  t() statements..
85f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4b 65  */.int sqlite3Ke
8600: 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
8610: 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65  (KeyInfo *p){ re
8620: 74 75 72 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b  turn p->nRef==1;
8630: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
8640: 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a  ITE_DEBUG */../*
8650: 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70  .** Given an exp
8660: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65  ression list, ge
8670: 6e 65 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f  nerate a KeyInfo
8680: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
8690: 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63  records.** the c
86a0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
86b0: 65 20 66 6f 72 20 65 61 63 68 20 65 78 70 72 65  e for each expre
86c0: 73 73 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78  ssion in that ex
86d0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
86e0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72  *.** If the Expr
86f0: 4c 69 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52  List is an ORDER
8700: 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
8710: 63 6c 61 75 73 65 20 74 68 65 6e 20 74 68 65 20  clause then the 
8720: 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79  resulting.** Key
8730: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
8740: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
8750: 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61  r initializing a
8760: 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74   virtual index t
8770: 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74  o.** implement t
8780: 68 61 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20  hat clause.  If 
8790: 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20  the ExprList is 
87a0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
87b0: 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68  f a SELECT.** th
87c0: 65 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  en the KeyInfo s
87d0: 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72  tructure is appr
87e0: 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74  opriate for init
87f0: 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75  ializing a virtu
8800: 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69  al.** index to i
8810: 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49  mplement a DISTI
8820: 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20  NCT test..**.** 
8830: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
8840: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
8850: 75 72 65 20 69 73 20 6f 62 74 61 69 6e 20 66 72  ure is obtain fr
8860: 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20  om malloc.  The 
8870: 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
8880: 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ion is responsib
8890: 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68  le for seeing th
88a0: 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72  at this structur
88b0: 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a  e is eventually.
88c0: 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61  ** freed..*/.sta
88d0: 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79  tic KeyInfo *key
88e0: 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
88f0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
8900: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
8910: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
8920: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
8930: 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68  ,     /* Form th
8940: 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  e KeyInfo object
8950: 20 66 72 6f 6d 20 74 68 69 73 20 45 78 70 72 4c   from this ExprL
8960: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74  ist */.  int iSt
8970: 61 72 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  art,          /*
8980: 20 42 65 67 69 6e 20 77 69 74 68 20 74 68 69 73   Begin with this
8990: 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74   column of pList
89a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
89b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
89c0: 64 20 74 68 69 73 20 6d 61 6e 79 20 65 78 74 72  d this many extr
89d0: 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65  a columns to the
89e0: 20 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   end */.){.  int
89f0: 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66   nExpr;.  KeyInf
8a00: 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75  o *pInfo;.  stru
8a10: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
8a20: 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74   *pItem;.  sqlit
8a30: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
8a40: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  >db;.  int i;.. 
8a50: 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e   nExpr = pList->
8a60: 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d  nExpr;.  pInfo =
8a70: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
8a80: 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2b 6e  lloc(db, nExpr+n
8a90: 45 78 74 72 61 2d 69 53 74 61 72 74 2c 20 31 29  Extra-iStart, 1)
8aa0: 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b  ;.  if( pInfo ){
8ab0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
8ac0: 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
8ad0: 74 65 61 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b  teable(pInfo) );
8ae0: 0a 20 20 20 20 66 6f 72 28 69 3d 69 53 74 61 72  .    for(i=iStar
8af0: 74 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  t, pItem=pList->
8b00: 61 2b 69 53 74 61 72 74 3b 20 69 3c 6e 45 78 70  a+iStart; i<nExp
8b10: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
8b20: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
8b30: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43  *pColl;.      pC
8b40: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
8b50: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
8b60: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
8b70: 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
8b80: 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
8b90: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
8ba0: 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69  pInfo->aColl[i-i
8bb0: 53 74 61 72 74 5d 20 3d 20 70 43 6f 6c 6c 3b 0a  Start] = pColl;.
8bc0: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f        pInfo->aSo
8bd0: 72 74 4f 72 64 65 72 5b 69 2d 69 53 74 61 72 74  rtOrder[i-iStart
8be0: 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f  ] = pItem->sortO
8bf0: 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rder;.    }.  }.
8c00: 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a    return pInfo;.
8c10: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
8c20: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
8c30: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d  SELECT./*.** Nam
8c40: 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  e of the connect
8c50: 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73  ion operator, us
8c60: 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  ed for error mes
8c70: 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sages..*/.static
8c80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c   const char *sel
8c90: 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64  ectOpName(int id
8ca0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
8cb0: 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20  switch( id ){.  
8cc0: 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20    case TK_ALL:  
8cd0: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20       z = "UNION 
8ce0: 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ALL";   break;. 
8cf0: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52     case TK_INTER
8d00: 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52  SECT: z = "INTER
8d10: 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a  SECT";   break;.
8d20: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
8d30: 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45  PT:    z = "EXCE
8d40: 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  PT";      break;
8d50: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20  .    default:   
8d60: 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49          z = "UNI
8d70: 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  ON";       break
8d80: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
8d90: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
8da0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
8db0: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69  ND_SELECT */..#i
8dc0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8dd0: 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
8de0: 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41  Unless an "EXPLA
8df0: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63  IN QUERY PLAN" c
8e00: 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20  ommand is being 
8e10: 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20  processed, this 
8e20: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61  function.** is a
8e30: 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73   no-op. Otherwis
8e40: 65 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e  e, it adds a sin
8e50: 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75  gle row of outpu
8e60: 74 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73  t to the EQP res
8e70: 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68  ult,.** where th
8e80: 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20  e caption is of 
8e90: 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
8ea0: 20 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52    "USE TEMP B-TR
8eb0: 45 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a  EE FOR xxx".**.*
8ec0: 2a 20 77 68 65 72 65 20 78 78 78 20 69 73 20 6f  * where xxx is o
8ed0: 6e 65 20 6f 66 20 22 44 49 53 54 49 4e 43 54 22  ne of "DISTINCT"
8ee0: 2c 20 22 4f 52 44 45 52 20 42 59 22 20 6f 72 20  , "ORDER BY" or 
8ef0: 22 47 52 4f 55 50 20 42 59 22 2e 20 45 78 61 63  "GROUP BY". Exac
8f00: 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  tly which.** is 
8f10: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
8f20: 65 20 7a 55 73 61 67 65 20 61 72 67 75 6d 65 6e  e zUsage argumen
8f30: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
8f40: 64 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62  d explainTempTab
8f50: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
8f60: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55  , const char *zU
8f70: 73 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61  sage){.  if( pPa
8f80: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
8f90: 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ){.    Vdbe *v =
8fa0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
8fb0: 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d      char *zMsg =
8fc0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
8fd0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 55 53 45  pParse->db, "USE
8fe0: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52   TEMP B-TREE FOR
8ff0: 20 25 73 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20   %s", zUsage);. 
9000: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9010: 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
9020: 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  in, pParse->iSel
9030: 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73  ectId, 0, 0, zMs
9040: 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P4_DYNAMIC);.
9050: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73    }.}../*.** Ass
9060: 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62  ign expression b
9070: 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41 20   to lvalue a. A 
9080: 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76  second, no-op, v
9090: 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d  ersion of this m
90a0: 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69  acro.** is provi
90b0: 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f  ded when SQLITE_
90c0: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20  OMIT_EXPLAIN is 
90d0: 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20 61 6c  defined. This al
90e0: 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a  lows the code.**
90f0: 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63   in sqlite3Selec
9100: 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20 76 61  t() to assign va
9110: 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74 75 72  lues to structur
9120: 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c  e member variabl
9130: 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20  es that.** only 
9140: 65 78 69 73 74 20 69 66 20 53 51 4c 49 54 45 5f  exist if SQLITE_
9150: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20  OMIT_EXPLAIN is 
9160: 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69 74 68  not defined with
9170: 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68  out polluting th
9180: 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 20 23  e.** code with #
9190: 69 66 6e 64 65 66 20 64 69 72 65 63 74 69 76 65  ifndef directive
91a0: 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65  s..*/.# define e
91b0: 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
91c0: 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23 65  (a, b) a = b..#e
91d0: 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72  lse./* No-op ver
91e0: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70  sions of the exp
91f0: 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69  lainXXX() functi
9200: 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20  ons and macros. 
9210: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  */.# define expl
9220: 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a  ainTempTable(y,z
9230: 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  ).# define expla
9240: 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c 7a  inSetInteger(y,z
9250: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  ).#endif..#if !d
9260: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
9270: 49 54 5f 45 58 50 4c 41 49 4e 29 20 26 26 20 21  IT_EXPLAIN) && !
9280: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9290: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
92a0: 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  ECT)./*.** Unles
92b0: 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55  s an "EXPLAIN QU
92c0: 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e  ERY PLAN" comman
92d0: 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65  d is being proce
92e0: 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ssed, this funct
92f0: 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f  ion.** is a no-o
9300: 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  p. Otherwise, it
9310: 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72   adds a single r
9320: 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20  ow of output to 
9330: 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a  the EQP result,.
9340: 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70  ** where the cap
9350: 74 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f  tion is of one o
9360: 66 20 74 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a  f the two forms:
9370: 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53  .**.**   "COMPOS
9380: 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69  ITE SUBQUERIES i
9390: 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 28  Sub1 and iSub2 (
93a0: 6f 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f  op)".**   "COMPO
93b0: 53 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20  SITE SUBQUERIES 
93c0: 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20  iSub1 and iSub2 
93d0: 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45  USING TEMP B-TRE
93e0: 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68  E (op)".**.** wh
93f0: 65 72 65 20 69 53 75 62 31 20 61 6e 64 20 69 53  ere iSub1 and iS
9400: 75 62 32 20 61 72 65 20 74 68 65 20 69 6e 74 65  ub2 are the inte
9410: 67 65 72 73 20 70 61 73 73 65 64 20 61 73 20 74  gers passed as t
9420: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
9430: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61 72  .** function par
9440: 61 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f 70 20  ameters, and op 
9450: 69 73 20 74 68 65 20 74 65 78 74 20 72 65 70 72  is the text repr
9460: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
9470: 65 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f  e parameter.** o
9480: 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  f the same name.
9490: 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22   The parameter "
94a0: 6f 70 22 20 6d 75 73 74 20 62 65 20 6f 6e 65 20  op" must be one 
94b0: 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f  of TK_UNION, TK_
94c0: 45 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e  EXCEPT,.** TK_IN
94d0: 54 45 52 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c  TERSECT or TK_AL
94e0: 4c 2e 20 54 68 65 20 66 69 72 73 74 20 66 6f 72  L. The first for
94f0: 6d 20 69 73 20 75 73 65 64 20 69 66 20 61 72 67  m is used if arg
9500: 75 6d 65 6e 74 20 62 55 73 65 54 6d 70 20 69 73  ument bUseTmp is
9510: 20 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74   .** false, or t
9520: 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69  he second form i
9530: 66 20 69 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f  f it is true..*/
9540: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
9550: 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20  lainComposite(. 
9560: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9580: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
9590: 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  t */.  int op,  
95a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95b0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
95c0: 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58   TK_UNION, TK_EX
95d0: 43 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69  CEPT etc. */.  i
95e0: 6e 74 20 69 53 75 62 31 2c 20 20 20 20 20 20 20  nt iSub1,       
95f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9600: 2a 20 53 75 62 71 75 65 72 79 20 69 64 20 31 20  * Subquery id 1 
9610: 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 2c 20  */.  int iSub2, 
9620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9630: 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79       /* Subquery
9640: 20 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62   id 2 */.  int b
9650: 55 73 65 54 6d 70 20 20 20 20 20 20 20 20 20 20  UseTmp          
9660: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
9670: 75 65 20 69 66 20 61 20 74 65 6d 70 20 74 61 62  ue if a temp tab
9680: 6c 65 20 77 61 73 20 75 73 65 64 20 2a 2f 0a 29  le was used */.)
9690: 7b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  {.  assert( op==
96a0: 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d  TK_UNION || op==
96b0: 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d  TK_EXCEPT || op=
96c0: 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c  =TK_INTERSECT ||
96d0: 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20   op==TK_ALL );. 
96e0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
96f0: 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56  lain==2 ){.    V
9700: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
9710: 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72  >pVdbe;.    char
9720: 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33   *zMsg = sqlite3
9730: 4d 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  MPrintf(.       
9740: 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f   pParse->db, "CO
9750: 4d 50 4f 55 4e 44 20 53 55 42 51 55 45 52 49 45  MPOUND SUBQUERIE
9760: 53 20 25 64 20 41 4e 44 20 25 64 20 25 73 28 25  S %d AND %d %s(%
9770: 73 29 22 2c 20 69 53 75 62 31 2c 20 69 53 75 62  s)", iSub1, iSub
9780: 32 2c 0a 20 20 20 20 20 20 20 20 62 55 73 65 54  2,.        bUseT
9790: 6d 70 3f 22 55 53 49 4e 47 20 54 45 4d 50 20 42  mp?"USING TEMP B
97a0: 2d 54 52 45 45 20 22 3a 22 22 2c 20 73 65 6c 65  -TREE ":"", sele
97b0: 63 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20  ctOpName(op).   
97c0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
97d0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
97e0: 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d  Explain, pParse-
97f0: 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30  >iSelectId, 0, 0
9800: 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
9810: 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  IC);.  }.}.#else
9820: 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f  ./* No-op versio
9830: 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69  ns of the explai
9840: 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73  nXXX() functions
9850: 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a   and macros. */.
9860: 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
9870: 43 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c  Composite(v,w,x,
9880: 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y,z).#endif../*.
9890: 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20  ** If the inner 
98a0: 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74  loop was generat
98b0: 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e  ed using a non-n
98c0: 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67  ull pOrderBy arg
98d0: 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74  ument,.** then t
98e0: 68 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20  he results were 
98f0: 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74  placed in a sort
9900: 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c  er.  After the l
9910: 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65  oop is terminate
9920: 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20  d.** we need to 
9930: 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61  run the sorter a
9940: 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65  nd output the re
9950: 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c  sults.  The foll
9960: 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65  owing.** routine
9970: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
9980: 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f  ode needed to do
9990: 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   that..*/.static
99a0: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f   void generateSo
99b0: 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20  rtTail(.  Parse 
99c0: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
99d0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
99e0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
99f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
9a00: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
9a10: 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72  .  SortCtx *pSor
9a20: 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74  t,   /* Informat
9a30: 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45 52  ion on the ORDER
9a40: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
9a50: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20  int nColumn,    
9a60: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
9a70: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a  olumns of data *
9a80: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
9a90: 70 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74  pDest /* Write t
9aa0: 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74  he sorted result
9ab0: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56  s here */.){.  V
9ac0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
9ad0: 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20 20 20  >pVdbe;         
9ae0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9af0: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
9b00: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61  ement */.  int a
9b10: 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74  ddrBreak = sqlit
9b20: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
9b30: 76 29 3b 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  v);     /* Jump 
9b40: 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f  here to exit loo
9b50: 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
9b60: 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
9b70: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
9b80: 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  );  /* Jump here
9b90: 20 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20   for next cycle 
9ba0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  */.  int addr;. 
9bb0: 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20   int addrOnce = 
9bc0: 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  0;.  int iTab;. 
9bd0: 20 69 6e 74 20 70 73 65 75 64 6f 54 61 62 20 3d   int pseudoTab =
9be0: 20 30 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   0;.  ExprList *
9bf0: 70 4f 72 64 65 72 42 79 20 3d 20 70 53 6f 72 74  pOrderBy = pSort
9c00: 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e  ->pOrderBy;.  in
9c10: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
9c20: 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74 20 69 50  >eDest;.  int iP
9c30: 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44  arm = pDest->iSD
9c40: 50 61 72 6d 3b 0a 20 20 69 6e 74 20 72 65 67 52  Parm;.  int regR
9c50: 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77  ow;.  int regRow
9c60: 69 64 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a  id;.  int nKey;.
9c70: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61  .  if( pSort->la
9c80: 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20  belBkOut ){.    
9c90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9ca0: 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70  2(v, OP_Gosub, p
9cb0: 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c  Sort->regReturn,
9cc0: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f   pSort->labelBkO
9cd0: 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ut);.    sqlite3
9ce0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9cf0: 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 42 72  _Goto, 0, addrBr
9d00: 65 61 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eak);.    sqlite
9d10: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
9d20: 6c 28 76 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65  l(v, pSort->labe
9d30: 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20 61 64 64  lBkOut);.    add
9d40: 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 43  rOnce = sqlite3C
9d50: 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
9d60: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
9d70: 3b 0a 20 20 7d 0a 20 20 69 54 61 62 20 3d 20 70  ;.  }.  iTab = p
9d80: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 3b 0a  Sort->iECursor;.
9d90: 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74    regRow = sqlit
9da0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
9db0: 72 73 65 29 3b 0a 20 20 69 66 28 20 65 44 65 73  rse);.  if( eDes
9dc0: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c  t==SRT_Output ||
9dd0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
9de0: 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 70 73 65  utine ){.    pse
9df0: 75 64 6f 54 61 62 20 3d 20 70 50 61 72 73 65 2d  udoTab = pParse-
9e00: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c  >nTab++;.    sql
9e10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
9e20: 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
9e30: 20 70 73 65 75 64 6f 54 61 62 2c 20 72 65 67 52   pseudoTab, regR
9e40: 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ow, nColumn);.  
9e50: 20 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 0a    regRowid = 0;.
9e60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67    }else{.    reg
9e70: 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47  Rowid = sqlite3G
9e80: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
9e90: 29 3b 0a 20 20 7d 0a 20 20 6e 4b 65 79 20 3d 20  );.  }.  nKey = 
9ea0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
9eb0: 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b  - pSort->nOBSat;
9ec0: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f  .  if( pSort->so
9ed0: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
9ee0: 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a  AG_UseSorter ){.
9ef0: 20 20 20 20 69 6e 74 20 72 65 67 53 6f 72 74 4f      int regSortO
9f00: 75 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ut = ++pParse->n
9f10: 4d 65 6d 3b 0a 20 20 20 20 69 6e 74 20 70 74 61  Mem;.    int pta
9f20: 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b2 = pParse->nTa
9f30: 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  b++;.    sqlite3
9f40: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
9f50: 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70 74 61  _OpenPseudo, pta
9f60: 62 32 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c 20  b2, regSortOut, 
9f70: 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 69 66 28  nKey+2);.    if(
9f80: 20 61 64 64 72 4f 6e 63 65 20 29 20 73 71 6c 69   addrOnce ) sqli
9f90: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
9fa0: 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20  v, addrOnce);.  
9fb0: 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c    addr = 1 + sql
9fc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9fd0: 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c  , OP_SorterSort,
9fe0: 20 69 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b   iTab, addrBreak
9ff0: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
a000: 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64 65  age(v);.    code
a010: 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66  Offset(v, p->iOf
a020: 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e  fset, addrContin
a030: 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ue);.    sqlite3
a040: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
a050: 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69 54 61  _SorterData, iTa
a060: 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 29 3b 0a  b, regSortOut);.
a070: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a080: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
a090: 6d 6e 2c 20 70 74 61 62 32 2c 20 6e 4b 65 79 2b  mn, ptab2, nKey+
a0a0: 31 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20  1, regRow);.    
a0b0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
a0c0: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c  eP5(v, OPFLAG_CL
a0d0: 45 41 52 43 41 43 48 45 29 3b 0a 20 20 7d 65 6c  EARCACHE);.  }el
a0e0: 73 65 7b 0a 20 20 20 20 69 66 28 20 61 64 64 72  se{.    if( addr
a0f0: 4f 6e 63 65 20 29 20 73 71 6c 69 74 65 33 56 64  Once ) sqlite3Vd
a100: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
a110: 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 61 64 64  drOnce);.    add
a120: 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  r = 1 + sqlite3V
a130: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a140: 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Sort, iTab, addr
a150: 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
a160: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64  rage(v);.    cod
a170: 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
a180: 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69  ffset, addrConti
a190: 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nue);.    sqlite
a1a0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
a1b0: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20  P_Column, iTab, 
a1c0: 6e 4b 65 79 2b 31 2c 20 72 65 67 52 6f 77 29 3b  nKey+1, regRow);
a1d0: 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 65  .  }.  switch( e
a1e0: 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65  Dest ){.    case
a1f0: 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20   SRT_Table:.    
a200: 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
a210: 62 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  b: {.      testc
a220: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
a230: 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74  Table );.      t
a240: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
a250: 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a  SRT_EphemTab );.
a260: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a270: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
a280: 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72  wRowid, iParm, r
a290: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
a2a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a2b0: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
a2c0: 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20 72  iParm, regRow, r
a2d0: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
a2e0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
a2f0: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
a300: 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72 65  PEND);.      bre
a310: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
a320: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
a330: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
a340: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
a350: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
a360: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
a370: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
a380: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
a390: 20 72 65 67 52 6f 77 2c 20 31 2c 20 72 65 67 52   regRow, 1, regR
a3a0: 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20  owid,.          
a3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
a3c0: 44 65 73 74 2d 3e 61 66 66 53 64 73 74 2c 20 31  Dest->affSdst, 1
a3d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
a3e0: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
a3f0: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
a400: 72 65 67 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20  regRow, 1);.    
a410: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a420: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
a430: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ert, iParm, regR
a440: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 62 72 65  owid);.      bre
a450: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
a460: 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
a470: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
a480: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
a490: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
a4a0: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  ove(pParse, regR
a4b0: 6f 77 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  ow, iParm, 1);. 
a4c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
a4d0: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
a4e0: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
a4f0: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
a500: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
a510: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
a520: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  : {.      int i;
a530: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
a540: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
a550: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
a560: 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20 20  oroutine ); .   
a570: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
a580: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
a590: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
a5a0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
a5b0: 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20  outine );.      
a5c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75  for(i=0; i<nColu
a5d0: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
a5e0: 20 20 61 73 73 65 72 74 28 20 72 65 67 52 6f 77    assert( regRow
a5f0: 21 3d 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 69  !=pDest->iSdst+i
a600: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
a610: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
a620: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73 65 75   OP_Column, pseu
a630: 64 6f 54 61 62 2c 20 69 2c 20 70 44 65 73 74 2d  doTab, i, pDest-
a640: 3e 69 53 64 73 74 2b 69 29 3b 0a 20 20 20 20 20  >iSdst+i);.     
a650: 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20     if( i==0 ){. 
a660: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
a670: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
a680: 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43 48  OPFLAG_CLEARCACH
a690: 45 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  E);.        }.  
a6a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
a6b0: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
a6c0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
a6d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a6e0: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
a6f0: 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43  pDest->iSdst, nC
a700: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20  olumn);.        
a710: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
a720: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
a730: 50 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69 53  Parse, pDest->iS
a740: 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  dst, nColumn);. 
a750: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a760: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a770: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
a780: 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
a790: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
a7a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
a7b0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
a7c0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
a7d0: 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 73 71  e, regRow);.  sq
a7e0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
a7f0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
a800: 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  owid);..  /* The
a810: 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c   bottom of the l
a820: 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  oop.  */.  sqlit
a830: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
a840: 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e  el(v, addrContin
a850: 75 65 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74  ue);.  if( pSort
a860: 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f  ->sortFlags & SO
a870: 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72  RTFLAG_UseSorter
a880: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
a890: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a8a0: 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 54 61 62  SorterNext, iTab
a8b0: 2c 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76  , addr); VdbeCov
a8c0: 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73  erage(v);.  }els
a8d0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
a8e0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
a8f0: 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29  ext, iTab, addr)
a900: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
a910: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f  );.  }.  if( pSo
a920: 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 20 29 20  rt->regReturn ) 
a930: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a940: 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
a950: 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e  pSort->regReturn
a960: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
a970: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
a980: 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66  addrBreak);.  if
a990: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
a9a0: 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  put || eDest==SR
a9b0: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20  T_Coroutine ){. 
a9c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a9d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
a9e0: 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29 3b  , pseudoTab, 0);
a9f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
aa00: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
aa10: 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  o a string conta
aa20: 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c 61  ining the 'decla
aa30: 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66 20  ration type' of 
aa40: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
aa50: 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73 74 72  n pExpr. The str
aa60: 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61 74  ing may be treat
aa70: 65 64 20 61 73 20 73 74 61 74 69 63 20 62 79 20  ed as static by 
aa80: 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  the caller..**.*
aa90: 2a 20 41 6c 73 6f 20 74 72 79 20 74 6f 20 65 73  * Also try to es
aaa0: 74 69 6d 61 74 65 20 74 68 65 20 73 69 7a 65 20  timate the size 
aab0: 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  of the returned 
aac0: 76 61 6c 75 65 20 61 6e 64 20 72 65 74 75 72 6e  value and return
aad0: 20 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20   that.** result 
aae0: 69 6e 20 2a 70 45 73 74 57 69 64 74 68 2e 0a 2a  in *pEstWidth..*
aaf0: 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61  *.** The declara
ab00: 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65  tion type is the
ab10: 20 65 78 61 63 74 20 64 61 74 61 74 79 70 65 20   exact datatype 
ab20: 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61  definition extra
ab30: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  cted from the.**
ab40: 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45   original CREATE
ab50: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
ab60: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
ab70: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20  on is a column. 
ab80: 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69  The.** declarati
ab90: 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f  on type for a RO
aba0: 57 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54  WID field is INT
abb0: 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68  EGER. Exactly wh
abc0: 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  en an expression
abd0: 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
abe0: 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62  d a column can b
abf0: 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65  e complex in the
ac00: 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62   presence of sub
ac10: 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20  queries. The.** 
ac20: 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65  result-set expre
ac30: 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20  ssion in all of 
ac40: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45  the following SE
ac50: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
ac60: 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65  is .** considere
ac70: 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68  d a column by th
ac80: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
ac90: 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20  **   SELECT col 
aca0: 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53  FROM tbl;.**   S
acb0: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f  ELECT (SELECT co
acc0: 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20  l FROM tbl;.**  
acd0: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
ace0: 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a  col FROM tbl);.*
acf0: 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63 20 46  *   SELECT abc F
ad00: 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20  ROM (SELECT col 
ad10: 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29  AS abc FROM tbl)
ad20: 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63  ;.** .** The dec
ad30: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f  laration type fo
ad40: 72 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  r any expression
ad50: 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f   other than a co
ad60: 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  lumn is NULL..**
ad70: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ad80: 20 68 61 73 20 65 69 74 68 65 72 20 33 20 6f 72   has either 3 or
ad90: 20 36 20 70 61 72 61 6d 65 74 65 72 73 20 64 65   6 parameters de
ada0: 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
adb0: 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65  er or not.** the
adc0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
add0: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 63  OLUMN_METADATA c
ade0: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
adf0: 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 23  on is used..*/.#
ae00: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
ae10: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
ae20: 41 54 41 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c  ATA.# define col
ae30: 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c  umnType(A,B,C,D,
ae40: 45 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49  E,F) columnTypeI
ae50: 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29  mpl(A,B,C,D,E,F)
ae60: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
ae70: 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d  ar *columnTypeIm
ae80: 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  pl(.  NameContex
ae90: 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20  t *pNC, .  Expr 
aea0: 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20  *pExpr,.  const 
aeb0: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c  char **pzOrigDb,
aec0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
aed0: 70 7a 4f 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e  pzOrigTab,.  con
aee0: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67  st char **pzOrig
aef0: 43 6f 6c 2c 0a 20 20 75 38 20 2a 70 45 73 74 57  Col,.  u8 *pEstW
af00: 69 64 74 68 0a 29 7b 0a 20 20 63 68 61 72 20 63  idth.){.  char c
af10: 6f 6e 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20  onst *zOrigDb = 
af20: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
af30: 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20  *zOrigTab = 0;. 
af40: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72   char const *zOr
af50: 69 67 43 6f 6c 20 3d 20 30 3b 0a 23 65 6c 73 65  igCol = 0;.#else
af60: 20 2f 2a 20 69 66 20 21 64 65 66 69 6e 65 64 28   /* if !defined(
af70: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
af80: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a  LUMN_METADATA) *
af90: 2f 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d  /.# define colum
afa0: 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c  nType(A,B,C,D,E,
afb0: 46 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70  F) columnTypeImp
afc0: 6c 28 41 2c 42 2c 46 29 0a 73 74 61 74 69 63 20  l(A,B,F).static 
afd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75  const char *colu
afe0: 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61  mnTypeImpl(.  Na
aff0: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
b000: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a  .  Expr *pExpr,.
b010: 20 20 75 38 20 2a 70 45 73 74 57 69 64 74 68 0a    u8 *pEstWidth.
b020: 29 7b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  ){.#endif /* !de
b030: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
b040: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
b050: 41 54 41 29 20 2a 2f 0a 20 20 63 68 61 72 20 63  ATA) */.  char c
b060: 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b  onst *zType = 0;
b070: 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 75 38 20 65  .  int j;.  u8 e
b080: 73 74 57 69 64 74 68 20 3d 20 31 3b 0a 0a 20 20  stWidth = 1;..  
b090: 69 66 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d  if( NEVER(pExpr=
b0a0: 3d 30 29 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63  =0) || pNC->pSrc
b0b0: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
b0c0: 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45   0;.  switch( pE
b0d0: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
b0e0: 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  ase TK_AGG_COLUM
b0f0: 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  N:.    case TK_C
b100: 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f  OLUMN: {.      /
b110: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
b120: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f   is a column. Lo
b130: 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 74  cate the table t
b140: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69  he column is bei
b150: 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72  ng.      ** extr
b160: 61 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61  acted from in Na
b170: 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69  meContext.pSrcLi
b180: 73 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d  st. This table m
b190: 61 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20  ay be real.     
b1a0: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61 62   ** database tab
b1b0: 6c 65 20 6f 72 20 61 20 73 75 62 71 75 65 72 79  le or a subquery
b1c0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
b1d0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30   Table *pTab = 0
b1e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
b1f0: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
b200: 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63  column is extrac
b210: 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20  ted from */.    
b220: 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30    Select *pS = 0
b230: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
b240: 20 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75   Select the colu
b250: 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20  mn is extracted 
b260: 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e  from */.      in
b270: 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e  t iCol = pExpr->
b280: 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64  iColumn;  /* Ind
b290: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20  ex of column in 
b2a0: 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 74 65  pTab */.      te
b2b0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
b2c0: 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
b2d0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
b2e0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
b2f0: 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
b300: 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20    while( pNC && 
b310: 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  !pTab ){.       
b320: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
b330: 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69  st = pNC->pSrcLi
b340: 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  st;.        for(
b350: 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  j=0;j<pTabList->
b360: 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74  nSrc && pTabList
b370: 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d  ->a[j].iCursor!=
b380: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b  pExpr->iTable;j+
b390: 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +);.        if( 
b3a0: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
b3b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54   ){.          pT
b3c0: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
b3d0: 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [j].pTab;.      
b3e0: 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69 73      pS = pTabLis
b3f0: 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b  t->a[j].pSelect;
b400: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
b410: 20 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d 20            pNC = 
b420: 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pNC->pNext;.    
b430: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
b440: 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
b450: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
b460: 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f 64 65  t one time, code
b470: 20 73 75 63 68 20 61 73 20 22 53 45 4c 45 43 54   such as "SELECT
b480: 20 6e 65 77 2e 78 22 20 77 69 74 68 69 6e 20 61   new.x" within a
b490: 20 74 72 69 67 67 65 72 20 77 6f 75 6c 64 0a 20   trigger would. 
b4a0: 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20         ** cause 
b4b0: 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 74  this condition t
b4c0: 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65 20 74 68  o run.  Since th
b4d0: 65 6e 2c 20 77 65 20 68 61 76 65 20 72 65 73 74  en, we have rest
b4e0: 72 75 63 74 75 72 65 64 20 68 6f 77 0a 20 20 20  ructured how.   
b4f0: 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20       ** trigger 
b500: 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65  code is generate
b510: 64 20 61 6e 64 20 73 6f 20 74 68 69 73 20 63 6f  d and so this co
b520: 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f  ndition is no lo
b530: 6e 67 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a  nger .        **
b540: 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65 76   possible. Howev
b550: 65 72 2c 20 69 74 20 63 61 6e 20 73 74 69 6c 6c  er, it can still
b560: 20 62 65 20 74 72 75 65 20 66 6f 72 20 73 74 61   be true for sta
b570: 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20 20  tements like.   
b580: 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c       ** the foll
b590: 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20 20 20 2a  owing:.        *
b5a0: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 43  *.        **   C
b5b0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 63  REATE TABLE t1(c
b5c0: 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 20  ol INTEGER);.   
b5d0: 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54       **   SELECT
b5e0: 20 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29   (SELECT t1.col)
b5f0: 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a 20   FROM FROM t1;. 
b600: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
b610: 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75 6d 6e    ** when column
b620: 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64  Type() is called
b630: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
b640: 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e 20 74  on "t1.col" in t
b650: 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  he .        ** s
b660: 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20 74 68  ub-select. In th
b670: 69 73 20 63 61 73 65 2c 20 73 65 74 20 74 68 65  is case, set the
b680: 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74 6f 20   column type to 
b690: 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20 20 20  NULL, even.     
b6a0: 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 69 74 20     ** though it 
b6b0: 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20 62 65  should really be
b6c0: 20 22 49 4e 54 45 47 45 52 22 2e 0a 20 20 20 20   "INTEGER"..    
b6d0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
b6e0: 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
b6f0: 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68 65 20  problem, as the 
b700: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66 20 22  column type of "
b710: 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76 65 72  t1.col" is never
b720: 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 64  .        ** used
b730: 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70  . When columnTyp
b740: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
b750: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
b760: 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 28 53 45  .        ** "(SE
b770: 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c 20 74  LECT t1.col)", t
b780: 68 65 20 63 6f 72 72 65 63 74 20 74 79 70 65 20  he correct type 
b790: 69 73 20 72 65 74 75 72 6e 65 64 20 28 73 65 65  is returned (see
b7a0: 20 74 68 65 20 54 4b 5f 53 45 4c 45 43 54 0a 20   the TK_SELECT. 
b7b0: 20 20 20 20 20 20 20 2a 2a 20 62 72 61 6e 63 68         ** branch
b7c0: 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20   below.  */.    
b7d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b7e0: 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
b7f0: 28 20 70 54 61 62 20 26 26 20 70 45 78 70 72 2d  ( pTab && pExpr-
b800: 3e 70 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20  >pTab==pTab );. 
b810: 20 20 20 20 20 69 66 28 20 70 53 20 29 7b 0a 20       if( pS ){. 
b820: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 74         /* The "t
b830: 61 62 6c 65 22 20 69 73 20 61 63 74 75 61 6c 6c  able" is actuall
b840: 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  y a sub-select o
b850: 72 20 61 20 76 69 65 77 20 69 6e 20 74 68 65 20  r a view in the 
b860: 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20  FROM clause.    
b870: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 53 45      ** of the SE
b880: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
b890: 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61  Return the decla
b8a0: 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 20  ration type and 
b8b0: 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20 20 2a  origin.        *
b8c0: 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 72  * data for the r
b8d0: 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e  esult-set column
b8e0: 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65   of the sub-sele
b8f0: 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ct..        */. 
b900: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e         if( iCol>
b910: 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69 43 6f  =0 && ALWAYS(iCo
b920: 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  l<pS->pEList->nE
b930: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
b940: 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20    /* If iCol is 
b950: 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
b960: 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
b970: 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68 65  ion requests the
b980: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f  .          ** ro
b990: 77 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73  wid of the sub-s
b9a0: 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54  elect or view. T
b9b0: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69  his expression i
b9c0: 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20  s legal (see .  
b9d0: 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20          ** test 
b9e0: 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20  case misc2.2.2) 
b9f0: 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c  - it always eval
ba00: 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20  uates to NULL.. 
ba10: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
ba20: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
ba30: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20  t sNC;.         
ba40: 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70   Expr *p = pS->p
ba50: 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70  EList->a[iCol].p
ba60: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
ba70: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
ba80: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20  S->pSrc;.       
ba90: 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70     sNC.pNext = p
baa0: 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  NC;.          sN
bab0: 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e  C.pParse = pNC->
bac0: 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20  pParse;.        
bad0: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
bae0: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f  Type(&sNC, p,&zO
baf0: 72 69 67 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c  rigDb,&zOrigTab,
bb00: 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65 73 74 57  &zOrigCol, &estW
bb10: 69 64 74 68 29 3b 20 0a 20 20 20 20 20 20 20 20  idth); .        
bb20: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
bb30: 28 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ( pTab->pSchema 
bb40: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ){.        /* A 
bb50: 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  real table */.  
bb60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
bb70: 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  S );.        if(
bb80: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
bb90: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
bba0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
bbb0: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
bbc0: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
bbd0: 3e 6e 43 6f 6c 29 20 29 3b 0a 23 69 66 64 65 66  >nCol) );.#ifdef
bbe0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
bbf0: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
bc00: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
bc10: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  0 ){.          z
bc20: 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22  Type = "INTEGER"
bc30: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
bc40: 67 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a  gCol = "rowid";.
bc50: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
bc60: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
bc70: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
bc80: 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20  ].zType;.       
bc90: 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54     zOrigCol = pT
bca0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
bcb0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
bcc0: 65 73 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d  estWidth = pTab-
bcd0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73  >aCol[iCol].szEs
bce0: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
bcf0: 20 20 20 20 20 7a 4f 72 69 67 54 61 62 20 3d 20       zOrigTab = 
bd00: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
bd10: 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50       if( pNC->pP
bd20: 61 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  arse ){.        
bd30: 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
bd40: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
bd50: 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62  (pNC->pParse->db
bd60: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
bd70: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
bd80: 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  gDb = pNC->pPars
bd90: 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
bda0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d  zName;.        }
bdb0: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69  .#else.        i
bdc0: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
bdd0: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22         zType = "
bde0: 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20  INTEGER";.      
bdf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
be00: 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d     zType = pTab-
be10: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70  >aCol[iCol].zTyp
be20: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73 74  e;.          est
be30: 57 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43  Width = pTab->aC
be40: 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a  ol[iCol].szEst;.
be50: 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
be60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
be70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
be80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
be90: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
bea0: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
beb0: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
bec0: 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d  ession is a sub-
bed0: 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74  select. Return t
bee0: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
bef0: 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ype and.      **
bf00: 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72   origin info for
bf10: 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75   the single colu
bf20: 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  mn in the result
bf30: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
bf40: 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  CT.      ** stat
bf50: 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ement..      */.
bf60: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
bf70: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c  t sNC;.      Sel
bf80: 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d  ect *pS = pExpr-
bf90: 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  >x.pSelect;.    
bfa0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e    Expr *p = pS->
bfb0: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
bfc0: 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
bfd0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
bfe0: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
bff0: 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
c000: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
c010: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73  S->pSrc;.      s
c020: 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a  NC.pNext = pNC;.
c030: 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65        sNC.pParse
c040: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
c050: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f        zType = co
c060: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
c070: 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72  , &zOrigDb, &zOr
c080: 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c  igTab, &zOrigCol
c090: 2c 20 26 65 73 74 57 69 64 74 68 29 3b 20 0a 20  , &estWidth); . 
c0a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c0b0: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69  }.#endif.  }..#i
c0c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
c0d0: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
c0e0: 54 41 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69  TA  .  if( pzOri
c0f0: 67 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  gDb ){.    asser
c100: 74 28 20 70 7a 4f 72 69 67 54 61 62 20 26 26 20  t( pzOrigTab && 
c110: 70 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20  pzOrigCol );.   
c120: 20 2a 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72   *pzOrigDb = zOr
c130: 69 67 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  igDb;.    *pzOri
c140: 67 54 61 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b  gTab = zOrigTab;
c150: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20  .    *pzOrigCol 
c160: 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a  = zOrigCol;.  }.
c170: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 45 73  #endif.  if( pEs
c180: 74 57 69 64 74 68 20 29 20 2a 70 45 73 74 57 69  tWidth ) *pEstWi
c190: 64 74 68 20 3d 20 65 73 74 57 69 64 74 68 3b 0a  dth = estWidth;.
c1a0: 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a    return zType;.
c1b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
c1c0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
c1d0: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
c1e0: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
c1f0: 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a  ypes of columns.
c200: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
c210: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
c220: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
c230: 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73  umnTypes(.  Pars
c240: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
c250: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
c260: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
c270: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
c280: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
c290: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
c2a0: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
c2b0: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
c2c0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
c2d0: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
c2e0: 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a  E_OMIT_DECLTYPE.
c2f0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
c300: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
c310: 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
c320: 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72  t sNC;.  sNC.pSr
c330: 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  cList = pTabList
c340: 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d  ;.  sNC.pParse =
c350: 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69   pParse;.  for(i
c360: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
c370: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
c380: 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d  xpr *p = pEList-
c390: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
c3a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
c3b0: 70 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  pe;.#ifdef SQLIT
c3c0: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
c3d0: 4d 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e  METADATA.    con
c3e0: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62  st char *zOrigDb
c3f0: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
c400: 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d  char *zOrigTab =
c410: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
c420: 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30  ar *zOrigCol = 0
c430: 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  ;.    zType = co
c440: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
c450: 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72  , &zOrigDb, &zOr
c460: 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c  igTab, &zOrigCol
c470: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  , 0);..    /* Th
c480: 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65  e vdbe must make
c490: 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66   its own copy of
c4a0: 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65   the column-type
c4b0: 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20   and other .    
c4c0: 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66  ** column specif
c4d0: 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63  ic strings, in c
c4e0: 61 73 65 20 74 68 65 20 73 63 68 65 6d 61 20 69  ase the schema i
c4f0: 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74  s reset before t
c500: 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75  his.    ** virtu
c510: 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65  al machine is de
c520: 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
c530: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
c540: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
c550: 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20  LNAME_DATABASE, 
c560: 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49 54 45 5f  zOrigDb, SQLITE_
c570: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
c580: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
c590: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
c5a0: 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67  AME_TABLE, zOrig
c5b0: 54 61 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Tab, SQLITE_TRAN
c5c0: 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
c5d0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
c5e0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
c5f0: 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c  COLUMN, zOrigCol
c600: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
c610: 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a  NT);.#else.    z
c620: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
c630: 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c  e(&sNC, p, 0, 0,
c640: 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20   0, 0);.#endif. 
c650: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
c660: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
c670: 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c  OLNAME_DECLTYPE,
c680: 20 7a 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54   zType, SQLITE_T
c690: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23  RANSIENT);.  }.#
c6a0: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
c6b0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  d(SQLITE_OMIT_DE
c6c0: 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 2f 2a  CLTYPE) */.}../*
c6d0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
c6e0: 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c  e that will tell
c6f0: 20 74 68 65 20 56 44 42 45 20 74 68 65 20 6e 61   the VDBE the na
c700: 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  mes of columns.*
c710: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
c720: 73 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  set.  This infor
c730: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  mation is used t
c740: 6f 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a  o provide the.**
c750: 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20   azCol[] values 
c760: 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e  in the callback.
c770: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c780: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
c790: 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  mes(.  Parse *pP
c7a0: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
c7b0: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
c7c0: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
c7d0: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
c7e0: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70   tables */.  Exp
c7f0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
c800: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
c810: 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73  defining the res
c820: 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20  ult set */.){.  
c830: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
c840: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
c850: 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  , j;.  sqlite3 *
c860: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
c870: 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73  .  int fullNames
c880: 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23  , shortNames;..#
c890: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
c8a0: 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20  IT_EXPLAIN.  /* 
c8b0: 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58  If this is an EX
c8c0: 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73  PLAIN, skip this
c8d0: 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70   step */.  if( p
c8e0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
c8f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
c900: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
c910: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
c920: 53 65 74 20 7c 7c 20 4e 45 56 45 52 28 76 3d 3d  Set || NEVER(v==
c930: 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  0) || db->malloc
c940: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
c950: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61  .  pParse->colNa
c960: 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75  mesSet = 1;.  fu
c970: 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66  llNames = (db->f
c980: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
c990: 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a  llColNames)!=0;.
c9a0: 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28    shortNames = (
c9b0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
c9c0: 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
c9d0: 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56  )!=0;.  sqlite3V
c9e0: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
c9f0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
ca00: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
ca10: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
ca20: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a  ){.    Expr *p;.
ca30: 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e      p = pEList->
ca40: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
ca50: 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
ca60: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
ca70: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
ca80: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
ca90: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45  char *zName = pE
caa0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
cab0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
cac0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
cad0: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
cae0: 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
caf0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
cb00: 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f 70  }else if( (p->op
cb10: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  ==TK_COLUMN || p
cb20: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
cb30: 55 4d 4e 29 20 26 26 20 70 54 61 62 4c 69 73 74  UMN) && pTabList
cb40: 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20   ){.      Table 
cb50: 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61  *pTab;.      cha
cb60: 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69  r *zCol;.      i
cb70: 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f  nt iCol = p->iCo
cb80: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28  lumn;.      for(
cb90: 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70 54  j=0; ALWAYS(j<pT
cba0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 20 6a  abList->nSrc); j
cbb0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
cbc0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
cbd0: 69 43 75 72 73 6f 72 3d 3d 70 2d 3e 69 54 61 62  iCursor==p->iTab
cbe0: 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  le ) break;.    
cbf0: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
cc00: 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ( j<pTabList->nS
cc10: 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  rc );.      pTab
cc20: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
cc30: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66  ].pTab;.      if
cc40: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
cc50: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
cc60: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
cc70: 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
cc80: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
cc90: 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69  nCol) );.      i
cca0: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
ccb0: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77       zCol = "row
ccc0: 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id";.      }else
ccd0: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
cce0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
ccf0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  ].zName;.      }
cd00: 0a 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72  .      if( !shor
cd10: 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e  tNames && !fullN
cd20: 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
cd30: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
cd40: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
cd50: 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20  AME_NAME, .     
cd60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
cd70: 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73  StrDup(db, pELis
cd80: 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20  t->a[i].zSpan), 
cd90: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
cda0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
cdb0: 20 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20   fullNames ){.  
cdc0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
cdd0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a  e = 0;.        z
cde0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
cdf0: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
ce00: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
ce10: 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  zCol);.        s
ce20: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
ce30: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
ce40: 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20  ME_NAME, zName, 
ce50: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
ce60: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ce70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ce80: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
ce90: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
cea0: 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41  zCol, SQLITE_TRA
ceb0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d  NSIENT);.      }
cec0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ced0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
cee0: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
cef0: 53 70 61 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20  Span;.      z = 
cf00: 7a 3d 3d 30 20 3f 20 73 71 6c 69 74 65 33 4d 50  z==0 ? sqlite3MP
cf10: 72 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d  rintf(db, "colum
cf20: 6e 25 64 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c  n%d", i+1) : sql
cf30: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
cf40: 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   z);.      sqlit
cf50: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
cf60: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
cf70: 41 4d 45 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44  AME, z, SQLITE_D
cf80: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20  YNAMIC);.    }. 
cf90: 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c   }.  generateCol
cfa0: 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c  umnTypes(pParse,
cfb0: 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
cfc0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  t);.}../*.** Giv
cfd0: 65 6e 20 61 20 61 6e 20 65 78 70 72 65 73 73 69  en a an expressi
cfe0: 6f 6e 20 6c 69 73 74 20 28 77 68 69 63 68 20 69  on list (which i
cff0: 73 20 72 65 61 6c 6c 79 20 74 68 65 20 6c 69 73  s really the lis
d000: 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
d010: 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20 74 68  .** that form th
d020: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
d030: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
d040: 6e 74 29 20 63 6f 6d 70 75 74 65 20 61 70 70 72  nt) compute appr
d050: 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d  opriate.** colum
d060: 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 74 61  n names for a ta
d070: 62 6c 65 20 74 68 61 74 20 77 6f 75 6c 64 20 68  ble that would h
d080: 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69  old the expressi
d090: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41  on list..**.** A
d0a0: 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ll column names 
d0b0: 77 69 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a  will be unique..
d0c0: 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63  **.** Only the c
d0d0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20  olumn names are 
d0e0: 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d  computed.  Colum
d0f0: 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e  n.zType, Column.
d100: 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74  zColl,.** and ot
d110: 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 43 6f  her fields of Co
d120: 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e  lumn are zeroed.
d130: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
d140: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
d150: 73 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79  ss.  If a memory
d160: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
d170: 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f  r occurs,.** sto
d180: 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f  re NULL in *paCo
d190: 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f  l and 0 in *pnCo
d1a0: 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  l and return SQL
d1b0: 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74  ITE_NOMEM..*/.st
d1c0: 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 43  atic int selectC
d1d0: 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
d1e0: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
d1f0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
d200: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
d210: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
d220: 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  pEList,       /*
d230: 20 45 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20   Expr list from 
d240: 77 68 69 63 68 20 74 6f 20 64 65 72 69 76 65 20  which to derive 
d250: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
d260: 20 20 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20    i16 *pnCol,   
d270: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
d280: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
d290: 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f   columns here */
d2a0: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f  .  Column **paCo
d2b0: 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  l          /* Wr
d2c0: 69 74 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75  ite the new colu
d2d0: 6d 6e 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a  mn list here */.
d2e0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
d2f0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
d300: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
d310: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
d320: 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
d330: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
d340: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
d350: 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20  nt cnt;         
d360: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
d370: 64 65 78 20 61 64 64 65 64 20 74 6f 20 6d 61 6b  dex added to mak
d380: 65 20 74 68 65 20 6e 61 6d 65 20 75 6e 69 71 75  e the name uniqu
d390: 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61  e */.  Column *a
d3a0: 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20  Col, *pCol;     
d3b0: 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
d3c0: 67 20 6f 76 65 72 20 72 65 73 75 6c 74 20 63 6f  g over result co
d3d0: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  lumns */.  int n
d3e0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
d3f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
d400: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
d410: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
d420: 0a 20 20 45 78 70 72 20 2a 70 3b 20 20 20 20 20  .  Expr *p;     
d430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d440: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72  * Expression for
d450: 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74   a single result
d460: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61   column */.  cha
d470: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
d480: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
d490: 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  mn name */.  int
d4a0: 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
d4b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
d4c0: 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d   of name in zNam
d4d0: 65 5b 5d 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45  e[] */..  if( pE
d4e0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c  List ){.    nCol
d4f0: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
d500: 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c  ;.    aCol = sql
d510: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
d520: 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c  (db, sizeof(aCol
d530: 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20  [0])*nCol);.    
d540: 74 65 73 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d  testcase( aCol==
d550: 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 );.  }else{.  
d560: 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20    nCol = 0;.    
d570: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  aCol = 0;.  }.  
d580: 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20  *pnCol = nCol;. 
d590: 20 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a   *paCol = aCol;.
d5a0: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c  .  for(i=0, pCol
d5b0: 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69  =aCol; i<nCol; i
d5c0: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
d5d0: 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f   /* Get an appro
d5e0: 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20  priate name for 
d5f0: 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a  the column.    *
d600: 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  /.    p = sqlite
d610: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
d620: 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  (pEList->a[i].pE
d630: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 28 7a  xpr);.    if( (z
d640: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
d650: 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  [i].zName)!=0 ){
d660: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
d670: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
d680: 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20   an "AS <name>" 
d690: 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d  phrase, use <nam
d6a0: 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a  e> as the name *
d6b0: 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  /.      zName = 
d6c0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
d6d0: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
d6e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
d6f0: 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b  r *pColExpr = p;
d700: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
d710: 69 6f 6e 20 74 68 61 74 20 69 73 20 74 68 65 20  ion that is the 
d720: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61  result column na
d730: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c  me */.      Tabl
d740: 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
d750: 20 2f 2a 20 54 61 62 6c 65 20 61 73 73 6f 63 69   /* Table associ
d760: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 65  ated with this e
d770: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
d780: 20 20 20 77 68 69 6c 65 28 20 70 43 6f 6c 45 78     while( pColEx
d790: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29  pr->op==TK_DOT )
d7a0: 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 45 78  {.        pColEx
d7b0: 70 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70  pr = pColExpr->p
d7c0: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61  Right;.        a
d7d0: 73 73 65 72 74 28 20 70 43 6f 6c 45 78 70 72 21  ssert( pColExpr!
d7e0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
d7f0: 20 20 20 20 69 66 28 20 70 43 6f 6c 45 78 70 72      if( pColExpr
d800: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
d810: 26 26 20 41 4c 57 41 59 53 28 70 43 6f 6c 45 78  && ALWAYS(pColEx
d820: 70 72 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a  pr->pTab!=0) ){.
d830: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63          /* For c
d840: 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20 63  olumns use the c
d850: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20  olumn name name 
d860: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
d870: 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e  Col = pColExpr->
d880: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  iColumn;.       
d890: 20 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70 72   pTab = pColExpr
d8a0: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
d8b0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
d8c0: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
d8d0: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
d8e0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
d8f0: 64 62 2c 20 22 25 73 22 2c 0a 20 20 20 20 20 20  db, "%s",.      
d900: 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 3e             iCol>
d910: 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  =0 ? pTab->aCol[
d920: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72  iCol].zName : "r
d930: 6f 77 69 64 22 29 3b 0a 20 20 20 20 20 20 7d 65  owid");.      }e
d940: 6c 73 65 20 69 66 28 20 70 43 6f 6c 45 78 70 72  lse if( pColExpr
d950: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20  ->op==TK_ID ){. 
d960: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
d970: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
d980: 70 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74  pColExpr, EP_Int
d990: 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
d9a0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
d9b0: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
d9c0: 22 2c 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a  ", pColExpr->u.z
d9d0: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65  Token);.      }e
d9e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
d9f0: 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  Use the original
da00: 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c   text of the col
da10: 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61  umn expression a
da20: 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20  s its name */.  
da30: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
da40: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
da50: 20 22 25 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61   "%s", pEList->a
da60: 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  [i].zSpan);.    
da70: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
da80: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
da90: 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ed ){.      sqli
daa0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
dab0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ame);.      brea
dac0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
dad0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
dae0: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e  olumn name is un
daf0: 69 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61  ique.  If the na
db00: 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65  me is not unique
db10: 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20  ,.    ** append 
db20: 61 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65  a integer to the
db30: 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74   name so that it
db40: 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e   becomes unique.
db50: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d  .    */.    nNam
db60: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
db70: 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  n30(zName);.    
db80: 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69  for(j=cnt=0; j<i
db90: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
dba0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
dbb0: 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  (aCol[j].zName, 
dbc0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
dbd0: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e       char *zNewN
dbe0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ame;.        int
dbf0: 20 6b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   k;.        for(
dc00: 6b 3d 6e 4e 61 6d 65 2d 31 3b 20 6b 3e 31 20 26  k=nName-1; k>1 &
dc10: 26 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74  & sqlite3Isdigit
dc20: 28 7a 4e 61 6d 65 5b 6b 5d 29 3b 20 6b 2d 2d 29  (zName[k]); k--)
dc30: 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b  {}.        if( k
dc40: 3e 3d 30 20 26 26 20 7a 4e 61 6d 65 5b 6b 5d 3d  >=0 && zName[k]=
dc50: 3d 27 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6b  =':' ) nName = k
dc60: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b  ;.        zName[
dc70: 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20  nName] = 0;.    
dc80: 20 20 20 20 7a 4e 65 77 4e 61 6d 65 20 3d 20 73      zNewName = s
dc90: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
dca0: 2c 20 22 25 73 3a 25 64 22 2c 20 7a 4e 61 6d 65  , "%s:%d", zName
dcb0: 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20  , ++cnt);.      
dcc0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
dcd0: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
dce0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77      zName = zNew
dcf0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 6a 20  Name;.        j 
dd00: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66  = -1;.        if
dd10: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65  ( zName==0 ) bre
dd20: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
dd30: 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  }.    pCol->zNam
dd40: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20  e = zName;.  }. 
dd50: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
dd60: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72  ailed ){.    for
dd70: 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b  (j=0; j<i; j++){
dd80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
dd90: 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d  Free(db, aCol[j]
dda0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  .zName);.    }. 
ddb0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
ddc0: 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20  (db, aCol);.    
ddd0: 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  *paCol = 0;.    
dde0: 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  *pnCol = 0;.    
ddf0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
de00: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  MEM;.  }.  retur
de10: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
de20: 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61  /*.** Add type a
de30: 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66  nd collation inf
de40: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f  ormation to a co
de50: 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20  lumn list based 
de60: 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73  on.** a SELECT s
de70: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a  tatement..** .**
de80: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   The column list
de90: 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65   presumably came
dea0: 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75   from selectColu
deb0: 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c  mnNamesFromExprL
dec0: 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f  ist()..** The co
ded0: 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e  lumn list has on
dee0: 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79  ly names, not ty
def0: 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e  pes or collation
df00: 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  s.  This.** rout
df10: 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68  ine goes through
df20: 20 61 6e 64 20 61 64 64 73 20 74 68 65 20 74 79   and adds the ty
df30: 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  pes and collatio
df40: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ns..**.** This r
df50: 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65 73 20  outine requires 
df60: 74 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66  that all identif
df70: 69 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45  iers in the SELE
df80: 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  CT.** statement 
df90: 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a  be resolved..*/.
dfa0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
dfb0: 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41  ctAddColumnTypeA
dfc0: 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50  ndCollation(.  P
dfd0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
dfe0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
dff0: 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54 61  contexts */.  Ta
e000: 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
e010: 20 20 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d      /* Add colum
e020: 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d 61 74 69  n type informati
e030: 6f 6e 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  on to this table
e040: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
e050: 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53  elect       /* S
e060: 45 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64 65  ELECT used to de
e070: 74 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e  termine types an
e080: 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a  d collations */.
e090: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
e0a0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
e0b0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
e0c0: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
e0d0: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
e0e0: 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45  ll;.  int i;.  E
e0f0: 78 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74  xpr *p;.  struct
e100: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
e110: 61 3b 0a 20 20 75 36 34 20 73 7a 41 6c 6c 20 3d  a;.  u64 szAll =
e120: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
e130: 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61  Select!=0 );.  a
e140: 73 73 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d  ssert( (pSelect-
e150: 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
e160: 65 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20  esolved)!=0 );. 
e170: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
e180: 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45  Col==pSelect->pE
e190: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64  List->nExpr || d
e1a0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
e1b0: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
e1c0: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
e1d0: 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e  rn;.  memset(&sN
e1e0: 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
e1f0: 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  ));.  sNC.pSrcLi
e200: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53  st = pSelect->pS
e210: 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63  rc;.  a = pSelec
e220: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20  t->pEList->a;.  
e230: 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54  for(i=0, pCol=pT
e240: 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62  ab->aCol; i<pTab
e250: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
e260: 6c 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 5b  l++){.    p = a[
e270: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 43  i].pExpr;.    pC
e280: 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69  ol->zType = sqli
e290: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
e2a0: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
e2b0: 20 70 2c 30 2c 30 2c 30 2c 20 26 70 43 6f 6c 2d   p,0,0,0, &pCol-
e2c0: 3e 73 7a 45 73 74 29 29 3b 0a 20 20 20 20 73 7a  >szEst));.    sz
e2d0: 41 6c 6c 20 2b 3d 20 70 43 6f 6c 2d 3e 73 7a 45  All += pCol->szE
e2e0: 73 74 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66  st;.    pCol->af
e2f0: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
e300: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b  ExprAffinity(p);
e310: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61  .    if( pCol->a
e320: 66 66 69 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f  ffinity==0 ) pCo
e330: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  l->affinity = SQ
e340: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
e350: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
e360: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
e370: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66  arse, p);.    if
e380: 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
e390: 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73   pCol->zColl = s
e3a0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
e3b0: 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  b, pColl->zName)
e3c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54  ;.    }.  }.  pT
e3d0: 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73  ab->szTabRow = s
e3e0: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 73 7a 41  qlite3LogEst(szA
e3f0: 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ll*4);.}../*.** 
e400: 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73  Given a SELECT s
e410: 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61  tatement, genera
e420: 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  te a Table struc
e430: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
e440: 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  bes.** the resul
e450: 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45  t set of that SE
e460: 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  LECT..*/.Table *
e470: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
e480: 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a  OfSelect(Parse *
e490: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
e4a0: 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c  pSelect){.  Tabl
e4b0: 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  e *pTab;.  sqlit
e4c0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
e4d0: 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64  >db;.  int saved
e4e0: 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46  Flags;..  savedF
e4f0: 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73  lags = db->flags
e500: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
e510: 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c   ~SQLITE_FullCol
e520: 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61  Names;.  db->fla
e530: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f  gs |= SQLITE_Sho
e540: 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71  rtColNames;.  sq
e550: 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
e560: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
e570: 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73   0);.  if( pPars
e580: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
e590: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65   0;.  while( pSe
e5a0: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  lect->pPrior ) p
e5b0: 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
e5c0: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e  ->pPrior;.  db->
e5d0: 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61  flags = savedFla
e5e0: 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  gs;.  pTab = sql
e5f0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
e600: 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
e610: 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  e) );.  if( pTab
e620: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
e630: 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68  n 0;.  }.  /* Th
e640: 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  e sqlite3ResultS
e650: 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20  etOfSelect() is 
e660: 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74  only used n cont
e670: 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61  exts where looka
e680: 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73  side.  ** is dis
e690: 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  abled */.  asser
e6a0: 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  t( db->lookaside
e6b0: 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20 29 3b 0a  .bEnabled==0 );.
e6c0: 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31    pTab->nRef = 1
e6d0: 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20  ;.  pTab->zName 
e6e0: 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f  = 0;.  pTab->nRo
e6f0: 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61  wLogEst = 200; a
e700: 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69  ssert( 200==sqli
e710: 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37  te3LogEst(104857
e720: 36 29 20 29 3b 0a 20 20 73 65 6c 65 63 74 43 6f  6) );.  selectCo
e730: 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
e740: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
e750: 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62  t->pEList, &pTab
e760: 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61  ->nCol, &pTab->a
e770: 43 6f 6c 29 3b 0a 20 20 73 65 6c 65 63 74 41 64  Col);.  selectAd
e780: 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
e790: 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  llation(pParse, 
e7a0: 70 54 61 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  pTab, pSelect);.
e7b0: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
e7c0: 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  -1;.  if( db->ma
e7d0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
e7e0: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
e7f0: 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a  able(db, pTab);.
e800: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
e810: 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  }.  return pTab;
e820: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
e830: 56 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76  VDBE for the giv
e840: 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  en parser contex
e850: 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
e860: 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72   one if necessar
e870: 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  y..** If an erro
e880: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
e890: 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20   NULL and leave 
e8a0: 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  a message in pPa
e8b0: 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71  rse..*/.Vdbe *sq
e8c0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72  lite3GetVdbe(Par
e8d0: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56  se *pParse){.  V
e8e0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
e8f0: 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d  >pVdbe;.  if( v=
e900: 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50  =0 ){.    v = pP
e910: 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71  arse->pVdbe = sq
e920: 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28  lite3VdbeCreate(
e930: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
e940: 20 76 20 29 20 73 71 6c 69 74 65 33 56 64 62 65   v ) sqlite3Vdbe
e950: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 49 6e 69  AddOp0(v, OP_Ini
e960: 74 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72  t);.    if( pPar
e970: 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d 30  se->pToplevel==0
e980: 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a  .     && Optimiz
e990: 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61  ationEnabled(pPa
e9a0: 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 46  rse->db,SQLITE_F
e9b0: 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29 0a 20  actorOutConst). 
e9c0: 20 20 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72     ){.      pPar
e9d0: 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f  se->okConstFacto
e9e0: 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  r = 1;.    }..  
e9f0: 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a  }.  return v;.}.
ea00: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
ea10: 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  the iLimit and i
ea20: 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66  Offset fields of
ea30: 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73 65   the SELECT base
ea40: 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d  d on the.** pLim
ea50: 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65  it and pOffset e
ea60: 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69  xpressions.  pLi
ea70: 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20  mit and pOffset 
ea80: 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73  hold the express
ea90: 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70  ions.** that app
eaa0: 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69  ear in the origi
eab0: 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  nal SQL statemen
eac0: 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49  t after the LIMI
ead0: 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20  T and OFFSET.** 
eae0: 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55  keywords.  Or NU
eaf0: 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77  LL if those keyw
eb00: 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64  ords are omitted
eb10: 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  . iLimit and iOf
eb20: 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65  fset .** are the
eb30: 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20   integer memory 
eb40: 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  register numbers
eb50: 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73   for counters us
eb60: 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a  ed to compute .*
eb70: 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20  * the limit and 
eb80: 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65 72  offset.  If ther
eb90: 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e  e is no limit an
eba0: 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65  d/or offset, the
ebb0: 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64  n .** iLimit and
ebc0: 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67   iOffset are neg
ebd0: 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ative..**.** Thi
ebe0: 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65  s routine change
ebf0: 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  s the values of 
ec00: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
ec10: 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20  et only if.** a 
ec20: 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20  limit or offset 
ec30: 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c  is defined by pL
ec40: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
ec50: 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a  .  iLimit and.**
ec60: 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20   iOffset should 
ec70: 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65 74  have been preset
ec80: 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20   to appropriate 
ec90: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20 28  default values (
eca0: 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74  zero).** prior t
ecb0: 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
ecc0: 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
ecd0: 65 20 69 4f 66 66 73 65 74 20 72 65 67 69 73 74  e iOffset regist
ece0: 65 72 20 28 69 66 20 69 74 20 65 78 69 73 74 73  er (if it exists
ecf0: 29 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  ) is initialized
ed00: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a   to the value.**
ed10: 20 6f 66 20 74 68 65 20 4f 46 46 53 45 54 2e 20   of the OFFSET. 
ed20: 20 54 68 65 20 69 4c 69 6d 69 74 20 72 65 67 69   The iLimit regi
ed30: 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69  ster is initiali
ed40: 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52  zed to LIMIT.  R
ed50: 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73  egister.** iOffs
ed60: 65 74 2b 31 20 69 73 20 69 6e 69 74 69 61 6c 69  et+1 is initiali
ed70: 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46  zed to LIMIT+OFF
ed80: 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  SET..**.** Only 
ed90: 69 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20  if pLimit!=0 or 
eda0: 70 4f 66 66 73 65 74 21 3d 30 20 64 6f 20 74 68  pOffset!=0 do th
edb0: 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72  e limit register
edc0: 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e  s get.** redefin
edd0: 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41  ed.  The UNION A
ede0: 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73  LL operator uses
edf0: 20 74 68 69 73 20 70 72 6f 70 65 72 74 79 20 74   this property t
ee00: 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72  o force.** the r
ee10: 65 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65  euse of the same
ee20: 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65   limit and offse
ee30: 74 20 72 65 67 69 73 74 65 72 73 20 61 63 72 6f  t registers acro
ee40: 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53  ss multiple.** S
ee50: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
ee60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ee70: 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
ee80: 69 73 74 65 72 73 28 50 61 72 73 65 20 2a 70 50  isters(Parse *pP
ee90: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
eea0: 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20   int iBreak){.  
eeb0: 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69  Vdbe *v = 0;.  i
eec0: 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  nt iLimit = 0;. 
eed0: 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20   int iOffset;.  
eee0: 69 6e 74 20 61 64 64 72 31 2c 20 6e 3b 0a 20 20  int addr1, n;.  
eef0: 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20  if( p->iLimit ) 
ef00: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20  return;..  /* . 
ef10: 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61   ** "LIMIT -1" a
ef20: 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20  lways shows all 
ef30: 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20  rows.  There is 
ef40: 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f  some.  ** contro
ef50: 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74  versy about what
ef60: 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68   the correct beh
ef70: 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e  avior should be.
ef80: 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e  .  ** The curren
ef90: 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
efa0: 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d   interprets "LIM
efb0: 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20  IT 0" to mean.  
efc0: 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f  ** no rows..  */
efd0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
efe0: 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
eff0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
f000: 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e  Offset==0 || p->
f010: 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69  pLimit!=0 );.  i
f020: 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  f( p->pLimit ){.
f030: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
f040: 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73  iLimit = ++pPars
f050: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d  e->nMem;.    v =
f060: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
f070: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 61 73 73  pParse);.    ass
f080: 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 20  ert( v!=0 );.   
f090: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
f0a0: 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 69  IsInteger(p->pLi
f0b0: 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20  mit, &n) ){.    
f0c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f0d0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
f0e0: 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  r, n, iLimit);. 
f0f0: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
f100: 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e  ((v, "LIMIT coun
f110: 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 69 66  ter"));.      if
f120: 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( n==0 ){.      
f130: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f140: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
f150: 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  0, iBreak);.    
f160: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e 3d 30    }else if( n>=0
f170: 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f   && p->nSelectRo
f180: 77 3e 28 75 36 34 29 6e 20 29 7b 0a 20 20 20 20  w>(u64)n ){.    
f190: 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
f1a0: 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  w = n;.      }. 
f1b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f1c0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
f1d0: 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69  pParse, p->pLimi
f1e0: 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  t, iLimit);.    
f1f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f200: 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op1(v, OP_MustBe
f210: 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64  Int, iLimit); Vd
f220: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
f230: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
f240: 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e  ((v, "LIMIT coun
f250: 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71  ter"));.      sq
f260: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f270: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c  v, OP_IfZero, iL
f280: 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56  imit, iBreak); V
f290: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
f2a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
f2b0: 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  >pOffset ){.    
f2c0: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69    p->iOffset = i
f2d0: 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  Offset = ++pPars
f2e0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70  e->nMem;.      p
f2f0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20  Parse->nMem++;  
f300: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20   /* Allocate an 
f310: 65 78 74 72 61 20 72 65 67 69 73 74 65 72 20 66  extra register f
f320: 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20  or limit+offset 
f330: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
f340: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
f350: 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66   p->pOffset, iOf
f360: 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  fset);.      sql
f370: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
f380: 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
f390: 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f  iOffset); VdbeCo
f3a0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
f3b0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
f3c0: 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72   "OFFSET counter
f3d0: 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31  "));.      addr1
f3e0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
f3f0: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp1(v, OP_IfPos
f400: 2c 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65  , iOffset); Vdbe
f410: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
f420: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f430: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
f440: 65 72 2c 20 30 2c 20 69 4f 66 66 73 65 74 29 3b  er, 0, iOffset);
f450: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f460: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
f470: 64 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dr1);.      sqli
f480: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
f490: 20 4f 50 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c   OP_Add, iLimit,
f4a0: 20 69 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65   iOffset, iOffse
f4b0: 74 2b 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65  t+1);.      Vdbe
f4c0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d  Comment((v, "LIM
f4d0: 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20 20  IT+OFFSET"));.  
f4e0: 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
f4f0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
f500: 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4c 69 6d 69   OP_IfPos, iLimi
f510: 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
f520: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
f530: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f540: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20  OP_Integer, -1, 
f550: 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20  iOffset+1);.    
f560: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
f570: 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
f580: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69  .    }.  }.}..#i
f590: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f5a0: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
f5b0: 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  T./*.** Return t
f5c0: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  he appropriate c
f5d0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
f5e0: 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74  e for the iCol-t
f5f0: 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74  h column of.** t
f600: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f  he result set fo
f610: 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73  r the compound-s
f620: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
f630: 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  "p".  Return NUL
f640: 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  L if.** the colu
f650: 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c  mn has no defaul
f660: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
f670: 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ence..**.** The 
f680: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
f690: 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  ce for the compo
f6a0: 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61  und select is ta
f6b0: 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ken from the.** 
f6c0: 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f  left-most term o
f6d0: 66 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61  f the select tha
f6e0: 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e  t has a collatin
f6f0: 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73  g sequence..*/.s
f700: 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d  tatic CollSeq *m
f710: 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
f720: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
f730: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
f740: 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  iCol){.  CollSeq
f750: 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d   *pRet;.  if( p-
f760: 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70  >pPrior ){.    p
f770: 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  Ret = multiSelec
f780: 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
f790: 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c   p->pPrior, iCol
f7a0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
f7b0: 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pRet = 0;.  }.  
f7c0: 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20  assert( iCol>=0 
f7d0: 29 3b 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30  );.  if( pRet==0
f7e0: 20 26 26 20 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69   && iCol<p->pELi
f7f0: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
f800: 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45   pRet = sqlite3E
f810: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
f820: 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  e, p->pEList->a[
f830: 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20  iCol].pExpr);.  
f840: 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  }.  return pRet;
f850: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65  .}../*.** The se
f860: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70  lect statement p
f870: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
f880: 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
f890: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
f8a0: 43 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52  CT.** with an OR
f8b0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 54  DER BY clause. T
f8c0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  his function all
f8d0: 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75 72  ocates and retur
f8e0: 6e 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20  ns a KeyInfo.** 
f8f0: 73 74 72 75 63 74 75 72 65 20 73 75 69 74 61 62  structure suitab
f900: 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74  le for implement
f910: 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59  ing the ORDER BY
f920: 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
f930: 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66   hold the KeyInf
f940: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  o structure is o
f950: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
f960: 6c 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67  loc. The calling
f970: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
f980: 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
f990: 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68  ensuring that th
f9a0: 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20  is structure is 
f9b0: 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72  eventually.** fr
f9c0: 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b  eed..*/.static K
f9d0: 65 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c  eyInfo *multiSel
f9e0: 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66  ectOrderByKeyInf
f9f0: 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  o(Parse *pParse,
fa00: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
fa10: 6e 45 78 74 72 61 29 7b 0a 20 20 45 78 70 72 4c  nExtra){.  ExprL
fa20: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
fa30: 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69  p->pOrderBy;.  i
fa40: 6e 74 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d  nt nOrderBy = p-
fa50: 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
fa60: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
fa70: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
fa80: 4b 65 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20  KeyInfo *pRet = 
fa90: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
faa0: 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42 79  loc(db, nOrderBy
fab0: 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20 20 69  +nExtra, 1);.  i
fac0: 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 69  f( pRet ){.    i
fad0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
fae0: 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
faf0: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
fb00: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
fb10: 2a 70 49 74 65 6d 20 3d 20 26 70 4f 72 64 65 72  *pItem = &pOrder
fb20: 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  By->a[i];.      
fb30: 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 49  Expr *pTerm = pI
fb40: 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
fb50: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
fb60: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ;..      if( pTe
fb70: 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43  rm->flags & EP_C
fb80: 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
fb90: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
fba0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
fbb0: 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  rse, pTerm);.   
fbc0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fbd0: 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53    pColl = multiS
fbe0: 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
fbf0: 72 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75  rse, p, pItem->u
fc00: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31  .x.iOrderByCol-1
fc10: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
fc20: 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20  Coll==0 ) pColl 
fc30: 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
fc40: 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42  .        pOrderB
fc50: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a  y->a[i].pExpr =.
fc60: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
fc70: 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53  3ExprAddCollateS
fc80: 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70 54  tring(pParse, pT
fc90: 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  erm, pColl->zNam
fca0: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
fcb0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
fcc0: 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
fcd0: 62 6c 65 28 70 52 65 74 29 20 29 3b 0a 20 20 20  ble(pRet) );.   
fce0: 20 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69     pRet->aColl[i
fcf0: 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  ] = pColl;.     
fd00: 20 70 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65   pRet->aSortOrde
fd10: 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d  r[i] = pOrderBy-
fd20: 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
fd30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
fd40: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69  turn pRet;.}..#i
fd50: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
fd60: 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73  T_CTE./*.** This
fd70: 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
fd80: 65 73 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20  es VDBE code to 
fd90: 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e 74  compute the cont
fda0: 65 6e 74 20 6f 66 20 61 20 57 49 54 48 20 52 45  ent of a WITH RE
fdb0: 43 55 52 53 49 56 45 0a 2a 2a 20 71 75 65 72 79  CURSIVE.** query
fdc0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
fdd0: 0a 2a 2a 20 20 20 3c 72 65 63 75 72 73 69 76 65  .**   <recursive
fde0: 2d 74 61 62 6c 65 3e 20 41 53 20 28 3c 73 65 74  -table> AS (<set
fdf0: 75 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20  up-query> UNION 
fe00: 5b 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76 65  [ALL] <recursive
fe10: 2d 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20  -query>).**     
fe20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe30: 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
fe40: 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f  /             \_
fe50: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
fe60: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
fe70: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
fe80: 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20  pPrior          
fe90: 20 20 20 20 20 20 20 20 20 20 20 20 70 0a 2a 2a              p.**
fea0: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
feb0: 65 78 61 63 74 6c 79 20 6f 6e 65 20 72 65 66 65  exactly one refe
fec0: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 72 65 63  rence to the rec
fed0: 75 72 73 69 76 65 2d 74 61 62 6c 65 20 69 6e 20  ursive-table in 
fee0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
fef0: 2a 2a 20 6f 66 20 72 65 63 75 72 73 69 76 65 2d  ** of recursive-
ff00: 71 75 65 72 79 2c 20 6d 61 72 6b 65 64 20 77 69  query, marked wi
ff10: 74 68 20 74 68 65 20 53 72 63 4c 69 73 74 2d 3e  th the SrcList->
ff20: 61 5b 5d 2e 69 73 52 65 63 75 72 73 69 76 65 20  a[].isRecursive 
ff30: 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  flag..**.** The 
ff40: 73 65 74 75 70 2d 71 75 65 72 79 20 72 75 6e 73  setup-query runs
ff50: 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72 61 74   once to generat
ff60: 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 73 65 74  e an initial set
ff70: 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 67 6f   of rows that go
ff80: 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65 75 65  .** into a Queue
ff90: 20 74 61 62 6c 65 2e 20 20 52 6f 77 73 20 61 72   table.  Rows ar
ffa0: 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
ffb0: 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
ffc0: 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20   one by.** one. 
ffd0: 20 45 61 63 68 20 72 6f 77 20 65 78 74 72 61 63   Each row extrac
ffe0: 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 20 69  ted from Queue i
fff0: 73 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73  s output to pDes
10000 74 2e 20 20 54 68 65 6e 20 74 68 65 20 73 69 6e  t.  Then the sin
10010 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74 65 64  gle.** extracted
10020 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74 68 65   row (now in the
10030 20 69 43 75 72 72 65 6e 74 20 74 61 62 6c 65 29   iCurrent table)
10040 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e   becomes the con
10050 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72  tent of the.** r
10060 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 66  ecursive-table f
10070 6f 72 20 61 20 72 65 63 75 72 73 69 76 65 2d 71  or a recursive-q
10080 75 65 72 79 20 72 75 6e 2e 20 20 54 68 65 20 6f  uery run.  The o
10090 75 74 70 75 74 20 6f 66 20 74 68 65 20 72 65 63  utput of the rec
100a0 75 72 73 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20  ursive-query.** 
100b0 69 73 20 61 64 64 65 64 20 62 61 63 6b 20 69 6e  is added back in
100c0 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61 62  to the Queue tab
100d0 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74 68 65  le.  Then anothe
100e0 72 20 72 6f 77 20 69 73 20 65 78 74 72 61 63 74  r row is extract
100f0 65 64 20 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a  ed from Queue.**
10100 20 61 6e 64 20 74 68 65 20 69 74 65 72 61 74 69   and the iterati
10110 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74  on continues unt
10120 69 6c 20 74 68 65 20 51 75 65 75 65 20 74 61 62  il the Queue tab
10130 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a  le is empty..**.
10140 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 6f 75  ** If the compou
10150 6e 64 20 71 75 65 72 79 20 6f 70 65 72 61 74 6f  nd query operato
10160 72 20 69 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20  r is UNION then 
10170 6e 6f 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77  no duplicate row
10180 73 20 61 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e  s are ever.** in
10190 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20  serted into the 
101a0 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68  Queue table.  Th
101b0 65 20 69 44 69 73 74 69 6e 63 74 20 74 61 62 6c  e iDistinct tabl
101c0 65 20 6b 65 65 70 73 20 61 20 63 6f 70 79 20 6f  e keeps a copy o
101d0 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68  f all rows.** th
101e0 61 74 20 68 61 76 65 20 65 76 65 72 20 62 65 65  at have ever bee
101f0 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  n inserted into 
10200 51 75 65 75 65 20 61 6e 64 20 63 61 75 73 65 73  Queue and causes
10210 20 64 75 70 6c 69 63 61 74 65 73 20 74 6f 20 62   duplicates to b
10220 65 0a 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20  e.** discarded. 
10230 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   If the operator
10240 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74   is UNION ALL, t
10250 68 65 6e 20 64 75 70 6c 69 63 61 74 65 73 20 61  hen duplicates a
10260 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a  re allowed..** .
10270 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  ** If the query 
10280 68 61 73 20 61 6e 20 4f 52 44 45 52 20 42 59 2c  has an ORDER BY,
10290 20 74 68 65 6e 20 65 6e 74 72 69 65 73 20 69 6e   then entries in
102a0 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
102b0 20 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20   are kept in.** 
102c0 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 20 61  ORDER BY order a
102d0 6e 64 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  nd the first ent
102e0 72 79 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ry is extracted 
102f0 66 6f 72 20 65 61 63 68 20 63 79 63 6c 65 2e 20  for each cycle. 
10300 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f   Without.** an O
10310 52 44 45 52 20 42 59 2c 20 74 68 65 20 51 75 65  RDER BY, the Que
10320 75 65 20 74 61 62 6c 65 20 69 73 20 6a 75 73 74  ue table is just
10330 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49   a FIFO..**.** I
10340 66 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  f a LIMIT clause
10350 20 69 73 20 70 72 6f 76 69 64 65 64 2c 20 74 68   is provided, th
10360 65 6e 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e  en the iteration
10370 20 73 74 6f 70 73 20 61 66 74 65 72 20 4c 49 4d   stops after LIM
10380 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20  IT rows.** have 
10390 62 65 65 6e 20 6f 75 74 70 75 74 20 74 6f 20 70  been output to p
103a0 44 65 73 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f  Dest.  A LIMIT o
103b0 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20  f zero means to 
103c0 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77 73 20 61  output no rows a
103d0 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65  nd a.** negative
103e0 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20   LIMIT means to 
103f0 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e  output all rows.
10400 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c    If there is al
10410 73 6f 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61  so an OFFSET cla
10420 75 73 65 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f  use.** with a po
10430 73 69 74 69 76 65 20 76 61 6c 75 65 2c 20 74 68  sitive value, th
10440 65 6e 20 74 68 65 20 66 69 72 73 74 20 4f 46 46  en the first OFF
10450 53 45 54 20 6f 75 74 70 75 74 73 20 61 72 65 20  SET outputs are 
10460 64 69 73 63 61 72 64 65 64 20 72 61 74 68 65 72  discarded rather
10470 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67 20 73  .** than being s
10480 65 6e 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54  ent to pDest.  T
10490 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64  he LIMIT count d
104a0 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e  oes not begin un
104b0 74 69 6c 20 61 66 74 65 72 20 4f 46 46 53 45 54  til after OFFSET
104c0 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65 20 62 65  .** rows have be
104d0 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73  en skipped..*/.s
104e0 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
104f0 61 74 65 57 69 74 68 52 65 63 75 72 73 69 76 65  ateWithRecursive
10500 51 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a  Query(.  Parse *
10510 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
10520 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
10530 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
10540 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
10550 54 68 65 20 72 65 63 75 72 73 69 76 65 20 53 45  The recursive SE
10560 4c 45 43 54 20 74 6f 20 62 65 20 63 6f 64 65 64  LECT to be coded
10570 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
10580 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
10590 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
105a0 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
105b0 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
105c0 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20  rc = p->pSrc;   
105d0 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
105e0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 72 65 63  lause of the rec
105f0 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a  ursive query */.
10600 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e    int nCol = p->
10610 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20  pEList->nExpr;  
10620 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
10630 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 63 75  umns in the recu
10640 72 73 69 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20  rsive table */. 
10650 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
10660 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f  e->pVdbe;      /
10670 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
10680 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63  tatement under c
10690 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
106a0 20 53 65 6c 65 63 74 20 2a 70 53 65 74 75 70 20   Select *pSetup 
106b0 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f  = p->pPrior;   /
106c0 2a 20 54 68 65 20 73 65 74 75 70 20 71 75 65 72  * The setup quer
106d0 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  y */.  int addrT
106e0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
106f0 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
10700 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  he loop */.  int
10710 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42   addrCont, addrB
10720 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f  reak;      /* CO
10730 4e 54 49 4e 55 45 20 61 6e 64 20 42 52 45 41 4b  NTINUE and BREAK
10740 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a 20 20   addresses */.  
10750 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30  int iCurrent = 0
10760 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
10770 20 54 68 65 20 43 75 72 72 65 6e 74 20 74 61 62   The Current tab
10780 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43  le */.  int regC
10790 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20  urrent;         
107a0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
107b0 72 20 68 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e  r holding Curren
107c0 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  t table */.  int
107d0 20 69 51 75 65 75 65 3b 20 20 20 20 20 20 20 20   iQueue;        
107e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
107f0 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f  e Queue table */
10800 0a 20 20 69 6e 74 20 69 44 69 73 74 69 6e 63 74  .  int iDistinct
10810 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
10820 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20 75 6e   /* To ensure un
10830 69 71 75 65 20 72 65 73 75 6c 74 73 20 69 66 20  ique results if 
10840 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65  UNION */.  int e
10850 44 65 73 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b  Dest = SRT_Fifo;
10860 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
10870 74 6f 20 77 72 69 74 65 20 74 6f 20 51 75 65 75  to write to Queu
10880 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  e */.  SelectDes
10890 74 20 64 65 73 74 51 75 65 75 65 3b 20 20 20 20  t destQueue;    
108a0 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 44 65       /* SelectDe
108b0 73 74 20 74 61 72 67 65 74 74 69 6e 67 20 74 68  st targetting th
108c0 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f  e Queue table */
108d0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
108e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108f0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
10900 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
10910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10920 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
10930 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  de */.  ExprList
10940 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20   *pOrderBy;     
10950 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44        /* The ORD
10960 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
10970 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
10980 2a 70 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  *pOffset;       
10990 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49 54 20 61  /* Saved LIMIT a
109a0 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69  nd OFFSET */.  i
109b0 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20 72 65 67  nt regLimit, reg
109c0 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  Offset;      /* 
109d0 52 65 67 69 73 74 65 72 73 20 75 73 65 64 20 62  Registers used b
109e0 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  y LIMIT and OFFS
109f0 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61  ET */..  /* Obta
10a00 69 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  in authorization
10a10 20 74 6f 20 64 6f 20 61 20 72 65 63 75 72 73 69   to do a recursi
10a20 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 66  ve query */.  if
10a30 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
10a40 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
10a50 45 5f 52 45 43 55 52 53 49 56 45 2c 20 30 2c 20  E_RECURSIVE, 0, 
10a60 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  0, 0) ) return;.
10a70 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68  .  /* Process th
10a80 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  e LIMIT and OFFS
10a90 45 54 20 63 6c 61 75 73 65 73 2c 20 69 66 20 74  ET clauses, if t
10aa0 68 65 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 61  hey exist */.  a
10ab0 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74  ddrBreak = sqlit
10ac0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
10ad0 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d  v);.  computeLim
10ae0 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
10af0 73 65 2c 20 70 2c 20 61 64 64 72 42 72 65 61 6b  se, p, addrBreak
10b00 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d  );.  pLimit = p-
10b10 3e 70 4c 69 6d 69 74 3b 0a 20 20 70 4f 66 66 73  >pLimit;.  pOffs
10b20 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
10b30 0a 20 20 72 65 67 4c 69 6d 69 74 20 3d 20 70 2d  .  regLimit = p-
10b40 3e 69 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4f 66  >iLimit;.  regOf
10b50 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  fset = p->iOffse
10b60 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  t;.  p->pLimit =
10b70 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
10b80 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70  .  p->iLimit = p
10b90 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->iOffset = 0;. 
10ba0 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
10bb0 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c  OrderBy;..  /* L
10bc0 6f 63 61 74 65 20 74 68 65 20 63 75 72 73 6f 72  ocate the cursor
10bd0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 43   number of the C
10be0 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a  urrent table */.
10bf0 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59    for(i=0; ALWAY
10c00 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72 63 29 3b  S(i<pSrc->nSrc);
10c10 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
10c20 53 72 63 2d 3e 61 5b 69 5d 2e 69 73 52 65 63 75  Src->a[i].isRecu
10c30 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69  rsive ){.      i
10c40 43 75 72 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e  Current = pSrc->
10c50 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  a[i].iCursor;.  
10c60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
10c70 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
10c80 61 74 65 20 63 75 72 73 6f 72 73 20 6e 75 6d 62  ate cursors numb
10c90 65 72 73 20 66 6f 72 20 51 75 65 75 65 20 61 6e  ers for Queue an
10ca0 64 20 44 69 73 74 69 6e 63 74 2e 20 20 54 68 65  d Distinct.  The
10cb0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
10cc0 6f 72 0a 20 20 2a 2a 20 74 68 65 20 44 69 73 74  or.  ** the Dist
10cd0 69 6e 63 74 20 74 61 62 6c 65 20 6d 75 73 74 20  inct table must 
10ce0 62 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 67  be exactly one g
10cf0 72 65 61 74 65 72 20 74 68 61 6e 20 51 75 65 75  reater than Queu
10d00 65 20 69 6e 20 6f 72 64 65 72 0a 20 20 2a 2a 20  e in order.  ** 
10d10 66 6f 72 20 74 68 65 20 53 52 54 5f 44 69 73 74  for the SRT_Dist
10d20 46 69 66 6f 20 61 6e 64 20 53 52 54 5f 44 69 73  Fifo and SRT_Dis
10d30 74 51 75 65 75 65 20 64 65 73 74 69 6e 61 74 69  tQueue destinati
10d40 6f 6e 73 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a  ons to work. */.
10d50 20 20 69 51 75 65 75 65 20 3d 20 70 50 61 72 73    iQueue = pPars
10d60 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 66 28  e->nTab++;.  if(
10d70 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
10d80 20 29 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20   ){.    eDest = 
10d90 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f 44  pOrderBy ? SRT_D
10da0 69 73 74 51 75 65 75 65 20 3a 20 53 52 54 5f 44  istQueue : SRT_D
10db0 69 73 74 46 69 66 6f 3b 0a 20 20 20 20 69 44 69  istFifo;.    iDi
10dc0 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  stinct = pParse-
10dd0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65  >nTab++;.  }else
10de0 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f  {.    eDest = pO
10df0 72 64 65 72 42 79 20 3f 20 53 52 54 5f 51 75 65  rderBy ? SRT_Que
10e00 75 65 20 3a 20 53 52 54 5f 46 69 66 6f 3b 0a 20  ue : SRT_Fifo;. 
10e10 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65   }.  sqlite3Sele
10e20 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
10e30 51 75 65 75 65 2c 20 65 44 65 73 74 2c 20 69 51  Queue, eDest, iQ
10e40 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  ueue);..  /* All
10e50 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 66 6f  ocate cursors fo
10e60 72 20 43 75 72 72 65 6e 74 2c 20 51 75 65 75 65  r Current, Queue
10e70 2c 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20  , and Distinct. 
10e80 2a 2f 0a 20 20 72 65 67 43 75 72 72 65 6e 74 20  */.  regCurrent 
10e90 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
10ea0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
10eb0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
10ec0 50 73 65 75 64 6f 2c 20 69 43 75 72 72 65 6e 74  Pseudo, iCurrent
10ed0 2c 20 72 65 67 43 75 72 72 65 6e 74 2c 20 6e 43  , regCurrent, nC
10ee0 6f 6c 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  ol);.  if( pOrde
10ef0 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  rBy ){.    KeyIn
10f00 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6d  fo *pKeyInfo = m
10f10 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
10f20 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c  yKeyInfo(pParse,
10f30 20 70 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69   p, 1);.    sqli
10f40 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
10f50 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
10f60 6c 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65  l, iQueue, pOrde
10f70 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c  rBy->nExpr+2, 0,
10f80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10f90 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
10fa0 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
10fb0 46 4f 29 3b 0a 20 20 20 20 64 65 73 74 51 75 65  FO);.    destQue
10fc0 75 65 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  ue.pOrderBy = pO
10fd0 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b  rderBy;.  }else{
10fe0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10ff0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
11000 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65  nEphemeral, iQue
11010 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20  ue, nCol);.  }. 
11020 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
11030 20 22 51 75 65 75 65 20 74 61 62 6c 65 22 29 29   "Queue table"))
11040 3b 0a 20 20 69 66 28 20 69 44 69 73 74 69 6e 63  ;.  if( iDistinc
11050 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61 64 64 72  t ){.    p->addr
11060 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71  OpenEphm[0] = sq
11070 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11080 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
11090 72 61 6c 2c 20 69 44 69 73 74 69 6e 63 74 2c 20  ral, iDistinct, 
110a0 30 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c  0);.    p->selFl
110b0 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
110c0 68 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20  hemeral;.  }..  
110d0 2f 2a 20 44 65 74 61 63 68 20 74 68 65 20 4f 52  /* Detach the OR
110e0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 72  DER BY clause fr
110f0 6f 6d 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  om the compound 
11100 53 45 4c 45 43 54 20 2a 2f 0a 20 20 70 2d 3e 70  SELECT */.  p->p
11110 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20  OrderBy = 0;..  
11120 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
11130 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 74 75  ults of the setu
11140 70 2d 71 75 65 72 79 20 69 6e 20 51 75 65 75 65  p-query in Queue
11150 2e 20 2a 2f 0a 20 20 70 53 65 74 75 70 2d 3e 70  . */.  pSetup->p
11160 4e 65 78 74 20 3d 20 30 3b 0a 20 20 72 63 20 3d  Next = 0;.  rc =
11170 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
11180 50 61 72 73 65 2c 20 70 53 65 74 75 70 2c 20 26  Parse, pSetup, &
11190 64 65 73 74 51 75 65 75 65 29 3b 0a 20 20 70 53  destQueue);.  pS
111a0 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  etup->pNext = p;
111b0 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
111c0 20 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76   end_of_recursiv
111d0 65 5f 71 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46  e_query;..  /* F
111e0 69 6e 64 20 74 68 65 20 6e 65 78 74 20 72 6f 77  ind the next row
111f0 20 69 6e 20 74 68 65 20 51 75 65 75 65 20 61 6e   in the Queue an
11200 64 20 6f 75 74 70 75 74 20 74 68 61 74 20 72 6f  d output that ro
11210 77 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d  w */.  addrTop =
11220 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11230 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
11240 20 69 51 75 65 75 65 2c 20 61 64 64 72 42 72 65   iQueue, addrBre
11250 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
11260 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e  e(v);..  /* Tran
11270 73 66 65 72 20 74 68 65 20 6e 65 78 74 20 72 6f  sfer the next ro
11280 77 20 69 6e 20 51 75 65 75 65 20 6f 76 65 72 20  w in Queue over 
11290 74 6f 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20  to Current */.  
112a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
112b0 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  1(v, OP_NullRow,
112c0 20 69 43 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54   iCurrent); /* T
112d0 6f 20 72 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63  o reset column c
112e0 61 63 68 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f  ache */.  if( pO
112f0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71  rderBy ){.    sq
11300 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
11310 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51  v, OP_Column, iQ
11320 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  ueue, pOrderBy->
11330 6e 45 78 70 72 2b 31 2c 20 72 65 67 43 75 72 72  nExpr+1, regCurr
11340 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ent);.  }else{. 
11350 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11360 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61  dOp2(v, OP_RowDa
11370 74 61 2c 20 69 51 75 65 75 65 2c 20 72 65 67 43  ta, iQueue, regC
11380 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73  urrent);.  }.  s
11390 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
113a0 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69  (v, OP_Delete, i
113b0 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75  Queue);..  /* Ou
113c0 74 70 75 74 20 74 68 65 20 73 69 6e 67 6c 65 20  tput the single 
113d0 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20 2a  row in Current *
113e0 2f 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 73  /.  addrCont = s
113f0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
11400 62 65 6c 28 76 29 3b 0a 20 20 63 6f 64 65 4f 66  bel(v);.  codeOf
11410 66 73 65 74 28 76 2c 20 72 65 67 4f 66 66 73 65  fset(v, regOffse
11420 74 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20  t, addrCont);.  
11430 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
11440 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
11450 4c 69 73 74 2c 20 69 43 75 72 72 65 6e 74 2c 0a  List, iCurrent,.
11460 20 20 20 20 20 20 30 2c 20 30 2c 20 70 44 65 73        0, 0, pDes
11470 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64  t, addrCont, add
11480 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 72  rBreak);.  if( r
11490 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  egLimit ){.    s
114a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
114b0 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 72  (v, OP_IfZero, r
114c0 65 67 4c 69 6d 69 74 2c 20 61 64 64 72 42 72 65  egLimit, addrBre
114d0 61 6b 2c 20 2d 31 29 3b 0a 20 20 20 20 56 64 62  ak, -1);.    Vdb
114e0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
114f0 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  }.  sqlite3VdbeR
11500 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
11510 64 64 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20  ddrCont);..  /* 
11520 45 78 65 63 75 74 65 20 74 68 65 20 72 65 63 75  Execute the recu
11530 72 73 69 76 65 20 53 45 4c 45 43 54 20 74 61 6b  rsive SELECT tak
11540 69 6e 67 20 74 68 65 20 73 69 6e 67 6c 65 20 72  ing the single r
11550 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20 61 73  ow in Current as
11560 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  .  ** the value 
11570 66 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76  for the recursiv
11580 65 2d 74 61 62 6c 65 2e 20 53 74 6f 72 65 20 74  e-table. Store t
11590 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
115a0 65 20 51 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20  e Queue..  */.  
115b0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
115c0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
115d0 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 51  Parse, p, &destQ
115e0 75 65 75 65 29 3b 0a 20 20 61 73 73 65 72 74 28  ueue);.  assert(
115f0 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b   p->pPrior==0 );
11600 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70  .  p->pPrior = p
11610 53 65 74 75 70 3b 0a 0a 20 20 2f 2a 20 4b 65 65  Setup;..  /* Kee
11620 70 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 6c 6f  p running the lo
11630 6f 70 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65  op until the Que
11640 75 65 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20  ue is empty */. 
11650 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11660 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
11670 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71  , addrTop);.  sq
11680 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
11690 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65  Label(v, addrBre
116a0 61 6b 29 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63  ak);..end_of_rec
116b0 75 72 73 69 76 65 5f 71 75 65 72 79 3a 0a 20 20  ursive_query:.  
116c0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
116d0 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
116e0 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
116f0 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
11700 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70  pOrderBy;.  p->p
11710 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
11720 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
11730 4f 66 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e  Offset;.  return
11740 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
11750 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f  LITE_OMIT_CTE */
11760 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
11770 65 72 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69  erences */.stati
11780 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
11790 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73  tOrderBy(.  Pars
117a0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
117b0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
117c0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
117d0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
117e0 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
117f0 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
11800 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
11810 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
11820 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
11830 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
11840 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 0a 2f 2a 0a  ults */.);.../*.
11850 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11860 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f  is called to pro
11870 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  cess a compound 
11880 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a  query form from.
11890 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  ** two or more s
118a0 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73 20  eparate queries 
118b0 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49  using UNION, UNI
118c0 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20  ON ALL, EXCEPT, 
118d0 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a  or.** INTERSECT.
118e0 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73  **.** "p" points
118f0 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
11900 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75  st of the two qu
11910 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72  eries.  the quer
11920 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74  y on the.** left
11930 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20   is p->pPrior.  
11940 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63  The left query c
11950 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63  ould also be a c
11960 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a  ompound query.**
11970 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
11980 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
11990 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72   be called recur
119a0 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54  sively. .**.** T
119b0 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
119c0 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72  e total query ar
119d0 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  e to be written 
119e0 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69  into a destinati
119f0 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44  on.** of type eD
11a00 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74  est with paramet
11a10 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  er iParm..**.** 
11a20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73  Example 1:  Cons
11a30 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79  ider a three-way
11a40 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74   compound SQL st
11a50 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20  atement..**.**  
11a60 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
11a70 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t1 UNION SELECT
11a80 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e   b FROM t2 UNION
11a90 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
11aa0 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61  3.**.** This sta
11ab0 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
11ac0 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   up as follows:.
11ad0 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
11ae0 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20   c FROM t3.**   
11af0 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d     |.**      `--
11b00 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46  --->  SELECT b F
11b10 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20  ROM t2.**       
11b20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
11b30 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d               `--
11b40 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20  ---->  SELECT a 
11b50 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68  FROM t1.**.** Th
11b60 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20  e arrows in the 
11b70 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65  diagram above re
11b80 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65  present the Sele
11b90 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65  ct.pPrior pointe
11ba0 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73  r..** So if this
11bb0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
11bc0 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20  ed with p equal 
11bd0 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c  to the t3 query,
11be0 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20   then.** pPrior 
11bf0 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71  will be the t2 q
11c00 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c  uery.  p->op wil
11c10 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e  l be TK_UNION in
11c20 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
11c30 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65  * Notice that be
11c40 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79  cause of the way
11c50 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63   SQLite parses c
11c60 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c  ompound SELECTs,
11c70 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
11c80 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79  al selects alway
11c90 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66  s group from lef
11ca0 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73  t to right..*/.s
11cb0 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
11cc0 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
11cd0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
11ce0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
11cf0 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
11d00 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
11d10 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
11d20 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
11d30 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
11d40 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
11d50 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
11d60 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
11d70 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
11d80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
11d90 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20  /* Success code 
11da0 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e  from a subroutin
11db0 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
11dc0 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20  Prior;       /* 
11dd0 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69  Another SELECT i
11de0 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75  mmediately to ou
11df0 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65  r left */.  Vdbe
11e00 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
11e10 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
11e20 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20  de to this VDBE 
11e30 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
11e40 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c  dest;      /* Al
11e50 74 65 72 6e 61 74 69 76 65 20 64 61 74 61 20 64  ternative data d
11e60 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20  estination */.  
11e70 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20  Select *pDelete 
11e80 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f  = 0;  /* Chain o
11e90 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73  f simple selects
11ea0 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
11eb0 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
11ec0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
11ed0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
11ee0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11ef0 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e  MIT_EXPLAIN.  in
11f00 74 20 69 53 75 62 31 20 3d 20 30 3b 20 20 20 20  t iSub1 = 0;    
11f10 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66      /* EQP id of
11f20 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79   left-hand query
11f30 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 20   */.  int iSub2 
11f40 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45  = 0;        /* E
11f50 51 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68  QP id of right-h
11f60 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e  and query */.#en
11f70 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  dif..  /* Make s
11f80 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ure there is no 
11f90 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
11fa0 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f  T clause on prio
11fb0 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79  r SELECTs.  Only
11fc0 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28  .  ** the last (
11fd0 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45  right-most) SELE
11fe0 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73  CT in the series
11ff0 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44   may have an ORD
12000 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a  ER BY or LIMIT..
12010 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
12020 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b   && p->pPrior );
12030 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e    /* Calling fun
12040 63 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73  ction guarantees
12050 20 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20   this much */.  
12060 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46  assert( (p->selF
12070 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73  lags & SF_Recurs
12080 69 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70  ive)==0 || p->op
12090 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f  ==TK_ALL || p->o
120a0 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
120b0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
120c0 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e  ;.  pPrior = p->
120d0 70 50 72 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d  pPrior;.  dest =
120e0 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70   *pDest;.  if( p
120f0 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
12100 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
12110 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f  rorMsg(pParse,"O
12120 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73  RDER BY clause s
12130 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72  hould come after
12140 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c   %s not before",
12150 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e  .      selectOpN
12160 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
12170 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
12180 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
12190 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  nd;.  }.  if( pP
121a0 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  rior->pLimit ){.
121b0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
121c0 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49  Msg(pParse,"LIMI
121d0 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  T clause should 
121e0 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f  come after %s no
121f0 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20  t before",.     
12200 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
12210 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
12220 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
12230 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
12240 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  }..  v = sqlite3
12250 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
12260 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
12270 29 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20  );  /* The VDBE 
12280 61 6c 72 65 61 64 79 20 63 72 65 61 74 65 64 20  already created 
12290 62 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  by calling funct
122a0 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65  ion */..  /* Cre
122b0 61 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74  ate the destinat
122c0 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ion temporary ta
122d0 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  ble if necessary
122e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74  .  */.  if( dest
122f0 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65  .eDest==SRT_Ephe
12300 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65  mTab ){.    asse
12310 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
12320 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12330 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
12340 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74  nEphemeral, dest
12350 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c  .iSDParm, p->pEL
12360 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
12370 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
12380 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e  geP5(v, BTREE_UN
12390 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 64 65  ORDERED);.    de
123a0 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54  st.eDest = SRT_T
123b0 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  able;.  }..  /* 
123c0 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45  Make sure all SE
123d0 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73 74 61  LECTs in the sta
123e0 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20  tement have the 
123f0 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65  same number of e
12400 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20  lements.  ** in 
12410 74 68 65 69 72 20 72 65 73 75 6c 74 20 73 65 74  their result set
12420 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  s..  */.  assert
12430 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70  ( p->pEList && p
12440 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b  Prior->pEList );
12450 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74  .  if( p->pEList
12460 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d  ->nExpr!=pPrior-
12470 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
12480 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c  {.    if( p->sel
12490 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65  Flags & SF_Value
124a0 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
124b0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
124c0 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d  e, "all VALUES m
124d0 75 73 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  ust have the sam
124e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  e number of term
124f0 73 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  s");.    }else{.
12500 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
12510 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53  orMsg(pParse, "S
12520 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65  ELECTs to the le
12530 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20  ft and right of 
12540 25 73 22 0a 20 20 20 20 20 20 20 20 22 20 64 6f  %s".        " do
12550 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73 61   not have the sa
12560 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  me number of res
12570 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65  ult columns", se
12580 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
12590 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ));.    }.    rc
125a0 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
125b0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
125c0 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
125d0 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
125e0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
125f0 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29  & SF_Recursive )
12600 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 57 69  {.    generateWi
12610 74 68 52 65 63 75 72 73 69 76 65 51 75 65 72 79  thRecursiveQuery
12620 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
12630 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  t);.  }else.#end
12640 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e  if..  /* Compoun
12650 64 20 53 45 4c 45 43 54 73 20 74 68 61 74 20 68  d SELECTs that h
12660 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ave an ORDER BY 
12670 63 6c 61 75 73 65 20 61 72 65 20 68 61 6e 64 6c  clause are handl
12680 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 20  ed separately.. 
12690 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72   */.  if( p->pOr
126a0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74  derBy ){.    ret
126b0 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  urn multiSelectO
126c0 72 64 65 72 42 79 28 70 50 61 72 73 65 2c 20 70  rderBy(pParse, p
126d0 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73  , pDest);.  }els
126e0 65 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  e..  /* Generate
126f0 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65   code for the le
12700 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c  ft and right SEL
12710 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
12720 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70    */.  switch( p
12730 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
12740 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20   TK_ALL: {.     
12750 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20   int addr = 0;. 
12760 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b       int nLimit;
12770 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
12780 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29  pPrior->pLimit )
12790 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
127a0 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d  iLimit = p->iLim
127b0 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  it;.      pPrior
127c0 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69  ->iOffset = p->i
127d0 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 50  Offset;.      pP
127e0 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  rior->pLimit = p
127f0 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
12800 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20  pPrior->pOffset 
12810 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
12820 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
12830 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61  teger(iSub1, pPa
12840 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
12850 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
12860 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
12870 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64  arse, pPrior, &d
12880 65 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  est);.      p->p
12890 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
128a0 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
128b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
128c0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
128d0 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
128e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
128f0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
12900 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70     p->iLimit = p
12910 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20  Prior->iLimit;. 
12920 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20       p->iOffset 
12930 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65  = pPrior->iOffse
12940 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  t;.      if( p->
12950 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
12960 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
12970 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
12980 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d  _IfZero, p->iLim
12990 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  it); VdbeCoverag
129a0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64  e(v);.        Vd
129b0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a  beComment((v, "J
129c0 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d  ump ahead if LIM
129d0 49 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20  IT reached"));. 
129e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70       }.      exp
129f0 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
12a00 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
12a10 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
12a20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12a30 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
12a40 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
12a50 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
12a60 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
12a70 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
12a80 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
12a90 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
12aa0 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
12ab0 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e  Row += pPrior->n
12ac0 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
12ad0 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69   if( pPrior->pLi
12ae0 6d 69 74 0a 20 20 20 20 20 20 20 26 26 20 73 71  mit.       && sq
12af0 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
12b00 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  er(pPrior->pLimi
12b10 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20  t, &nLimit).    
12b20 20 20 20 26 26 20 6e 4c 69 6d 69 74 3e 30 20 26     && nLimit>0 &
12b30 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  & p->nSelectRow 
12b40 3e 20 28 75 36 34 29 6e 4c 69 6d 69 74 20 0a 20  > (u64)nLimit . 
12b50 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
12b60 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
12b70 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a  nLimit;.      }.
12b80 20 20 20 20 20 20 69 66 28 20 61 64 64 72 20 29        if( addr )
12b90 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
12ba0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
12bb0 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a   addr);.      }.
12bc0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12bd0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45   }.    case TK_E
12be0 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20  XCEPT:.    case 
12bf0 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20  TK_UNION: {.    
12c00 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20    int unionTab; 
12c10 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
12c20 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  ber of the tempo
12c30 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69  rary table holdi
12c40 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20  ng result */.   
12c50 20 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20     u8 op = 0;   
12c60 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
12c70 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
12c80 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65  s to apply to se
12c90 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  lf */.      int 
12ca0 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20  priorOp;     /* 
12cb0 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  The SRT_ operati
12cc0 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70  on to apply to p
12cd0 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a  rior selects */.
12ce0 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d        Expr *pLim
12cf0 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a  it, *pOffset; /*
12d00 20 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66   Saved values of
12d10 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70   p->nLimit and p
12d20 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20  ->nOffset */.   
12d30 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
12d40 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e     SelectDest un
12d50 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20  iondest;..      
12d60 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
12d70 3d 54 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20 20  =TK_EXCEPT );.  
12d80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
12d90 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
12da0 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d  .      priorOp =
12db0 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20   SRT_Union;.    
12dc0 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
12dd0 3d 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20  ==priorOp ){.   
12de0 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72       /* We can r
12df0 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79  euse a temporary
12e00 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64   table generated
12e10 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20   by a SELECT to 
12e20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  our.        ** r
12e30 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ight..        */
12e40 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
12e50 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b   p->pLimit==0 );
12e60 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c        /* Not all
12e70 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64  owed on leftward
12e80 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20   elements */.   
12e90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
12ea0 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20  pOffset==0 );   
12eb0 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64    /* Not allowed
12ec0 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65   on leftward ele
12ed0 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  ments */.       
12ee0 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74   unionTab = dest
12ef0 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20  .iSDParm;.      
12f00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
12f10 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  * We will need t
12f20 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e  o create our own
12f30 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
12f40 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20   to hold the.   
12f50 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64       ** intermed
12f60 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20  iate results..  
12f70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
12f80 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72   unionTab = pPar
12f90 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
12fa0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
12fb0 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
12fc0 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
12fd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12fe0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
12ff0 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  al, unionTab, 0)
13000 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
13010 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
13020 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[0] == -1 );.  
13030 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
13040 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b  nEphm[0] = addr;
13050 0a 20 20 20 20 20 20 20 20 66 69 6e 64 52 69 67  .        findRig
13060 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c  htmost(p)->selFl
13070 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
13080 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20  hemeral;.       
13090 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
130a0 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  st );.      }.. 
130b0 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
130c0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
130d0 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20  ts to our left. 
130e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
130f0 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70  sert( !pPrior->p
13100 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20  OrderBy );.     
13110 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
13120 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73  stInit(&uniondes
13130 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f  t, priorOp, unio
13140 6e 54 61 62 29 3b 0a 20 20 20 20 20 20 65 78 70  nTab);.      exp
13150 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
13160 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub1, pParse->iN
13170 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
13180 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13190 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
131a0 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73  Prior, &uniondes
131b0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
131c0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
131d0 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
131e0 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
131f0 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
13200 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61  rrent SELECT sta
13210 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a  tement.      */.
13220 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d        if( p->op=
13230 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20  =TK_EXCEPT ){.  
13240 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45        op = SRT_E
13250 78 63 65 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c  xcept;.      }el
13260 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
13270 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  rt( p->op==TK_UN
13280 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f  ION );.        o
13290 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  p = SRT_Union;. 
132a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
132b0 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
132c0 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
132d0 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
132e0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
132f0 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f   pOffset = p->pO
13300 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
13310 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
13320 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65     uniondest.eDe
13330 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 65  st = op;.      e
13340 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
13350 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e  (iSub2, pParse->
13360 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
13370 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13380 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
13390 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b   p, &uniondest);
133a0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
133b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
133c0 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79  ;.      /* Query
133d0 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73   flattening in s
133e0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d  qlite3Select() m
133f0 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70  ight refill p->p
13400 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20 20 2a  OrderBy..      *
13410 2a 20 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c  * Be sure to del
13420 65 74 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ete p->pOrderBy,
13430 20 74 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61   therefore, to a
13440 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65  void a memory le
13450 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ak. */.      sql
13460 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
13470 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  te(db, p->pOrder
13480 42 79 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65  By);.      pDele
13490 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  te = p->pPrior;.
134a0 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
134b0 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
134c0 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
134d0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  .      if( p->op
134e0 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 20 70 2d 3e  ==TK_UNION ) p->
134f0 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50  nSelectRow += pP
13500 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
13510 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
13520 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
13530 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
13540 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
13550 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  it;.      p->pOf
13560 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
13570 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
13580 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f  = 0;.      p->iO
13590 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20  ffset = 0;..    
135a0 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
135b0 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d   data in the tem
135c0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74  porary table int
135d0 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a  o whatever form.
135e0 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74        ** it is t
135f0 68 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79  hat we currently
13600 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a   need..      */.
13610 20 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e        assert( un
13620 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53 44  ionTab==dest.iSD
13630 50 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65  Parm || dest.eDe
13640 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20  st!=priorOp );. 
13650 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
13660 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a  est!=priorOp ){.
13670 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e          int iCon
13680 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
13690 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
136a0 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
136b0 20 20 20 20 20 20 20 20 69 66 28 20 64 65 73 74          if( dest
136c0 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  .eDest==SRT_Outp
136d0 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ut ){.          
136e0 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d  Select *pFirst =
136f0 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68   p;.          wh
13700 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72  ile( pFirst->pPr
13710 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70  ior ) pFirst = p
13720 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  First->pPrior;. 
13730 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74           generat
13740 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
13750 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e  rse, 0, pFirst->
13760 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  pEList);.       
13770 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65 61   }.        iBrea
13780 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
13790 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
137a0 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c       iCont = sql
137b0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
137c0 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  l(v);.        co
137d0 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
137e0 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
137f0 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
13800 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13810 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
13820 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b  unionTab, iBreak
13830 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
13840 76 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61  v);.        iSta
13850 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
13860 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
13870 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e          selectIn
13880 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
13890 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e  p, p->pEList, un
138a0 69 6f 6e 54 61 62 2c 0a 20 20 20 20 20 20 20 20  ionTab,.        
138b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138c0 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f  0, 0, &dest, iCo
138d0 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  nt, iBreak);.   
138e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
138f0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
13900 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  iCont);.        
13910 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13920 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e  2(v, OP_Next, un
13930 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b  ionTab, iStart);
13940 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
13950 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
13960 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
13970 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
13980 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13990 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
139a0 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30  ose, unionTab, 0
139b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
139c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
139d0 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72    default: asser
139e0 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54  t( p->op==TK_INT
139f0 45 52 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20  ERSECT ); {.    
13a00 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32    int tab1, tab2
13a10 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e  ;.      int iCon
13a20 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
13a30 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
13a40 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b  Limit, *pOffset;
13a50 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
13a60 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
13a70 74 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b  t intersectdest;
13a80 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a  .      int r1;..
13a90 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45        /* INTERSE
13aa0 43 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  CT is different 
13ab0 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20  from the others 
13ac0 73 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65  since it require
13ad0 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74  s.      ** two t
13ae0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
13af0 20 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69    Hence it has i
13b00 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65  ts own case.  Be
13b10 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20  gin.      ** by 
13b20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74  allocating the t
13b30 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65  ables we will ne
13b40 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
13b50 20 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65     tab1 = pParse
13b60 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
13b70 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab2 = pParse->n
13b80 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73  Tab++;.      ass
13b90 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
13ba0 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 61 64  ==0 );..      ad
13bb0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
13bc0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
13bd0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31  nEphemeral, tab1
13be0 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
13bf0 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  rt( p->addrOpenE
13c00 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a  phm[0] == -1 );.
13c10 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
13c20 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b  nEphm[0] = addr;
13c30 0a 20 20 20 20 20 20 66 69 6e 64 52 69 67 68 74  .      findRight
13c40 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67  most(p)->selFlag
13c50 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65  s |= SF_UsesEphe
13c60 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 61 73 73  meral;.      ass
13c70 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
13c80 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  ;..      /* Code
13c90 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20   the SELECTs to 
13ca0 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65  our left into te
13cb0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
13cc0 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ab1"..      */. 
13cd0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
13ce0 63 74 44 65 73 74 49 6e 69 74 28 26 69 6e 74 65  ctDestInit(&inte
13cf0 72 73 65 63 74 64 65 73 74 2c 20 53 52 54 5f 55  rsectdest, SRT_U
13d00 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20  nion, tab1);.   
13d10 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
13d20 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72  eger(iSub1, pPar
13d30 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
13d40 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
13d50 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
13d60 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e  rse, pPrior, &in
13d70 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20  tersectdest);.  
13d80 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
13d90 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
13da0 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
13db0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
13dc0 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ode the current 
13dd0 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70  SELECT into temp
13de0 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62  orary table "tab
13df0 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  2".      */.    
13e00 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
13e10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13e20 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
13e30 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab2, 0);.      
13e40 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
13e50 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31  penEphm[1] == -1
13e60 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64   );.      p->add
13e70 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61  rOpenEphm[1] = a
13e80 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ddr;.      p->pP
13e90 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
13ea0 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
13eb0 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  it;.      p->pLi
13ec0 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
13ed0 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
13ee0 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  set;.      p->pO
13ef0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
13f00 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69   intersectdest.i
13f10 53 44 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20  SDParm = tab2;. 
13f20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
13f30 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50  nteger(iSub2, pP
13f40 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
13f50 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
13f60 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
13f70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72  Parse, p, &inter
13f80 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20  sectdest);.     
13f90 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
13fa0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
13fb0 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
13fc0 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
13fd0 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
13fe0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  .      if( p->nS
13ff0 65 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d  electRow>pPrior-
14000 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d  >nSelectRow ) p-
14010 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50  >nSelectRow = pP
14020 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
14030 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
14040 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
14050 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
14060 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
14070 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  it;.      p->pOf
14080 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
14090 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
140a0 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20  te code to take 
140b0 74 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e  the intersection
140c0 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70   of the two temp
140d0 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74  orary.      ** t
140e0 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  ables..      */.
140f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
14100 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
14110 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
14120 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20  =SRT_Output ){. 
14130 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
14140 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20  First = p;.     
14150 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74     while( pFirst
14160 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73  ->pPrior ) pFirs
14170 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69  t = pFirst->pPri
14180 6f 72 3b 0a 20 20 20 20 20 20 20 20 67 65 6e 65  or;.        gene
14190 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
141a0 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73  pParse, 0, pFirs
141b0 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  t->pEList);.    
141c0 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b    }.      iBreak
141d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
141e0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
141f0 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65    iCont = sqlite
14200 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
14210 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65  );.      compute
14220 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
14230 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b  Parse, p, iBreak
14240 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14250 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14260 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69  _Rewind, tab1, i
14270 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
14280 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 72  rage(v);.      r
14290 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
142a0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
142b0 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
142c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
142d0 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61  v, OP_RowKey, ta
142e0 62 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  b1, r1);.      s
142f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
14300 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  Int(v, OP_NotFou
14310 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c  nd, tab2, iCont,
14320 20 72 31 2c 20 30 29 3b 20 56 64 62 65 43 6f 76   r1, 0); VdbeCov
14330 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
14340 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
14350 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
14360 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  );.      selectI
14370 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
14380 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74   p, p->pEList, t
14390 61 62 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ab1,.           
143a0 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
143b0 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69   &dest, iCont, i
143c0 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71  Break);.      sq
143d0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
143e0 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b  Label(v, iCont);
143f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
14400 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
14410 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72  ext, tab1, iStar
14420 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
14430 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
14440 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
14450 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
14460 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14470 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
14480 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  se, tab2, 0);.  
14490 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
144a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
144b0 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20  e, tab1, 0);.   
144c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
144d0 20 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e 43 6f    }..  explainCo
144e0 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20  mposite(pParse, 
144f0 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53  p->op, iSub1, iS
14500 75 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41  ub2, p->op!=TK_A
14510 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  LL);..  /* Compu
14520 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  te collating seq
14530 75 65 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a  uences used by .
14540 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74    ** temporary t
14550 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20  ables needed to 
14560 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
14570 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
14580 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b   ** Attach the K
14590 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
145a0 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72   to all temporar
145b0 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  y tables..  **. 
145c0 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e   ** This section
145d0 20 69 73 20 72 75 6e 20 62 79 20 74 68 65 20 72   is run by the r
145e0 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54  ight-most SELECT
145f0 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e   statement only.
14600 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  .  ** SELECT sta
14610 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c  tements to the l
14620 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20  eft always skip 
14630 74 68 69 73 20 70 61 72 74 2e 20 20 54 68 65 20  this part.  The 
14640 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20  right-most.  ** 
14650 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73  SELECT might als
14660 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74  o skip this part
14670 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52   if it has no OR
14680 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
14690 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74  d.  ** no temp t
146a0 61 62 6c 65 73 20 61 72 65 20 72 65 71 75 69 72  ables are requir
146b0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
146c0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
146d0 55 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b  UsesEphemeral ){
146e0 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
146f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14700 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
14710 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66  er */.    KeyInf
14720 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20  o *pKeyInfo;    
14730 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
14740 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
14750 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  r the result set
14760 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a   */.    Select *
14770 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
14780 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
14790 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c  ping through SEL
147a0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  ECT statements *
147b0 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a  /.    CollSeq **
147c0 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  apColl;         
147d0 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
147e0 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49  ng through pKeyI
147f0 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a  nfo->aColl[] */.
14800 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20      int nCol;   
14810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14820 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
14830 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74  olumns in result
14840 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73   set */..    ass
14850 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30  ert( p->pNext==0
14860 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70   );.    nCol = p
14870 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
14880 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
14890 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
148a0 6c 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29  loc(db, nCol, 1)
148b0 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79 49  ;.    if( !pKeyI
148c0 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nfo ){.      rc 
148d0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
148e0 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
148f0 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
14900 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20   }.    for(i=0, 
14910 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d  apColl=pKeyInfo-
14920 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20  >aColl; i<nCol; 
14930 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a  i++, apColl++){.
14940 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
14950 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
14960 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29  eq(pParse, p, i)
14970 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a  ;.      if( 0==*
14980 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  apColl ){.      
14990 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e    *apColl = db->
149a0 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
149b0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f   }.    }..    fo
149c0 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70  r(pLoop=p; pLoop
149d0 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
149e0 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f  Prior){.      fo
149f0 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29  r(i=0; i<2; i++)
14a00 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  {.        int ad
14a10 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72  dr = pLoop->addr
14a20 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20  OpenEphm[i];.   
14a30 20 20 20 20 20 69 66 28 20 61 64 64 72 3c 30 20       if( addr<0 
14a40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
14a50 49 66 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64  If [0] is unused
14a60 20 74 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73   then [1] is als
14a70 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65  o unused.  So we
14a80 20 63 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a   can.          *
14a90 2a 20 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20  * always safely 
14aa0 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73  abort as soon as
14ab0 20 74 68 65 20 66 69 72 73 74 20 75 6e 75 73 65   the first unuse
14ac0 64 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20  d slot is found 
14ad0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
14ae0 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72  ert( pLoop->addr
14af0 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b  OpenEphm[1]<0 );
14b00 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
14b10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14b20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
14b30 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c  hangeP2(v, addr,
14b40 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
14b50 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
14b60 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68  eP4(v, addr, (ch
14b70 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e  ar*)sqlite3KeyIn
14b80 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c  foRef(pKeyInfo),
14b90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f               P4_
14bb0 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
14bc0 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65    pLoop->addrOpe
14bd0 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20  nEphm[i] = -1;. 
14be0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
14bf0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
14c00 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a  nref(pKeyInfo);.
14c10 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63    }..multi_selec
14c20 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e  t_end:.  pDest->
14c30 69 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53 64  iSdst = dest.iSd
14c40 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64  st;.  pDest->nSd
14c50 73 74 20 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b  st = dest.nSdst;
14c60 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
14c70 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 65  Delete(db, pDele
14c80 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  te);.  return rc
14c90 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
14ca0 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
14cb0 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a  ND_SELECT */../*
14cc0 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70  .** Code an outp
14cd0 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f  ut subroutine fo
14ce0 72 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d  r a coroutine im
14cf0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
14d00 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  a.** SELECT stat
14d10 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
14d20 64 61 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75  data to be outpu
14d30 74 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  t is contained i
14d40 6e 20 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54  n pIn->iSdst.  T
14d50 68 65 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d  here are.** pIn-
14d60 3e 6e 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74  >nSdst columns t
14d70 6f 20 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44  o be output.  pD
14d80 65 73 74 20 69 73 20 77 68 65 72 65 20 74 68 65  est is where the
14d90 20 6f 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a   output should.*
14da0 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a  * be sent..**.**
14db0 20 72 65 67 52 65 74 75 72 6e 20 69 73 20 74 68   regReturn is th
14dc0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
14dd0 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  register holding
14de0 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a   the subroutine.
14df0 2a 2a 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  ** return addres
14e00 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50  s..**.** If regP
14e10 72 65 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73  rev>0 then it is
14e20 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73   the first regis
14e30 74 65 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20  ter in a vector 
14e40 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20  that.** records 
14e50 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74  the previous out
14e60 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65  put.  mem[regPre
14e70 76 5d 20 69 73 20 61 20 66 6c 61 67 20 74 68 61  v] is a flag tha
14e80 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66  t is false.** if
14e90 20 74 68 65 72 65 20 68 61 73 20 62 65 65 6e 20   there has been 
14ea0 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70  no previous outp
14eb0 75 74 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e  ut.  If regPrev>
14ec0 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a  0 then code is.*
14ed0 2a 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73  * generated to s
14ee0 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74  uppress duplicat
14ef0 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73  es.  pKeyInfo is
14f00 20 75 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72   used for compar
14f10 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a  ing.** keys..**.
14f20 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20  ** If the LIMIT 
14f30 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d  found in p->iLim
14f40 69 74 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a  it is reached, j
14f50 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ump immediately 
14f60 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f  to.** iBreak..*/
14f70 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65  .static int gene
14f80 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75  rateOutputSubrou
14f90 74 69 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70  tine(.  Parse *p
14fa0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
14fb0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
14fc0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
14fd0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
14fe0 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
14ff0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c  atement */.  Sel
15000 65 63 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20  ectDest *pIn,   
15010 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e       /* Coroutin
15020 65 20 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61  e supplying data
15030 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
15040 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a   *pDest,      /*
15050 20 57 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74   Where to send t
15060 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  he data */.  int
15070 20 72 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20   regReturn,     
15080 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
15090 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73  rn address regis
150a0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ter */.  int reg
150b0 50 72 65 76 2c 20 20 20 20 20 20 20 20 20 20 20  Prev,           
150c0 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73   /* Previous res
150d0 75 6c 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e  ult register.  N
150e0 6f 20 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20  o uniqueness if 
150f0 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  0 */.  KeyInfo *
15100 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f  pKeyInfo,      /
15110 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20  * For comparing 
15120 77 69 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e  with previous en
15130 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72  try */.  int iBr
15140 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  eak             
15150 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
15160 20 77 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49   we hit the LIMI
15170 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  T */.){.  Vdbe *
15180 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
15190 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  e;.  int iContin
151a0 75 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  ue;.  int addr;.
151b0 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  .  addr = sqlite
151c0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
151d0 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65  (v);.  iContinue
151e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
151f0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f  keLabel(v);..  /
15200 2a 20 53 75 70 70 72 65 73 73 20 64 75 70 6c 69  * Suppress dupli
15210 63 61 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c  cates for UNION,
15220 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54   EXCEPT, and INT
15230 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69  ERSECT .  */.  i
15240 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20  f( regPrev ){.  
15250 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20    int j1, j2;.  
15260 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64    j1 = sqlite3Vd
15270 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
15280 66 4e 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 20  fNot, regPrev); 
15290 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
152a0 0a 20 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65  .    j2 = sqlite
152b0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
152c0 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e  P_Compare, pIn->
152d0 69 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31  iSdst, regPrev+1
152e0 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20  , pIn->nSdst,.  
152f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15300 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
15310 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  r*)sqlite3KeyInf
15320 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20  oRef(pKeyInfo), 
15330 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
15340 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15350 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a  p3(v, OP_Jump, j
15360 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  2+2, iContinue, 
15370 6a 32 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72  j2+2); VdbeCover
15380 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
15390 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
153a0 76 2c 20 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69  v, j1);.    sqli
153b0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
153c0 20 4f 50 5f 43 6f 70 79 2c 20 70 49 6e 2d 3e 69   OP_Copy, pIn->i
153d0 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c  Sdst, regPrev+1,
153e0 20 70 49 6e 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a   pIn->nSdst-1);.
153f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15400 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
15410 67 65 72 2c 20 31 2c 20 72 65 67 50 72 65 76 29  ger, 1, regPrev)
15420 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  ;.  }.  if( pPar
15430 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
15440 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b  iled ) return 0;
15450 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20  ..  /* Suppress 
15460 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54  the first OFFSET
15470 20 65 6e 74 72 69 65 73 20 69 66 20 74 68 65 72   entries if ther
15480 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54 20 63  e is an OFFSET c
15490 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64  lause.  */.  cod
154a0 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
154b0 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65  ffset, iContinue
154c0 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 44  );..  switch( pD
154d0 65 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20  est->eDest ){.  
154e0 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72    /* Store the r
154f0 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73  esult as data us
15500 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79  ing a unique key
15510 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
15520 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
15530 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
15540 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ab: {.      int 
15550 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
15560 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
15570 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73        int r2 = s
15580 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
15590 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
155a0 74 65 73 74 63 61 73 65 28 20 70 44 65 73 74 2d  testcase( pDest-
155b0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c  >eDest==SRT_Tabl
155c0 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
155d0 61 73 65 28 20 70 44 65 73 74 2d 3e 65 44 65 73  ase( pDest->eDes
155e0 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
155f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15600 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
15610 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e  _MakeRecord, pIn
15620 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
15630 64 73 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  dst, r1);.      
15640 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15650 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
15660 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
15670 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r2);.      sql
15680 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
15690 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44 65  , OP_Insert, pDe
156a0 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c  st->iSDParm, r1,
156b0 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r2);.      sqli
156c0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
156d0 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
156e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
156f0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
15700 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20  Parse, r2);.    
15710 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
15720 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
15730 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r1);.      break
15740 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
15750 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
15760 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20  QUERY.    /* If 
15770 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20  we are creating 
15780 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78  a set for an "ex
15790 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
157a0 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20  .)" construct,. 
157b0 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
157c0 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e   should be a sin
157d0 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  gle item on the 
157e0 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68  stack.  Write th
157f0 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69  is.    ** item i
15800 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c  nto the set tabl
15810 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74  e with bogus dat
15820 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  a..    */.    ca
15830 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
15840 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20      int r1;.    
15850 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e    assert( pIn->n
15860 53 64 73 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Sdst==1 );.     
15870 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20   pDest->affSdst 
15880 3d 20 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  = .         sqli
15890 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
158a0 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  ty(p->pEList->a[
158b0 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d  0].pExpr, pDest-
158c0 3e 61 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20  >affSdst);.     
158d0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
158e0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
158f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15900 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
15910 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e  akeRecord, pIn->
15920 69 53 64 73 74 2c 20 31 2c 20 72 31 2c 20 26 70  iSdst, 1, r1, &p
15930 44 65 73 74 2d 3e 61 66 66 53 64 73 74 2c 31 29  Dest->affSdst,1)
15940 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
15950 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
15960 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  Change(pParse, p
15970 49 6e 2d 3e 69 53 64 73 74 2c 20 31 29 3b 0a 20  In->iSdst, 1);. 
15980 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15990 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
159a0 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69  Insert, pDest->i
159b0 53 44 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20  SDParm, r1);.   
159c0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
159d0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
159e0 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
159f0 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 20  k;.    }..#if 0 
15a00 20 2f 2a 20 4e 65 76 65 72 20 6f 63 63 75 72 73   /* Never occurs
15a10 20 6f 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20   on an ORDER BY 
15a20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 2f 2a 20  query */.    /* 
15a30 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74  If any row exist
15a40 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
15a50 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20  et, record that 
15a60 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a  fact and abort..
15a70 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
15a80 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20  SRT_Exists: {.  
15a90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15aa0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
15ab0 67 65 72 2c 20 31 2c 20 70 44 65 73 74 2d 3e 69  ger, 1, pDest->i
15ac0 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f  SDParm);.      /
15ad0 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
15ae0 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74  se will terminat
15af0 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  e the loop for u
15b00 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
15b10 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
15b20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
15b30 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63  s a scalar selec
15b40 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  t that is part o
15b50 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  f an expression,
15b60 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f   then.    ** sto
15b70 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
15b80 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
15b90 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  e memory cell an
15ba0 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20  d break out.    
15bb0 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c  ** of the scan l
15bc0 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
15bd0 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
15be0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
15bf0 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 29 3b 0a 20  n->nSdst==1 );. 
15c00 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
15c10 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
15c20 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65   pIn->iSdst, pDe
15c30 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b  st->iSDParm, 1);
15c40 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
15c50 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
15c60 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20  jump out of the 
15c70 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
15c80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15c90 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  }.#endif /* #ifn
15ca0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15cb0 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20  SUBQUERY */..   
15cc0 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20   /* The results 
15cd0 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20  are stored in a 
15ce0 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
15cf0 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61  sters.    ** sta
15d00 72 74 69 6e 67 20 61 74 20 70 44 65 73 74 2d 3e  rting at pDest->
15d10 69 53 64 73 74 2e 20 20 54 68 65 6e 20 74 68 65  iSdst.  Then the
15d20 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c   co-routine yiel
15d30 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ds..    */.    c
15d40 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  ase SRT_Coroutin
15d50 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e: {.      if( p
15d60 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29  Dest->iSdst==0 )
15d70 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d  {.        pDest-
15d80 3e 69 53 64 73 74 20 3d 20 73 71 6c 69 74 65 33  >iSdst = sqlite3
15d90 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
15da0 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  rse, pIn->nSdst)
15db0 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d  ;.        pDest-
15dc0 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53  >nSdst = pIn->nS
15dd0 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dst;.      }.   
15de0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
15df0 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70  deMove(pParse, p
15e00 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74  In->iSdst, pDest
15e10 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e  ->iSdst, pDest->
15e20 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
15e30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
15e40 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
15e50 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
15e60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
15e70 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65  ..    /* If none
15e80 20 6f 66 20 74 68 65 20 61 62 6f 76 65 2c 20 74   of the above, t
15e90 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 64  hen the result d
15ea0 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20  estination must 
15eb0 62 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75  be.    ** SRT_Ou
15ec0 74 70 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74  tput.  This rout
15ed0 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
15ee0 6c 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68  led with any oth
15ef0 65 72 0a 20 20 20 20 2a 2a 20 64 65 73 74 69 6e  er.    ** destin
15f00 61 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ation other than
15f10 20 74 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65   the ones handle
15f20 64 20 61 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f  d above or SRT_O
15f30 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  utput..    **.  
15f40 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74    ** For SRT_Out
15f50 70 75 74 2c 20 72 65 73 75 6c 74 73 20 61 72 65  put, results are
15f60 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71   stored in a seq
15f70 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
15f80 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68 65  rs.  .    ** The
15f90 6e 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52  n the OP_ResultR
15fa0 6f 77 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65  ow opcode is use
15fb0 64 20 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74  d to cause sqlit
15fc0 65 33 5f 73 74 65 70 28 29 20 74 6f 0a 20 20 20  e3_step() to.   
15fd0 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e   ** return the n
15fe0 65 78 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c  ext row of resul
15ff0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65  t..    */.    de
16000 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
16010 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44  ssert( pDest->eD
16020 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
16030 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16040 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16050 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d  _ResultRow, pIn-
16060 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
16070 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
16080 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
16090 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
160a0 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
160b0 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
160c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
160d0 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  }..  /* Jump to 
160e0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
160f0 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54  oop if the LIMIT
16100 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a   is reached..  *
16110 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  /.  if( p->iLimi
16120 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
16130 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
16140 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d  _IfZero, p->iLim
16150 69 74 2c 20 69 42 72 65 61 6b 2c 20 2d 31 29 3b  it, iBreak, -1);
16160 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
16170 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
16180 72 61 74 65 20 74 68 65 20 73 75 62 72 6f 75 74  rate the subrout
16190 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a  ine return.  */.
161a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
161b0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
161c0 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74  ntinue);.  sqlit
161d0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
161e0 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65  OP_Return, regRe
161f0 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e  turn);..  return
16200 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
16210 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6d 70  Alternative comp
16220 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f 64 65  ound select code
16230 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72 20 63   generator for c
16240 61 73 65 73 20 77 68 65 6e 20 74 68 65 72 65 0a  ases when there.
16250 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  ** is an ORDER B
16260 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  Y clause..**.** 
16270 57 65 20 61 73 73 75 6d 65 20 61 20 71 75 65 72  We assume a quer
16280 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
16290 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  ng form:.**.**  
162a0 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c      <selectA>  <
162b0 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65  operator>  <sele
162c0 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59 20 3c  ctB>  ORDER BY <
162d0 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a  orderbylist>.**.
162e0 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73  ** <operator> is
162f0 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c   one of UNION AL
16300 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54  L, UNION, EXCEPT
16310 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54 2e 20  , or INTERSECT. 
16320 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69 73 20   The idea.** is 
16330 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c 73 65  to code both <se
16340 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65  lectA> and <sele
16350 63 74 42 3e 20 77 69 74 68 20 74 68 65 20 4f 52  ctB> with the OR
16360 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73  DER BY clause as
16370 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e  .** co-routines.
16380 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65 20 63    Then run the c
16390 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20 70 61  o-routines in pa
163a0 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65  rallel and merge
163b0 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
163c0 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e  into the output.
163d0 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f    In addition to
163e0 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69   the two corouti
163f0 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65 6c 65  nes (called sele
16400 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63  ctA and.** selec
16410 74 42 29 20 74 68 65 72 65 20 61 72 65 20 37 20  tB) there are 7 
16420 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a  subroutines:.**.
16430 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20 20 4d  **    outA:    M
16440 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f  ove the output o
16450 66 20 74 68 65 20 73 65 6c 65 63 74 41 20 63 6f  f the selectA co
16460 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65  routine into the
16470 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20   output.**      
16480 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f         of the co
16490 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a  mpound query..**
164a0 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20 20 20  .**    outB:    
164b0 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20  Move the output 
164c0 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42 20 63  of the selectB c
164d0 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68  oroutine into th
164e0 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20  e output.**     
164f0 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63          of the c
16500 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 20  ompound query.  
16510 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20  (Only generated 
16520 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a  for UNION and.**
16530 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49               UNI
16540 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50 54 20  ON ALL.  EXCEPT 
16550 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54 20 6e  and INSERTSECT n
16560 65 76 65 72 20 6f 75 74 70 75 74 20 61 20 72 6f  ever output a ro
16570 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  w that.**       
16580 20 20 20 20 20 20 61 70 70 65 61 72 73 20 6f 6e        appears on
16590 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20  ly in B.).**.** 
165a0 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c     AltB:    Call
165b0 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
165c0 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20   data from both 
165d0 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41  coroutines and A
165e0 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71  <B..**.**    Aeq
165f0 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
16600 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
16610 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
16620 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a  ines and A==B..*
16630 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 20 20  *.**    AgtB:   
16640 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
16650 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20  re is data from 
16660 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20  both coroutines 
16670 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20  and A>B..**.**  
16680 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65    EofA:    Calle
16690 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65  d when data is e
166a0 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65  xhausted from se
166b0 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  lectA..**.**    
166c0 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  EofB:    Called 
166d0 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68  when data is exh
166e0 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65  austed from sele
166f0 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ctB..**.** The i
16700 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
16710 20 74 68 65 20 6c 61 74 74 65 72 20 66 69 76 65   the latter five
16720 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64 65 70   subroutines dep
16730 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a  end on which .**
16740 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 75   <operator> is u
16750 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20  sed:.**.**.**   
16760 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20            UNION 
16770 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e 49 4f  ALL         UNIO
16780 4e 20 20 20 20 20 20 20 20 20 20 20 20 45 58 43  N            EXC
16790 45 50 54 20 20 20 20 20 20 20 20 20 20 49 4e 54  EPT          INT
167a0 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20 20 20  ERSECT.**       
167b0 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
167c0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
167d0 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---  -----------
167e0 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---  -----------
167f0 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42  ------.**   AltB
16800 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20  :   outA, nextA 
16810 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
16820 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
16830 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41  tA         nextA
16840 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20  .**.**   AeqB:  
16850 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
16860 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20       nextA      
16870 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20         nextA    
16880 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
16890 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20  .**.**   AgtB:  
168a0 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
168b0 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
168c0 20 20 20 20 20 20 20 6e 65 78 74 42 20 20 20 20         nextB    
168d0 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a          nextB.**
168e0 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f 75  .**   EofA:   ou
168f0 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f  tB, nextB      o
16900 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
16910 20 20 20 20 68 61 6c 74 20 20 20 20 20 20 20 20      halt        
16920 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20       halt.**.** 
16930 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20    EofB:   outA, 
16940 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c  nextA      outA,
16950 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74   nextA       out
16960 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20  A, nextA        
16970 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74   halt.**.** In t
16980 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 61  he AltB, AeqB, a
16990 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75 74 69  nd AgtB subrouti
169a0 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41  nes, an EOF on A
169b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41   following nextA
169c0 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20 69 6d  .** causes an im
169d0 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20  mediate jump to 
169e0 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f 46 20  EofA and an EOF 
169f0 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e  on B following n
16a00 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a 20 61  extB causes.** a
16a10 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70  n immediate jump
16a20 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74 68 69   to EofB.  Withi
16a30 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c  n EofA and EofB,
16a40 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72   and EOF on entr
16a50 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  y or.** followin
16a60 67 20 6e 65 78 74 58 20 63 61 75 73 65 73 20 61  g nextX causes a
16a70 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64   jump to the end
16a80 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 70   of the select p
16a90 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a  rocessing..**.**
16aa0 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76   Duplicate remov
16ab0 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c  al in the UNION,
16ac0 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54   EXCEPT, and INT
16ad0 45 52 53 45 43 54 20 63 61 73 65 73 20 69 73 20  ERSECT cases is 
16ae0 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69  handled.** withi
16af0 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62  n the output sub
16b00 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 72 65  routine.  The re
16b10 67 50 72 65 76 20 72 65 67 69 73 74 65 72 20 73  gPrev register s
16b20 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70 72 65  et holds the pre
16b30 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75  viously.** outpu
16b40 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70  t value.  A comp
16b50 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61  arison is made a
16b60 67 61 69 6e 73 74 20 74 68 69 73 20 76 61 6c 75  gainst this valu
16b70 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74  e and the output
16b80 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64 20 69  .** is skipped i
16b90 66 20 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c  f the next resul
16ba0 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68 65 20  ts would be the 
16bb0 73 61 6d 65 20 61 73 20 74 68 65 20 70 72 65 76  same as the prev
16bc0 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ious..**.** The 
16bd0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70  implementation p
16be0 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d  lan is to implem
16bf0 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f 72 6f  ent the two coro
16c00 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76 65 6e  utines and seven
16c10 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 73 20  .** subroutines 
16c20 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75 74 20  first, then put 
16c30 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69  the control logi
16c40 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e  c at the bottom.
16c50 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a    Like this:.**.
16c60 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  **          goto
16c70 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41   Init.**     coA
16c80 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  : coroutine for 
16c90 6c 65 66 74 20 71 75 65 72 79 20 28 41 29 0a 2a  left query (A).*
16ca0 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75  *     coB: corou
16cb0 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 71  tine for right q
16cc0 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f  uery (B).**    o
16cd0 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20  utA: output one 
16ce0 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f  row of A.**    o
16cf0 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20  utB: output one 
16d00 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20  row of B (UNION 
16d10 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e  and UNION ALL on
16d20 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20  ly).**    EofA: 
16d30 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20  ....**    EofB: 
16d40 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20  ....**    AltB: 
16d50 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20  ....**    AeqB: 
16d60 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20  ....**    AgtB: 
16d70 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20  ....**    Init: 
16d80 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75  initialize corou
16d90 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 0a 2a  tine registers.*
16da0 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64  *          yield
16db0 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20 20   coA.**         
16dc0 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74 6f 20   if eof(A) goto 
16dd0 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20 20 20  EofA.**         
16de0 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20   yield coB.**   
16df0 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 42 29         if eof(B)
16e00 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20   goto EofB.**   
16e10 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20 41   Cmpr: Compare A
16e20 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  , B.**          
16e30 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71 42 2c  Jump AltB, AeqB,
16e40 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64   AgtB.**     End
16e50 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63  : ....**.** We c
16e60 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c 20  all AltB, AeqB, 
16e70 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20  AgtB, EofA, and 
16e80 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69 6e 65  EofB "subroutine
16e90 73 22 20 62 75 74 20 74 68 65 79 20 61 72 65 20  s" but they are 
16ea0 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20  not.** actually 
16eb0 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f 73  called using Gos
16ec0 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e  ub and they do n
16ed0 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f 66 41  ot Return.  EofA
16ee0 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a   and EofB loop.*
16ef0 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61  * until all data
16f00 20 69 73 20 65 78 68 61 75 73 74 65 64 20 74 68   is exhausted th
16f10 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 22  en jump to the "
16f20 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c 74 42  end" labe.  AltB
16f30 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41  , AeqB,.** and A
16f40 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69 74 68  gtB jump to eith
16f50 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20  er L2 or to one 
16f60 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e  of EofA or EofB.
16f70 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
16f80 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
16f90 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63 20 69  _SELECT.static i
16fa0 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  nt multiSelectOr
16fb0 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a  derBy(.  Parse *
16fc0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
16fd0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
16fe0 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
16ff0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
17000 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
17010 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
17020 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
17030 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
17040 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
17050 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
17060 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  s */.){.  int i,
17070 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
17080 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
17090 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50   */.  Select *pP
170a0 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41  rior;       /* A
170b0 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d  nother SELECT im
170c0 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72  mediately to our
170d0 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20   left */.  Vdbe 
170e0 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
170f0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
17100 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  e to this VDBE *
17110 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
17120 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44 65 73  estA;     /* Des
17130 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72  tination for cor
17140 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65  outine A */.  Se
17150 6c 65 63 74 44 65 73 74 20 64 65 73 74 42 3b 20  lectDest destB; 
17160 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69      /* Destinati
17170 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65  on for coroutine
17180 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41   B */.  int regA
17190 64 64 72 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  ddrA;         /*
171a0 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
171b0 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 63  r for select-A c
171c0 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
171d0 74 20 72 65 67 41 64 64 72 42 3b 20 20 20 20 20  t regAddrB;     
171e0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
171f0 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
17200 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-B coroutine *
17210 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65  /.  int addrSele
17220 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  ctA;      /* Add
17230 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
17240 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-A coroutine *
17250 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65  /.  int addrSele
17260 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  ctB;      /* Add
17270 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
17280 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-B coroutine *
17290 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 41 3b  /.  int regOutA;
172a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
172b0 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
172c0 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73  r the output-A s
172d0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
172e0 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20 20 20  nt regOutB;     
172f0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
17300 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65  register for the
17310 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75   output-B subrou
17320 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
17330 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20  drOutA;         
17340 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
17350 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f  e output-A subro
17360 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
17370 64 64 72 4f 75 74 42 20 3d 20 30 3b 20 20 20 20  ddrOutB = 0;    
17380 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
17390 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72  he output-B subr
173a0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
173b0 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20 20 20  addrEofA;       
173c0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
173d0 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65 78 68  the select-A-exh
173e0 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e  austed subroutin
173f0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45  e */.  int addrE
17400 6f 66 41 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a 20  ofA_noB;     /* 
17410 41 6c 74 65 72 6e 61 74 65 20 61 64 64 72 45 6f  Alternate addrEo
17420 66 41 20 69 66 20 42 20 69 73 20 75 6e 69 6e 69  fA if B is unini
17430 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e  tialized */.  in
17440 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20  t addrEofB;     
17450 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
17460 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65  f the select-B-e
17470 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74  xhausted subrout
17480 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
17490 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f  rAltB;         /
174a0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
174b0 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20   A<B subroutine 
174c0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71  */.  int addrAeq
174d0 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
174e0 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d  dress of the A==
174f0 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
17500 20 20 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20    int addrAgtB; 
17510 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
17520 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75  ss of the A>B su
17530 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
17540 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20  t regLimitA;    
17550 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67      /* Limit reg
17560 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
17570 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c  -A */.  int regL
17580 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a  imitB;        /*
17590 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20   Limit register 
175a0 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a  for select-A */.
175b0 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20    int regPrev;  
175c0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e          /* A ran
175d0 67 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ge of registers 
175e0 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73  to hold previous
175f0 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74   output */.  int
17600 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20   savedLimit;    
17610 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75     /* Saved valu
17620 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a  e of p->iLimit *
17630 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66  /.  int savedOff
17640 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76  set;      /* Sav
17650 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69  ed value of p->i
17660 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  Offset */.  int 
17670 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20  labelCmpr;      
17680 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74    /* Label for t
17690 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
176a0 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20  merge algorithm 
176b0 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e  */.  int labelEn
176c0 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61  d;         /* La
176d0 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20  bel for the end 
176e0 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53  of the overall S
176f0 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20  ELECT stmt */.  
17700 69 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20  int j1;         
17710 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e        /* Jump in
17720 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20  structions that 
17730 67 65 74 20 72 65 74 61 72 67 65 74 74 65 64 20  get retargetted 
17740 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  */.  int op;    
17750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
17760 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f  e of TK_ALL, TK_
17770 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54  UNION, TK_EXCEPT
17780 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a  , TK_INTERSECT *
17790 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
177a0 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d  yDup = 0; /* Com
177b0 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74  parison informat
177c0 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74  ion for duplicat
177d0 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b  e removal */.  K
177e0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67  eyInfo *pKeyMerg
177f0 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73  e;   /* Comparis
17800 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  on information f
17810 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20  or merging rows 
17820 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
17830 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ;          /* Da
17840 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
17850 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  n */.  ExprList 
17860 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20  *pOrderBy;   /* 
17870 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
17880 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72  use */.  int nOr
17890 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f  derBy;         /
178a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
178b0 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
178c0 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
178d0 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20  t *aPermute;    
178e0 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66      /* Mapping f
178f0 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72  rom ORDER BY ter
17900 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74  ms to result set
17910 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e   columns */.#ifn
17920 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17930 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53  EXPLAIN.  int iS
17940 75 62 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  ub1;            
17950 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66  /* EQP id of lef
17960 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a  t-hand query */.
17970 20 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20 20    int iSub2;    
17980 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69          /* EQP i
17990 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20  d of right-hand 
179a0 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a  query */.#endif.
179b0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
179c0 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61  rderBy!=0 );.  a
179d0 73 73 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d  ssert( pKeyDup==
179e0 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64  0 ); /* "Managed
179f0 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69  " code needs thi
17a00 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33 38 32  s.  Ticket #3382
17a10 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72  . */.  db = pPar
17a20 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50  se->db;.  v = pP
17a30 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
17a40 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20  ssert( v!=0 );  
17a50 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20       /* Already 
17a60 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72  thrown the error
17a70 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66   if VDBE alloc f
17a80 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c  ailed */.  label
17a90 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
17aa0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
17ab0 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c   labelCmpr = sql
17ac0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
17ad0 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74  l(v);...  /* Pat
17ae0 63 68 20 75 70 20 74 68 65 20 4f 52 44 45 52 20  ch up the ORDER 
17af0 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  BY clause.  */. 
17b00 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20   op = p->op;  . 
17b10 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
17b20 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ior;.  assert( p
17b30 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d  Prior->pOrderBy=
17b40 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79  =0 );.  pOrderBy
17b50 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
17b60 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
17b70 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79  By );.  nOrderBy
17b80 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
17b90 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70  pr;..  /* For op
17ba0 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68  erators other th
17bb0 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20  an UNION ALL we 
17bc0 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  have to make sur
17bd0 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20  e that.  ** the 
17be0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
17bf0 63 6f 76 65 72 73 20 65 76 65 72 79 20 74 65 72  covers every ter
17c00 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  m of the result 
17c10 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74  set.  Add.  ** t
17c20 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45  erms to the ORDE
17c30 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e  R BY clause as n
17c40 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
17c50 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20   if( op!=TK_ALL 
17c60 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ){.    for(i=1; 
17c70 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
17c80 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c  ==0 && i<=p->pEL
17c90 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
17ca0 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  {.      struct E
17cb0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
17cc0 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  tem;.      for(j
17cd0 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72  =0, pItem=pOrder
17ce0 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42  By->a; j<nOrderB
17cf0 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  y; j++, pItem++)
17d00 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
17d10 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
17d20 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20  derByCol>0 );.  
17d30 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
17d40 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
17d50 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==i ) break;.   
17d60 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
17d70 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ==nOrderBy ){.  
17d80 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
17d90 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
17da0 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30  b, TK_INTEGER, 0
17db0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
17dc0 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
17dd0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
17de0 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67        pNew->flag
17df0 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65  s |= EP_IntValue
17e00 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
17e10 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20  u.iValue = i;.  
17e20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d        pOrderBy =
17e30 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
17e40 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
17e50 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a  OrderBy, pNew);.
17e60 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 64          if( pOrd
17e70 65 72 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d  erBy ) pOrderBy-
17e80 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 75  >a[nOrderBy++].u
17e90 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d  .x.iOrderByCol =
17ea0 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d   (u16)i;.      }
17eb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
17ec0 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d   Compute the com
17ed0 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74  parison permutat
17ee0 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20  ion and keyinfo 
17ef0 74 68 61 74 20 69 73 20 75 73 65 64 20 77 69 74  that is used wit
17f00 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75  h.  ** the permu
17f10 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 64  tation used to d
17f20 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
17f30 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66  next.  ** row of
17f40 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66   results comes f
17f50 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73  rom selectA or s
17f60 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64  electB.  Also ad
17f70 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20  d explicit.  ** 
17f80 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68  collations to th
17f90 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
17fa0 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20  e terms so that 
17fb0 77 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72  when the subquer
17fc0 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ies.  ** to the 
17fd0 72 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65  right and the le
17fe0 66 74 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ft are evaluated
17ff0 2c 20 74 68 65 79 20 75 73 65 20 74 68 65 20 63  , they use the c
18000 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c  orrect.  ** coll
18010 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50  ation..  */.  aP
18020 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33  ermute = sqlite3
18030 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
18040 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f 72 64  sizeof(int)*nOrd
18050 65 72 42 79 29 3b 0a 20 20 69 66 28 20 61 50 65  erBy);.  if( aPe
18060 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 73 74 72  rmute ){.    str
18070 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
18080 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 66 6f  m *pItem;.    fo
18090 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72  r(i=0, pItem=pOr
180a0 64 65 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64  derBy->a; i<nOrd
180b0 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  erBy; i++, pItem
180c0 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
180d0 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  t( pItem->u.x.iO
180e0 72 64 65 72 42 79 43 6f 6c 3e 30 0a 20 20 20 20  rderByCol>0.    
180f0 20 20 20 20 20 20 26 26 20 70 49 74 65 6d 2d 3e        && pItem->
18100 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3c  u.x.iOrderByCol<
18110 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  =p->pEList->nExp
18120 72 20 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d  r );.      aPerm
18130 75 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e  ute[i] = pItem->
18140 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
18150 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  - 1;.    }.    p
18160 4b 65 79 4d 65 72 67 65 20 3d 20 6d 75 6c 74 69  KeyMerge = multi
18170 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79  SelectOrderByKey
18180 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20  Info(pParse, p, 
18190 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
181a0 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a   pKeyMerge = 0;.
181b0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61    }..  /* Reatta
181c0 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ch the ORDER BY 
181d0 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 71 75  clause to the qu
181e0 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  ery..  */.  p->p
181f0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
18200 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f  By;.  pPrior->pO
18210 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
18220 45 78 70 72 4c 69 73 74 44 75 70 28 70 50 61 72  ExprListDup(pPar
18230 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42 79  se->db, pOrderBy
18240 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  , 0);..  /* Allo
18250 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20  cate a range of 
18260 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
18270 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65 79 49  ers and the KeyI
18280 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20  nfo needed.  ** 
18290 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20 74 68  for the logic th
182a0 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70 6c 69  at removes dupli
182b0 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f 77 73  cate result rows
182c0 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f   when the.  ** o
182d0 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e  perator is UNION
182e0 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54  , EXCEPT, or INT
182f0 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f 74 20  ERSECT (but not 
18300 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f  UNION ALL)..  */
18310 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
18320 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72 65 76  L ){.    regPrev
18330 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
18340 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70     int nExpr = p
18350 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
18360 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72  .    assert( nOr
18370 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20  derBy>=nExpr || 
18380 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
18390 20 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76 20   );.    regPrev 
183a0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
183b0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
183c0 65 6d 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a 20  em += nExpr+1;. 
183d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
183e0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
183f0 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76 29 3b  er, 0, regPrev);
18400 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d 20 73  .    pKeyDup = s
18410 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
18420 6f 63 28 64 62 2c 20 6e 45 78 70 72 2c 20 31 29  oc(db, nExpr, 1)
18430 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 44 75  ;.    if( pKeyDu
18440 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  p ){.      asser
18450 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
18460 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65  oIsWriteable(pKe
18470 79 44 75 70 29 20 29 3b 0a 20 20 20 20 20 20 66  yDup) );.      f
18480 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b  or(i=0; i<nExpr;
18490 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
184a0 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d  KeyDup->aColl[i]
184b0 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
184c0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c  llSeq(pParse, p,
184d0 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65   i);.        pKe
184e0 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72  yDup->aSortOrder
184f0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [i] = 0;.      }
18500 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f  .    }.  }. .  /
18510 2a 20 53 65 70 61 72 61 74 65 20 74 68 65 20 6c  * Separate the l
18520 65 66 74 20 61 6e 64 20 74 68 65 20 72 69 67 68  eft and the righ
18530 74 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65  t query from one
18540 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20   another.  */.  
18550 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
18560 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d   pPrior->pNext =
18570 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73   0;.  sqlite3Res
18580 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79  olveOrderGroupBy
18590 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
185a0 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22  OrderBy, "ORDER"
185b0 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d  );.  if( pPrior-
185c0 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20  >pPrior==0 ){.  
185d0 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
185e0 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61  OrderGroupBy(pPa
185f0 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 50 72  rse, pPrior, pPr
18600 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22  ior->pOrderBy, "
18610 4f 52 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20  ORDER");.  }..  
18620 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c  /* Compute the l
18630 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 2a  imit registers *
18640 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  /.  computeLimit
18650 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
18660 2c 20 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  , p, labelEnd);.
18670 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
18680 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b  && op==TK_ALL ){
18690 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d  .    regLimitA =
186a0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
186b0 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d  .    regLimitB =
186c0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
186d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
186e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
186f0 79 2c 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20  y, p->iOffset ? 
18700 70 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70  p->iOffset+1 : p
18710 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20  ->iLimit,.      
18720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18730 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 4c              regL
18740 69 6d 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69  imitA);.    sqli
18750 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18760 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d   OP_Copy, regLim
18770 69 74 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b  itA, regLimitB);
18780 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
18790 67 4c 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d  gLimitA = regLim
187a0 69 74 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  itB = 0;.  }.  s
187b0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
187c0 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
187d0 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  .  p->pLimit = 0
187e0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
187f0 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66  elete(db, p->pOf
18800 66 73 65 74 29 3b 0a 20 20 70 2d 3e 70 4f 66 66  fset);.  p->pOff
18810 73 65 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41  set = 0;..  regA
18820 64 64 72 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ddrA = ++pParse-
18830 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72  >nMem;.  regAddr
18840 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  B = ++pParse->nM
18850 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20  em;.  regOutA = 
18860 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
18870 20 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50    regOutB = ++pP
18880 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71  arse->nMem;.  sq
18890 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
188a0 6e 69 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f  nit(&destA, SRT_
188b0 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
188c0 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  drA);.  sqlite3S
188d0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
188e0 65 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74  estB, SRT_Corout
188f0 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a  ine, regAddrB);.
18900 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
18910 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76   coroutine to ev
18920 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43  aluate the SELEC
18930 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74  T statement to t
18940 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20  he.  ** left of 
18950 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65  the compound ope
18960 72 61 74 6f 72 20 2d 20 74 68 65 20 22 41 22 20  rator - the "A" 
18970 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 61  select..  */.  a
18980 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c  ddrSelectA = sql
18990 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
189a0 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 6a 31  ddr(v) + 1;.  j1
189b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
189c0 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
189d0 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
189e0 72 41 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63  rA, 0, addrSelec
189f0 74 41 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65  tA);.  VdbeComme
18a00 6e 74 28 28 76 2c 20 22 6c 65 66 74 20 53 45 4c  nt((v, "left SEL
18a10 45 43 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72  ECT"));.  pPrior
18a20 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69  ->iLimit = regLi
18a30 6d 69 74 41 3b 0a 20 20 65 78 70 6c 61 69 6e 53  mitA;.  explainS
18a40 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c  etInteger(iSub1,
18a50 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
18a60 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74  lectId);.  sqlit
18a70 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
18a80 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 41 29   pPrior, &destA)
18a90 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
18aa0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43  ddOp1(v, OP_EndC
18ab0 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
18ac0 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rA);.  sqlite3Vd
18ad0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31  beJumpHere(v, j1
18ae0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
18af0 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f  e a coroutine to
18b00 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45   evaluate the SE
18b10 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f  LECT statement o
18b20 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68  n .  ** the righ
18b30 74 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c 65  t - the "B" sele
18b40 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65  ct.  */.  addrSe
18b50 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33 56  lectB = sqlite3V
18b60 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
18b70 29 20 2b 20 31 3b 0a 20 20 6a 31 20 3d 20 73 71  ) + 1;.  j1 = sq
18b80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
18b90 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74  v, OP_InitCorout
18ba0 69 6e 65 2c 20 72 65 67 41 64 64 72 42 2c 20 30  ine, regAddrB, 0
18bb0 2c 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a  , addrSelectB);.
18bc0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
18bd0 2c 20 22 72 69 67 68 74 20 53 45 4c 45 43 54 22  , "right SELECT"
18be0 29 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74  ));.  savedLimit
18bf0 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20   = p->iLimit;.  
18c00 73 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d  savedOffset = p-
18c10 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69  >iOffset;.  p->i
18c20 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74  Limit = regLimit
18c30 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20  B;.  p->iOffset 
18c40 3d 20 30 3b 20 20 0a 20 20 65 78 70 6c 61 69 6e  = 0;  .  explain
18c50 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32  SetInteger(iSub2
18c60 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
18c70 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69  electId);.  sqli
18c80 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
18c90 2c 20 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20  , p, &destB);.  
18ca0 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65  p->iLimit = save
18cb0 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66  dLimit;.  p->iOf
18cc0 66 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73  fset = savedOffs
18cd0 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  et;.  sqlite3Vdb
18ce0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e  eAddOp1(v, OP_En
18cf0 64 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  dCoroutine, regA
18d00 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  ddrB);..  /* Gen
18d10 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
18d20 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
18d30 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
18d40 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a 20 73 65  of the A.  ** se
18d50 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74  lect as the next
18d60 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74   output row of t
18d70 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
18d80 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  ct..  */.  VdbeN
18d90 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
18da0 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66  Output routine f
18db0 6f 72 20 41 22 29 29 3b 0a 20 20 61 64 64 72 4f  or A"));.  addrO
18dc0 75 74 41 20 3d 20 67 65 6e 65 72 61 74 65 4f 75  utA = generateOu
18dd0 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70  tputSubroutine(p
18de0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
18df0 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74          p, &dest
18e00 41 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74  A, pDest, regOut
18e10 41 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  A,.             
18e20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65      regPrev, pKe
18e30 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  yDup, labelEnd);
18e40 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  .  .  /* Generat
18e50 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
18e60 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20  hat outputs the 
18e70 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74  current row of t
18e80 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74  he B.  ** select
18e90 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74   as the next out
18ea0 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63  put row of the c
18eb0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a  ompound select..
18ec0 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
18ed0 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  K_ALL || op==TK_
18ee0 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62  UNION ){.    Vdb
18ef0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
18f00 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65   "Output routine
18f10 20 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20 61   for B"));.    a
18f20 64 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72 61  ddrOutB = genera
18f30 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
18f40 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  ne(pParse,.     
18f50 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26              p, &
18f60 64 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65  destB, pDest, re
18f70 67 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20 20  gOutB,.         
18f80 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c          regPrev,
18f90 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45   pKeyDup, labelE
18fa0 6e 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nd);.  }.  sqlit
18fb0 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
18fc0 4b 65 79 44 75 70 29 3b 0a 0a 20 20 2f 2a 20 47  KeyDup);..  /* G
18fd0 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
18fe0 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e  tine to run when
18ff0 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f   the results fro
19000 6d 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20  m select A.  ** 
19010 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e  are exhausted an
19020 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73  d only data in s
19030 65 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73 2e  elect B remains.
19040 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
19050 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d  TK_EXCEPT || op=
19060 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b  =TK_INTERSECT ){
19070 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f  .    addrEofA_no
19080 42 20 3d 20 61 64 64 72 45 6f 66 41 20 3d 20 6c  B = addrEofA = l
19090 61 62 65 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73 65  abelEnd;.  }else
190a0 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70  {  .    VdbeNoop
190b0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66  Comment((v, "eof
190c0 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -A subroutine"))
190d0 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d  ;.    addrEofA =
190e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
190f0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
19100 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74  regOutB, addrOut
19110 42 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41  B);.    addrEofA
19120 5f 6e 6f 42 20 3d 20 73 71 6c 69 74 65 33 56 64  _noB = sqlite3Vd
19130 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
19140 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20  ield, regAddrB, 
19150 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 20  labelEnd);.     
19160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19180 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
19190 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
191a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
191b0 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 41 29 3b  o, 0, addrEofA);
191c0 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52  .    p->nSelectR
191d0 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53  ow += pPrior->nS
191e0 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 0a 0a 20  electRow;.  }.. 
191f0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
19200 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e  ubroutine to run
19210 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   when the result
19220 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a  s from select B.
19230 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74    ** are exhaust
19240 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61  ed and only data
19250 20 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d   in select A rem
19260 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ains..  */.  if(
19270 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
19280 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66  T ){.    addrEof
19290 42 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20  B = addrEofA;.  
192a0 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74    if( p->nSelect
192b0 52 6f 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53  Row > pPrior->nS
192c0 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53  electRow ) p->nS
192d0 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f  electRow = pPrio
192e0 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  r->nSelectRow;. 
192f0 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64   }else{  .    Vd
19300 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
19310 2c 20 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74  , "eof-B subrout
19320 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72  ine"));.    addr
19330 45 6f 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64  EofB = sqlite3Vd
19340 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
19350 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61  osub, regOutA, a
19360 64 64 72 4f 75 74 41 29 3b 0a 20 20 20 20 73 71  ddrOutA);.    sq
19370 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19380 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
19390 41 64 64 72 41 2c 20 6c 61 62 65 6c 45 6e 64 29  AddrA, labelEnd)
193a0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
193b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
193c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
193d0 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 42  oto, 0, addrEofB
193e0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
193f0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
19400 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
19410 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65   A<B.  */.  Vdbe
19420 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
19430 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69  "A-lt-B subrouti
19440 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74  ne"));.  addrAlt
19450 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
19460 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
19470 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72  b, regOutA, addr
19480 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  OutA);.  sqlite3
19490 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
194a0 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
194b0 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62  , addrEofA); Vdb
194c0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
194d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
194e0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
194f0 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20   labelCmpr);..  
19500 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
19510 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
19520 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f  ase of A==B.  */
19530 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
19540 4c 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71  L ){.    addrAeq
19550 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20  B = addrAltB;.  
19560 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
19570 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20  _INTERSECT ){.  
19580 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64    addrAeqB = add
19590 72 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41  rAltB;.    addrA
195a0 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ltB++;.  }else{.
195b0 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
195c0 65 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20  ent((v, "A-eq-B 
195d0 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
195e0 20 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20     addrAeqB =.  
195f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19600 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
19610 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45   regAddrA, addrE
19620 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ofA); VdbeCovera
19630 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
19640 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19650 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65  OP_Goto, 0, labe
19660 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  lCmpr);.  }..  /
19670 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
19680 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
19690 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20  se of A>B.  */. 
196a0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
196b0 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62  ((v, "A-gt-B sub
196c0 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64  routine"));.  ad
196d0 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33  drAgtB = sqlite3
196e0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
196f0 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  v);.  if( op==TK
19700 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55  _ALL || op==TK_U
19710 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69  NION ){.    sqli
19720 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19730 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
19740 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20  tB, addrOutB);. 
19750 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
19760 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
19770 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64  ld, regAddrB, ad
19780 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76  drEofB); VdbeCov
19790 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
197a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
197b0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62   OP_Goto, 0, lab
197c0 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54  elCmpr);..  /* T
197d0 68 69 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e  his code runs on
197e0 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ce to initialize
197f0 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a   everything..  *
19800 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  /.  sqlite3VdbeJ
19810 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
19820 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19830 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
19840 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45   regAddrA, addrE
19850 6f 66 41 5f 6e 6f 42 29 3b 20 56 64 62 65 43 6f  ofA_noB); VdbeCo
19860 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
19870 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19880 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
19890 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b  ddrB, addrEofB);
198a0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
198b0 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e  ;..  /* Implemen
198c0 74 20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67 65  t the main merge
198d0 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c   loop.  */.  sql
198e0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
198f0 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70  abel(v, labelCmp
19900 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r);.  sqlite3Vdb
19910 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65  eAddOp4(v, OP_Pe
19920 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c  rmutation, 0, 0,
19930 20 30 2c 20 28 63 68 61 72 2a 29 61 50 65 72 6d   0, (char*)aPerm
19940 75 74 65 2c 20 50 34 5f 49 4e 54 41 52 52 41 59  ute, P4_INTARRAY
19950 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
19960 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp4(v, OP_Com
19970 70 61 72 65 2c 20 64 65 73 74 41 2e 69 53 64 73  pare, destA.iSds
19980 74 2c 20 64 65 73 74 42 2e 69 53 64 73 74 2c 20  t, destB.iSdst, 
19990 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20  nOrderBy,.      
199a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199b0 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d 65     (char*)pKeyMe
199c0 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  rge, P4_KEYINFO)
199d0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
199e0 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
199f0 47 5f 50 45 52 4d 55 54 45 29 3b 0a 20 20 73 71  G_PERMUTE);.  sq
19a00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
19a10 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72  v, OP_Jump, addr
19a20 41 6c 74 42 2c 20 61 64 64 72 41 65 71 42 2c 20  AltB, addrAeqB, 
19a30 61 64 64 72 41 67 74 42 29 3b 20 56 64 62 65 43  addrAgtB); VdbeC
19a40 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f  overage(v);..  /
19a50 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 74 68  * Jump to the th
19a60 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65  is point in orde
19a70 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  r to terminate t
19a80 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  he query..  */. 
19a90 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
19aa0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65  lveLabel(v, labe
19ab0 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  lEnd);..  /* Set
19ac0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
19ad0 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 0a 20 20  utput columns.  
19ae0 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  */.  if( pDest->
19af0 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
19b00 74 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20  t ){.    Select 
19b10 2a 70 46 69 72 73 74 20 3d 20 70 50 72 69 6f 72  *pFirst = pPrior
19b20 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 46 69  ;.    while( pFi
19b30 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46  rst->pPrior ) pF
19b40 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70  irst = pFirst->p
19b50 50 72 69 6f 72 3b 0a 20 20 20 20 67 65 6e 65 72  Prior;.    gener
19b60 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
19b70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74  Parse, 0, pFirst
19b80 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a  ->pEList);.  }..
19b90 20 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79 20    /* Reassembly 
19ba0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
19bb0 72 79 20 73 6f 20 74 68 61 74 20 69 74 20 77 69  ry so that it wi
19bc0 6c 6c 20 62 65 20 66 72 65 65 64 20 63 6f 72 72  ll be freed corr
19bd0 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68  ectly.  ** by th
19be0 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
19bf0 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  on */.  if( p->p
19c00 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c  Prior ){.    sql
19c10 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
19c20 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b  (db, p->pPrior);
19c30 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72  .  }.  p->pPrior
19c40 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 70 50 72   = pPrior;.  pPr
19c50 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a  ior->pNext = p;.
19c60 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e  .  /*** TBD:  In
19c70 73 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20  sert subroutine 
19c80 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63  calls to close c
19c90 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70  ursors on incomp
19ca0 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71  lete.  **** subq
19cb0 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65  ueries ****/.  e
19cc0 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28  xplainComposite(
19cd0 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69  pParse, p->op, i
19ce0 53 75 62 31 2c 20 69 53 75 62 32 2c 20 30 29 3b  Sub1, iSub2, 0);
19cf0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19d00 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  _OK;.}.#endif..#
19d10 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
19d20 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
19d30 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
19d40 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
19d50 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61  /* Forward Decla
19d60 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69  rations */.stati
19d70 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
19d80 4c 69 73 74 28 73 71 6c 69 74 65 33 2a 2c 20 45  List(sqlite3*, E
19d90 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45  xprList*, int, E
19da0 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69  xprList*);.stati
19db0 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65  c void substSele
19dc0 63 74 28 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c  ct(sqlite3*, Sel
19dd0 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72  ect *, int, Expr
19de0 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  List *);../*.** 
19df0 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65  Scan through the
19e00 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
19e10 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72  r.  Replace ever
19e20 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a  y reference to.*
19e30 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61  * a column in ta
19e40 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c  ble number iTabl
19e50 65 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  e with a copy of
19e60 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a   the iColumn-th.
19e70 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69  ** entry in pELi
19e80 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20  st.  (But leave 
19e90 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
19ea0 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a  e ROWID column .
19eb0 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a  ** unchanged.).*
19ec0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
19ed0 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  e is part of the
19ee0 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63   flattening proc
19ef0 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65  edure.  A subque
19f00 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75  ry.** whose resu
19f10 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65  lt set is define
19f20 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65  d by pEList appe
19f30 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20  ars as entry in 
19f40 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75  the.** FROM clau
19f50 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  se of a SELECT s
19f60 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42  uch that the VDB
19f70 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65  E cursor assigne
19f80 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52  d to that.** FOR
19f90 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69  M clause entry i
19fa0 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20  s iTable.  This 
19fb0 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65  routine make the
19fc0 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63   necessary .** c
19fd0 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20  hanges to pExpr 
19fe0 73 6f 20 74 68 61 74 20 69 74 20 72 65 66 65 72  so that it refer
19ff0 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  s directly to th
1a000 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a  e source table.*
1a010 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
1a020 79 20 72 61 74 68 65 72 20 74 68 65 20 72 65 73  y rather the res
1a030 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 73  ult set of the s
1a040 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  ubquery..*/.stat
1a050 69 63 20 45 78 70 72 20 2a 73 75 62 73 74 45 78  ic Expr *substEx
1a060 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pr(.  sqlite3 *d
1a070 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70  b,        /* Rep
1a080 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  ort malloc error
1a090 73 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63  s to this connec
1a0a0 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  tion */.  Expr *
1a0b0 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a  pExpr,        /*
1a0c0 20 45 78 70 72 20 69 6e 20 77 68 69 63 68 20 73   Expr in which s
1a0d0 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75  ubstitution occu
1a0e0 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  rs */.  int iTab
1a0f0 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  le,         /* T
1a100 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74  able to be subst
1a110 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  ituted */.  Expr
1a120 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
1a130 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 65 78  /* Substitute ex
1a140 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  pressions */.){.
1a150 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
1a160 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
1a170 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
1a180 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e  OLUMN && pExpr->
1a190 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29  iTable==iTable )
1a1a0 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  {.    if( pExpr-
1a1b0 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  >iColumn<0 ){.  
1a1c0 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
1a1d0 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c  TK_NULL;.    }el
1a1e0 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
1a1f0 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65  pNew;.      asse
1a200 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26  rt( pEList!=0 &&
1a210 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
1a220 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
1a230 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1a240 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26  Expr->pLeft==0 &
1a250 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d  & pExpr->pRight=
1a260 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  =0 );.      pNew
1a270 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
1a280 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  p(db, pEList->a[
1a290 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
1a2a0 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
1a2b0 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1a2c0 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  te(db, pExpr);. 
1a2d0 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65       pExpr = pNe
1a2e0 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  w;.    }.  }else
1a2f0 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65  {.    pExpr->pLe
1a300 66 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  ft = substExpr(d
1a310 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  b, pExpr->pLeft,
1a320 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1a330 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69  ;.    pExpr->pRi
1a340 67 68 74 20 3d 20 73 75 62 73 74 45 78 70 72 28  ght = substExpr(
1a350 64 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  db, pExpr->pRigh
1a360 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
1a370 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72  t);.    if( Expr
1a380 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1a390 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1a3a0 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53   ){.      substS
1a3b0 65 6c 65 63 74 28 64 62 2c 20 70 45 78 70 72 2d  elect(db, pExpr-
1a3c0 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69 54 61 62  >x.pSelect, iTab
1a3d0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
1a3e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75   }else{.      su
1a3f0 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
1a400 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20  pExpr->x.pList, 
1a410 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1a420 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1a430 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61  urn pExpr;.}.sta
1a440 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
1a450 70 72 4c 69 73 74 28 0a 20 20 73 71 6c 69 74 65  prList(.  sqlite
1a460 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f  3 *db,         /
1a470 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20  * Report malloc 
1a480 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20  errors here */. 
1a490 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1a4a0 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f  ,     /* List to
1a4b0 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69   scan and in whi
1a4c0 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74  ch to make subst
1a4d0 69 74 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20  itutes */.  int 
1a4e0 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
1a4f0 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
1a500 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20  substituted */. 
1a510 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
1a520 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74  t     /* Substit
1a530 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b  ute values */.){
1a540 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1a550 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1a560 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
1a570 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
1a580 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  +){.    pList->a
1a590 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73  [i].pExpr = subs
1a5a0 74 45 78 70 72 28 64 62 2c 20 70 4c 69 73 74 2d  tExpr(db, pList-
1a5b0 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61  >a[i].pExpr, iTa
1a5c0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1a5d0 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
1a5e0 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20 73  substSelect(.  s
1a5f0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
1a600 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61      /* Report ma
1a610 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65  lloc errors here
1a620 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
1a630 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
1a640 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
1a650 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20  n which to make 
1a660 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f  substitutions */
1a670 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1a680 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
1a690 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20   to be replaced 
1a6a0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1a6b0 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62  EList     /* Sub
1a6c0 73 74 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a  stitute values *
1a6d0 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  /.){.  SrcList *
1a6e0 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53  pSrc;.  struct S
1a6f0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1a700 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  em;.  int i;.  i
1a710 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a  f( !p ) return;.
1a720 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1a730 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69  db, p->pEList, i
1a740 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1a750 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1a760 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c  db, p->pGroupBy,
1a770 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1a780 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
1a790 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  t(db, p->pOrderB
1a7a0 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  y, iTable, pELis
1a7b0 74 29 3b 0a 20 20 70 2d 3e 70 48 61 76 69 6e 67  t);.  p->pHaving
1a7c0 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
1a7d0 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61   p->pHaving, iTa
1a7e0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1a7f0 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73  p->pWhere = subs
1a800 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68  tExpr(db, p->pWh
1a810 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ere, iTable, pEL
1a820 69 73 74 29 3b 0a 20 20 73 75 62 73 74 53 65 6c  ist);.  substSel
1a830 65 63 74 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f  ect(db, p->pPrio
1a840 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  r, iTable, pELis
1a850 74 29 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e  t);.  pSrc = p->
1a860 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
1a870 70 53 72 63 20 29 3b 20 20 2f 2a 20 45 76 65 6e  pSrc );  /* Even
1a880 20 66 6f 72 20 28 53 45 4c 45 43 54 20 31 29 20   for (SELECT 1) 
1a890 77 65 20 68 61 76 65 3a 20 70 53 72 63 21 3d 30  we have: pSrc!=0
1a8a0 20 62 75 74 20 70 53 72 63 2d 3e 6e 53 72 63 3d   but pSrc->nSrc=
1a8b0 3d 30 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41  =0 */.  if( ALWA
1a8c0 59 53 28 70 53 72 63 29 20 29 7b 0a 20 20 20 20  YS(pSrc) ){.    
1a8d0 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63  for(i=pSrc->nSrc
1a8e0 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b  , pItem=pSrc->a;
1a8f0 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d   i>0; i--, pItem
1a900 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  ++){.      subst
1a910 53 65 6c 65 63 74 28 64 62 2c 20 70 49 74 65 6d  Select(db, pItem
1a920 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c  ->pSelect, iTabl
1a930 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
1a940 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  }.  }.}.#endif /
1a950 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
1a960 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
1a970 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
1a980 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a  ITE_OMIT_VIEW) *
1a990 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
1a9a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1a9b0 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
1a9c0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
1a9d0 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  EW)./*.** This r
1a9e0 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20  outine attempts 
1a9f0 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75  to flatten subqu
1aa00 65 72 69 65 73 20 61 73 20 61 20 70 65 72 66 6f  eries as a perfo
1aa10 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74  rmance optimizat
1aa20 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
1aa30 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 20 69  tine returns 1 i
1aa40 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67  f it makes chang
1aa50 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66  es and 0 if no f
1aa60 6c 61 74 74 65 6e 69 6e 67 20 6f 63 63 75 72 73  lattening occurs
1aa70 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72  ..**.** To under
1aa80 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70  stand the concep
1aa90 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c  t of flattening,
1aaa0 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f   consider the fo
1aab0 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79  llowing.** query
1aac0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
1aad0 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT a FROM (SELEC
1aae0 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20  T x+y AS a FROM 
1aaf0 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20  t1 WHERE z<100) 
1ab00 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  WHERE a>5.**.** 
1ab10 54 68 65 20 64 65 66 61 75 6c 74 20 77 61 79 20  The default way 
1ab20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  of implementing 
1ab30 74 68 69 73 20 71 75 65 72 79 20 69 73 20 74 6f  this query is to
1ab40 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20   execute the.** 
1ab50 73 75 62 71 75 65 72 79 20 66 69 72 73 74 20 61  subquery first a
1ab60 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
1ab70 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72  ults in a tempor
1ab80 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a  ary table, then.
1ab90 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72  ** run the outer
1aba0 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74   query on that t
1abb0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
1abc0 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20 74   This requires t
1abd0 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65  wo.** passes ove
1abe0 72 20 74 68 65 20 64 61 74 61 2e 20 20 46 75 72  r the data.  Fur
1abf0 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73  thermore, becaus
1ac00 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
1ac10 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20  table.** has no 
1ac20 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48 45  indices, the WHE
1ac30 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65  RE clause on the
1ac40 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e   outer query can
1ac50 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69  not be.** optimi
1ac60 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  zed..**.** This 
1ac70 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
1ac80 20 74 6f 20 72 65 77 72 69 74 65 20 71 75 65 72   to rewrite quer
1ac90 69 65 73 20 73 75 63 68 20 61 73 20 74 68 65 20  ies such as the 
1aca0 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20  above into.** a 
1acb0 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65  single flat sele
1acc0 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  ct, like this:.*
1acd0 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
1ace0 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
1acf0 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44   WHERE z<100 AND
1ad00 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63   a>5.**.** The c
1ad10 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f  ode generated fo
1ad20 72 20 74 68 69 73 20 73 69 6d 70 69 66 69 63 61  r this simpifica
1ad30 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73  tion gives the s
1ad40 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75  ame result.** bu
1ad50 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63  t only has to sc
1ad60 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65  an the data once
1ad70 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65 20 69  .  And because i
1ad80 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a  ndices might .**
1ad90 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61   exist on the ta
1ada0 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65  ble t1, a comple
1adb0 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64  te scan of the d
1adc0 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20  ata might be.** 
1add0 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  avoided..**.** F
1ade0 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c  lattening is onl
1adf0 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20 61  y attempted if a
1ae00 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
1ae10 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
1ae20 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20 73  .**   (1)  The s
1ae30 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
1ae40 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
1ae50 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67 67 72  ot both use aggr
1ae60 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  egates..**.**   
1ae70 28 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (2)  The subquer
1ae80 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  y is not an aggr
1ae90 65 67 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74  egate or the out
1aea0 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
1aeb0 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
1aec0 28 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (3)  The subquer
1aed0 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67  y is not the rig
1aee0 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
1aef0 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 0a  left outer join.
1af00 2a 2a 20 20 20 20 20 20 20 20 28 4f 72 69 67 69  **        (Origi
1af10 6e 61 6c 6c 79 20 74 69 63 6b 65 74 20 23 33 30  nally ticket #30
1af20 36 2e 20 20 53 74 72 65 6e 67 74 68 65 6e 65 64  6.  Strengthened
1af30 20 62 79 20 74 69 63 6b 65 74 20 23 33 33 30 30   by ticket #3300
1af40 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54  ).**.**   (4)  T
1af50 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
1af60 6f 74 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a  ot DISTINCT..**.
1af70 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65  **  (**)  At one
1af80 20 70 6f 69 6e 74 20 72 65 73 74 72 69 63 74 69   point restricti
1af90 6f 6e 73 20 28 34 29 20 61 6e 64 20 28 35 29 20  ons (4) and (5) 
1afa0 64 65 66 69 6e 65 64 20 61 20 73 75 62 73 65 74  defined a subset
1afb0 20 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20   of DISTINCT.** 
1afc0 20 20 20 20 20 20 20 73 75 62 2d 71 75 65 72 69         sub-queri
1afd0 65 73 20 74 68 61 74 20 77 65 72 65 20 65 78 63  es that were exc
1afe0 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 69 73 20  luded from this 
1aff0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65  optimization. Re
1b000 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  striction .**   
1b010 20 20 20 20 20 28 34 29 20 68 61 73 20 73 69 6e       (4) has sin
1b020 63 65 20 62 65 65 6e 20 65 78 70 61 6e 64 65 64  ce been expanded
1b030 20 74 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c 20   to exclude all 
1b040 44 49 53 54 49 4e 43 54 20 73 75 62 71 75 65 72  DISTINCT subquer
1b050 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29  ies..**.**   (6)
1b060 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
1b070 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72  oes not use aggr
1b080 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75  egates or the ou
1b090 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
1b0a0 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49  .**        DISTI
1b0b0 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29  NCT..**.**   (7)
1b0c0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 68    The subquery h
1b0d0 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  as a FROM clause
1b0e0 2e 20 20 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75  .  TODO:  For su
1b0f0 62 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74  bqueries without
1b100 0a 2a 2a 20 20 20 20 20 20 20 20 41 20 46 52 4f  .**        A FRO
1b110 4d 20 63 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64  M clause, consid
1b120 65 72 20 61 64 64 69 6e 67 20 61 20 46 52 4f 4d  er adding a FROM
1b130 20 63 6c 6f 73 65 20 77 69 74 68 20 74 68 65 20   close with the 
1b140 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20  special.**      
1b150 20 20 74 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f    table sqlite_o
1b160 6e 63 65 20 74 68 61 74 20 63 6f 6e 73 69 73 74  nce that consist
1b170 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 72 6f  s of a single ro
1b180 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a  w containing a.*
1b190 2a 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20  *        single 
1b1a0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38  NULL..**.**   (8
1b1b0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1b1c0 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
1b1d0 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
1b1e0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
1b1f0 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29  oin..**.**   (9)
1b200 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
1b210 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
1b220 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
1b230 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
1b240 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72  e.**        aggr
1b250 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  egates..**.**  (
1b260 31 30 29 20 20 54 68 65 20 73 75 62 71 75 65 72  10)  The subquer
1b270 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61  y does not use a
1b280 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65  ggregates or the
1b290 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
1b2a0 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
1b2b0 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a  use LIMIT..**.**
1b2c0 20 20 28 31 31 29 20 20 54 68 65 20 73 75 62 71    (11)  The subq
1b2d0 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74  uery and the out
1b2e0 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
1b2f0 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52 20  both have ORDER 
1b300 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  BY clauses..**.*
1b310 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70  *  (**)  Not imp
1b320 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75  lemented.  Subsu
1b330 6d 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63  med into restric
1b340 74 69 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70  tion (3).  Was p
1b350 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20  reviously.**    
1b360 20 20 20 20 61 20 73 65 70 61 72 61 74 65 20 72      a separate r
1b370 65 73 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76  estriction deriv
1b380 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20  ing from ticket 
1b390 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33  #350..**.**  (13
1b3a0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1b3b0 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79 20  and outer query 
1b3c0 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20  do not both use 
1b3d0 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  LIMIT..**.**  (1
1b3e0 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  4)  The subquery
1b3f0 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f 46   does not use OF
1b400 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35  FSET..**.**  (15
1b410 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65  )  The outer que
1b420 72 79 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  ry is not part o
1b430 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  f a compound sel
1b440 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20  ect or the.**   
1b450 20 20 20 20 20 73 75 62 71 75 65 72 79 20 64 6f       subquery do
1b460 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 4c 49  es not have a LI
1b470 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20  MIT clause..**  
1b480 20 20 20 20 20 20 28 53 65 65 20 74 69 63 6b 65        (See ticke
1b490 74 20 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b  t #2339 and tick
1b4a0 65 74 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29  et [02a8e81d44])
1b4b0 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54  ..**.**  (16)  T
1b4c0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1b4d0 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
1b4e0 74 65 20 6f 72 20 74 68 65 20 73 75 62 71 75 65  te or the subque
1b4f0 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20  ry does.**      
1b500 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52    not contain OR
1b510 44 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74  DER BY.  (Ticket
1b520 20 23 32 39 34 32 29 20 20 54 68 69 73 20 75 73   #2942)  This us
1b530 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72  ed to not matter
1b540 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c  .**        until
1b550 20 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74   we introduced t
1b560 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  he group_concat(
1b570 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a  ) function.  .**
1b580 0a 2a 2a 20 20 28 31 37 29 20 20 54 68 65 20 73  .**  (17)  The s
1b590 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20  ub-query is not 
1b5a0 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
1b5b0 74 2c 20 6f 72 20 69 74 20 69 73 20 61 20 55 4e  t, or it is a UN
1b5c0 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20  ION ALL .**     
1b5d0 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75     compound clau
1b5e0 73 65 20 6d 61 64 65 20 75 70 20 65 6e 74 69 72  se made up entir
1b5f0 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65  ely of non-aggre
1b600 67 61 74 65 20 71 75 65 72 69 65 73 2c 20 61 6e  gate queries, an
1b610 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65  d .**        the
1b620 20 70 61 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a   parent query:.*
1b630 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20  *.**          * 
1b640 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 70 61  is not itself pa
1b650 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  rt of a compound
1b660 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20   select,.**     
1b670 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e       * is not an
1b680 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 44 49   aggregate or DI
1b690 53 54 49 4e 43 54 20 71 75 65 72 79 2c 20 61 6e  STINCT query, an
1b6a0 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20  d.**          * 
1b6b0 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a  is not a join.**
1b6c0 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 70  .**        The p
1b6d0 61 72 65 6e 74 20 61 6e 64 20 73 75 62 2d 71 75  arent and sub-qu
1b6e0 65 72 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ery may contain 
1b6f0 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20 53  WHERE clauses. S
1b700 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20  ubject to.**    
1b710 20 20 20 20 72 75 6c 65 73 20 28 31 31 29 2c 20      rules (11), 
1b720 28 31 33 29 20 61 6e 64 20 28 31 34 29 2c 20 74  (13) and (14), t
1b730 68 65 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e  hey may also con
1b740 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a  tain ORDER BY,.*
1b750 2a 20 20 20 20 20 20 20 20 4c 49 4d 49 54 20 61  *        LIMIT a
1b760 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  nd OFFSET clause
1b770 73 2e 20 20 54 68 65 20 73 75 62 71 75 65 72 79  s.  The subquery
1b780 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20   cannot use any 
1b790 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20  compound.**     
1b7a0 20 20 20 6f 70 65 72 61 74 6f 72 20 6f 74 68 65     operator othe
1b7b0 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c  r than UNION ALL
1b7c0 20 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65   because all the
1b7d0 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a   other compound.
1b7e0 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61 74  **        operat
1b7f0 6f 72 73 20 68 61 76 65 20 61 6e 20 69 6d 70 6c  ors have an impl
1b800 69 65 64 20 44 49 53 54 49 4e 43 54 20 77 68 69  ied DISTINCT whi
1b810 63 68 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64  ch is disallowed
1b820 20 62 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65   by.**        re
1b830 73 74 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a  striction (4)..*
1b840 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c 73 6f  *.**        Also
1b850 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74  , each component
1b860 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   of the sub-quer
1b870 79 20 6d 75 73 74 20 72 65 74 75 72 6e 20 74 68  y must return th
1b880 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a  e same number.**
1b890 20 20 20 20 20 20 20 20 6f 66 20 72 65 73 75 6c          of resul
1b8a0 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20  t columns. This 
1b8b0 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 72 65  is actually a re
1b8c0 71 75 69 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e  quirement for an
1b8d0 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20  y compound.**   
1b8e0 20 20 20 20 20 53 45 4c 45 43 54 20 73 74 61 74       SELECT stat
1b8f0 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74  ement, but all t
1b900 68 65 20 63 6f 64 65 20 68 65 72 65 20 64 6f 65  he code here doe
1b910 73 20 69 73 20 6d 61 6b 65 20 73 75 72 65 20 74  s is make sure t
1b920 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20  hat no.**       
1b930 20 73 75 63 68 20 28 69 6c 6c 65 67 61 6c 29 20   such (illegal) 
1b940 73 75 62 2d 71 75 65 72 79 20 69 73 20 66 6c 61  sub-query is fla
1b950 74 74 65 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c  ttened. The call
1b960 65 72 20 77 69 6c 6c 20 64 65 74 65 63 74 20 74  er will detect t
1b970 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 79 6e  he.**        syn
1b980 74 61 78 20 65 72 72 6f 72 20 61 6e 64 20 72 65  tax error and re
1b990 74 75 72 6e 20 61 20 64 65 74 61 69 6c 65 64 20  turn a detailed 
1b9a0 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20  message..**.**  
1b9b0 28 31 38 29 20 20 49 66 20 74 68 65 20 73 75 62  (18)  If the sub
1b9c0 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  -query is a comp
1b9d0 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65  ound select, the
1b9e0 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  n all terms of t
1b9f0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44  he.**        ORD
1ba00 45 52 20 62 79 20 63 6c 61 75 73 65 20 6f 66 20  ER by clause of 
1ba10 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20  the parent must 
1ba20 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65  be simple refere
1ba30 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20  nces to .**     
1ba40 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68     columns of th
1ba50 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a  e sub-query..**.
1ba60 2a 2a 20 20 28 31 39 29 20 20 54 68 65 20 73 75  **  (19)  The su
1ba70 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
1ba80 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
1ba90 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
1baa0 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
1bab0 68 61 76 65 20 61 20 57 48 45 52 45 20 63 6c 61  have a WHERE cla
1bac0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29  use..**.**  (20)
1bad0 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65    If the sub-que
1bae0 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
1baf0 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74   select, then it
1bb00 20 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a   must not use.**
1bb10 20 20 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52          an ORDER
1bb20 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63   BY clause.  Tic
1bb30 6b 65 74 20 23 33 37 37 33 2e 20 20 57 65 20 63  ket #3773.  We c
1bb40 6f 75 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20  ould relax this 
1bb50 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20  constraint.**   
1bb60 20 20 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79       somewhat by
1bb70 20 73 61 79 69 6e 67 20 74 68 61 74 20 74 68 65   saying that the
1bb80 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
1bb90 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75  DER BY clause mu
1bba0 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70  st.**        app
1bbb0 65 61 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65  ear as unmodifie
1bbc0 64 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  d result columns
1bbd0 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
1bbe0 65 72 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20  ery.  But we.** 
1bbf0 20 20 20 20 20 20 20 68 61 76 65 20 6f 74 68 65         have othe
1bc00 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  r optimizations 
1bc10 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20  in mind to deal 
1bc20 77 69 74 68 20 74 68 61 74 20 63 61 73 65 2e 0a  with that case..
1bc30 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20 54 68 65  **.**  (21)  The
1bc40 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
1bc50 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
1bc60 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1bc70 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  is not.**       
1bc80 20 44 49 53 54 49 4e 43 54 2e 20 20 28 53 65 65   DISTINCT.  (See
1bc90 20 74 69 63 6b 65 74 20 5b 37 35 32 65 31 36 34   ticket [752e164
1bca0 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32  6fc])..**.**  (2
1bcb0 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  2)  The subquery
1bcc0 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73   is not a recurs
1bcd0 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20  ive CTE..**.**  
1bce0 28 32 33 29 20 20 54 68 65 20 70 61 72 65 6e 74  (23)  The parent
1bcf0 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73   is not a recurs
1bd00 69 76 65 20 43 54 45 2c 20 6f 72 20 74 68 65 20  ive CTE, or the 
1bd10 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74  sub-query is not
1bd20 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d   a.**        com
1bd30 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 54 68 69  pound query. Thi
1bd40 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20 69 73  s restriction is
1bd50 20 62 65 63 61 75 73 65 20 74 72 61 6e 73 66 6f   because transfo
1bd60 72 6d 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20  rming the.**    
1bd70 20 20 20 20 70 61 72 65 6e 74 20 74 6f 20 61 20      parent to a 
1bd80 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 63  compound query c
1bd90 6f 6e 66 75 73 65 73 20 74 68 65 20 63 6f 64 65  onfuses the code
1bda0 20 74 68 61 74 20 68 61 6e 64 6c 65 73 0a 2a 2a   that handles.**
1bdb0 20 20 20 20 20 20 20 20 72 65 63 75 72 73 69 76          recursiv
1bdc0 65 20 71 75 65 72 69 65 73 20 69 6e 20 6d 75 6c  e queries in mul
1bdd0 74 69 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a  tiSelect()..**.*
1bde0 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75  *.** In this rou
1bdf0 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61  tine, the "p" pa
1be00 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69  rameter is a poi
1be10 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65  nter to the oute
1be20 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20  r query..** The 
1be30 73 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70  subquery is p->p
1be40 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20  Src->a[iFrom].  
1be50 69 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66  isAgg is true if
1be60 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1be70 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61  .** uses aggrega
1be80 74 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 79  tes and subquery
1be90 49 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66  IsAgg is true if
1bea0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73   the subquery us
1beb0 65 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a  es aggregates..*
1bec0 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69  *.** If flatteni
1bed0 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70  ng is not attemp
1bee0 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ted, this routin
1bef0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64  e is a no-op and
1bf00 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49   returns 0..** I
1bf10 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
1bf20 61 74 74 65 6d 70 74 65 64 20 74 68 69 73 20 72  attempted this r
1bf30 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31  outine returns 1
1bf40 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74  ..**.** All of t
1bf50 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  he expression an
1bf60 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75  alysis must occu
1bf70 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75  r on both the ou
1bf80 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a  ter query and.**
1bf90 20 74 68 65 20 73 75 62 71 75 65 72 79 20 62 65   the subquery be
1bfa0 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e  fore this routin
1bfb0 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  e runs..*/.stati
1bfc0 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62  c int flattenSub
1bfd0 71 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a  query(.  Parse *
1bfe0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
1bff0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
1c000 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
1c010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1c020 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65  e parent or oute
1c030 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  r SELECT stateme
1c040 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f  nt */.  int iFro
1c050 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m,           /* 
1c060 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63  Index in p->pSrc
1c070 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e  ->a[] of the inn
1c080 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  er subquery */. 
1c090 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20   int isAgg,     
1c0a0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1c0b0 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 75 73   outer SELECT us
1c0c0 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  es aggregate fun
1c0d0 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ctions */.  int 
1c0e0 73 75 62 71 75 65 72 79 49 73 41 67 67 20 20 20  subqueryIsAgg   
1c0f0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
1c100 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67  subquery uses ag
1c110 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
1c120 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  s */.){.  const 
1c130 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68  char *zSavedAuth
1c140 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65  Context = pParse
1c150 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a  ->zAuthContext;.
1c160 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e    Select *pParen
1c170 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  t;.  Select *pSu
1c180 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  b;       /* The 
1c190 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22  inner query or "
1c1a0 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53  subquery" */.  S
1c1b0 65 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20  elect *pSub1;   
1c1c0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
1c1d0 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73   the rightmost s
1c1e0 65 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65  elect in sub-que
1c1f0 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ry */.  SrcList 
1c200 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54  *pSrc;      /* T
1c210 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1c220 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
1c230 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  y */.  SrcList *
1c240 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68  pSubSrc;   /* Th
1c250 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1c260 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   the subquery */
1c270 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
1c280 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65  st;    /* The re
1c290 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
1c2a0 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
1c2b0 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20   int iParent;   
1c2c0 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72       /* VDBE cur
1c2d0 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
1c2e0 65 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65  e pSub result se
1c2f0 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a  t temp table */.
1c300 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
1c310 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1c320 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20  unter */.  Expr 
1c330 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20  *pWhere;        
1c340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c350 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1c360 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
1c370 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74  ist_item *pSubit
1c380 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62  em;   /* The sub
1c390 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74  query */.  sqlit
1c3a0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1c3b0 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  >db;..  /* Check
1c3c0 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74   to see if flatt
1c3d0 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74  ening is permitt
1c3e0 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  ed.  Return 0 if
1c3f0 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   not..  */.  ass
1c400 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
1c410 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72  ssert( p->pPrior
1c420 3d 3d 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c  ==0 );  /* Unabl
1c430 65 20 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d  e to flatten com
1c440 70 6f 75 6e 64 20 71 75 65 72 69 65 73 20 2a 2f  pound queries */
1c450 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74  .  if( Optimizat
1c460 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20  ionDisabled(db, 
1c470 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74  SQLITE_QueryFlat
1c480 74 65 6e 65 72 29 20 29 20 72 65 74 75 72 6e 20  tener) ) return 
1c490 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  0;.  pSrc = p->p
1c4a0 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
1c4b0 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20  Src && iFrom>=0 
1c4c0 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e  && iFrom<pSrc->n
1c4d0 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65  Src );.  pSubite
1c4e0 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72  m = &pSrc->a[iFr
1c4f0 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d  om];.  iParent =
1c500 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73   pSubitem->iCurs
1c510 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75  or;.  pSub = pSu
1c520 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  bitem->pSelect;.
1c530 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21 3d    assert( pSub!=
1c540 30 20 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67  0 );.  if( isAgg
1c550 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67   && subqueryIsAg
1c560 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  g ) return 0;   
1c570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c580 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 29   Restriction (1)
1c590 20 20 2a 2f 0a 20 20 69 66 28 20 73 75 62 71 75    */.  if( subqu
1c5a0 65 72 79 49 73 41 67 67 20 26 26 20 70 53 72 63  eryIsAgg && pSrc
1c5b0 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72  ->nSrc>1 ) retur
1c5c0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  n 0;          /*
1c5d0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 29   Restriction (2)
1c5e0 20 20 2a 2f 0a 20 20 70 53 75 62 53 72 63 20 3d    */.  pSubSrc =
1c5f0 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61   pSub->pSrc;.  a
1c600 73 73 65 72 74 28 20 70 53 75 62 53 72 63 20 29  ssert( pSubSrc )
1c610 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20  ;.  /* Prior to 
1c620 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77  version 3.1.2, w
1c630 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  hen LIMIT and OF
1c640 46 53 45 54 20 68 61 64 20 74 6f 20 62 65 20 73  FSET had to be s
1c650 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c  imple constants,
1c660 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72  .  ** not arbitr
1c670 61 72 79 20 65 78 70 72 65 73 73 73 69 6f 6e 73  ary expresssions
1c680 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d  , we allowed som
1c690 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c  e combining of L
1c6a0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
1c6b0 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65    ** because the
1c6c0 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75  y could be compu
1c6d0 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ted at compile-t
1c6e0 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20 4c  ime.  But when L
1c6f0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
1c700 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62 69    ** became arbi
1c710 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e  trary expression
1c720 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63 65  s, we were force
1c730 64 20 74 6f 20 61 64 64 20 72 65 73 74 72 69 63  d to add restric
1c740 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20  tions (13).  ** 
1c750 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69  and (14). */.  i
1c760 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
1c770 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72  && p->pLimit ) r
1c780 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1c790 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1c7a0 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69  tion (13) */.  i
1c7b0 66 28 20 70 53 75 62 2d 3e 70 4f 66 66 73 65 74  f( pSub->pOffset
1c7c0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1c7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7e0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1c7f0 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69  tion (14) */.  i
1c800 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
1c810 26 20 53 46 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d  & SF_Compound)!=
1c820 30 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69  0 && pSub->pLimi
1c830 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
1c840 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1c850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c870 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 35   Restriction (15
1c880 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  ) */.  }.  if( p
1c890 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20  SubSrc->nSrc==0 
1c8a0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1c8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8c0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1c8d0 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 70   (7)  */.  if( p
1c8e0 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
1c8f0 53 46 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65  SF_Distinct ) re
1c900 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1c910 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1c920 20 28 35 29 20 20 2a 2f 0a 20 20 69 66 28 20 70   (5)  */.  if( p
1c930 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28  Sub->pLimit && (
1c940 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20  pSrc->nSrc>1 || 
1c950 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 72  isAgg) ){.     r
1c960 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1c970 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73   /* Restrictions
1c980 20 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20   (8)(9) */.  }. 
1c990 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
1c9a0 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
1c9b0 21 3d 30 20 26 26 20 73 75 62 71 75 65 72 79 49  !=0 && subqueryI
1c9c0 73 41 67 67 20 29 7b 0a 20 20 20 20 20 72 65 74  sAgg ){.     ret
1c9d0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f  urn 0;         /
1c9e0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 36  * Restriction (6
1c9f0 29 20 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  )  */.  }.  if( 
1ca00 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70  p->pOrderBy && p
1ca10 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
1ca20 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
1ca30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1ca60 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f  triction (11) */
1ca70 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67  .  }.  if( isAgg
1ca80 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72   && pSub->pOrder
1ca90 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  By ) return 0;  
1caa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cab0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 36   Restriction (16
1cac0 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
1cad0 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 57  >pLimit && p->pW
1cae0 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
1caf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cb00 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 39   Restriction (19
1cb10 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
1cb20 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d 3e 73  >pLimit && (p->s
1cb30 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
1cb40 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20 20 20  tinct)!=0 ){.   
1cb50 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
1cb60 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1cb70 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 20  on (21) */.  }. 
1cb80 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c   if( pSub->selFl
1cb90 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
1cba0 76 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ve ) return 0;  
1cbb0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1cbc0 69 63 74 69 6f 6e 20 28 32 32 29 20 20 2a 2f 0a  iction (22)  */.
1cbd0 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
1cbe0 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
1cbf0 65 29 20 26 26 20 70 53 75 62 2d 3e 70 50 72 69  e) && pSub->pPri
1cc00 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  or ) return 0;  
1cc10 20 20 20 20 20 2f 2a 20 28 32 33 29 20 20 2a 2f       /* (23)  */
1cc20 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45 54 45 20  ..  /* OBSOLETE 
1cc30 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20 2a 2a 20  COMMENT 1:.  ** 
1cc40 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20  Restriction 3:  
1cc50 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1cc60 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20  is a join, make 
1cc70 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72  sure the subquer
1cc80 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75  y is .  ** not u
1cc90 73 65 64 20 61 73 20 74 68 65 20 72 69 67 68 74  sed as the right
1cca0 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f   operand of an o
1ccb0 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d  uter join.  Exam
1ccc0 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73  ples of why this
1ccd0 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c  .  ** is not all
1cce0 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  owed:.  **.  ** 
1ccf0 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20          t1 LEFT 
1cd00 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a  OUTER JOIN (t2 J
1cd10 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a  OIN t3).  **.  *
1cd20 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20  * If we flatten 
1cd30 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f  the above, we wo
1cd40 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a  uld get.  **.  *
1cd50 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45  *         (t1 LE
1cd60 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32  FT OUTER JOIN t2
1cd70 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20  ) JOIN t3.  **. 
1cd80 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74   ** which is not
1cd90 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65   at all the same
1cda0 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a   thing..  **.  *
1cdb0 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45  * OBSOLETE COMME
1cdc0 4e 54 20 32 3a 0a 20 20 2a 2a 20 52 65 73 74 72  NT 2:.  ** Restr
1cdd0 69 63 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74  iction 12:  If t
1cde0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74  he subquery is t
1cdf0 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
1ce00 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72   of a left outer
1ce10 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65  .  ** join, make
1ce20 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65   sure the subque
1ce30 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20  ry has no WHERE 
1ce40 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20  clause..  ** An 
1ce50 65 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20  examples of why 
1ce60 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  this is not allo
1ce70 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  wed:.  **.  **  
1ce80 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f         t1 LEFT O
1ce90 55 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43  UTER JOIN (SELEC
1cea0 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52  T * FROM t2 WHER
1ceb0 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20  E t2.x>0).  **. 
1cec0 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
1ced0 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
1cee0 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
1cef0 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
1cf00 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
1cf10 74 32 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30  t2) WHERE t2.x>0
1cf20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74  .  **.  ** But t
1cf30 68 65 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77  he t2.x>0 test w
1cf40 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20  ill always fail 
1cf50 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66  on a NULL row of
1cf60 20 74 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20   t2, which.  ** 
1cf70 65 66 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76  effectively conv
1cf80 65 72 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a  erts the OUTER J
1cf90 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45  OIN into an INNE
1cfa0 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a 20 20 2a  R JOIN..  **.  *
1cfb0 2a 20 54 48 49 53 20 4f 56 45 52 52 49 44 45 53  * THIS OVERRIDES
1cfc0 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e   OBSOLETE COMMEN
1cfd0 54 53 20 31 20 41 4e 44 20 32 20 41 42 4f 56 45  TS 1 AND 2 ABOVE
1cfe0 3a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 33  :.  ** Ticket #3
1cff0 33 30 30 20 73 68 6f 77 73 20 74 68 61 74 20 66  300 shows that f
1d000 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20 72 69  lattening the ri
1d010 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45  ght term of a LE
1d020 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20 69 73 20  FT JOIN.  ** is 
1d030 66 72 61 75 67 68 74 20 77 69 74 68 20 64 61 6e  fraught with dan
1d040 67 65 72 2e 20 20 42 65 73 74 20 74 6f 20 61 76  ger.  Best to av
1d050 6f 69 64 20 74 68 65 20 77 68 6f 6c 65 20 74 68  oid the whole th
1d060 69 6e 67 2e 20 20 49 66 20 74 68 65 0a 20 20 2a  ing.  If the.  *
1d070 2a 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68  * subquery is th
1d080 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20  e right term of 
1d090 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65  a LEFT JOIN, the
1d0a0 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e  n do not flatten
1d0b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53  ..  */.  if( (pS
1d0c0 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ubitem->jointype
1d0d0 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
1d0e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1d0f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72  .  }..  /* Restr
1d100 69 63 74 69 6f 6e 20 31 37 3a 20 49 66 20 74 68  iction 17: If th
1d110 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
1d120 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
1d130 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 0a 20  , then it must. 
1d140 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68 65   ** use only the
1d150 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
1d160 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66  tor. And none of
1d170 20 74 68 65 20 73 69 6d 70 6c 65 20 73 65 6c 65   the simple sele
1d180 63 74 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20  ct queries.  ** 
1d190 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65  that make up the
1d1a0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
1d1b0 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
1d1c0 62 65 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  be aggregate or 
1d1d0 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75  distinct.  ** qu
1d1e0 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  eries..  */.  if
1d1f0 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29  ( pSub->pPrior )
1d200 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  {.    if( pSub->
1d210 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
1d220 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20    return 0;  /* 
1d230 52 65 73 74 72 69 63 74 69 6f 6e 20 32 30 20 2a  Restriction 20 *
1d240 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  /.    }.    if( 
1d250 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c  isAgg || (p->sel
1d260 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
1d270 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d  nct)!=0 || pSrc-
1d280 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20 20 20  >nSrc!=1 ){.    
1d290 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1d2a0 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62 31 3d  }.    for(pSub1=
1d2b0 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70 53 75  pSub; pSub1; pSu
1d2c0 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f 72  b1=pSub1->pPrior
1d2d0 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
1d2e0 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c  e( (pSub1->selFl
1d2f0 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
1d300 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
1d310 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29  )==SF_Distinct )
1d320 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1d330 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61  ( (pSub1->selFla
1d340 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
1d350 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
1d360 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29  ==SF_Aggregate )
1d370 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1d380 70 53 75 62 2d 3e 70 53 72 63 21 3d 30 20 29 3b  pSub->pSrc!=0 );
1d390 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 75 62  .      if( (pSub
1d3a0 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
1d3b0 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
1d3c0 67 72 65 67 61 74 65 29 29 21 3d 30 0a 20 20 20  gregate))!=0.   
1d3d0 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70      || (pSub1->p
1d3e0 50 72 69 6f 72 20 26 26 20 70 53 75 62 31 2d 3e  Prior && pSub1->
1d3f0 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20 20  op!=TK_ALL) .   
1d400 20 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53      || pSub1->pS
1d410 72 63 2d 3e 6e 53 72 63 3c 31 0a 20 20 20 20 20  rc->nSrc<1.     
1d420 20 20 7c 7c 20 70 53 75 62 2d 3e 70 45 4c 69 73    || pSub->pELis
1d430 74 2d 3e 6e 45 78 70 72 21 3d 70 53 75 62 31 2d  t->nExpr!=pSub1-
1d440 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 0a 20  >pEList->nExpr. 
1d450 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1d460 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
1d470 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
1d480 28 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e  ( pSub1->pSrc->n
1d490 53 72 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a  Src>1 );.    }..
1d4a0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1d4b0 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20 20 20 69 66  on 18. */.    if
1d4c0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
1d4d0 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  .      int ii;. 
1d4e0 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
1d4f0 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  i<p->pOrderBy->n
1d500 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
1d510 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
1d520 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e  erBy->a[ii].u.x.
1d530 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29  iOrderByCol==0 )
1d540 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
1d550 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1d560 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61  /***** If we rea
1d570 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66  ch this point, f
1d580 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72  lattening is per
1d590 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 0a  mitted. *****/..
1d5a0 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20 74    /* Authorize t
1d5b0 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
1d5c0 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
1d5d0 6e 74 65 78 74 20 3d 20 70 53 75 62 69 74 65 6d  ntext = pSubitem
1d5e0 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45 53 54 4f  ->zName;.  TESTO
1d5f0 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69 74 65 33  NLY(i =) sqlite3
1d600 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1d610 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c  , SQLITE_SELECT,
1d620 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 74 65 73   0, 0, 0);.  tes
1d630 74 63 61 73 65 28 20 69 3d 3d 53 51 4c 49 54 45  tcase( i==SQLITE
1d640 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50 61 72 73  _DENY );.  pPars
1d650 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
1d660 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74  = zSavedAuthCont
1d670 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ext;..  /* If th
1d680 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
1d690 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
1d6a0 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
1d6b0 20 28 62 79 20 72 65 73 74 72 69 63 74 69 6f 6e   (by restriction
1d6c0 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20 31 38  s.  ** 17 and 18
1d6d0 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73 74 20   above) it must 
1d6e0 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61  be a UNION ALL a
1d6f0 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20 71 75  nd the parent qu
1d700 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62  ery must .  ** b
1d710 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20  e of the form:. 
1d720 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
1d730 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20  ECT <expr-list> 
1d740 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72 79  FROM (<sub-query
1d750 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75 73 65  >) <where-clause
1d760 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c  > .  **.  ** fol
1d770 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f 52 44  lowed by any ORD
1d780 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64  ER BY, LIMIT and
1d790 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61 75 73  /or OFFSET claus
1d7a0 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20  es. This block. 
1d7b0 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d 31 20   ** creates N-1 
1d7c0 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61  copies of the pa
1d7d0 72 65 6e 74 20 71 75 65 72 79 20 77 69 74 68 6f  rent query witho
1d7e0 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c  ut any ORDER BY,
1d7f0 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20   LIMIT or .  ** 
1d800 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 20 61  OFFSET clauses a
1d810 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f  nd joins them to
1d820 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73   the left-hand-s
1d830 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ide of the origi
1d840 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55  nal.  ** using U
1d850 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
1d860 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  rs. In this case
1d870 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
1d880 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20   of simple.  ** 
1d890 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
1d8a0 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e  s in the compoun
1d8b0 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a  d sub-query..  *
1d8c0 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a  *.  ** Example:.
1d8d0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
1d8e0 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a  LECT a+1 FROM (.
1d8f0 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45    **        SELE
1d900 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a 20 20  CT x FROM tab.  
1d910 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  **        UNION 
1d920 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ALL.  **        
1d930 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 61  SELECT y FROM ta
1d940 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e  b.  **        UN
1d950 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20  ION ALL.  **    
1d960 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a      SELECT abs(z
1d970 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a 20 20  *2) FROM tab2.  
1d980 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45 20 61  **     ) WHERE a
1d990 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31 0a 20  !=5 ORDER BY 1. 
1d9a0 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f   **.  ** Transfo
1d9b0 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a  rmed into:.  **.
1d9c0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
1d9d0 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45  x+1 FROM tab WHE
1d9e0 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  RE x+1!=5.  **  
1d9f0 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
1da00 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79 2b 31  *     SELECT y+1
1da10 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20   FROM tab WHERE 
1da20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20  y+1!=5.  **     
1da30 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
1da40 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a     SELECT abs(z*
1da50 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32 20 57  2)+1 FROM tab2 W
1da60 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b 31 21  HERE abs(z*2)+1!
1da70 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44 45  =5.  **     ORDE
1da80 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a  R BY 1.  **.  **
1da90 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20 74 68   We call this th
1daa0 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71  e "compound-subq
1dab0 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 22  uery flattening"
1dac0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75  ..  */.  for(pSu
1dad0 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20  b=pSub->pPrior; 
1dae0 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75 62 2d  pSub; pSub=pSub-
1daf0 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65  >pPrior){.    Se
1db00 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20  lect *pNew;.    
1db10 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
1db20 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
1db30 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d  ;.    Expr *pLim
1db40 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
1db50 20 20 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65      Expr *pOffse
1db60 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
1db70 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69      Select *pPri
1db80 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  or = p->pPrior;.
1db90 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
1dba0 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63  = 0;.    p->pSrc
1dbb0 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72   = 0;.    p->pPr
1dbc0 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  ior = 0;.    p->
1dbd0 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
1dbe0 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
1dbf0 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
1dc00 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
1dc10 70 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 70 4f  p, 0);.    p->pO
1dc20 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b  ffset = pOffset;
1dc30 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  .    p->pLimit =
1dc40 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e   pLimit;.    p->
1dc50 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
1dc60 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63  rBy;.    p->pSrc
1dc70 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e   = pSrc;.    p->
1dc80 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20  op = TK_ALL;.   
1dc90 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
1dca0 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
1dcb0 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65  = pPrior;.    }e
1dcc0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  lse{.      pNew-
1dcd0 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
1dce0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69  ;.      if( pPri
1dcf0 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65  or ) pPrior->pNe
1dd00 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  xt = pNew;.     
1dd10 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70   pNew->pNext = p
1dd20 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
1dd30 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a  r = pNew;.    }.
1dd40 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
1dd50 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
1dd60 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  n 1;.  }..  /* B
1dd70 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20  egin flattening 
1dd80 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74  the iFrom-th ent
1dd90 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
1dda0 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74  lause .  ** in t
1ddb0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
1ddc0 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53    */.  pSub = pS
1ddd0 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ub1 = pSubitem->
1dde0 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44  pSelect;..  /* D
1ddf0 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73 69  elete the transi
1de00 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
1de10 75 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ure associated w
1de20 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62  ith the.  ** sub
1de30 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c  query.  */.  sql
1de40 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1de50 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61  Subitem->zDataba
1de60 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  se);.  sqlite3Db
1de70 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
1de80 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  m->zName);.  sql
1de90 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1dea0 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  Subitem->zAlias)
1deb0 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44  ;.  pSubitem->zD
1dec0 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70  atabase = 0;.  p
1ded0 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  Subitem->zName =
1dee0 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
1def0 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53  zAlias = 0;.  pS
1df00 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20  ubitem->pSelect 
1df10 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72  = 0;..  /* Defer
1df20 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61   deleting the Ta
1df30 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63  ble object assoc
1df40 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20  iated with the. 
1df50 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74   ** subquery unt
1df60 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  il code generati
1df70 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c  on is.  ** compl
1df80 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65  ete, since there
1df90 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74   may still exist
1dfa0 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69   Expr.pTab entri
1dfb0 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66  es that.  ** ref
1dfc0 65 72 20 74 6f 20 74 68 65 20 73 75 62 71 75 65  er to the subque
1dfd0 72 79 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c  ry even after fl
1dfe0 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65  attening.  Ticke
1dff0 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20  t #3346..  **.  
1e000 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61  ** pSubitem->pTa
1e010 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d  b is always non-
1e020 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65 73  NULL by test res
1e030 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74 65  trictions and te
1e040 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a  sts above..  */.
1e050 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 75    if( ALWAYS(pSu
1e060 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20  bitem->pTab!=0) 
1e070 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
1e080 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74  abToDel = pSubit
1e090 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66  em->pTab;.    if
1e0a0 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65  ( pTabToDel->nRe
1e0b0 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61  f==1 ){.      Pa
1e0c0 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
1e0d0 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
1e0e0 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
1e0f0 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e       pTabToDel->
1e100 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54  pNextZombie = pT
1e110 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65  oplevel->pZombie
1e120 54 61 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c  Tab;.      pTopl
1e130 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62  evel->pZombieTab
1e140 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20   = pTabToDel;.  
1e150 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1e160 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d  TabToDel->nRef--
1e170 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62  ;.    }.    pSub
1e180 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a  item->pTab = 0;.
1e190 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f    }..  /* The fo
1e1a0 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e  llowing loop run
1e1b0 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  s once for each 
1e1c0 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75  term in a compou
1e1d0 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a  nd-subquery.  **
1e1e0 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20   flattening (as 
1e1f0 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 29  described above)
1e200 2e 20 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  .  If we are doi
1e210 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b  ng a different k
1e220 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74  ind.  ** of flat
1e230 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74  tening - a flatt
1e240 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  ening other than
1e250 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71   a compound-subq
1e260 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20  uery flattening 
1e270 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73  -.  ** then this
1e280 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20   loop only runs 
1e290 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  once..  **.  ** 
1e2a0 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20  This loop moves 
1e2b0 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  all of the FROM 
1e2c0 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
1e2d0 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
1e2e0 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  e.  ** the FROM 
1e2f0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
1e300 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f  ter query.  Befo
1e310 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72  re doing this, r
1e320 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65  emember.  ** the
1e330 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
1e340 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
1e350 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d  outer query FROM
1e360 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a   element in.  **
1e370 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69   iParent.  The i
1e380 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69  Parent cursor wi
1e390 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ll never be used
1e3a0 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f  .  Subsequent co
1e3b0 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61  de.  ** will sca
1e3c0 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f  n expressions lo
1e3d0 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e  oking for iParen
1e3e0 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  t references and
1e3f0 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68   replace.  ** th
1e400 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77  ose references w
1e410 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ith expressions 
1e420 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20  that resolve to 
1e430 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f  the subquery FRO
1e440 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20  M.  ** elements 
1e450 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69  we are now copyi
1e460 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ng in..  */.  fo
1e470 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61  r(pParent=p; pPa
1e480 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50  rent; pParent=pP
1e490 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70  arent->pPrior, p
1e4a0 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
1e4b0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53  ){.    int nSubS
1e4c0 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74  rc;.    u8 joint
1e4d0 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75  ype = 0;.    pSu
1e4e0 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72  bSrc = pSub->pSr
1e4f0 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  c;     /* FROM c
1e500 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72  lause of subquer
1e510 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63  y */.    nSubSrc
1e520 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63   = pSubSrc->nSrc
1e530 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
1e540 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72  terms in subquer
1e550 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  y FROM clause */
1e560 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72  .    pSrc = pPar
1e570 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f  ent->pSrc;     /
1e580 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
1e590 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1e5a0 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72   */..    if( pSr
1e5b0 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  c ){.      asser
1e5c0 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b  t( pParent==p );
1e5d0 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20    /* First time 
1e5e0 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70  through the loop
1e5f0 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79   */.      jointy
1e600 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a  pe = pSubitem->j
1e610 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c  ointype;.    }el
1e620 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1e630 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20  ( pParent!=p ); 
1e640 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73   /* 2nd and subs
1e650 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72  equent times thr
1e660 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  ough the loop */
1e670 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 50  .      pSrc = pP
1e680 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71  arent->pSrc = sq
1e690 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1e6a0 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b  nd(db, 0, 0, 0);
1e6b0 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63 3d  .      if( pSrc=
1e6c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
1e6d0 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
1e6e0 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
1e6f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1e700 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
1e710 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
1e720 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f   a single slot o
1e730 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
1e740 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20  e of the outer. 
1e750 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66     ** query.  If
1e760 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61   the subquery ha
1e770 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
1e780 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46  element in its F
1e790 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20  ROM clause,.    
1e7a0 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74  ** then expand t
1e7b0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 74  he outer query t
1e7c0 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72  o make space for
1e7d0 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20   it to hold all 
1e7e0 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20  elements.    ** 
1e7f0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
1e800 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
1e810 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20  xample:.    **. 
1e820 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20     **    SELECT 
1e830 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45  * FROM tabA, (SE
1e840 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31  LECT * FROM sub1
1e850 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20  , sub2), tabB;. 
1e860 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1e870 20 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 73   outer query has
1e880 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20   3 slots in its 
1e890 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e  FROM clause.  On
1e8a0 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20  e slot of the.  
1e8b0 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
1e8c0 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f   (the middle slo
1e8d0 74 29 20 69 73 20 75 73 65 64 20 62 79 20 74 68  t) is used by th
1e8e0 65 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 65  e subquery.  The
1e8f0 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f   next.    ** blo
1e900 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20  ck of code will 
1e910 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 20 71  expand the out q
1e920 75 65 72 79 20 74 6f 20 34 20 73 6c 6f 74 73 2e  uery to 4 slots.
1e930 20 20 54 68 65 20 6d 69 64 64 6c 65 0a 20 20 20    The middle.   
1e940 20 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78 70 61   ** slot is expa
1e950 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74  nded to two slot
1e960 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61  s in order to ma
1e970 6b 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  ke space for the
1e980 0a 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d  .    ** two elem
1e990 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ents in the FROM
1e9a0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
1e9b0 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  ubquery..    */.
1e9c0 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e      if( nSubSrc>
1e9d0 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65  1 ){.      pPare
1e9e0 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20  nt->pSrc = pSrc 
1e9f0 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
1ea00 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63  Enlarge(db, pSrc
1ea10 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f  , nSubSrc-1,iFro
1ea20 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  m+1);.      if( 
1ea30 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1ea40 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
1ea50 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1ea60 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65  ..    /* Transfe
1ea70 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  r the FROM claus
1ea80 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65  e terms from the
1ea90 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74   subquery into t
1eaa0 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
1eab0 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  query..    */.  
1eac0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75    for(i=0; i<nSu
1ead0 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  bSrc; i++){.    
1eae0 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
1eaf0 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e  elete(db, pSrc->
1eb00 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e  a[i+iFrom].pUsin
1eb10 67 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e  g);.      pSrc->
1eb20 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75  a[i+iFrom] = pSu
1eb30 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  bSrc->a[i];.    
1eb40 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72    memset(&pSubSr
1eb50 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65  c->a[i], 0, size
1eb60 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d  of(pSubSrc->a[i]
1eb70 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  ));.    }.    pS
1eb80 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69  rc->a[iFrom].joi
1eb90 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65  ntype = jointype
1eba0 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20  ;.  .    /* Now 
1ebb0 62 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69  begin substituti
1ebc0 6e 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75  ng subquery resu
1ebd0 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt set expressio
1ebe0 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72  ns for .    ** r
1ebf0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
1ec00 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20   iParent in the 
1ec10 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20  outer query..   
1ec20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d   ** .    ** Exam
1ec30 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
1ec40 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c  **   SELECT a+5,
1ec50 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45   b*10 FROM (SELE
1ec60 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31  CT x*3 AS a, y+1
1ec70 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20  0 AS b FROM t1) 
1ec80 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a  WHERE a>b;.    *
1ec90 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20  *   \           
1eca0 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
1ecb0 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72  ________ subquer
1ecc0 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  y __________/   
1ecd0 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20         /.    ** 
1ece0 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
1ecf0 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20  _________ outer 
1ed00 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  query __________
1ed10 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1ed20 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20  ____/.    **.   
1ed30 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65   ** We look at e
1ed40 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
1ed50 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
1ed60 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  ry and every pla
1ed70 63 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a  ce we see.    **
1ed80 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75   "a" we substitu
1ed90 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65  te "x*3" and eve
1eda0 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20  ry place we see 
1edb0 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "b" we substitut
1edc0 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f  e "y+10"..    */
1edd0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61  .    pList = pPa
1ede0 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  rent->pEList;.  
1edf0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
1ee00 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
1ee10 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
1ee20 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20  ->a[i].zName==0 
1ee30 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
1ee40 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  *zName = sqlite3
1ee50 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4c 69  DbStrDup(db, pLi
1ee60 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b  st->a[i].zSpan);
1ee70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ee80 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a  Dequote(zName);.
1ee90 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61          pList->a
1eea0 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  [i].zName = zNam
1eeb0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
1eec0 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
1eed0 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  st(db, pParent->
1eee0 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c  pEList, iParent,
1eef0 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
1ef00 20 20 20 20 69 66 28 20 69 73 41 67 67 20 29 7b      if( isAgg ){
1ef10 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72  .      substExpr
1ef20 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74  List(db, pParent
1ef30 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72  ->pGroupBy, iPar
1ef40 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
1ef50 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  t);.      pParen
1ef60 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62  t->pHaving = sub
1ef70 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65  stExpr(db, pPare
1ef80 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61  nt->pHaving, iPa
1ef90 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
1efa0 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  st);.    }.    i
1efb0 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  f( pSub->pOrderB
1efc0 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  y ){.      asser
1efd0 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64  t( pParent->pOrd
1efe0 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  erBy==0 );.     
1eff0 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72   pParent->pOrder
1f000 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65  By = pSub->pOrde
1f010 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d  rBy;.      pSub-
1f020 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
1f030 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
1f040 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 29  rent->pOrderBy )
1f050 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70  {.      substExp
1f060 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e  rList(db, pParen
1f070 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61  t->pOrderBy, iPa
1f080 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
1f090 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  st);.    }.    i
1f0a0 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20  f( pSub->pWhere 
1f0b0 29 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65 20  ){.      pWhere 
1f0c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
1f0d0 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72  (db, pSub->pWher
1f0e0 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  e, 0);.    }else
1f0f0 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d  {.      pWhere =
1f100 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
1f110 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
1f120 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1f130 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
1f140 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  g==0 );.      pP
1f150 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d  arent->pHaving =
1f160 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
1f170 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
1f180 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65  >pWhere = pWhere
1f190 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
1f1a0 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74  >pHaving = subst
1f1b0 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74  Expr(db, pParent
1f1c0 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65  ->pHaving, iPare
1f1d0 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
1f1e0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
1f1f0 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69  ->pHaving = sqli
1f200 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70  te3ExprAnd(db, p
1f210 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c  Parent->pHaving,
1f220 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1f230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f240 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1f250 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61  up(db, pSub->pHa
1f260 76 69 6e 67 2c 20 30 29 29 3b 0a 20 20 20 20 20  ving, 0));.     
1f270 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
1f280 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b  ->pGroupBy==0 );
1f290 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1f2a0 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
1f2b0 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
1f2c0 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79  , pSub->pGroupBy
1f2d0 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
1f2e0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1f2f0 70 57 68 65 72 65 20 3d 20 73 75 62 73 74 45 78  pWhere = substEx
1f300 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  pr(db, pParent->
1f310 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c  pWhere, iParent,
1f320 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
1f330 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1f340 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
1f350 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65  xprAnd(db, pPare
1f360 6e 74 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65  nt->pWhere, pWhe
1f370 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  re);.    }.  .  
1f380 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e    /* The flatten
1f390 65 64 20 71 75 65 72 79 20 69 73 20 64 69 73 74  ed query is dist
1f3a0 69 6e 63 74 20 69 66 20 65 69 74 68 65 72 20 74  inct if either t
1f3b0 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a  he inner or the.
1f3c0 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
1f3d0 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20  ry is distinct. 
1f3e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72  .    */.    pPar
1f3f0 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  ent->selFlags |=
1f400 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
1f410 26 20 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20  & SF_Distinct;. 
1f420 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20   .    /*.    ** 
1f430 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
1f440 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49  (SELECT ... LIMI
1f450 54 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49  T a OFFSET b) LI
1f460 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a  MIT x OFFSET y;.
1f470 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e      **.    ** On
1f480 65 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20  e is tempted to 
1f490 74 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64  try to add a and
1f4a0 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68   b to combine th
1f4b0 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74  e limits.  But t
1f4c0 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20  his.    ** does 
1f4d0 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68  not work if eith
1f4e0 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61  er limit is nega
1f4f0 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tive..    */.   
1f500 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
1f510 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65  t ){.      pPare
1f520 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75  nt->pLimit = pSu
1f530 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  b->pLimit;.     
1f540 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20   pSub->pLimit = 
1f550 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
1f560 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c  /* Finially, del
1f570 65 74 65 20 77 68 61 74 20 69 73 20 6c 65 66 74  ete what is left
1f580 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
1f590 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a   and return.  **
1f5a0 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20   success..  */. 
1f5b0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1f5c0 6c 65 74 65 28 64 62 2c 20 70 53 75 62 31 29 3b  lete(db, pSub1);
1f5d0 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ..  return 1;.}.
1f5e0 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
1f5f0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
1f600 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
1f610 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1f620 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _VIEW) */../*.**
1f630 20 42 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f   Based on the co
1f640 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 41 67  ntents of the Ag
1f650 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  gInfo structure 
1f660 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65  indicated by the
1f670 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65   first.** argume
1f680 6e 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  nt, this functio
1f690 6e 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 20  n checks if the 
1f6a0 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
1f6b0 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74  ue:.**.**    * t
1f6c0 68 65 20 71 75 65 72 79 20 63 6f 6e 74 61 69 6e  he query contain
1f6d0 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20  s just a single 
1f6e0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
1f6f0 6f 6e 2c 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  on,.**    * the 
1f700 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
1f710 6f 6e 20 69 73 20 65 69 74 68 65 72 20 6d 69 6e  on is either min
1f720 28 29 20 6f 72 20 6d 61 78 28 29 2c 20 61 6e 64  () or max(), and
1f730 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 72 67  .**    * the arg
1f740 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 61 67 67  ument to the agg
1f750 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
1f760 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  is a column valu
1f770 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20  e..**.** If all 
1f780 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65  of the above are
1f790 20 74 72 75 65 2c 20 74 68 65 6e 20 57 48 45 52   true, then WHER
1f7a0 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72  E_ORDERBY_MIN or
1f7b0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
1f7c0 41 58 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  AX.** is returne
1f7d0 64 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  d as appropriate
1f7e0 2e 20 41 6c 73 6f 2c 20 2a 70 70 4d 69 6e 4d 61  . Also, *ppMinMa
1f7f0 78 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  x is set to poin
1f800 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 6c 69 73  t to the .** lis
1f810 74 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70  t of arguments p
1f820 61 73 73 65 64 20 74 6f 20 74 68 65 20 61 67 67  assed to the agg
1f830 72 65 67 61 74 65 20 62 65 66 6f 72 65 20 72 65  regate before re
1f840 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f  turning..**.** O
1f850 72 2c 20 69 66 20 74 68 65 20 63 6f 6e 64 69 74  r, if the condit
1f860 69 6f 6e 73 20 61 62 6f 76 65 20 61 72 65 20 6e  ions above are n
1f870 6f 74 20 6d 65 74 2c 20 2a 70 70 4d 69 6e 4d 61  ot met, *ppMinMa
1f880 78 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e  x is set to 0 an
1f890 64 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44 45 52  d.** WHERE_ORDER
1f8a0 42 59 5f 4e 4f 52 4d 41 4c 20 69 73 20 72 65 74  BY_NORMAL is ret
1f8b0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
1f8c0 20 75 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28   u8 minMaxQuery(
1f8d0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
1f8e0 6f 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70  o, ExprList **pp
1f8f0 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 65  MinMax){.  int e
1f900 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  Ret = WHERE_ORDE
1f910 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20 20  RBY_NORMAL;     
1f920 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
1f930 61 6c 75 65 20 2a 2f 0a 0a 20 20 2a 70 70 4d 69  alue */..  *ppMi
1f940 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 69 66 28 20  nMax = 0;.  if( 
1f950 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d  pAggInfo->nFunc=
1f960 3d 31 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  =1 ){.    Expr *
1f970 70 45 78 70 72 20 3d 20 70 41 67 67 49 6e 66 6f  pExpr = pAggInfo
1f980 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72  ->aFunc[0].pExpr
1f990 3b 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20 66  ; /* Aggregate f
1f9a0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 45  unction */.    E
1f9b0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
1f9c0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
1f9d0 3b 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65  ;      /* Argume
1f9e0 6e 74 73 20 74 6f 20 61 67 67 20 66 75 6e 63 74  nts to agg funct
1f9f0 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  ion */..    asse
1fa00 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
1fa10 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
1fa20 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
1fa30 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
1fa40 72 3d 3d 31 20 26 26 20 70 45 4c 69 73 74 2d 3e  r==1 && pEList->
1fa50 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d  a[0].pExpr->op==
1fa60 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b  TK_AGG_COLUMN ){
1fa70 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
1fa80 72 20 2a 7a 46 75 6e 63 20 3d 20 70 45 78 70 72  r *zFunc = pExpr
1fa90 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
1faa0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1fab0 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e  ICmp(zFunc, "min
1fac0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
1fad0 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52   eRet = WHERE_OR
1fae0 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 20  DERBY_MIN;.     
1faf0 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70     *ppMinMax = p
1fb00 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c  EList;.      }el
1fb10 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
1fb20 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61  rICmp(zFunc, "ma
1fb30 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  x")==0 ){.      
1fb40 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f    eRet = WHERE_O
1fb50 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20  RDERBY_MAX;.    
1fb60 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20      *ppMinMax = 
1fb70 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a  pEList;.      }.
1fb80 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
1fb90 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d  ert( *ppMinMax==
1fba0 30 20 7c 7c 20 28 2a 70 70 4d 69 6e 4d 61 78 29  0 || (*ppMinMax)
1fbb0 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20  ->nExpr==1 );.  
1fbc0 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a  return eRet;.}..
1fbd0 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74  /*.** The select
1fbe0 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
1fbf0 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
1fc00 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 67  rgument is an ag
1fc10 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a  gregate query..*
1fc20 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  * The second arg
1fc30 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f  ment is the asso
1fc40 63 69 61 74 65 64 20 61 67 67 72 65 67 61 74 65  ciated aggregate
1fc50 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68  -info object. Th
1fc60 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
1fc70 74 65 73 74 73 20 69 66 20 74 68 65 20 53 45 4c  tests if the SEL
1fc80 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ECT is of the fo
1fc90 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  rm:.**.**   SELE
1fca0 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
1fcb0 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65   <tbl>.**.** whe
1fcc0 72 65 20 74 61 62 6c 65 20 69 73 20 61 20 64 61  re table is a da
1fcd0 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f  tabase table, no
1fce0 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  t a sub-select o
1fcf0 72 20 76 69 65 77 2e 20 49 66 20 74 68 65 20 71  r view. If the q
1fd00 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74  uery.** does mat
1fd10 63 68 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c  ch this pattern,
1fd20 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20   then a pointer 
1fd30 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  to the Table obj
1fd40 65 63 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67  ect representing
1fd50 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74  .** <tbl> is ret
1fd60 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
1fd70 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e  , 0 is returned.
1fd80 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65  .*/.static Table
1fd90 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28   *isSimpleCount(
1fda0 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e  Select *p, AggIn
1fdb0 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
1fdc0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
1fdd0 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20  Expr *pExpr;..  
1fde0 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f  assert( !p->pGro
1fdf0 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70  upBy );..  if( p
1fe00 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70  ->pWhere || p->p
1fe10 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  EList->nExpr!=1 
1fe20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e  .   || p->pSrc->
1fe30 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53  nSrc!=1 || p->pS
1fe40 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
1fe50 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
1fe60 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d   0;.  }.  pTab =
1fe70 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
1fe80 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70  Tab;.  pExpr = p
1fe90 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
1fea0 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20  Expr;.  assert( 
1feb0 70 54 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70  pTab && !pTab->p
1fec0 53 65 6c 65 63 74 20 26 26 20 70 45 78 70 72 20  Select && pExpr 
1fed0 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74  );..  if( IsVirt
1fee0 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75  ual(pTab) ) retu
1fef0 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
1ff00 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55  r->op!=TK_AGG_FU
1ff10 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20  NCTION ) return 
1ff20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  0;.  if( NEVER(p
1ff30 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d  AggInfo->nFunc==
1ff40 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  0) ) return 0;. 
1ff50 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e   if( (pAggInfo->
1ff60 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e  aFunc[0].pFunc->
1ff70 66 75 6e 63 46 6c 61 67 73 26 53 51 4c 49 54 45  funcFlags&SQLITE
1ff80 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20  _FUNC_COUNT)==0 
1ff90 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
1ffa0 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 26 45  ( pExpr->flags&E
1ffb0 50 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65 74  P_Distinct ) ret
1ffc0 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e  urn 0;..  return
1ffd0 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pTab;.}../*.** 
1ffe0 49 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69  If the source-li
1fff0 73 74 20 69 74 65 6d 20 70 61 73 73 65 64 20 61  st item passed a
20000 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 61  s an argument wa
20010 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68  s augmented with
20020 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42   an.** INDEXED B
20030 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74  Y clause, then t
20040 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  ry to locate the
20050 20 73 70 65 63 69 66 69 65 64 20 69 6e 64 65 78   specified index
20060 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 77 61  . If there.** wa
20070 73 20 73 75 63 68 20 61 20 63 6c 61 75 73 65 20  s such a clause 
20080 61 6e 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e  and the named in
20090 64 65 78 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  dex cannot be fo
200a0 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  und, return .** 
200b0 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64  SQLITE_ERROR and
200c0 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
200d0 69 6e 20 70 50 61 72 73 65 2e 20 4f 74 68 65 72  in pParse. Other
200e0 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a  wise, populate .
200f0 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78  ** pFrom->pIndex
20100 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
20110 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
20120 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f  lite3IndexedByLo
20130 6f 6b 75 70 28 50 61 72 73 65 20 2a 70 50 61 72  okup(Parse *pPar
20140 73 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69  se, struct SrcLi
20150 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b  st_item *pFrom){
20160 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54  .  if( pFrom->pT
20170 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e 7a 49 6e  ab && pFrom->zIn
20180 64 65 78 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  dex ){.    Table
20190 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
201a0 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a  pTab;.    char *
201b0 7a 49 6e 64 65 78 20 3d 20 70 46 72 6f 6d 2d 3e  zIndex = pFrom->
201c0 7a 49 6e 64 65 78 3b 0a 20 20 20 20 49 6e 64 65  zIndex;.    Inde
201d0 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72  x *pIdx;.    for
201e0 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
201f0 65 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64  ex; .        pId
20200 78 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  x && sqlite3StrI
20210 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c  Cmp(pIdx->zName,
20220 20 7a 49 6e 64 65 78 29 3b 20 0a 20 20 20 20 20   zIndex); .     
20230 20 20 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e     pIdx=pIdx->pN
20240 65 78 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ext.    );.    i
20250 66 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20  f( !pIdx ){.    
20260 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
20270 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
20280 63 68 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a  ch index: %s", z
20290 49 6e 64 65 78 2c 20 30 29 3b 0a 20 20 20 20 20  Index, 0);.     
202a0 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63   pParse->checkSc
202b0 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20  hema = 1;.      
202c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
202d0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
202e0 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70  From->pIndex = p
202f0 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Idx;.  }.  retur
20300 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f  n SQLITE_OK;.}./
20310 2a 0a 2a 2a 20 44 65 74 65 63 74 20 63 6f 6d 70  *.** Detect comp
20320 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74  ound SELECT stat
20330 65 6d 65 6e 74 73 20 74 68 61 74 20 75 73 65 20  ements that use 
20340 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
20350 73 65 20 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61  se with .** an a
20360 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61  lternative colla
20370 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
20380 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2e  *.**    SELECT .
20390 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50  .. FROM t1 EXCEP
203a0 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  T SELECT ... FRO
203b0 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20 2e 2e  M t2 ORDER BY ..
203c0 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a   COLLATE ....**.
203d0 2a 2a 20 54 68 65 73 65 20 61 72 65 20 72 65 77  ** These are rew
203e0 72 69 74 74 65 6e 20 61 73 20 61 20 73 75 62 71  ritten as a subq
203f0 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  uery:.**.**    S
20400 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45  ELECT * FROM (SE
20410 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  LECT ... FROM t1
20420 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e   EXCEPT SELECT .
20430 2e 2e 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20  .. FROM t2).**  
20440 20 20 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20     ORDER BY ... 
20450 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a  COLLATE ....**.*
20460 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d  * This transform
20470 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61  ation is necessa
20480 72 79 20 62 65 63 61 75 73 65 20 74 68 65 20 6d  ry because the m
20490 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
204a0 79 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  y() routine.** a
204b0 62 6f 76 65 20 74 68 61 74 20 67 65 6e 65 72 61  bove that genera
204c0 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72  tes the code for
204d0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
204e0 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52  CT with an ORDER
204f0 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73   BY clause.** us
20500 65 73 20 61 20 6d 65 72 67 65 20 61 6c 67 6f 72  es a merge algor
20510 69 74 68 6d 20 74 68 61 74 20 72 65 71 75 69 72  ithm that requir
20520 65 73 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c  es the same coll
20530 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f  ating sequence o
20540 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20  n the.** result 
20550 63 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68  columns as on th
20560 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
20570 65 2e 20 20 53 65 65 20 74 69 63 6b 65 74 0a 2a  e.  See ticket.*
20580 2a 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c  * http://www.sql
20590 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f  ite.org/src/info
205a0 2f 36 37 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a  /6709574d2a.**.*
205b0 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d  * This transform
205c0 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65  ation is only ne
205d0 65 64 65 64 20 66 6f 72 20 45 58 43 45 50 54 2c  eded for EXCEPT,
205e0 20 49 4e 54 45 52 53 45 43 54 2c 20 61 6e 64 20   INTERSECT, and 
205f0 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e  UNION..** The UN
20600 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
20610 20 77 6f 72 6b 73 20 66 69 6e 65 20 77 69 74 68   works fine with
20620 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
20630 72 42 79 28 29 20 65 76 65 6e 20 77 68 65 6e 0a  rBy() even when.
20640 2a 2a 20 74 68 65 72 65 20 61 72 65 20 43 4f 4c  ** there are COL
20650 4c 41 54 45 20 74 65 72 6d 73 20 69 6e 20 74 68  LATE terms in th
20660 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73  e ORDER BY..*/.s
20670 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 76 65 72  tatic int conver
20680 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54  tCompoundSelectT
20690 6f 53 75 62 71 75 65 72 79 28 57 61 6c 6b 65 72  oSubquery(Walker
206a0 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
206b0 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  t *p){.  int i;.
206c0 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a    Select *pNew;.
206d0 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20    Select *pX;.  
206e0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73  sqlite3 *db;.  s
206f0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
20700 74 65 6d 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73  tem *a;.  SrcLis
20710 74 20 2a 70 4e 65 77 53 72 63 3b 0a 20 20 50 61  t *pNewSrc;.  Pa
20720 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 54  rse *pParse;.  T
20730 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69  oken dummy;..  i
20740 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  f( p->pPrior==0 
20750 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
20760 74 69 6e 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e  tinue;.  if( p->
20770 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65  pOrderBy==0 ) re
20780 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
20790 65 3b 0a 20 20 66 6f 72 28 70 58 3d 70 3b 20 70  e;.  for(pX=p; p
207a0 58 20 26 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b  X && (pX->op==TK
207b0 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d  _ALL || pX->op==
207c0 54 4b 5f 53 45 4c 45 43 54 29 3b 20 70 58 3d 70  TK_SELECT); pX=p
207d0 58 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69  X->pPrior){}.  i
207e0 66 28 20 70 58 3d 3d 30 20 29 20 72 65 74 75 72  f( pX==0 ) retur
207f0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
20800 20 20 61 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42    a = p->pOrderB
20810 79 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d  y->a;.  for(i=p-
20820 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
20830 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
20840 20 20 20 20 69 66 28 20 61 5b 69 5d 2e 70 45 78      if( a[i].pEx
20850 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43  pr->flags & EP_C
20860 6f 6c 6c 61 74 65 20 29 20 62 72 65 61 6b 3b 0a  ollate ) break;.
20870 20 20 7d 0a 20 20 69 66 28 20 69 3c 30 20 29 20    }.  if( i<0 ) 
20880 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
20890 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  nue;..  /* If we
208a0 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
208b0 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  t, that means th
208c0 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  e transformation
208d0 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   is required. */
208e0 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 61  ..  pParse = pWa
208f0 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
20900 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
20910 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
20920 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
20930 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  , sizeof(*pNew) 
20940 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
20950 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
20960 6f 72 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  ort;.  memset(&d
20970 75 6d 6d 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ummy, 0, sizeof(
20980 64 75 6d 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53  dummy));.  pNewS
20990 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
209a0 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72  istAppendFromTer
209b0 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26  m(pParse,0,0,0,&
209c0 64 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b  dummy,pNew,0,0);
209d0 0a 20 20 69 66 28 20 70 4e 65 77 53 72 63 3d 3d  .  if( pNewSrc==
209e0 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
209f0 62 6f 72 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20  bort;.  *pNew = 
20a00 2a 70 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20  *p;.  p->pSrc = 
20a10 70 4e 65 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45  pNewSrc;.  p->pE
20a20 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
20a30 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
20a40 72 73 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45  rse, 0, sqlite3E
20a50 78 70 72 28 64 62 2c 20 54 4b 5f 41 4c 4c 2c 20  xpr(db, TK_ALL, 
20a60 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54  0));.  p->op = T
20a70 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70  K_SELECT;.  p->p
20a80 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65  Where = 0;.  pNe
20a90 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b  w->pGroupBy = 0;
20aa0 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67  .  pNew->pHaving
20ab0 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f   = 0;.  pNew->pO
20ac0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d  rderBy = 0;.  p-
20ad0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70  >pPrior = 0;.  p
20ae0 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70  ->pNext = 0;.  p
20af0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
20b00 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 61 73  F_Compound;.  as
20b10 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 50 72 69  sert( pNew->pPri
20b20 6f 72 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d  or!=0 );.  pNew-
20b30 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d  >pPrior->pNext =
20b40 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70   pNew;.  pNew->p
20b50 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65  Limit = 0;.  pNe
20b60 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  w->pOffset = 0;.
20b70 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
20b80 74 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65  tinue;.}..#ifnde
20b90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
20ba0 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  E./*.** Argument
20bb0 20 70 57 69 74 68 20 28 77 68 69 63 68 20 6d 61   pWith (which ma
20bc0 79 20 62 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74  y be NULL) point
20bd0 73 20 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69  s to a linked li
20be0 73 74 20 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a  st of nested .**
20bf0 20 57 49 54 48 20 63 6f 6e 74 65 78 74 73 2c 20   WITH contexts, 
20c00 66 72 6f 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75  from inner to ou
20c10 74 65 72 6d 6f 73 74 2e 20 49 66 20 74 68 65 20  termost. If the 
20c20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64  table identified
20c30 20 62 79 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61   by .** FROM cla
20c40 75 73 65 20 65 6c 65 6d 65 6e 74 20 70 49 74 65  use element pIte
20c50 6d 20 69 73 20 72 65 61 6c 6c 79 20 61 20 63 6f  m is really a co
20c60 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65  mmon-table-expre
20c70 73 73 69 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20  ssion (CTE) .** 
20c80 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f  then return a po
20c90 69 6e 74 65 72 20 74 6f 20 74 68 65 20 43 54 45  inter to the CTE
20ca0 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20   definition for 
20cb0 74 68 61 74 20 74 61 62 6c 65 2e 20 4f 74 68 65  that table. Othe
20cc0 72 77 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20  rwise.** return 
20cd0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  NULL..**.** If a
20ce0 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20   non-NULL value 
20cf0 69 73 20 72 65 74 75 72 6e 65 64 2c 20 73 65 74  is returned, set
20d00 20 2a 70 70 43 6f 6e 74 65 78 74 20 74 6f 20 70   *ppContext to p
20d10 6f 69 6e 74 20 74 6f 20 74 68 65 20 57 69 74 68  oint to the With
20d20 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20  .** object that 
20d30 74 68 65 20 72 65 74 75 72 6e 65 64 20 43 54 45  the returned CTE
20d40 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a   belongs to..*/.
20d50 73 74 61 74 69 63 20 73 74 72 75 63 74 20 43 74  static struct Ct
20d60 65 20 2a 73 65 61 72 63 68 57 69 74 68 28 0a 20  e *searchWith(. 
20d70 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20   With *pWith,   
20d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d90 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 75 74 65   /* Current oute
20da0 72 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73  rmost WITH claus
20db0 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
20dc0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
20dd0 6d 2c 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  m,     /* FROM c
20de0 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f  lause element to
20df0 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69   resolve */.  Wi
20e00 74 68 20 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20  th **ppContext  
20e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20e20 20 4f 55 54 3a 20 57 49 54 48 20 63 6c 61 75 73   OUT: WITH claus
20e30 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 62  e return value b
20e40 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a  elongs to */.){.
20e50 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
20e60 61 6d 65 3b 0a 20 20 69 66 28 20 70 49 74 65 6d  ame;.  if( pItem
20e70 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 26  ->zDatabase==0 &
20e80 26 20 28 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d  & (zName = pItem
20e90 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  ->zName)!=0 ){. 
20ea0 20 20 20 57 69 74 68 20 2a 70 3b 0a 20 20 20 20     With *p;.    
20eb0 66 6f 72 28 70 3d 70 57 69 74 68 3b 20 70 3b 20  for(p=pWith; p; 
20ec0 70 3d 70 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20  p=p->pOuter){.  
20ed0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
20ee0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
20ef0 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Cte; i++){.     
20f00 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
20f10 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e  rICmp(zName, p->
20f20 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  a[i].zName)==0 )
20f30 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70 43  {.          *ppC
20f40 6f 6e 74 65 78 74 20 3d 20 70 3b 0a 20 20 20 20  ontext = p;.    
20f50 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d        return &p-
20f60 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d  >a[i];.        }
20f70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20f80 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
20f90 0a 0a 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65  ../* The code ge
20fa0 6e 65 72 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e  nerator maintain
20fb0 73 20 61 20 73 74 61 63 6b 20 6f 66 20 61 63 74  s a stack of act
20fc0 69 76 65 20 57 49 54 48 20 63 6c 61 75 73 65 73  ive WITH clauses
20fd0 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e 6e  .** with the inn
20fe0 65 72 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c 61  er-most WITH cla
20ff0 75 73 65 20 62 65 69 6e 67 20 61 74 20 74 68 65  use being at the
21000 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
21010 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
21020 75 74 69 6e 65 20 70 75 73 68 65 73 20 74 68 65  utine pushes the
21030 20 57 49 54 48 20 63 6c 61 75 73 65 20 70 61 73   WITH clause pas
21040 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
21050 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e  d argument.** on
21060 74 6f 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  to the top of th
21070 65 20 73 74 61 63 6b 2e 20 49 66 20 61 72 67 75  e stack. If argu
21080 6d 65 6e 74 20 62 46 72 65 65 20 69 73 20 74 72  ment bFree is tr
21090 75 65 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a  ue, then this.**
210a0 20 57 49 54 48 20 63 6c 61 75 73 65 20 77 69 6c   WITH clause wil
210b0 6c 20 6e 65 76 65 72 20 62 65 20 70 6f 70 70 65  l never be poppe
210c0 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  d from the stack
210d0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
210e0 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 66  t.** should be f
210f0 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  reed along with 
21100 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
21110 2e 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73  . In other cases
21120 2c 20 77 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d  , when.** bFree=
21130 3d 30 2c 20 74 68 65 20 57 69 74 68 20 6f 62 6a  =0, the With obj
21140 65 63 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65  ect will be free
21150 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
21160 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74   SELECT .** stat
21170 65 6d 65 6e 74 20 77 69 74 68 20 77 68 69 63 68  ement with which
21180 20 69 74 20 69 73 20 61 73 73 6f 63 69 61 74 65   it is associate
21190 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
211a0 65 33 57 69 74 68 50 75 73 68 28 50 61 72 73 65  e3WithPush(Parse
211b0 20 2a 70 50 61 72 73 65 2c 20 57 69 74 68 20 2a   *pParse, With *
211c0 70 57 69 74 68 2c 20 75 38 20 62 46 72 65 65 29  pWith, u8 bFree)
211d0 7b 0a 20 20 61 73 73 65 72 74 28 20 62 46 72 65  {.  assert( bFre
211e0 65 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  e==0 || pParse->
211f0 70 57 69 74 68 3d 3d 30 20 29 3b 0a 20 20 69 66  pWith==0 );.  if
21200 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 70  ( pWith ){.    p
21210 57 69 74 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70  With->pOuter = p
21220 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20  Parse->pWith;.  
21230 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
21240 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61  = pWith;.    pPa
21250 72 73 65 2d 3e 62 46 72 65 65 57 69 74 68 20 3d  rse->bFreeWith =
21260 20 62 46 72 65 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f   bFree;.  }.}../
21270 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
21280 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 61 72 67  on checks if arg
21290 75 6d 65 6e 74 20 70 46 72 6f 6d 20 72 65 66 65  ument pFrom refe
212a0 72 73 20 74 6f 20 61 20 43 54 45 20 64 65 63 6c  rs to a CTE decl
212b0 61 72 65 64 20 62 79 20 0a 2a 2a 20 61 20 57 49  ared by .** a WI
212c0 54 48 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65  TH clause on the
212d0 20 73 74 61 63 6b 20 63 75 72 72 65 6e 74 6c 79   stack currently
212e0 20 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20 74   maintained by t
212f0 68 65 20 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a  he parser. And,.
21300 2a 2a 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20  ** if currently 
21310 70 72 6f 63 65 73 73 69 6e 67 20 61 20 43 54 45  processing a CTE
21320 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 69 66 20   expression, if 
21330 69 74 20 69 73 20 61 20 72 65 63 75 72 73 69 76  it is a recursiv
21340 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74  e.** reference t
21350 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 43 54  o the current CT
21360 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f  E..**.** If pFro
21370 6d 20 66 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74  m falls into eit
21380 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 63  her of the two c
21390 61 74 65 67 6f 72 69 65 73 20 61 62 6f 76 65 2c  ategories above,
213a0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20   pFrom->pTab.** 
213b0 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73  and other fields
213c0 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 61   are populated a
213d0 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68 65 20  ccordingly. The 
213e0 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 68  caller should ch
213f0 65 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70  eck.** (pFrom->p
21400 54 61 62 21 3d 30 29 20 74 6f 20 64 65 74 65 72  Tab!=0) to deter
21410 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
21420 6e 6f 74 20 61 20 73 75 63 63 65 73 73 66 75 6c  not a successful
21430 20 6d 61 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f   match.** was fo
21440 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68  und..**.** Wheth
21450 65 72 20 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63  er or not a matc
21460 68 20 69 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49  h is found, SQLI
21470 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
21480 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a  d if no error.**
21490 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65   occurs. If an e
214a0 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c  rror does occur,
214b0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
214c0 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74  e is stored in t
214d0 68 65 0a 2a 2a 20 70 61 72 73 65 72 20 61 6e 64  he.** parser and
214e0 20 73 6f 6d 65 20 65 72 72 6f 72 20 63 6f 64 65   some error code
214f0 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
21500 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
21510 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
21520 74 68 45 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b  thExpand(.  Walk
21530 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20  er *pWalker, .  
21540 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
21550 74 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20  tem *pFrom.){.  
21560 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
21570 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
21580 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
21590 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73   pParse->db;.  s
215a0 74 72 75 63 74 20 43 74 65 20 2a 70 43 74 65 3b  truct Cte *pCte;
215b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
215c0 2a 20 4d 61 74 63 68 65 64 20 43 54 45 20 28 6f  * Matched CTE (o
215d0 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74  r NULL if no mat
215e0 63 68 29 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70  ch) */.  With *p
215f0 57 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  With;           
21600 20 20 20 20 20 20 20 20 20 2f 2a 20 57 49 54 48           /* WITH
21610 20 63 6c 61 75 73 65 20 74 68 61 74 20 70 43 74   clause that pCt
21620 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  e belongs to */.
21630 0a 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d  .  assert( pFrom
21640 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20  ->pTab==0 );..  
21650 70 43 74 65 20 3d 20 73 65 61 72 63 68 57 69 74  pCte = searchWit
21660 68 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68 2c  h(pParse->pWith,
21670 20 70 46 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b   pFrom, &pWith);
21680 0a 20 20 69 66 28 20 70 43 74 65 20 29 7b 0a 20  .  if( pCte ){. 
21690 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
216a0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
216b0 4c 69 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74  List;.    Select
216c0 20 2a 70 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65   *pSel;.    Sele
216d0 63 74 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  ct *pLeft;      
216e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66            /* Lef
216f0 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
21700 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
21710 6e 74 20 62 4d 61 79 52 65 63 75 72 73 69 76 65  nt bMayRecursive
21720 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
21730 54 72 75 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64  True if compound
21740 20 6a 6f 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e   joined by UNION
21750 20 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69   [ALL] */.    Wi
21760 74 68 20 2a 70 53 61 76 65 64 57 69 74 68 3b 20  th *pSavedWith; 
21770 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
21780 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20  nitial value of 
21790 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f  pParse->pWith */
217a0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 74 65  ..    /* If pCte
217b0 2d 3e 7a 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55  ->zErr is non-NU
217c0 4c 4c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  LL at this point
217d0 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61  , then this is a
217e0 6e 20 69 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a  n illegal.    **
217f0 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72   recursive refer
21800 65 6e 63 65 20 74 6f 20 43 54 45 20 70 43 74 65  ence to CTE pCte
21810 2e 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  . Leave an error
21820 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
21830 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72  eturn.    ** ear
21840 6c 79 2e 20 49 66 20 70 43 74 65 2d 3e 7a 45 72  ly. If pCte->zEr
21850 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  r is NULL, then 
21860 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65  this is not a re
21870 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
21880 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  e..    ** In thi
21890 73 20 63 61 73 65 2c 20 70 72 6f 63 65 65 64 2e  s case, proceed.
218a0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 74    */.    if( pCt
218b0 65 2d 3e 7a 45 72 72 20 29 7b 0a 20 20 20 20 20  e->zErr ){.     
218c0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
218d0 28 70 50 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a  (pParse, pCte->z
218e0 45 72 72 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  Err, pCte->zName
218f0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
21900 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
21910 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
21920 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
21930 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  );.    pFrom->pT
21940 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69  ab = pTab = sqli
21950 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
21960 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
21970 29 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ));.    if( pTab
21980 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
21990 5f 41 62 6f 72 74 3b 0a 20 20 20 20 70 54 61 62  _Abort;.    pTab
219a0 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
219b0 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  pTab->zName = sq
219c0 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
219d0 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCte->zName);.
219e0 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20      pTab->iPKey 
219f0 3d 20 2d 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e  = -1;.    pTab->
21a00 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30  nRowLogEst = 200
21a10 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73  ; assert( 200==s
21a20 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34  qlite3LogEst(104
21a30 38 35 37 36 29 20 29 3b 0a 20 20 20 20 70 54 61  8576) );.    pTa
21a40 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  b->tabFlags |= T
21a50 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20  F_Ephemeral;.   
21a60 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20   pFrom->pSelect 
21a70 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
21a80 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65  up(db, pCte->pSe
21a90 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  lect, 0);.    if
21aa0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
21ab0 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ed ) return SQLI
21ac0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 61 73  TE_NOMEM;.    as
21ad0 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65  sert( pFrom->pSe
21ae0 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  lect );..    /* 
21af0 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73  Check if this is
21b00 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45   a recursive CTE
21b10 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20 3d 20  . */.    pSel = 
21b20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pFrom->pSelect;.
21b30 20 20 20 20 62 4d 61 79 52 65 63 75 72 73 69 76      bMayRecursiv
21b40 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d  e = ( pSel->op==
21b50 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e  TK_ALL || pSel->
21b60 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
21b70 20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75      if( bMayRecu
21b80 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69  rsive ){.      i
21b90 6e 74 20 69 3b 0a 20 20 20 20 20 20 53 72 63 4c  nt i;.      SrcL
21ba0 69 73 74 20 2a 70 53 72 63 20 3d 20 70 46 72 6f  ist *pSrc = pFro
21bb0 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63  m->pSelect->pSrc
21bc0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
21bd0 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69   i<pSrc->nSrc; i
21be0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  ++){.        str
21bf0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
21c00 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72 63 2d   *pItem = &pSrc-
21c10 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  >a[i];.        i
21c20 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  f( pItem->zDatab
21c30 61 73 65 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  ase==0 .        
21c40 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65   && pItem->zName
21c50 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26  !=0 .         &&
21c60 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
21c70 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c  mp(pItem->zName,
21c80 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20   pCte->zName).  
21c90 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
21ca0 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62       pItem->pTab
21cb0 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20   = pTab;.       
21cc0 20 20 20 70 49 74 65 6d 2d 3e 69 73 52 65 63 75     pItem->isRecu
21cd0 72 73 69 76 65 20 3d 20 31 3b 0a 20 20 20 20 20  rsive = 1;.     
21ce0 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b       pTab->nRef+
21cf0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 65  +;.          pSe
21d00 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  l->selFlags |= S
21d10 46 5f 52 65 63 75 72 73 69 76 65 3b 0a 20 20 20  F_Recursive;.   
21d20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
21d30 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c     }..    /* Onl
21d40 79 20 6f 6e 65 20 72 65 63 75 72 73 69 76 65 20  y one recursive 
21d50 72 65 66 65 72 65 6e 63 65 20 69 73 20 70 65 72  reference is per
21d60 6d 69 74 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20  mitted. */ .    
21d70 69 66 28 20 70 54 61 62 2d 3e 6e 52 65 66 3e 32  if( pTab->nRef>2
21d80 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
21d90 33 45 72 72 6f 72 4d 73 67 28 0a 20 20 20 20 20  3ErrorMsg(.     
21da0 20 20 20 20 20 70 50 61 72 73 65 2c 20 22 6d 75       pParse, "mu
21db0 6c 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65  ltiple reference
21dc0 73 20 74 6f 20 72 65 63 75 72 73 69 76 65 20 74  s to recursive t
21dd0 61 62 6c 65 3a 20 25 73 22 2c 20 70 43 74 65 2d  able: %s", pCte-
21de0 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a  >zName.      );.
21df0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
21e00 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
21e10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
21e20 62 2d 3e 6e 52 65 66 3d 3d 31 20 7c 7c 20 28 28  b->nRef==1 || ((
21e30 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53  pSel->selFlags&S
21e40 46 5f 52 65 63 75 72 73 69 76 65 29 20 26 26 20  F_Recursive) && 
21e50 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 32 20 29 29  pTab->nRef==2 ))
21e60 3b 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a 45 72  ;..    pCte->zEr
21e70 72 20 3d 20 22 63 69 72 63 75 6c 61 72 20 72 65  r = "circular re
21e80 66 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a 20 20  ference: %s";.  
21e90 20 20 70 53 61 76 65 64 57 69 74 68 20 3d 20 70    pSavedWith = p
21ea0 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20  Parse->pWith;.  
21eb0 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
21ec0 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 73 71 6c  = pWith;.    sql
21ed0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
21ee0 57 61 6c 6b 65 72 2c 20 62 4d 61 79 52 65 63 75  Walker, bMayRecu
21ef0 72 73 69 76 65 20 3f 20 70 53 65 6c 2d 3e 70 50  rsive ? pSel->pP
21f00 72 69 6f 72 20 3a 20 70 53 65 6c 29 3b 0a 0a 20  rior : pSel);.. 
21f10 20 20 20 66 6f 72 28 70 4c 65 66 74 3d 70 53 65     for(pLeft=pSe
21f20 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72  l; pLeft->pPrior
21f30 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74 2d 3e 70  ; pLeft=pLeft->p
21f40 50 72 69 6f 72 29 3b 0a 20 20 20 20 70 45 4c 69  Prior);.    pELi
21f50 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70 45 4c 69  st = pLeft->pELi
21f60 73 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 65  st;.    if( pCte
21f70 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20 20 20 20 20  ->pCols ){.     
21f80 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78   if( pEList->nEx
21f90 70 72 21 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d  pr!=pCte->pCols-
21fa0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
21fb0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
21fc0 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
21fd0 20 25 73 20 68 61 73 20 25 64 20 76 61 6c 75 65   %s has %d value
21fe0 73 20 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73  s for %d columns
21ff0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ",.            p
22000 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69  Cte->zName, pELi
22010 73 74 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d  st->nExpr, pCte-
22020 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20  >pCols->nExpr.  
22030 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
22040 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
22050 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20 20   pSavedWith;.   
22060 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
22070 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
22080 7d 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d  }.      pEList =
22090 20 70 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20   pCte->pCols;.  
220a0 20 20 7d 0a 0a 20 20 20 20 73 65 6c 65 63 74 43    }..    selectC
220b0 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
220c0 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  st(pParse, pELis
220d0 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  t, &pTab->nCol, 
220e0 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20  &pTab->aCol);.  
220f0 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73    if( bMayRecurs
22100 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ive ){.      if(
22110 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20   pSel->selFlags 
22120 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29  & SF_Recursive )
22130 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e  {.        pCte->
22140 7a 45 72 72 20 3d 20 22 6d 75 6c 74 69 70 6c 65  zErr = "multiple
22150 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72   recursive refer
22160 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20 20 20 20  ences: %s";.    
22170 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22180 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20 22 72   pCte->zErr = "r
22190 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
221a0 63 65 20 69 6e 20 61 20 73 75 62 71 75 65 72 79  ce in a subquery
221b0 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20  : %s";.      }. 
221c0 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
221d0 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
221e0 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pSel);.    }.   
221f0 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20 30 3b   pCte->zErr = 0;
22200 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69  .    pParse->pWi
22210 74 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b  th = pSavedWith;
22220 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
22230 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
22240 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
22250 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a  TE_OMIT_CTE./*.*
22260 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20  * If the SELECT 
22270 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
22280 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 68 61  cond argument ha
22290 73 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20  s an associated 
222a0 57 49 54 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c  WITH .** clause,
222b0 20 70 6f 70 20 69 74 20 66 72 6f 6d 20 74 68 65   pop it from the
222c0 20 73 74 61 63 6b 20 73 74 6f 72 65 64 20 61 73   stack stored as
222d0 20 70 61 72 74 20 6f 66 20 74 68 65 20 50 61 72   part of the Par
222e0 73 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  se object..**.**
222f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
22300 73 20 75 73 65 64 20 61 73 20 74 68 65 20 78 53  s used as the xS
22310 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 28 29  electCallback2()
22320 20 63 61 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20   callback by.** 
22330 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
22340 61 6e 64 28 29 20 77 68 65 6e 20 77 61 6c 6b 69  and() when walki
22350 6e 67 20 61 20 53 45 4c 45 43 54 20 74 72 65 65  ng a SELECT tree
22360 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 61 62 6c   to resolve tabl
22370 65 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f  e.** names and o
22380 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65  ther FROM clause
22390 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73   elements. .*/.s
223a0 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
223b0 74 50 6f 70 57 69 74 68 28 57 61 6c 6b 65 72 20  tPopWith(Walker 
223c0 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
223d0 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *p){.  Parse *p
223e0 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
223f0 3e 70 50 61 72 73 65 3b 0a 20 20 57 69 74 68 20  >pParse;.  With 
22400 2a 70 57 69 74 68 20 3d 20 66 69 6e 64 52 69 67  *pWith = findRig
22410 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68  htmost(p)->pWith
22420 3b 0a 20 20 69 66 28 20 70 57 69 74 68 21 3d 30  ;.  if( pWith!=0
22430 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
22440 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70  pParse->pWith==p
22450 57 69 74 68 20 29 3b 0a 20 20 20 20 70 50 61 72  With );.    pPar
22460 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
22470 68 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 7d 0a 7d  h->pOuter;.  }.}
22480 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 73  .#else.#define s
22490 65 6c 65 63 74 50 6f 70 57 69 74 68 20 30 0a 23  electPopWith 0.#
224a0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
224b0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 57  s routine is a W
224c0 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66  alker callback f
224d0 6f 72 20 22 65 78 70 61 6e 64 69 6e 67 22 20 61  or "expanding" a
224e0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
224f0 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67  t..** "Expanding
22500 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74 68  " means to do th
22510 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
22520 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20  **    (1)  Make 
22530 73 75 72 65 20 56 44 42 45 20 63 75 72 73 6f 72  sure VDBE cursor
22540 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65   numbers have be
22550 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65  en assigned to e
22560 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  very.**         
22570 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46  element of the F
22580 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ROM clause..**.*
22590 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69  *    (2)  Fill i
225a0 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e  n the pTabList->
225b0 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20  a[].pTab fields 
225c0 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74  in the SrcList t
225d0 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  hat .**         
225e0 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61  defines FROM cla
225f0 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73  use.  When views
22600 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46   appear in the F
22610 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20  ROM clause,.**  
22620 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62         fill pTab
22630 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63  List->a[].pSelec
22640 74 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  t with a copy of
22650 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
22660 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  ement.**        
22670 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
22680 20 74 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f   the view.  A co
22690 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68  py is made of th
226a0 65 20 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a  e view's SELECT.
226b0 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61 74 65  **         state
226c0 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20  ment so that we 
226d0 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66  can freely modif
226e0 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74  y or delete that
226f0 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20   statement.**   
22700 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f        without wo
22710 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73  rrying about mes
22720 73 69 6e 67 20 75 70 20 74 68 65 20 70 72 65 73  sing up the pres
22730 69 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74  istent represent
22740 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20  ation.**        
22750 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a   of the view..**
22760 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64 20  .**    (3)  Add 
22770 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45  terms to the WHE
22780 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63  RE clause to acc
22790 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55  omodate the NATU
227a0 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20  RAL keyword.**  
227b0 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20         on joins 
227c0 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55  and the ON and U
227d0 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a  SING clause of j
227e0 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  oins..**.**    (
227f0 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73  4)  Scan the lis
22800 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  t of columns in 
22810 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 28  the result set (
22820 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a  pEList) looking.
22830 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20 69  **         for i
22840 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
22850 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  "*" operator or 
22860 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72  the TABLE.* oper
22870 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ator..**        
22880 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e   If found, expan
22890 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65  d each "*" to be
228a0 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
228b0 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20   every table.** 
228c0 20 20 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c          and TABL
228d0 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20  E.* to be every 
228e0 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e  column in TABLE.
228f0 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
22900 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  t selectExpander
22910 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
22920 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
22930 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
22940 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
22950 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a  .  int i, j, k;.
22960 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
22970 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
22980 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  *pEList;.  struc
22990 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
229a0 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pFrom;.  sqlite3
229b0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
229c0 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c 20 2a  b;.  Expr *pE, *
229d0 70 52 69 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a  pRight, *pExpr;.
229e0 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 20 3d    u16 selFlags =
229f0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 0a 20   p->selFlags;.. 
22a00 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
22a10 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 69  SF_Expanded;.  i
22a20 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
22a30 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75  led  ){.    retu
22a40 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
22a50 7d 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d  }.  if( NEVER(p-
22a60 3e 70 53 72 63 3d 3d 30 29 20 7c 7c 20 28 73 65  >pSrc==0) || (se
22a70 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61  lFlags & SF_Expa
22a80 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20  nded)!=0 ){.    
22a90 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
22aa0 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74  ;.  }.  pTabList
22ab0 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45   = p->pSrc;.  pE
22ac0 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
22ad0 3b 0a 20 20 73 71 6c 69 74 65 33 57 69 74 68 50  ;.  sqlite3WithP
22ae0 75 73 68 28 70 50 61 72 73 65 2c 20 66 69 6e 64  ush(pParse, find
22af0 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57  Rightmost(p)->pW
22b00 69 74 68 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 4d  ith, 0);..  /* M
22b10 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20  ake sure cursor 
22b20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
22b30 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c  n assigned to al
22b40 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a  l entries in.  *
22b50 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
22b60 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  e of the SELECT 
22b70 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
22b80 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
22b90 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
22ba0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b  arse, pTabList);
22bb0 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65  ..  /* Look up e
22bc0 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64  very table named
22bd0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
22be0 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63  use of the selec
22bf0 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  t.  If.  ** an e
22c00 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
22c10 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62   clause is a sub
22c20 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66  query instead of
22c30 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77   a table or view
22c40 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61  ,.  ** then crea
22c50 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74  te a transient t
22c60 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
22c70 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73  o describe the s
22c80 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  ubquery..  */.  
22c90 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
22ca0 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
22cb0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
22cc0 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
22cd0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
22ce0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
22cf0 3e 69 73 52 65 63 75 72 73 69 76 65 3d 3d 30 20  >isRecursive==0 
22d00 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29  || pFrom->pTab )
22d10 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  ;.    if( pFrom-
22d20 3e 69 73 52 65 63 75 72 73 69 76 65 20 29 20 63  >isRecursive ) c
22d30 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
22d40 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20   pFrom->pTab!=0 
22d50 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
22d60 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 61   statement has a
22d70 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72 65 70  lready been prep
22d80 61 72 65 64 2e 20 20 54 68 65 72 65 20 69 73 20  ared.  There is 
22d90 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a  no need.      **
22da0 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20   to go further. 
22db0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
22dc0 20 69 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66   i==0 );.#ifndef
22dd0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
22de0 0a 20 20 20 20 20 20 73 65 6c 65 63 74 50 6f 70  .      selectPop
22df0 57 69 74 68 28 70 57 61 6c 6b 65 72 2c 20 70 29  With(pWalker, p)
22e00 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  ;.#endif.      r
22e10 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
22e20 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
22e30 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20  QLITE_OMIT_CTE. 
22e40 20 20 20 69 66 28 20 77 69 74 68 45 78 70 61 6e     if( withExpan
22e50 64 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d  d(pWalker, pFrom
22e60 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ) ) return WRC_A
22e70 62 6f 72 74 3b 0a 20 20 20 20 69 66 28 20 70 46  bort;.    if( pF
22e80 72 6f 6d 2d 3e 70 54 61 62 20 29 20 7b 7d 20 65  rom->pTab ) {} e
22e90 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  lse.#endif.    i
22ea0 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d  f( pFrom->zName=
22eb0 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  =0 ){.#ifndef SQ
22ec0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
22ed0 52 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  RY.      Select 
22ee0 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSel = pFrom->p
22ef0 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a  Select;.      /*
22f00 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20   A sub-query in 
22f10 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
22f20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20  of a SELECT */. 
22f30 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65       assert( pSe
22f40 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  l!=0 );.      as
22f50 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
22f60 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  b==0 );.      sq
22f70 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
22f80 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a  pWalker, pSel);.
22f90 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61        pFrom->pTa
22fa0 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
22fb0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
22fc0 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
22fd0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
22fe0 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  b==0 ) return WR
22ff0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70  C_Abort;.      p
23000 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  Tab->nRef = 1;. 
23010 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
23020 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
23030 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 71  f(db, "sqlite_sq
23040 5f 25 70 22 2c 20 28 76 6f 69 64 2a 29 70 54 61  _%p", (void*)pTa
23050 62 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  b);.      while(
23060 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b   pSel->pPrior ){
23070 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50   pSel = pSel->pP
23080 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 65  rior; }.      se
23090 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  lectColumnsFromE
230a0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
230b0 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 20 26 70  pSel->pEList, &p
230c0 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  Tab->nCol, &pTab
230d0 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70  ->aCol);.      p
230e0 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  Tab->iPKey = -1;
230f0 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f  .      pTab->nRo
23100 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61  wLogEst = 200; a
23110 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69  ssert( 200==sqli
23120 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37  te3LogEst(104857
23130 36 29 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  6) );.      pTab
23140 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
23150 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64  _Ephemeral;.#end
23160 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
23170 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61      /* An ordina
23180 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  ry table or view
23190 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f   name in the FRO
231a0 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
231b0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
231c0 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20  >pTab==0 );.    
231d0 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
231e0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
231f0 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50  cateTableItem(pP
23200 61 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b  arse, 0, pFrom);
23210 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
23220 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
23230 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 69 66 28  Abort;.      if(
23240 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 30 78 66   pTab->nRef==0xf
23250 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73  fff ){.        s
23260 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
23270 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
23280 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c   references to \
23290 22 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35  "%s\": max 65535
232a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  ",.           pT
232b0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
232c0 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
232d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
232e0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
232f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61       }.      pTa
23300 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20 21  b->nRef++;.#if !
23310 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
23320 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
23330 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d  fined (SQLITE_OM
23340 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
23350 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d  .      if( pTab-
23360 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56 69  >pSelect || IsVi
23370 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
23380 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65 61         /* We rea
23390 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20 6e  ch here if the n
233a0 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61 20  amed table is a 
233b0 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f  really a view */
233c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
233d0 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
233e0 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
233f0 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 57 52  Tab) ) return WR
23400 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20  C_Abort;.       
23410 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
23420 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20  pSelect==0 );.  
23430 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65        pFrom->pSe
23440 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
23450 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62  lectDup(db, pTab
23460 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  ->pSelect, 0);. 
23470 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61         sqlite3Wa
23480 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
23490 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  , pFrom->pSelect
234a0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
234b0 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
234c0 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  Locate the index
234d0 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e   named by the IN
234e0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
234f0 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20   if any. */.    
23500 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78  if( sqlite3Index
23510 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73  edByLookup(pPars
23520 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20  e, pFrom) ){.   
23530 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
23540 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ort;.    }.  }..
23550 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54    /* Process NAT
23560 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61  URAL keywords, a
23570 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  nd ON and USING 
23580 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73  clauses of joins
23590 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
235a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
235b0 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
235c0 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b  in(pParse, p) ){
235d0 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
235e0 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Abort;.  }..  /*
235f0 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74   For every "*" t
23600 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68  hat occurs in th
23610 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69  e column list, i
23620 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20  nsert the names 
23630 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75  of.  ** all colu
23640 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
23650 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72  s.  And for ever
23660 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74  y TABLE.* insert
23670 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20   the names.  ** 
23680 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
23690 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61  n TABLE.  The pa
236a0 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20  rser inserted a 
236b0 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69  special expressi
236c0 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65  on.  ** with the
236d0 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72   TK_ALL operator
236e0 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68   for each "*" th
236f0 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74  at it found in t
23700 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a  he column list..
23710 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
23720 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73  ng code just has
23730 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54   to locate the T
23740 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e  K_ALL expression
23750 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a  s and expand.  *
23760 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68  * each one to th
23770 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f  e list of all co
23780 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62  lumns in all tab
23790 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  les..  **.  ** T
237a0 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75  he first loop ju
237b0 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  st checks to see
237c0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
237d0 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a  y "*" operators.
237e0 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65    ** that need e
237f0 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  xpanding..  */. 
23800 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
23810 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
23820 0a 20 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74  .    pE = pEList
23830 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[k].pExpr;.  
23840 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
23850 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20  _ALL ) break;.  
23860 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
23870 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e  !=TK_DOT || pE->
23880 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20  pRight!=0 );.   
23890 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21   assert( pE->op!
238a0 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e  =TK_DOT || (pE->
238b0 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e  pLeft!=0 && pE->
238c0 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  pLeft->op==TK_ID
238d0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  ) );.    if( pE-
238e0 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70  >op==TK_DOT && p
238f0 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  E->pRight->op==T
23900 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20  K_ALL ) break;. 
23910 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73   }.  if( k<pELis
23920 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
23930 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20  /*.    ** If we 
23940 67 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e  get here it mean
23950 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
23960 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
23970 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a   more "*".    **
23980 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
23990 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
239a0 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75  ded.  Loop throu
239b0 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
239c0 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  on.    ** in the
239d0 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20   result set and 
239e0 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20  expand them one 
239f0 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  by one..    */. 
23a00 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
23a10 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c  st_item *a = pEL
23a20 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72  ist->a;.    Expr
23a30 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  List *pNew = 0;.
23a40 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
23a50 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
23a60 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e  s;.    int longN
23a70 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20  ames = (flags & 
23a80 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
23a90 6d 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20  mes)!=0.        
23aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
23ab0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
23ac0 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d  _ShortColNames)=
23ad0 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e  =0;..    /* When
23ae0 20 70 72 6f 63 65 73 73 69 6e 67 20 46 52 4f 4d   processing FROM
23af0 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69  -clause subqueri
23b00 65 73 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73  es, it is always
23b10 20 74 68 65 20 63 61 73 65 0a 20 20 20 20 2a 2a   the case.    **
23b20 20 74 68 61 74 20 66 75 6c 6c 5f 63 6f 6c 75 6d   that full_colum
23b30 6e 5f 6e 61 6d 65 73 3d 4f 46 46 20 61 6e 64 20  n_names=OFF and 
23b40 73 68 6f 72 74 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  short_column_nam
23b50 65 73 3d 4f 4e 2e 20 20 54 68 65 0a 20 20 20 20  es=ON.  The.    
23b60 2a 2a 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74  ** sqlite3Result
23b70 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 72 6f  SetOfSelect() ro
23b80 75 74 69 6e 65 20 6d 61 6b 65 73 20 69 74 20 73  utine makes it s
23b90 6f 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  o. */.    assert
23ba0 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
23bb0 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d   SF_NestedFrom)=
23bc0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  =0.          || 
23bd0 28 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ((flags & SQLITE
23be0 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 3d 3d  _FullColNames)==
23bf0 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  0 &&.           
23c00 20 20 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49     (flags & SQLI
23c10 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
23c20 29 21 3d 30 29 20 29 3b 0a 0a 20 20 20 20 66 6f  )!=0) );..    fo
23c30 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
23c40 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
23c50 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45      pE = a[k].pE
23c60 78 70 72 3b 0a 20 20 20 20 20 20 70 52 69 67 68  xpr;.      pRigh
23c70 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a  t = pE->pRight;.
23c80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
23c90 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
23ca0 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20  pRight!=0 );.   
23cb0 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54     if( pE->op!=T
23cc0 4b 5f 41 4c 4c 20 26 26 20 28 70 45 2d 3e 6f 70  K_ALL && (pE->op
23cd0 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67  !=TK_DOT || pRig
23ce0 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20  ht->op!=TK_ALL) 
23cf0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
23d00 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 65 78  is particular ex
23d10 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f  pression does no
23d20 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
23d30 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  anded..        *
23d40 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  /.        pNew =
23d50 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
23d60 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
23d70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29  New, a[k].pExpr)
23d80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
23d90 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ew ){.          
23da0 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
23db0 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61  xpr-1].zName = a
23dc0 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [k].zName;.     
23dd0 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65       pNew->a[pNe
23de0 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61  w->nExpr-1].zSpa
23df0 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a  n = a[k].zSpan;.
23e00 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a            a[k].z
23e10 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
23e20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d      a[k].zSpan =
23e30 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
23e40 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72        a[k].pExpr
23e50 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
23e60 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
23e70 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
23e80 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42   a "*" or a "TAB
23e90 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20  LE.*" and needs 
23ea0 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  to be.        **
23eb0 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20   expanded. */.  
23ec0 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53        int tableS
23ed0 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  een = 0;      /*
23ee0 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54   Set to 1 when T
23ef0 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a  ABLE matches */.
23f00 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
23f10 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Name = 0;       
23f20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20  /* text of name 
23f30 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20  of TABLE */.    
23f40 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
23f50 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20  TK_DOT ){.      
23f60 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
23f70 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20  pLeft!=0 );.    
23f80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
23f90 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
23fa0 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74  E->pLeft, EP_Int
23fb0 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
23fc0 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d      zTName = pE-
23fd0 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e  >pLeft->u.zToken
23fe0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23ff0 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72      for(i=0, pFr
24000 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
24010 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
24020 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
24030 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65  .          Table
24040 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
24050 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
24060 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70  Select *pSub = p
24070 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
24080 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
24090 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d  TabName = pFrom-
240a0 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  >zAlias;.       
240b0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
240c0 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a  SchemaName = 0;.
240d0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
240e0 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  b;.          if(
240f0 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a   zTabName==0 ){.
24100 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62              zTab
24110 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  Name = pTab->zNa
24120 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  me;.          }.
24130 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 62            if( db
24140 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
24150 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
24160 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c    if( pSub==0 ||
24170 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73   (pSub->selFlags
24180 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d   & SF_NestedFrom
24190 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
241a0 20 20 20 20 70 53 75 62 20 3d 20 30 3b 0a 20 20      pSub = 0;.  
241b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
241c0 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53  Name && sqlite3S
241d0 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a  trICmp(zTName, z
241e0 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  TabName)!=0 ){. 
241f0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
24200 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
24210 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
24220 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
24230 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
24240 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
24250 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63 68              zSch
24260 65 6d 61 4e 61 6d 65 20 3d 20 69 44 62 3e 3d 30  emaName = iDb>=0
24270 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   ? db->aDb[iDb].
24280 7a 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20  zName : "*";.   
24290 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
242a0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
242b0 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
242c0 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
242d0 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e   *zName = pTab->
242e0 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  aCol[j].zName;. 
242f0 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
24300 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54  *zColname;  /* T
24310 68 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75  he computed colu
24320 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  mn name */.     
24330 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f         char *zTo
24340 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f  Free;   /* Mallo
24350 63 65 64 20 73 74 72 69 6e 67 20 74 68 61 74 20  ced string that 
24360 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65  needs to be free
24370 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  d */.           
24380 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b   Token sColname;
24390 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f    /* Computed co
243a0 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74  lumn name as a t
243b0 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20  oken */..       
243c0 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61       assert( zNa
243d0 6d 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  me );.          
243e0 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20    if( zTName && 
243f0 70 53 75 62 0a 20 20 20 20 20 20 20 20 20 20 20  pSub.           
24400 20 20 26 26 20 73 71 6c 69 74 65 33 4d 61 74 63    && sqlite3Matc
24410 68 53 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e  hSpanName(pSub->
24420 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70  pEList->a[j].zSp
24430 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30  an, 0, zTName, 0
24440 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
24450 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24460 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
24470 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
24480 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63         /* If a c
24490 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20  olumn is marked 
244a0 61 73 20 27 68 69 64 64 65 6e 27 20 28 63 75 72  as 'hidden' (cur
244b0 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73  rently only poss
244c0 69 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  ible.           
244d0 20 2a 2a 20 66 6f 72 20 76 69 72 74 75 61 6c 20   ** for virtual 
244e0 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20  tables), do not 
244f0 69 6e 63 6c 75 64 65 20 69 74 20 69 6e 20 74 68  include it in th
24500 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20  e expanded.     
24510 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74         ** result
24520 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20 20 20 20  -set list..     
24530 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
24540 20 20 20 20 20 20 69 66 28 20 49 73 48 69 64 64        if( IsHidd
24550 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e  enColumn(&pTab->
24560 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20  aCol[j]) ){.    
24570 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
24580 28 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  (IsVirtual(pTab)
24590 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
245a0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
245b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
245c0 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d       tableSeen =
245d0 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20   1;..           
245e0 20 69 66 28 20 69 3e 30 20 26 26 20 7a 54 4e 61   if( i>0 && zTNa
245f0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  me==0 ){.       
24600 20 20 20 20 20 20 20 69 66 28 20 28 70 46 72 6f         if( (pFro
24610 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  m->jointype & JT
24620 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20 20 20  _NATURAL)!=0.   
24630 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
24640 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e  tableAndColumnIn
24650 64 65 78 28 70 54 61 62 4c 69 73 74 2c 20 69 2c  dex(pTabList, i,
24660 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20 20   zName, 0, 0).  
24670 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
24680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24690 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a  * In a NATURAL j
246a0 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f  oin, omit the jo
246b0 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  in columns from 
246c0 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  the .           
246d0 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f       ** table to
246e0 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68   the right of th
246f0 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20 20  e join */.      
24700 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
24710 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
24720 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
24730 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c    if( sqlite3IdL
24740 69 73 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d 3e  istIndex(pFrom->
24750 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d  pUsing, zName)>=
24760 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
24770 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69       /* In a joi
24780 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63  n with a USING c
24790 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75  lause, omit colu
247a0 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20  mns in the.     
247b0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73             ** us
247c0 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20  ing clause from 
247d0 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  the table on the
247e0 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20   right. */.     
247f0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
24800 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
24810 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
24820 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
24830 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
24840 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a  xpr(db, TK_ID, z
24850 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
24860 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e     zColname = zN
24870 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
24880 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20   zToFree = 0;.  
24890 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f            if( lo
248a0 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c  ngNames || pTabL
248b0 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20  ist->nSrc>1 ){. 
248c0 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
248d0 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r *pLeft;.      
248e0 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20          pLeft = 
248f0 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
24900 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29  TK_ID, zTabName)
24910 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
24920 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  pExpr = sqlite3P
24930 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
24940 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  DOT, pLeft, pRig
24950 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ht, 0);.        
24960 20 20 20 20 20 20 69 66 28 20 7a 53 63 68 65 6d        if( zSchem
24970 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  aName ){.       
24980 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d           pLeft =
24990 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
249a0 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61 4e   TK_ID, zSchemaN
249b0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
249c0 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
249d0 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
249e0 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  e, TK_DOT, pLeft
249f0 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  , pExpr, 0);.   
24a00 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
24a10 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
24a20 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ongNames ){.    
24a30 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
24a40 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  name = sqlite3MP
24a50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
24a60 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61  ", zTabName, zNa
24a70 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
24a80 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a       zToFree = z
24a90 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  Colname;.       
24aa0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24ab0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
24ac0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
24ad0 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
24ae0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24af0 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
24b00 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
24b10 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70  (pParse, pNew, p
24b20 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
24b30 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 7a 20 3d 20     sColname.z = 
24b40 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20  zColname;.      
24b50 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 6e        sColname.n
24b60 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
24b70 33 30 28 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20  30(zColname);.  
24b80 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
24b90 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65  3ExprListSetName
24ba0 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26  (pParse, pNew, &
24bb0 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20  sColname, 0);.  
24bc0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e            if( pN
24bd0 65 77 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61  ew && (p->selFla
24be0 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72  gs & SF_NestedFr
24bf0 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  om)!=0 ){.      
24c00 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
24c10 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58  xprList_item *pX
24c20 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77   = &pNew->a[pNew
24c30 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20  ->nExpr-1];.    
24c40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
24c50 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ub ){.          
24c60 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20        pX->zSpan 
24c70 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
24c80 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69  p(db, pSub->pELi
24c90 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b  st->a[j].zSpan);
24ca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24cb0 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a   testcase( pX->z
24cc0 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Span==0 );.     
24cd0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
24ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cf0 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69  pX->zSpan = sqli
24d00 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
24d10 25 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20 20  %s.%s.%s",.     
24d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d40 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d        zSchemaNam
24d50 65 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f  e, zTabName, zCo
24d60 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  lname);.        
24d70 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
24d80 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29  ( pX->zSpan==0 )
24d90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
24da0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
24db0 70 58 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d  pX->bSpanIsTab =
24dc0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
24dd0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  }.            sq
24de0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
24df0 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20  zToFree);.      
24e00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
24e10 20 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62          if( !tab
24e20 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20  leSeen ){.      
24e30 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29      if( zTName )
24e40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
24e50 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
24e60 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74  arse, "no such t
24e70 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d  able: %s", zTNam
24e80 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  e);.          }e
24e90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
24ea0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
24eb0 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62  (pParse, "no tab
24ec0 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b  les specified");
24ed0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
24ee0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
24ef0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
24f00 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
24f10 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b, pEList);.    
24f20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77  p->pEList = pNew
24f30 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45  ;.  }.#if SQLITE
24f40 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66  _MAX_COLUMN.  if
24f50 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70  ( p->pEList && p
24f60 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  ->pEList->nExpr>
24f70 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
24f80 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
24f90 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
24fa0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
24fb0 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
24fc0 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29   in result set")
24fd0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
24fe0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
24ff0 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d  ue;.}../*.** No-
25000 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74  op routine for t
25010 68 65 20 70 61 72 73 65 2d 74 72 65 65 20 77 61  he parse-tree wa
25020 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  lker..**.** When
25030 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
25040 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45 78 70   the Walker.xExp
25050 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65  rCallback then e
25060 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 0a  xpression trees.
25070 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20 77 69  ** are walked wi
25080 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69 6f 6e  thout any action
25090 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20 61 74  s being taken at
250a0 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50 72 65   each node.  Pre
250b0 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e  sumably,.** when
250c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
250d0 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b 65 72   used for Walker
250e0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74  .xExprCallback t
250f0 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78  hen .** Walker.x
25100 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 69  SelectCallback i
25110 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65  s set to do some
25120 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66 6f 72  thing useful for
25130 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62 71 75   every .** subqu
25140 65 72 79 20 69 6e 20 74 68 65 20 70 61 72 73 65  ery in the parse
25150 72 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69  r tree..*/.stati
25160 63 20 69 6e 74 20 65 78 70 72 57 61 6c 6b 4e 6f  c int exprWalkNo
25170 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73  op(Walker *NotUs
25180 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73 65  ed, Expr *NotUse
25190 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
251a0 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
251b0 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72  , NotUsed2);.  r
251c0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
251d0 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ue;.}../*.** Thi
251e0 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70 61 6e  s routine "expan
251f0 64 73 22 20 61 20 53 45 4c 45 43 54 20 73 74 61  ds" a SELECT sta
25200 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f  tement and all o
25210 66 20 69 74 73 20 73 75 62 71 75 65 72 69 65 73  f its subqueries
25220 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74 69 6f  ..** For additio
25230 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
25240 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61 6e 73  on what it means
25250 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61 20 53   to "expand" a S
25260 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65  ELECT.** stateme
25270 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f 6d 6d  nt, see the comm
25280 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c 65 63  ent on the selec
25290 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72 20 63  tExpand worker c
252a0 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a  allback above..*
252b0 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20 61  *.** Expanding a
252c0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
252d0 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73  t is the first s
252e0 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73 69 6e  tep in processin
252f0 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  g a.** SELECT st
25300 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 53 45  atement.  The SE
25310 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d  LECT statement m
25320 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20  ust be expanded 
25330 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72  before.** name r
25340 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65 72  esolution is per
25350 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  formed..**.** If
25360 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
25370 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d  rong, an error m
25380 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65  essage is writte
25390 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a  n into pParse..*
253a0 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  * The calling fu
253b0 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74 65 63  nction can detec
253c0 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 62 79  t the problem by
253d0 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61 72   looking at pPar
253e0 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f  se->nErr.** and/
253f0 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  or pParse->db->m
25400 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a  allocFailed..*/.
25410 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
25420 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
25430 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
25440 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
25450 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d  .  Walker w;.  m
25460 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
25470 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78  eof(w));.  w.xEx
25480 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
25490 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70  rWalkNoop;.  w.p
254a0 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
254b0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 68 61    if( pParse->ha
254c0 73 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20  sCompound ){.   
254d0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
254e0 63 6b 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70  ck = convertComp
254f0 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71  oundSelectToSubq
25500 75 65 72 79 3b 0a 20 20 20 20 73 71 6c 69 74 65  uery;.    sqlite
25510 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
25520 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20  pSelect);.  }.  
25530 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
25540 6b 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64  k = selectExpand
25550 65 72 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  er;.  w.xSelectC
25560 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63  allback2 = selec
25570 74 50 6f 70 57 69 74 68 3b 0a 20 20 73 71 6c 69  tPopWith;.  sqli
25580 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
25590 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a  , pSelect);.}...
255a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
255b0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
255c0 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57 61 6c  ** This is a Wal
255d0 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62  ker.xSelectCallb
255e0 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ack callback for
255f0 20 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65   the sqlite3Sele
25600 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20  ctTypeInfo().** 
25610 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a  interface..**.**
25620 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63   For each FROM-c
25630 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 2c 20  lause subquery, 
25640 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65  add Column.zType
25650 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c   and Column.zCol
25660 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  l.** information
25670 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74   to the Table st
25680 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70  ructure that rep
25690 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75  resents the resu
256a0 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61  lt set.** of tha
256b0 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  t subquery..**.*
256c0 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
256d0 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65  cture that repre
256e0 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74  sents the result
256f0 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75   set was constru
25700 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63  cted.** by selec
25710 74 45 78 70 61 6e 64 65 72 28 29 20 62 75 74 20  tExpander() but 
25720 74 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c  the type and col
25730 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  lation informati
25740 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a  on was omitted.*
25750 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20  * at that point 
25760 62 65 63 61 75 73 65 20 69 64 65 6e 74 69 66 69  because identifi
25770 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ers had not yet 
25780 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20  been resolved.  
25790 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
257a0 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
257b0 69 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c  identifier resol
257c0 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ution..*/.static
257d0 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64 53   void selectAddS
257e0 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28  ubqueryTypeInfo(
257f0 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
25800 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50   Select *p){.  P
25810 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20  arse *pParse;.  
25820 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74  int i;.  SrcList
25830 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74   *pTabList;.  st
25840 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
25850 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73  m *pFrom;..  ass
25860 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ert( p->selFlags
25870 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29   & SF_Resolved )
25880 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  ;.  if( (p->selF
25890 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70  lags & SF_HasTyp
258a0 65 49 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20 20 20  eInfo)==0 ){.   
258b0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
258c0 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a  SF_HasTypeInfo;.
258d0 20 20 20 20 70 50 61 72 73 65 20 3d 20 70 57 61      pParse = pWa
258e0 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
258f0 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
25900 70 53 72 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d  pSrc;.    for(i=
25910 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
25920 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
25930 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
25940 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 54 61 62  om++){.      Tab
25950 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
25960 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66  ->pTab;.      if
25970 28 20 41 4c 57 41 59 53 28 70 54 61 62 21 3d 30  ( ALWAYS(pTab!=0
25980 29 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46  ) && (pTab->tabF
25990 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
259a0 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ral)!=0 ){.     
259b0 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
259c0 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
259d0 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
259e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65   */.        Sele
259f0 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d  ct *pSel = pFrom
25a00 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
25a10 20 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20     if( pSel ){. 
25a20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
25a30 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70  pSel->pPrior ) p
25a40 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69  Sel = pSel->pPri
25a50 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 65  or;.          se
25a60 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
25a70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50  eAndCollation(pP
25a80 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c  arse, pTab, pSel
25a90 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
25aa0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
25ab0 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
25ac0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64  This routine add
25ad0 73 20 64 61 74 61 74 79 70 65 20 61 6e 64 20 63  s datatype and c
25ae0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
25af0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  e information to
25b00 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74  .** the Table st
25b10 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20  ructures of all 
25b20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
25b30 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53  ueries in a.** S
25b40 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
25b50 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20  .**.** Use this 
25b60 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61  routine after na
25b70 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a  me resolution..*
25b80 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
25b90 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79  lite3SelectAddTy
25ba0 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  peInfo(Parse *pP
25bb0 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
25bc0 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20  elect){.#ifndef 
25bd0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
25be0 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b  UERY.  Walker w;
25bf0 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
25c00 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77   sizeof(w));.  w
25c10 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
25c20 32 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75 62  2 = selectAddSub
25c30 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20  queryTypeInfo;. 
25c40 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
25c50 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b   = exprWalkNoop;
25c60 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
25c70 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57  arse;.  sqlite3W
25c80 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
25c90 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d  elect);.#endif.}
25ca0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
25cb0 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20  utine sets up a 
25cc0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
25cd0 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e   for processing.
25ce0 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69    The.** followi
25cf0 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68  ng is accomplish
25d00 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  ed:.**.**     * 
25d10 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d   VDBE Cursor num
25d20 62 65 72 73 20 61 72 65 20 61 73 73 69 67 6e 65  bers are assigne
25d30 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c  d to all FROM-cl
25d40 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20  ause terms..**  
25d50 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c 20     *  Ephemeral 
25d60 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72  Table objects ar
25d70 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c  e created for al
25d80 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  l FROM-clause su
25d90 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20  bqueries..**    
25da0 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47   *  ON and USING
25db0 20 63 6c 61 75 73 65 73 20 61 72 65 20 73 68 69   clauses are shi
25dc0 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45 20  fted into WHERE 
25dd0 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20  statements.**   
25de0 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20 22    *  Wildcards "
25df0 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22  *" and "TABLE.*"
25e00 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73 20   in result sets 
25e10 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a  are expanded..**
25e20 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66 69       *  Identifi
25e30 65 72 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f  ers in expressio
25e40 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20 74 6f  n are matched to
25e50 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54   tables..**.** T
25e60 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73  his routine acts
25e70 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20   recursively on 
25e80 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20 77  all subqueries w
25e90 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43 54  ithin the SELECT
25ea0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
25eb0 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20 50  3SelectPrep(.  P
25ec0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
25ed0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
25ee0 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
25ef0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
25f00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
25f10 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
25f20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a  being coded. */.
25f30 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
25f40 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65  OuterNC  /* Name
25f50 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e   context for con
25f60 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73  tainer */.){.  s
25f70 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66  qlite3 *db;.  if
25f80 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20  ( NEVER(p==0) ) 
25f90 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70  return;.  db = p
25fa0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
25fb0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
25fc0 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
25fd0 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
25fe0 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29  SF_HasTypeInfo )
25ff0 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
26000 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70  e3SelectExpand(p
26010 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28  Parse, p);.  if(
26020 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
26030 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
26040 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  d ) return;.  sq
26050 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65  lite3ResolveSele
26060 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  ctNames(pParse, 
26070 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20  p, pOuterNC);.  
26080 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
26090 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
260a0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
260b0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
260c0 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65  dTypeInfo(pParse
260d0 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , p);.}../*.** R
260e0 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61  eset the aggrega
260f0 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a  te accumulator..
26100 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67  **.** The aggreg
26110 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
26120 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f  is a set of memo
26130 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f  ry cells that ho
26140 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61  ld.** intermedia
26150 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65  te results while
26160 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20   calculating an 
26170 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73  aggregate.  This
26180 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  .** routine gene
26190 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20  rates code that 
261a0 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20  stores NULLs in 
261b0 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d  all of those mem
261c0 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f  ory.** cells..*/
261d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
261e0 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61  etAccumulator(Pa
261f0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
26200 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
26210 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
26220 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
26230 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
26240 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e  gInfo_func *pFun
26250 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d 20  c;.  int nReg = 
26260 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20  pAggInfo->nFunc 
26270 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  + pAggInfo->nCol
26280 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d  umn;.  if( nReg=
26290 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66  =0 ) return;.#if
262a0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
262b0 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .  /* Verify tha
262c0 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65  t all AggInfo re
262d0 67 69 73 74 65 72 73 20 61 72 65 20 77 69 74 68  gisters are with
262e0 69 6e 20 74 68 65 20 72 61 6e 67 65 20 73 70 65  in the range spe
262f0 63 69 66 69 65 64 20 62 79 0a 20 20 2a 2a 20 41  cified by.  ** A
26300 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67  ggInfo.mnReg..Ag
26310 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20  gInfo.mxReg */. 
26320 20 61 73 73 65 72 74 28 20 6e 52 65 67 3d 3d 70   assert( nReg==p
26330 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70  AggInfo->mxReg-p
26340 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31  AggInfo->mnReg+1
26350 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
26360 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  <pAggInfo->nColu
26370 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  mn; i++){.    as
26380 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e  sert( pAggInfo->
26390 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41  aCol[i].iMem>=pA
263a0 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20  ggInfo->mnReg.  
263b0 20 20 20 20 20 20 20 26 26 20 70 41 67 67 49 6e         && pAggIn
263c0 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d  fo->aCol[i].iMem
263d0 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  <=pAggInfo->mxRe
263e0 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  g );.  }.  for(i
263f0 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
26400 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFunc; i++){.   
26410 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66   assert( pAggInf
26420 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d  o->aFunc[i].iMem
26430 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  >=pAggInfo->mnRe
26440 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41  g.         && pA
26450 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d  ggInfo->aFunc[i]
26460 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d  .iMem<=pAggInfo-
26470 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65  >mxReg );.  }.#e
26480 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56 64  ndif.  sqlite3Vd
26490 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
264a0 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f  ull, 0, pAggInfo
264b0 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e 66  ->mnReg, pAggInf
264c0 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72  o->mxReg);.  for
264d0 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d  (pFunc=pAggInfo-
264e0 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70  >aFunc, i=0; i<p
264f0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
26500 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20  i++, pFunc++){. 
26510 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44     if( pFunc->iD
26520 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
26530 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
26540 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Func->pExpr;.   
26550 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
26560 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20  HasProperty(pE, 
26570 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
26580 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78  .      if( pE->x
26590 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d  .pList==0 || pE-
265a0 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  >x.pList->nExpr!
265b0 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
265c0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
265d0 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20  arse, "DISTINCT 
265e0 61 67 67 72 65 67 61 74 65 73 20 6d 75 73 74 20  aggregates must 
265f0 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65  have exactly one
26600 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61   ".           "a
26610 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20  rgument");.     
26620 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69     pFunc->iDisti
26630 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  nct = -1;.      
26640 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b  }else{.        K
26650 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
26660 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
26670 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
26680 45 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c 20 30  E->x.pList, 0, 0
26690 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
266a0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
266b0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
266c0 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e  , pFunc->iDistin
266d0 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  ct, 0, 0,.      
266e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266f0 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
26700 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
26710 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
26720 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76    }.}../*.** Inv
26730 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69  oke the OP_AggFi
26740 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f  nalize opcode fo
26750 72 20 65 76 65 72 79 20 61 67 67 72 65 67 61 74  r every aggregat
26760 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e  e function.** in
26770 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72   the AggInfo str
26780 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
26790 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41  c void finalizeA
267a0 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73  ggFunctions(Pars
267b0 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
267c0 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
267d0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
267e0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
267f0 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  i;.  struct AggI
26800 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20  nfo_func *pF;.  
26810 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67  for(i=0, pF=pAgg
26820 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70  Info->aFunc; i<p
26830 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
26840 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20  i++, pF++){.    
26850 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
26860 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70  = pF->pExpr->x.p
26870 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74  List;.    assert
26880 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
26890 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50  ty(pF->pExpr, EP
268a0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
268b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
268c0 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69  dOp4(v, OP_AggFi
268d0 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70  nal, pF->iMem, p
268e0 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45  List ? pList->nE
268f0 78 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20  xpr : 0, 0,.    
26900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26910 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75    (void*)pF->pFu
26920 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
26930 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70  .  }.}../*.** Up
26940 64 61 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c  date the accumul
26950 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  ator memory cell
26960 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61  s for an aggrega
26970 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74  te based on.** t
26980 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
26990 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73  r position..*/.s
269a0 74 61 74 69 63 20 76 6f 69 64 20 75 70 64 61 74  tatic void updat
269b0 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72  eAccumulator(Par
269c0 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
269d0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
269e0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
269f0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
26a00 20 69 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74   i;.  int regHit
26a10 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72   = 0;.  int addr
26a20 48 69 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73  HitTest = 0;.  s
26a30 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
26a40 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74  nc *pF;.  struct
26a50 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
26a60 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64  ;..  pAggInfo->d
26a70 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20  irectMode = 1;. 
26a80 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
26a90 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
26aa0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
26ab0 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
26ac0 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69   int nArg;.    i
26ad0 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b  nt addrNext = 0;
26ae0 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b  .    int regAgg;
26af0 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
26b00 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
26b10 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61  ->x.pList;.    a
26b20 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
26b30 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70  roperty(pF->pExp
26b40 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
26b50 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
26b60 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  t ){.      nArg 
26b70 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
26b80 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 73        regAgg = s
26b90 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
26ba0 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29  ge(pParse, nArg)
26bb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
26bc0 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
26bd0 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72  pParse, pList, r
26be0 65 67 41 67 67 2c 20 53 51 4c 49 54 45 5f 45 43  egAgg, SQLITE_EC
26bf0 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c  EL_DUP);.    }el
26c00 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d  se{.      nArg =
26c10 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67   0;.      regAgg
26c20 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
26c30 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63  if( pF->iDistinc
26c40 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64  t>=0 ){.      ad
26c50 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33  drNext = sqlite3
26c60 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
26c70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
26c80 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20  nArg==1 );.     
26c90 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50   codeDistinct(pP
26ca0 61 72 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69  arse, pF->iDisti
26cb0 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31  nct, addrNext, 1
26cc0 2c 20 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d  , regAgg);.    }
26cd0 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75  .    if( pF->pFu
26ce0 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  nc->funcFlags & 
26cf0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44  SQLITE_FUNC_NEED
26d00 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f  COLL ){.      Co
26d10 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30  llSeq *pColl = 0
26d20 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  ;.      struct E
26d30 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
26d40 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  tem;.      int j
26d50 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
26d60 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20  pList!=0 );  /* 
26d70 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e  pList!=0 if pF->
26d80 70 46 75 6e 63 20 68 61 73 20 4e 45 45 44 43 4f  pFunc has NEEDCO
26d90 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  LL */.      for(
26da0 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  j=0, pItem=pList
26db0 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a  ->a; !pColl && j
26dc0 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65  <nArg; j++, pIte
26dd0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43  m++){.        pC
26de0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
26df0 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
26e00 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
26e10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
26e20 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  ( !pColl ){.    
26e30 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72      pColl = pPar
26e40 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
26e50 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
26e60 20 69 66 28 20 72 65 67 48 69 74 3d 3d 30 20 26   if( regHit==0 &
26e70 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63  & pAggInfo->nAcc
26e80 75 6d 75 6c 61 74 6f 72 20 29 20 72 65 67 48 69  umulator ) regHi
26e90 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
26ea0 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
26eb0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
26ec0 50 5f 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48 69  P_CollSeq, regHi
26ed0 74 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a  t, 0, 0, (char *
26ee0 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
26ef0 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  EQ);.    }.    s
26f00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
26f10 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c 20  (v, OP_AggStep, 
26f20 30 2c 20 72 65 67 41 67 67 2c 20 70 46 2d 3e 69  0, regAgg, pF->i
26f30 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Mem,.           
26f40 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
26f50 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f  *)pF->pFunc, P4_
26f60 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71  FUNCDEF);.    sq
26f70 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
26f80 35 28 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a  5(v, (u8)nArg);.
26f90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
26fa0 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
26fb0 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67  ge(pParse, regAg
26fc0 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71  g, nArg);.    sq
26fd0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
26fe0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
26ff0 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20  gAgg, nArg);.   
27000 20 69 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b   if( addrNext ){
27010 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
27020 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
27030 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20  , addrNext);.   
27040 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
27050 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
27060 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
27070 2a 20 42 65 66 6f 72 65 20 70 6f 70 75 6c 61 74  * Before populat
27080 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ing the accumula
27090 74 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 63  tor registers, c
270a0 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lear the column 
270b0 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65  cache..  ** Othe
270c0 72 77 69 73 65 2c 20 69 66 20 61 6e 79 20 6f 66  rwise, if any of
270d0 20 74 68 65 20 72 65 71 75 69 72 65 64 20 63 6f   the required co
270e0 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61 72 65 20  lumn values are 
270f0 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 20  already present 
27100 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  .  ** in registe
27110 72 73 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43  rs, sqlite3ExprC
27120 6f 64 65 28 29 20 6d 61 79 20 75 73 65 20 4f 50  ode() may use OP
27130 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70 79 20 74  _SCopy to copy t
27140 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f  he value.  ** to
27150 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62   pC->iMem. But b
27160 79 20 74 68 65 20 74 69 6d 65 20 74 68 65 20 76  y the time the v
27170 61 6c 75 65 20 69 73 20 75 73 65 64 2c 20 74 68  alue is used, th
27180 65 20 6f 72 69 67 69 6e 61 6c 20 72 65 67 69 73  e original regis
27190 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76  ter.  ** may hav
271a0 65 20 62 65 65 6e 20 75 73 65 64 2c 20 69 6e 76  e been used, inv
271b0 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20 75 6e  alidating the un
271c0 64 65 72 6c 79 69 6e 67 20 62 75 66 66 65 72 20  derlying buffer 
271d0 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a  holding the.  **
271e0 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 20 76 61   text or blob va
271f0 6c 75 65 2e 20 53 65 65 20 74 69 63 6b 65 74 20  lue. See ticket 
27200 5b 38 38 33 30 33 34 64 63 62 35 5d 2e 0a 20 20  [883034dcb5]..  
27210 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20  **.  ** Another 
27220 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62  solution would b
27230 65 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  e to change the 
27240 4f 50 5f 53 43 6f 70 79 20 75 73 65 64 20 74 6f  OP_SCopy used to
27250 20 63 6f 70 79 20 63 61 63 68 65 64 0a 20 20 2a   copy cached.  *
27260 2a 20 76 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f  * values to an O
27270 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69  P_Copy..  */.  i
27280 66 28 20 72 65 67 48 69 74 20 29 7b 0a 20 20 20  f( regHit ){.   
27290 20 61 64 64 72 48 69 74 54 65 73 74 20 3d 20 73   addrHitTest = s
272a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
272b0 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48 69  (v, OP_If, regHi
272c0 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
272d0 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (v);.  }.  sqlit
272e0 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
272f0 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28  (pParse);.  for(
27300 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f  i=0, pC=pAggInfo
27310 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e  ->aCol; i<pAggIn
27320 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  fo->nAccumulator
27330 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20  ; i++, pC++){.  
27340 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
27350 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45  e(pParse, pC->pE
27360 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a  xpr, pC->iMem);.
27370 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e    }.  pAggInfo->
27380 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a  directMode = 0;.
27390 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
273a0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
273b0 0a 20 20 69 66 28 20 61 64 64 72 48 69 74 54 65  .  if( addrHitTe
273c0 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  st ){.    sqlite
273d0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
273e0 20 61 64 64 72 48 69 74 54 65 73 74 29 3b 0a 20   addrHitTest);. 
273f0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
27400 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c  a single OP_Expl
27410 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ain instruction 
27420 74 6f 20 74 68 65 20 56 44 42 45 20 74 6f 20 65  to the VDBE to e
27430 78 70 6c 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a  xplain a simple.
27440 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71 75 65 72  ** count(*) quer
27450 79 20 28 22 53 45 4c 45 43 54 20 63 6f 75 6e 74  y ("SELECT count
27460 28 2a 29 20 46 52 4f 4d 20 70 54 61 62 22 29 2e  (*) FROM pTab").
27470 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
27480 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
27490 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
274a0 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a  ainSimpleCount(.
274b0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
274c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274d0 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
274e0 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
274f0 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
27500 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
27510 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a   being queried *
27520 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
27530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27540 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65      /* Index use
27550 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63  d to optimize sc
27560 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29  an, or NULL */.)
27570 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
27580 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
27590 20 20 63 68 61 72 20 2a 7a 45 71 70 20 3d 20 73    char *zEqp = s
275a0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50  qlite3MPrintf(pP
275b0 61 72 73 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20  arse->db, "SCAN 
275c0 54 41 42 4c 45 20 25 73 25 73 25 73 22 2c 0a 20  TABLE %s%s%s",. 
275d0 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
275e0 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70 49 64  me, .        pId
275f0 78 20 3f 20 22 20 55 53 49 4e 47 20 43 4f 56 45  x ? " USING COVE
27600 52 49 4e 47 20 49 4e 44 45 58 20 22 20 3a 20 22  RING INDEX " : "
27610 22 2c 0a 20 20 20 20 20 20 20 20 70 49 64 78 20  ",.        pIdx 
27620 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20  ? pIdx->zName : 
27630 22 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  "".    );.    sq
27640 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
27650 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
27660 3e 70 56 64 62 65 2c 20 4f 50 5f 45 78 70 6c 61  >pVdbe, OP_Expla
27670 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  in, pParse->iSel
27680 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 45 71  ectId, 0, 0, zEq
27690 70 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20  p, P4_DYNAMIC.  
276a0 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65    );.  }.}.#else
276b0 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
276c0 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62  nSimpleCount(a,b
276d0 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,c).#endif../*.*
276e0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
276f0 66 6f 72 20 74 68 65 20 53 45 4c 45 43 54 20 73  for the SELECT s
27700 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 69  tatement given i
27710 6e 20 74 68 65 20 70 20 61 72 67 75 6d 65 6e 74  n the p argument
27720 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  .  .**.** The re
27730 73 75 6c 74 73 20 61 72 65 20 72 65 74 75 72 6e  sults are return
27740 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ed according to 
27750 74 68 65 20 53 65 6c 65 63 74 44 65 73 74 20 73  the SelectDest s
27760 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 53 65 65  tructure..** See
27770 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 73 71 6c   comments in sql
27780 69 74 65 49 6e 74 2e 68 20 66 6f 72 20 66 75 72  iteInt.h for fur
27790 74 68 65 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ther information
277a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
277b0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
277c0 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
277d0 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72  s.  If any error
277e0 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74  s are.** encount
277f0 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70  ered, then an ap
27800 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
27810 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20  message is left 
27820 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45  in.** pParse->zE
27830 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rrMsg..**.** Thi
27840 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e  s routine does N
27850 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65  OT free the Sele
27860 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73  ct structure pas
27870 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20  sed in.  The.** 
27880 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
27890 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61   needs to do tha
278a0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
278b0 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  3Select(.  Parse
278c0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
278d0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
278e0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
278f0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
27900 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
27910 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
27920 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65  g coded. */.  Se
27930 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
27940 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
27950 64 6f 20 77 69 74 68 20 74 68 65 20 71 75 65 72  do with the quer
27960 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
27970 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
27980 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
27990 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57   counters */.  W
279a0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
279b0 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  ;     /* Return 
279c0 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65 72  from sqlite3Wher
279d0 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64  eBegin() */.  Vd
279e0 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
279f0 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
27a00 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65  ual machine unde
27a10 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
27a20 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20  /.  int isAgg;  
27a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
27a40 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69  ue for select li
27a50 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28  sts like "count(
27a60 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  *)" */.  ExprLis
27a70 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
27a80 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  /* List of colum
27a90 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a  ns to extract. *
27aa0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
27ab0 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69  bList;     /* Li
27ac0 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20  st of tables to 
27ad0 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20  select from */. 
27ae0 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
27af0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
27b00 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61  HERE clause.  Ma
27b10 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
27b20 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
27b30 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f  y;    /* The GRO
27b40 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  UP BY clause.  M
27b50 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
27b60 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20  Expr *pHaving;  
27b70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41         /* The HA
27b80 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61  VING clause.  Ma
27b90 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  y be NULL */.  i
27ba0 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20  nt rc = 1;      
27bb0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
27bc0 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68  o return from th
27bd0 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
27be0 20 44 69 73 74 69 6e 63 74 43 74 78 20 73 44 69   DistinctCtx sDi
27bf0 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20  stinct; /* Info 
27c00 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74  on how to code t
27c10 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
27c20 6f 72 64 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78  ord */.  SortCtx
27c30 20 73 53 6f 72 74 3b 20 20 20 20 20 20 20 20 20   sSort;         
27c40 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74  /* Info on how t
27c50 6f 20 63 6f 64 65 20 74 68 65 20 4f 52 44 45 52  o code the ORDER
27c60 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
27c70 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f  AggInfo sAggInfo
27c80 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  ;      /* Inform
27c90 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67  ation used by ag
27ca0 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
27cb0 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20  */.  int iEnd;  
27cc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
27cd0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e  ddress of the en
27ce0 64 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a  d of the query *
27cf0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
27d00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
27d10 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
27d20 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65  ction */..#ifnde
27d30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
27d40 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 52 65 73  PLAIN.  int iRes
27d50 74 6f 72 65 53 65 6c 65 63 74 49 64 20 3d 20 70  toreSelectId = p
27d60 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
27d70 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  ;.  pParse->iSel
27d80 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e  ectId = pParse->
27d90 69 4e 65 78 74 53 65 6c 65 63 74 49 64 2b 2b 3b  iNextSelectId++;
27da0 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 20 3d 20  .#endif..  db = 
27db0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
27dc0 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  ( p==0 || db->ma
27dd0 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
27de0 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20  arse->nErr ){.  
27df0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
27e00 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
27e10 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
27e20 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c  QLITE_SELECT, 0,
27e30 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20   0, 0) ) return 
27e40 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67  1;.  memset(&sAg
27e50 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  gInfo, 0, sizeof
27e60 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 20 20  (sAggInfo));..  
27e70 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
27e80 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d  rBy==0 || pDest-
27e90 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74  >eDest!=SRT_Dist
27ea0 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  Fifo );.  assert
27eb0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
27ec0 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
27ed0 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20  !=SRT_Fifo );.  
27ee0 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
27ef0 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d  rBy==0 || pDest-
27f00 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74  >eDest!=SRT_Dist
27f10 51 75 65 75 65 20 29 3b 0a 20 20 61 73 73 65 72  Queue );.  asser
27f20 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
27f30 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  0 || pDest->eDes
27f40 74 21 3d 53 52 54 5f 51 75 65 75 65 20 29 3b 0a  t!=SRT_Queue );.
27f50 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f    if( IgnorableO
27f60 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b  rderby(pDest) ){
27f70 0a 20 20 20 20 61 73 73 65 72 74 28 70 44 65 73  .    assert(pDes
27f80 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78  t->eDest==SRT_Ex
27f90 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65  ists || pDest->e
27fa0 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20  Dest==SRT_Union 
27fb0 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70  || .           p
27fc0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
27fd0 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74  _Except || pDest
27fe0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ->eDest==SRT_Dis
27ff0 63 61 72 64 20 7c 7c 0a 20 20 20 20 20 20 20 20  card ||.        
28000 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d     pDest->eDest=
28010 3d 53 52 54 5f 51 75 65 75 65 20 20 7c 7c 20 70  =SRT_Queue  || p
28020 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
28030 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20 20 20  _DistFifo ||.   
28040 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65          pDest->e
28050 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75  Dest==SRT_DistQu
28060 65 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  eue || pDest->eD
28070 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29 3b 0a  est==SRT_Fifo);.
28080 20 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20      /* If ORDER 
28090 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66  BY makes no diff
280a0 65 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75  erence in the ou
280b0 74 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65  tput then neithe
280c0 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49  r does.    ** DI
280d0 53 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e  STINCT so it can
280e0 20 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e   be removed too.
280f0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
28100 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
28110 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
28120 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
28130 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46  = 0;.    p->selF
28140 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74  lags &= ~SF_Dist
28150 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  inct;.  }.  sqli
28160 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50  te3SelectPrep(pP
28170 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 6d  arse, p, 0);.  m
28180 65 6d 73 65 74 28 26 73 53 6f 72 74 2c 20 30 2c  emset(&sSort, 0,
28190 20 73 69 7a 65 6f 66 28 73 53 6f 72 74 29 29 3b   sizeof(sSort));
281a0 0a 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  .  sSort.pOrderB
281b0 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
281c0 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
281d0 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20  >pSrc;.  pEList 
281e0 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
281f0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
28200 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
28210 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
28220 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
28230 20 20 69 73 41 67 67 20 3d 20 28 70 2d 3e 73 65    isAgg = (p->se
28240 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
28250 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 61 73 73  egate)!=0;.  ass
28260 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
28270 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  ;..  /* Begin ge
28280 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20  nerating code.. 
28290 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
282a0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
282b0 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67  ;.  if( v==0 ) g
282c0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
282d0 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67  .  /* If writing
282e0 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65   to memory or ge
282f0 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20  nerating a set. 
28300 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c   ** only a singl
28310 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20  e column may be 
28320 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66  output..  */.#if
28330 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
28340 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20  _SUBQUERY.  if( 
28350 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c  checkForMultiCol
28360 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70  umnSelectError(p
28370 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70 45  Parse, pDest, pE
28380 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a  List->nExpr) ){.
28390 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
283a0 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  end;.  }.#endif.
283b0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
283c0 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d  ode for all sub-
283d0 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46  queries in the F
283e0 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  ROM clause.  */.
283f0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
28400 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
28410 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
28420 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
28430 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e  .  for(i=0; !p->
28440 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62  pPrior && i<pTab
28450 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
28460 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
28470 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
28480 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
28490 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65  i];.    SelectDe
284a0 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c  st dest;.    Sel
284b0 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65  ect *pSub = pIte
284c0 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
284d0 69 6e 74 20 69 73 41 67 67 53 75 62 3b 0a 0a 20  int isAggSub;.. 
284e0 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29     if( pSub==0 )
284f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
28500 2f 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 65  /* Sometimes the
28510 20 63 6f 64 65 20 66 6f 72 20 61 20 73 75 62 71   code for a subq
28520 75 65 72 79 20 77 69 6c 6c 20 62 65 20 67 65 6e  uery will be gen
28530 65 72 61 74 65 64 20 6d 6f 72 65 20 74 68 61 6e  erated more than
28540 0a 20 20 20 20 2a 2a 20 6f 6e 63 65 2c 20 69 66  .    ** once, if
28550 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
28560 20 70 61 72 74 20 6f 66 20 74 68 65 20 57 48 45   part of the WHE
28570 52 45 20 63 6c 61 75 73 65 20 69 6e 20 61 20 4c  RE clause in a L
28580 45 46 54 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a  EFT JOIN,.    **
28590 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 49   for example.  I
285a0 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64 6f 20  n that case, do 
285b0 6e 6f 74 20 72 65 67 65 6e 65 72 61 74 65 20 74  not regenerate t
285c0 68 65 20 63 6f 64 65 20 74 6f 20 6d 61 6e 69 66  he code to manif
285d0 65 73 74 0a 20 20 20 20 2a 2a 20 61 20 76 69 65  est.    ** a vie
285e0 77 20 6f 72 20 74 68 65 20 63 6f 2d 72 6f 75 74  w or the co-rout
285f0 69 6e 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ine to implement
28600 20 61 20 76 69 65 77 2e 20 20 54 68 65 20 66 69   a view.  The fi
28610 72 73 74 20 69 6e 73 74 61 6e 63 65 0a 20 20 20  rst instance.   
28620 20 2a 2a 20 69 73 20 73 75 66 66 69 63 69 65 6e   ** is sufficien
28630 74 2c 20 74 68 6f 75 67 68 20 74 68 65 20 73 75  t, though the su
28640 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6e 69  broutine to mani
28650 66 65 73 74 20 74 68 65 20 76 69 65 77 20 64 6f  fest the view do
28660 65 73 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74  es need.    ** t
28670 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 67 61  o be invoked aga
28680 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  in. */.    if( p
28690 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
286a0 62 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  b ){.      if( p
286b0 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69  Item->viaCorouti
286c0 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ne==0 ){.       
286d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
286e0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
286f0 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
28700 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  , pItem->addrFil
28710 6c 53 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lSub);.      }. 
28720 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
28730 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63     }..    /* Inc
28740 72 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65  rement Parse.nHe
28750 69 67 68 74 20 62 79 20 74 68 65 20 68 65 69 67  ight by the heig
28760 68 74 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73  ht of the larges
28770 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  t expression.   
28780 20 2a 2a 20 74 72 65 65 20 72 65 66 65 72 72 65   ** tree referre
28790 64 20 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68  d to by this, th
287a0 65 20 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e  e parent select.
287b0 20 54 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63   The child selec
287c0 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e  t.    ** may con
287d0 74 61 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  tain expression 
287e0 74 72 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74  trees of at most
287f0 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f  .    ** (SQLITE_
28800 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50  MAX_EXPR_DEPTH-P
28810 61 72 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65  arse.nHeight) he
28820 69 67 68 74 2e 20 54 68 69 73 20 69 73 20 61 20  ight. This is a 
28830 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20  bit.    ** more 
28840 63 6f 6e 73 65 72 76 61 74 69 76 65 20 74 68 61  conservative tha
28850 6e 20 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74  n necessary, but
28860 20 6d 75 63 68 20 65 61 73 69 65 72 20 74 68 61   much easier tha
28870 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20  n enforcing.    
28880 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69  ** an exact limi
28890 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  t..    */.    pP
288a0 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d  arse->nHeight +=
288b0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
288c0 70 72 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20  prHeight(p);..  
288d0 20 20 69 73 41 67 67 53 75 62 20 3d 20 28 70 53    isAggSub = (pS
288e0 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
288f0 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b  F_Aggregate)!=0;
28900 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e  .    if( flatten
28910 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c  Subquery(pParse,
28920 20 70 2c 20 69 2c 20 69 73 41 67 67 2c 20 69 73   p, i, isAgg, is
28930 41 67 67 53 75 62 29 20 29 7b 0a 20 20 20 20 20  AggSub) ){.     
28940 20 2f 2a 20 54 68 69 73 20 73 75 62 71 75 65 72   /* This subquer
28950 79 20 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65  y can be absorbe
28960 64 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e  d into its paren
28970 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  t. */.      if( 
28980 69 73 41 67 67 53 75 62 20 29 7b 0a 20 20 20 20  isAggSub ){.    
28990 20 20 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20      isAgg = 1;. 
289a0 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61         p->selFla
289b0 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61  gs |= SF_Aggrega
289c0 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  te;.      }.    
289d0 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65    i = -1;.    }e
289e0 6c 73 65 20 69 66 28 20 70 54 61 62 4c 69 73 74  lse if( pTabList
289f0 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20 20  ->nSrc==1.      
28a00 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61       && Optimiza
28a10 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
28a20 53 51 4c 49 54 45 5f 53 75 62 71 43 6f 72 6f 75  SQLITE_SubqCorou
28a30 74 69 6e 65 29 0a 20 20 20 20 29 7b 0a 20 20 20  tine).    ){.   
28a40 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20     /* Implement 
28a50 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61  a co-routine tha
28a60 74 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20  t will return a 
28a70 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68  single row of th
28a80 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  e result.      *
28a90 2a 20 73 65 74 20 6f 6e 20 65 61 63 68 20 69 6e  * set on each in
28aa0 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20  vocation..      
28ab0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
28ac0 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
28ad0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
28ae0 2b 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  +1;.      pItem-
28af0 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70  >regReturn = ++p
28b00 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
28b10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
28b20 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
28b30 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d  oroutine, pItem-
28b40 3e 72 65 67 52 65 74 75 72 6e 2c 20 30 2c 20 61  >regReturn, 0, a
28b50 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 56  ddrTop);.      V
28b60 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
28b70 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  %s", pItem->pTab
28b80 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
28b90 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
28ba0 53 75 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20  Sub = addrTop;. 
28bb0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
28bc0 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
28bd0 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
28be0 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
28bf0 6e 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  n);.      explai
28c00 6e 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65  nSetInteger(pIte
28c10 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75  m->iSelectId, (u
28c20 38 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  8)pParse->iNextS
28c30 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
28c40 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
28c50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73  arse, pSub, &des
28c60 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  t);.      pItem-
28c70 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73  >pTab->nRowLogEs
28c80 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  t = sqlite3LogEs
28c90 74 28 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52  t(pSub->nSelectR
28ca0 6f 77 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  ow);.      pItem
28cb0 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d  ->viaCoroutine =
28cc0 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d   1;.      pItem-
28cd0 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 64 65 73  >regResult = des
28ce0 74 2e 69 53 64 73 74 3b 0a 20 20 20 20 20 20 73  t.iSdst;.      s
28cf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
28d00 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74  (v, OP_EndCorout
28d10 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  ine, pItem->regR
28d20 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 73 71  eturn);.      sq
28d30 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
28d40 65 28 76 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b  e(v, addrTop-1);
28d50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c  .      sqlite3Cl
28d60 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28  earTempRegCache(
28d70 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c  pParse);.    }el
28d80 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  se{.      /* Gen
28d90 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
28da0 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 66 69 6c  ne that will fil
28db0 6c 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  l an ephemeral t
28dc0 61 62 6c 65 20 77 69 74 68 0a 20 20 20 20 20 20  able with.      
28dd0 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ** the content o
28de0 66 20 74 68 69 73 20 73 75 62 71 75 65 72 79 2e  f this subquery.
28df0 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c    pItem->addrFil
28e00 6c 53 75 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a  lSub will point.
28e10 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20        ** to the 
28e20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 67  address of the g
28e30 65 6e 65 72 61 74 65 64 20 73 75 62 72 6f 75 74  enerated subrout
28e40 69 6e 65 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67  ine.  pItem->reg
28e50 52 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20  Return.      ** 
28e60 69 73 20 61 20 72 65 67 69 73 74 65 72 20 61 6c  is a register al
28e70 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20  located to hold 
28e80 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72  the subroutine r
28e90 65 74 75 72 6e 20 61 64 64 72 65 73 73 0a 20 20  eturn address.  
28ea0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
28eb0 20 74 6f 70 41 64 64 72 3b 0a 20 20 20 20 20 20   topAddr;.      
28ec0 69 6e 74 20 6f 6e 63 65 41 64 64 72 20 3d 20 30  int onceAddr = 0
28ed0 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 74 41  ;.      int retA
28ee0 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ddr;.      asser
28ef0 74 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69  t( pItem->addrFi
28f00 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20  llSub==0 );.    
28f10 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75    pItem->regRetu
28f20 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rn = ++pParse->n
28f30 4d 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41 64  Mem;.      topAd
28f40 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
28f50 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
28f60 65 67 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e  eger, 0, pItem->
28f70 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
28f80 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c    pItem->addrFil
28f90 6c 53 75 62 20 3d 20 74 6f 70 41 64 64 72 2b 31  lSub = topAddr+1
28fa0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
28fb0 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d  m->isCorrelated=
28fc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
28fd0 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
28fe0 20 69 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74   is not correlat
28ff0 65 64 20 61 6e 64 20 69 66 20 77 65 20 61 72 65  ed and if we are
29000 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a 20   not inside of. 
29010 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67         ** a trig
29020 67 65 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c  ger, then we onl
29030 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74  y need to comput
29040 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
29050 68 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20  he subquery.    
29060 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a      ** once. */.
29070 20 20 20 20 20 20 20 20 6f 6e 63 65 41 64 64 72          onceAddr
29080 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e   = sqlite3CodeOn
29090 63 65 28 70 50 61 72 73 65 29 3b 20 56 64 62 65  ce(pParse); Vdbe
290a0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
290b0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
290c0 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a  ((v, "materializ
290d0 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d  e \"%s\"", pItem
290e0 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
290f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
29100 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f        VdbeNoopCo
29110 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72  mment((v, "mater
29120 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20  ialize \"%s\"", 
29130 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
29140 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  me));.      }.  
29150 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
29160 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
29170 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70   SRT_EphemTab, p
29180 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
29190 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
291a0 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69  Integer(pItem->i
291b0 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50  SelectId, (u8)pP
291c0 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
291d0 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tId);.      sqli
291e0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
291f0 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a  , pSub, &dest);.
29200 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61        pItem->pTa
29210 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20  b->nRowLogEst = 
29220 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 53  sqlite3LogEst(pS
29230 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b  ub->nSelectRow);
29240 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 41  .      if( onceA
29250 64 64 72 20 29 20 73 71 6c 69 74 65 33 56 64 62  ddr ) sqlite3Vdb
29260 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63  eJumpHere(v, onc
29270 65 41 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65  eAddr);.      re
29280 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  tAddr = sqlite3V
29290 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
292a0 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72  Return, pItem->r
292b0 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20  egReturn);.     
292c0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
292d0 20 22 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d   "end %s", pItem
292e0 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
292f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
29300 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 74 6f  beChangeP1(v, to
29310 70 41 64 64 72 2c 20 72 65 74 41 64 64 72 29 3b  pAddr, retAddr);
29320 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c  .      sqlite3Cl
29330 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28  earTempRegCache(
29340 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20  pParse);.    }. 
29350 20 20 20 69 66 28 20 2f 2a 70 50 61 72 73 65 2d     if( /*pParse-
29360 3e 6e 45 72 72 20 7c 7c 2a 2f 20 64 62 2d 3e 6d  >nErr ||*/ db->m
29370 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
29380 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
29390 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
293a0 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20  pParse->nHeight 
293b0 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  -= sqlite3Select
293c0 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20  ExprHeight(p);. 
293d0 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d     pTabList = p-
293e0 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20 21  >pSrc;.    if( !
293f0 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
29400 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20  (pDest) ){.     
29410 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
29420 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
29430 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73     }.  }.  pELis
29440 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 23  t = p->pEList;.#
29450 65 6e 64 69 66 0a 20 20 70 57 68 65 72 65 20 3d  endif.  pWhere =
29460 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47   p->pWhere;.  pG
29470 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
29480 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20  upBy;.  pHaving 
29490 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20  = p->pHaving;.  
294a0 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
294b0 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20   = (p->selFlags 
294c0 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d  & SF_Distinct)!=
294d0 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0;..#ifndef SQLI
294e0 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
294f0 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20  _SELECT.  /* If 
29500 74 68 65 72 65 20 69 73 20 61 72 65 20 61 20 73  there is are a s
29510 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69  equence of queri
29520 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69  es, do the earli
29530 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20  er ones first.. 
29540 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
29550 69 6f 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ior ){.    rc = 
29560 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72  multiSelect(pPar
29570 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20  se, p, pDest);. 
29580 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
29590 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65  eger(pParse->iSe
295a0 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65  lectId, iRestore
295b0 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 72  SelectId);.    r
295c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
295d0 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
295e0 65 20 71 75 65 72 79 20 69 73 20 44 49 53 54 49  e query is DISTI
295f0 4e 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45  NCT with an ORDE
29600 52 20 42 59 20 62 75 74 20 69 73 20 6e 6f 74 20  R BY but is not 
29610 61 6e 20 61 67 67 72 65 67 61 74 65 2c 20 61 6e  an aggregate, an
29620 64 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 73  d .  ** if the s
29630 65 6c 65 63 74 2d 6c 69 73 74 20 69 73 20 74 68  elect-list is th
29640 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 4f 52  e same as the OR
29650 44 45 52 20 42 59 20 6c 69 73 74 2c 20 74 68 65  DER BY list, the
29660 6e 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a  n this query.  *
29670 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69 74 74  * can be rewritt
29680 65 6e 20 61 73 20 61 20 47 52 4f 55 50 20 42 59  en as a GROUP BY
29690 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
296a0 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a  , this:.  **.  *
296b0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 44 49 53  *     SELECT DIS
296c0 54 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e  TINCT xyz FROM .
296d0 2e 2e 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a  .. ORDER BY xyz.
296e0 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72 61    **.  ** is tra
296f0 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 2a  nsformed to:.  *
29700 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
29710 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47  T xyz FROM ... G
29720 52 4f 55 50 20 42 59 20 78 79 7a 0a 20 20 2a 2a  ROUP BY xyz.  **
29730 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  .  ** The second
29740 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72   form is preferr
29750 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69  ed as a single i
29760 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61  ndex (or temp-ta
29770 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a  ble) may be .  *
29780 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20  * used for both 
29790 74 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64  the ORDER BY and
297a0 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
297b0 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61  sing. As origina
297c0 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65  lly .  ** writte
297d0 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75 73 74  n the query must
297e0 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c   use a temp-tabl
297f0 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f  e for at least o
29800 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ne of the ORDER 
29810 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53  .  ** BY and DIS
29820 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e  TINCT, and an in
29830 64 65 78 20 6f 72 20 73 65 70 61 72 61 74 65 20  dex or separate 
29840 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74  temp-table for t
29850 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20  he other..  */. 
29860 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
29870 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
29880 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
29890 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20  =SF_Distinct .  
298a0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c   && sqlite3ExprL
298b0 69 73 74 43 6f 6d 70 61 72 65 28 73 53 6f 72 74  istCompare(sSort
298c0 2e 70 4f 72 64 65 72 42 79 2c 20 70 2d 3e 70 45  .pOrderBy, p->pE
298d0 4c 69 73 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29  List, -1)==0.  )
298e0 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  {.    p->selFlag
298f0 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63  s &= ~SF_Distinc
29900 74 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70  t;.    p->pGroup
29910 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
29920 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
29930 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 70  EList, 0);.    p
29940 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
29950 6f 75 70 42 79 3b 0a 20 20 20 20 73 53 6f 72 74  oupBy;.    sSort
29960 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  .pOrderBy = 0;. 
29970 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61     /* Notice tha
29980 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20 53  t even thought S
29990 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20 62  F_Distinct has b
299a0 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f 6d  een cleared from
299b0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20   p->selFlags,.  
299c0 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69 6e    ** the sDistin
299d0 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74 69  ct.isTnct is sti
299e0 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c 20  ll set.  Hence, 
299f0 69 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e 74  isTnct represent
29a00 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69  s the.    ** ori
29a10 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f 66  ginal setting of
29a20 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63 74   the SF_Distinct
29a30 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20 63   flag, not the c
29a40 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 2a  urrent setting *
29a50 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 44  /.    assert( sD
29a60 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 29  istinct.isTnct )
29a70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
29a80 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
29a90 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
29aa0 20 74 68 69 73 20 73 6f 72 74 69 6e 67 0a 20 20   this sorting.  
29ab0 2a 2a 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65  ** index might e
29ac0 6e 64 20 75 70 20 62 65 69 6e 67 20 75 6e 75 73  nd up being unus
29ad0 65 64 20 69 66 20 74 68 65 20 64 61 74 61 20 63  ed if the data c
29ae0 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78 74 72  an be .  ** extr
29af0 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72  acted in pre-sor
29b00 74 65 64 20 6f 72 64 65 72 2e 20 20 49 66 20 74  ted order.  If t
29b10 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c  hat is the case,
29b20 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f   then the.  ** O
29b30 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
29b40 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c  instruction will
29b50 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61   be changed to a
29b60 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20  n OP_Noop once. 
29b70 20 2a 2a 20 77 65 20 66 69 67 75 72 65 20 6f 75   ** we figure ou
29b80 74 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 69  t that the sorti
29b90 6e 67 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20  ng index is not 
29ba0 6e 65 65 64 65 64 2e 20 20 54 68 65 20 61 64 64  needed.  The add
29bb0 72 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20  rSortIndex.  ** 
29bc0 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
29bd0 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74   to facilitate t
29be0 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f  hat change..  */
29bf0 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72  .  if( sSort.pOr
29c00 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79  derBy ){.    Key
29c10 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
29c20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b      pKeyInfo = k
29c30 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
29c40 73 74 28 70 50 61 72 73 65 2c 20 73 53 6f 72 74  st(pParse, sSort
29c50 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c 20 30 29  .pOrderBy, 0, 0)
29c60 3b 0a 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75  ;.    sSort.iECu
29c70 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
29c80 54 61 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74  Tab++;.    sSort
29c90 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d  .addrSortIndex =
29ca0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
29cb0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
29cc0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20  penEphemeral,.  
29cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ce0 20 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 69           sSort.i
29cf0 45 43 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70  ECursor, sSort.p
29d00 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32  OrderBy->nExpr+2
29d10 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
29d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d30 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
29d40 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
29d50 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f 72 74  }else{.    sSort
29d60 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d  .addrSortIndex =
29d70 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   -1;.  }..  /* I
29d80 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
29d90 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74  destined for a t
29da0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
29db0 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e  open that table.
29dc0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73  .  */.  if( pDes
29dd0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  t->eDest==SRT_Ep
29de0 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71  hemTab ){.    sq
29df0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
29e00 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
29e10 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ral, pDest->iSDP
29e20 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  arm, pEList->nEx
29e30 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  pr);.  }..  /* S
29e40 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a  et the limiter..
29e50 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71    */.  iEnd = sq
29e60 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
29e70 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c  el(v);.  p->nSel
29e80 65 63 74 52 6f 77 20 3d 20 4c 41 52 47 45 53 54  ectRow = LARGEST
29e90 5f 49 4e 54 36 34 3b 0a 20 20 63 6f 6d 70 75 74  _INT64;.  comput
29ea0 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
29eb0 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29  pParse, p, iEnd)
29ec0 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  ;.  if( p->iLimi
29ed0 74 3d 3d 30 20 26 26 20 73 53 6f 72 74 2e 61 64  t==0 && sSort.ad
29ee0 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29  drSortIndex>=0 )
29ef0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
29f00 65 47 65 74 4f 70 28 76 2c 20 73 53 6f 72 74 2e  eGetOp(v, sSort.
29f10 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 2d 3e  addrSortIndex)->
29f20 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 53 6f 72 74  opcode = OP_Sort
29f30 65 72 4f 70 65 6e 3b 0a 20 20 20 20 73 53 6f 72  erOpen;.    sSor
29f40 74 2e 73 6f 72 74 46 6c 61 67 73 20 7c 3d 20 53  t.sortFlags |= S
29f50 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65  ORTFLAG_UseSorte
29f60 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  r;.  }..  /* Ope
29f70 6e 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65  n a virtual inde
29f80 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  x to use for the
29f90 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20   distinct set.. 
29fa0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
29fb0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
29fc0 6e 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74  nct ){.    sDist
29fd0 69 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70  inct.tabTnct = p
29fe0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
29ff0 20 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64     sDistinct.add
2a000 72 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56  rTnct = sqlite3V
2a010 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
2a020 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20  OpenEphemeral,. 
2a030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2a050 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74  Distinct.tabTnct
2a060 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
2a070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a080 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 6b          (char*)k
2a090 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
2a0a0 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45  st(pParse, p->pE
2a0b0 4c 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20 20 20  List,0,0),.     
2a0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0d0 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45             P4_KE
2a0e0 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69  YINFO);.    sqli
2a0f0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
2a100 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52  v, BTREE_UNORDER
2a110 45 44 29 3b 0a 20 20 20 20 73 44 69 73 74 69 6e  ED);.    sDistin
2a120 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57  ct.eTnctType = W
2a130 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
2a140 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65  ORDERED;.  }else
2a150 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e  {.    sDistinct.
2a160 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52  eTnctType = WHER
2a170 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b  E_DISTINCT_NOOP;
2a180 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 41  .  }..  if( !isA
2a190 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d  gg && pGroupBy==
2a1a0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61  0 ){.    /* No a
2a1b0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
2a1c0 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20  ns and no GROUP 
2a1d0 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  BY clause */.   
2a1e0 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20   u16 wctrlFlags 
2a1f0 3d 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54  = (sDistinct.isT
2a200 6e 63 74 20 3f 20 57 48 45 52 45 5f 57 41 4e 54  nct ? WHERE_WANT
2a210 5f 44 49 53 54 49 4e 43 54 20 3a 20 30 29 3b 0a  _DISTINCT : 0);.
2a220 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68  .    /* Begin th
2a230 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 2e  e database scan.
2a240 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d   */.    pWInfo =
2a250 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2a260 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
2a270 69 73 74 2c 20 70 57 68 65 72 65 2c 20 73 53 6f  ist, pWhere, sSo
2a280 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20 20  rt.pOrderBy,.   
2a290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a2a0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
2a2b0 45 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c 61 67  EList, wctrlFlag
2a2c0 73 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  s, 0);.    if( p
2a2d0 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
2a2e0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
2a2f0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
2a300 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70  OutputRowCount(p
2a310 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c  WInfo) < p->nSel
2a320 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20  ectRow ){.      
2a330 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
2a340 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70  sqlite3WhereOutp
2a350 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66  utRowCount(pWInf
2a360 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  o);.    }.    if
2a370 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e  ( sDistinct.isTn
2a380 63 74 20 26 26 20 73 71 6c 69 74 65 33 57 68 65  ct && sqlite3Whe
2a390 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49  reIsDistinct(pWI
2a3a0 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 73 44  nfo) ){.      sD
2a3b0 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70  istinct.eTnctTyp
2a3c0 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  e = sqlite3Where
2a3d0 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66  IsDistinct(pWInf
2a3e0 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  o);.    }.    if
2a3f0 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  ( sSort.pOrderBy
2a400 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e   ){.      sSort.
2a410 6e 4f 42 53 61 74 20 3d 20 73 71 6c 69 74 65 33  nOBSat = sqlite3
2a420 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70  WhereIsOrdered(p
2a430 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66  WInfo);.      if
2a440 28 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d  ( sSort.nOBSat==
2a450 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e  sSort.pOrderBy->
2a460 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
2a470 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
2a480 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
2a490 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f   }..    /* If so
2a4a0 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
2a4b0 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
2a4c0 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45  a prior OP_OpenE
2a4d0 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a  phemeral .    **
2a4e0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64   instruction end
2a4f0 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20  ed up not being 
2a500 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61  needed, then cha
2a510 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45  nge the OP_OpenE
2a520 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20  phemeral.    ** 
2a530 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e  into an OP_Noop.
2a540 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2a550 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2a560 64 65 78 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e  dex>=0 && sSort.
2a570 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
2a580 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2a590 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
2a5a0 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2a5b0 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  dex);.    }..   
2a5c0 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e   /* Use the stan
2a5d0 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e  dard inner loop.
2a5e0 20 2a 2f 0a 20 20 20 20 73 65 6c 65 63 74 49 6e   */.    selectIn
2a5f0 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
2a600 70 2c 20 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26  p, pEList, -1, &
2a610 73 53 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63  sSort, &sDistinc
2a620 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20  t, pDest,.      
2a630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2a640 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e  lite3WhereContin
2a650 75 65 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c  ueLabel(pWInfo),
2a660 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a670 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
2a680 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e  eBreakLabel(pWIn
2a690 66 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e  fo));..    /* En
2a6a0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
2a6b0 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
2a6c0 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72  .    sqlite3Wher
2a6d0 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
2a6e0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
2a6f0 69 73 20 63 61 73 65 20 77 68 65 6e 20 74 68 65  is case when the
2a700 72 65 20 65 78 69 73 74 20 61 67 67 72 65 67 61  re exist aggrega
2a710 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20  te functions or 
2a720 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
2a730 65 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68  e.    ** or both
2a740 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74   */.    NameCont
2a750 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e  ext sNC;    /* N
2a760 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ame context for 
2a770 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65  processing aggre
2a780 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  gate information
2a790 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65   */.    int iAMe
2a7a0 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m;          /* F
2a7b0 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73  irst Mem address
2a7c0 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72   for storing cur
2a7d0 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f  rent GROUP BY */
2a7e0 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20  .    int iBMem; 
2a7f0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2a800 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f  t Mem address fo
2a810 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50  r previous GROUP
2a820 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69   BY */.    int i
2a830 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f  UseFlag;       /
2a840 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f  * Mem address ho
2a850 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63  lding flag indic
2a860 61 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65  ating that at le
2a870 61 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  ast.            
2a880 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
2a890 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e  ne row of the in
2a8a0 70 75 74 20 74 6f 20 74 68 65 20 61 67 67 72 65  put to the aggre
2a8b0 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20  gator has been. 
2a8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a8d0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
2a8e0 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  sed */.    int i
2a8f0 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f  AbortFlag;     /
2a900 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68  * Mem address wh
2a910 69 63 68 20 63 61 75 73 65 73 20 71 75 65 72 79  ich causes query
2a920 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69   abort if positi
2a930 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72  ve */.    int gr
2a940 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a  oupBySort;    /*
2a950 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20   Rows come from 
2a960 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20  source in GROUP 
2a970 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  BY order */.    
2a980 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20  int addrEnd;    
2a990 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72      /* End of pr
2a9a0 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69  ocessing for thi
2a9b0 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  s SELECT */.    
2a9c0 69 6e 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30  int sortPTab = 0
2a9d0 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62  ;   /* Pseudotab
2a9e0 6c 65 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64  le used to decod
2a9f0 65 20 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74  e sorting result
2aa00 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72  s */.    int sor
2aa10 74 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  tOut = 0;    /* 
2aa20 4f 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20  Output register 
2aa30 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20  from the sorter 
2aa40 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 72 64 65 72  */.    int order
2aa50 42 79 47 72 70 20 3d 20 30 3b 20 2f 2a 20 54 72  ByGrp = 0; /* Tr
2aa60 75 65 20 69 66 20 74 68 65 20 47 52 4f 55 50 20  ue if the GROUP 
2aa70 42 59 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20  BY and ORDER BY 
2aa80 61 72 65 20 74 68 65 20 73 61 6d 65 20 2a 2f 0a  are the same */.
2aa90 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61  .    /* Remove a
2aaa0 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73  ny and all alias
2aab0 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 72  es between the r
2aac0 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68  esult set and th
2aad0 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42  e.    ** GROUP B
2aae0 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f  Y clause..    */
2aaf0 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
2ab00 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  y ){.      int k
2ab10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ab20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2ab30 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
2ab40 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
2ab50 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20  t_item *pItem;  
2ab60 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
2ab70 76 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ver expression i
2ab80 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20  n a list */..   
2ab90 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69     for(k=p->pELi
2aba0 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d  st->nExpr, pItem
2abb0 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b  =p->pEList->a; k
2abc0 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; k--, pItem++
2abd0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d  ){.        pItem
2abe0 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30  ->u.x.iAlias = 0
2abf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2ac00 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e  for(k=pGroupBy->
2ac10 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72  nExpr, pItem=pGr
2ac20 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b  oupBy->a; k>0; k
2ac30 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
2ac40 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78        pItem->u.x
2ac50 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20  .iAlias = 0;.   
2ac60 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
2ac70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 31 30 30  ->nSelectRow>100
2ac80 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
2ac90 20 3d 20 31 30 30 3b 0a 20 20 20 20 7d 65 6c 73   = 100;.    }els
2aca0 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  e{.      p->nSel
2acb0 65 63 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20  ectRow = 1;.    
2acc0 7d 0a 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  }...    /* If th
2acd0 65 72 65 20 69 73 20 62 6f 74 68 20 61 20 47 52  ere is both a GR
2ace0 4f 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52  OUP BY and an OR
2acf0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
2ad00 64 20 74 68 65 79 20 61 72 65 0a 20 20 20 20 2a  d they are.    *
2ad10 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65  * identical, the
2ad20 6e 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73  n it may be poss
2ad30 69 62 6c 65 20 74 6f 20 64 69 73 61 62 6c 65 20  ible to disable 
2ad40 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2ad50 75 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  use .    ** on t
2ad60 68 65 20 67 72 6f 75 6e 64 73 20 74 68 61 74 20  he grounds that 
2ad70 74 68 65 20 47 52 4f 55 50 20 42 59 20 77 69 6c  the GROUP BY wil
2ad80 6c 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74 73  l cause elements
2ad90 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20 20   to come out .  
2ada0 20 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 72    ** in the corr
2adb0 65 63 74 20 6f 72 64 65 72 2e 20 49 74 20 61 6c  ect order. It al
2adc0 73 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68 65  so may not - the
2add0 20 47 52 4f 55 50 20 42 59 20 6d 61 79 20 75 73   GROUP BY may us
2ade0 65 20 61 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  e a.    ** datab
2adf0 61 73 65 20 69 6e 64 65 78 20 74 68 61 74 20 63  ase index that c
2ae00 61 75 73 65 73 20 72 6f 77 73 20 74 6f 20 62 65  auses rows to be
2ae10 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65   grouped togethe
2ae20 72 20 61 73 20 72 65 71 75 69 72 65 64 0a 20 20  r as required.  
2ae30 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 61 63 74    ** but not act
2ae40 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e 20 45 69  ually sorted. Ei
2ae50 74 68 65 72 20 77 61 79 2c 20 72 65 63 6f 72 64  ther way, record
2ae60 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
2ae70 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44 45 52 20  he.    ** ORDER 
2ae80 42 59 20 61 6e 64 20 47 52 4f 55 50 20 42 59 20  BY and GROUP BY 
2ae90 63 6c 61 75 73 65 73 20 61 72 65 20 74 68 65 20  clauses are the 
2aea0 73 61 6d 65 20 62 79 20 73 65 74 74 69 6e 67 20  same by setting 
2aeb0 74 68 65 20 6f 72 64 65 72 42 79 47 72 70 0a 20  the orderByGrp. 
2aec0 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20     ** variable. 
2aed0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
2aee0 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
2aef0 72 65 28 70 47 72 6f 75 70 42 79 2c 20 73 53 6f  re(pGroupBy, sSo
2af00 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29  rt.pOrderBy, -1)
2af10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 72 64  ==0 ){.      ord
2af20 65 72 42 79 47 72 70 20 3d 20 31 3b 0a 20 20 20  erByGrp = 1;.   
2af30 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61   }. .    /* Crea
2af40 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75  te a label to ju
2af50 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61  mp to when we wa
2af60 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20  nt to abort the 
2af70 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64  query */.    add
2af80 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  rEnd = sqlite3Vd
2af90 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
2afa0 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  .    /* Convert 
2afb0 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20  TK_COLUMN nodes 
2afc0 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  into TK_AGG_COLU
2afd0 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72  MN and make entr
2afe0 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41  ies in.    ** sA
2aff0 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54  ggInfo for all T
2b000 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e  K_AGG_FUNCTION n
2b010 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73 69  odes in expressi
2b020 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ons of the.    *
2b030 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
2b040 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d  nt..    */.    m
2b050 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
2b060 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20  izeof(sNC));.   
2b070 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
2b080 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53  arse;.    sNC.pS
2b090 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  rcList = pTabLis
2b0a0 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49  t;.    sNC.pAggI
2b0b0 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b  nfo = &sAggInfo;
2b0c0 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e  .    sAggInfo.mn
2b0d0 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Reg = pParse->nM
2b0e0 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49 6e  em+1;.    sAggIn
2b0f0 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
2b100 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70  n = pGroupBy ? p
2b110 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31  GroupBy->nExpr+1
2b120 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e   : 0;.    sAggIn
2b130 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  fo.pGroupBy = pG
2b140 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69  roupBy;.    sqli
2b150 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2b160 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69  gList(&sNC, pELi
2b170 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
2b180 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
2b190 73 74 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70  st(&sNC, sSort.p
2b1a0 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66  OrderBy);.    if
2b1b0 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ( pHaving ){.   
2b1c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
2b1d0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
2b1e0 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a  &sNC, pHaving);.
2b1f0 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e      }.    sAggIn
2b200 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20  fo.nAccumulator 
2b210 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  = sAggInfo.nColu
2b220 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  mn;.    for(i=0;
2b230 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e   i<sAggInfo.nFun
2b240 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  c; i++){.      a
2b250 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2b260 72 6f 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f  roperty(sAggInfo
2b270 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c  .aFunc[i].pExpr,
2b280 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
2b290 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c  ;.      sNC.ncFl
2b2a0 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46  ags |= NC_InAggF
2b2b0 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  unc;.      sqlit
2b2c0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2b2d0 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49  List(&sNC, sAggI
2b2e0 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78  nfo.aFunc[i].pEx
2b2f0 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
2b300 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20      sNC.ncFlags 
2b310 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63  &= ~NC_InAggFunc
2b320 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67  ;.    }.    sAgg
2b330 49 6e 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61  Info.mxReg = pPa
2b340 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69  rse->nMem;.    i
2b350 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
2b360 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  led ) goto selec
2b370 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50  t_end;..    /* P
2b380 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67  rocessing for ag
2b390 67 72 65 67 61 74 65 73 20 77 69 74 68 20 47 52  gregates with GR
2b3a0 4f 55 50 20 42 59 20 69 73 20 76 65 72 79 20 64  OUP BY is very d
2b3b0 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20  ifferent and.   
2b3c0 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f   ** much more co
2b3d0 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65  mplex than aggre
2b3e0 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61 20  gates without a 
2b3f0 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f  GROUP BY..    */
2b400 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
2b410 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e  y ){.      KeyIn
2b420 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f  fo *pKeyInfo;  /
2b430 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61  * Keying informa
2b440 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f  tion for the gro
2b450 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a  up by clause */.
2b460 20 20 20 20 20 20 69 6e 74 20 6a 31 3b 20 20 20        int j1;   
2b470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76            /* A-v
2b480 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20  s-B comparision 
2b490 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e  jump */.      in
2b4a0 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b  t addrOutputRow;
2b4b0 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75    /* Start of su
2b4c0 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
2b4d0 74 70 75 74 73 20 61 20 72 65 73 75 6c 74 20 72  tputs a result r
2b4e0 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ow */.      int 
2b4f0 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20  regOutputRow;   
2b500 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73  /* Return addres
2b510 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f  s register for o
2b520 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
2b530 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
2b540 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a  drSetAbort;   /*
2b550 20 53 65 74 20 74 68 65 20 61 62 6f 72 74 20 66   Set the abort f
2b560 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a  lag and return *
2b570 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
2b580 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54  TopOfLoop;  /* T
2b590 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  op of the input 
2b5a0 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e  loop */.      in
2b5b0 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78  t addrSortingIdx
2b5c0 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e  ; /* The OP_Open
2b5d0 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68  Ephemeral for th
2b5e0 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
2b5f0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
2b600 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  rReset;      /* 
2b610 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72  Subroutine for r
2b620 65 73 65 74 74 69 6e 67 20 74 68 65 20 61 63 63  esetting the acc
2b630 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20  umulator */.    
2b640 20 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20    int regReset; 
2b650 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2b660 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  address register
2b670 20 66 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f   for reset subro
2b680 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20  utine */..      
2b690 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
2b6a0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
2b6b0 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61   we might need a
2b6c0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
2b6d0 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65  o.      ** imple
2b6e0 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61  ment it.  Alloca
2b6f0 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20  te that sorting 
2b700 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69  index now.  If i
2b710 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20  t turns out.    
2b720 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20    ** that we do 
2b730 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74 65  not need it afte
2b740 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f  r all, the OP_So
2b750 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 72 75 63  rterOpen instruc
2b760 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69  tion.      ** wi
2b770 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  ll be converted 
2b780 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20  into a Noop.  . 
2b790 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41       */.      sA
2b7a0 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
2b7b0 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  x = pParse->nTab
2b7c0 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e  ++;.      pKeyIn
2b7d0 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
2b7e0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
2b7f0 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 30 29   pGroupBy, 0, 0)
2b800 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74  ;.      addrSort
2b810 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33  ingIdx = sqlite3
2b820 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
2b830 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20  _SorterOpen, .  
2b840 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
2b850 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67  .sortingIdx, sAg
2b860 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f  gInfo.nSortingCo
2b870 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20  lumn, .         
2b880 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49   0, (char*)pKeyI
2b890 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
2b8a0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74  ;..      /* Init
2b8b0 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f  ialize memory lo
2b8c0 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20  cations used by 
2b8d0 47 52 4f 55 50 20 42 59 20 61 67 67 72 65 67 61  GROUP BY aggrega
2b8e0 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20  te processing.  
2b8f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73      */.      iUs
2b900 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65  eFlag = ++pParse
2b910 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41  ->nMem;.      iA
2b920 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61  bortFlag = ++pPa
2b930 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2b940 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20   regOutputRow = 
2b950 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2b960 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
2b970 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
2b980 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
2b990 20 20 20 20 20 72 65 67 52 65 73 65 74 20 3d 20       regReset = 
2b9a0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2b9b0 20 20 20 20 20 20 61 64 64 72 52 65 73 65 74 20        addrReset 
2b9c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
2b9d0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
2b9e0 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d   iAMem = pParse-
2b9f0 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20  >nMem + 1;.     
2ba00 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
2ba10 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
2ba20 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20  ;.      iBMem = 
2ba30 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
2ba40 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
2ba50 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79  nMem += pGroupBy
2ba60 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ->nExpr;.      s
2ba70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2ba80 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
2ba90 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a  0, iAbortFlag);.
2baa0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2bab0 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f  t((v, "clear abo
2bac0 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
2bad0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2bae0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
2baf0 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b  r, 0, iUseFlag);
2bb00 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
2bb10 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65  nt((v, "indicate
2bb20 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70   accumulator emp
2bb30 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ty"));.      sql
2bb40 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2bb50 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41  , OP_Null, 0, iA
2bb60 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75  Mem, iAMem+pGrou
2bb70 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a  pBy->nExpr-1);..
2bb80 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61        /* Begin a
2bb90 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20   loop that will 
2bba0 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72  extract all sour
2bbb0 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50  ce rows in GROUP
2bbc0 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20   BY order..     
2bbd0 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69   ** This might i
2bbe0 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72  nvolve two separ
2bbf0 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61  ate loops with a
2bc00 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74  n OP_Sort in bet
2bc10 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a  ween, or.      *
2bc20 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20  * it might be a 
2bc30 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74  single loop that
2bc40 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74   uses an index t
2bc50 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d  o extract inform
2bc60 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69  ation.      ** i
2bc70 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72 64 65  n the right orde
2bc80 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e  r to begin with.
2bc90 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2bca0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2bcb0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
2bcc0 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73  egReset, addrRes
2bcd0 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  et);.      pWInf
2bce0 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
2bcf0 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
2bd00 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
2bd10 70 47 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20  pGroupBy, 0,.   
2bd20 20 20 20 20 20 20 20 57 48 45 52 45 5f 47 52 4f         WHERE_GRO
2bd30 55 50 42 59 20 7c 20 28 6f 72 64 65 72 42 79 47  UPBY | (orderByG
2bd40 72 70 20 3f 20 57 48 45 52 45 5f 53 4f 52 54 42  rp ? WHERE_SORTB
2bd50 59 47 52 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20  YGROUP : 0), 0. 
2bd60 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66       );.      if
2bd70 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
2bd80 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
2bd90 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2bda0 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70  WhereIsOrdered(p
2bdb0 57 49 6e 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79  WInfo)==pGroupBy
2bdc0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
2bdd0 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69     /* The optimi
2bde0 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64  zer is able to d
2bdf0 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67  eliver rows in g
2be00 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f  roup by order so
2be10 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64  .        ** we d
2be20 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f  o not have to so
2be30 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e  rt.  The OP_Open
2be40 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  Ephemeral table 
2be50 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20  will be.        
2be60 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74  ** cancelled lat
2be70 65 72 20 62 65 63 61 75 73 65 20 77 65 20 73 74  er because we st
2be80 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20  ill need to use 
2be90 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20  the pKeyInfo.   
2bea0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2beb0 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b  groupBySort = 0;
2bec0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2bed0 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72        /* Rows ar
2bee0 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20  e coming out in 
2bef0 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64  undetermined ord
2bf00 65 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  er.  We have to 
2bf10 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20  push.        ** 
2bf20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20  each row into a 
2bf30 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74  sorting index, t
2bf40 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72  erminate the fir
2bf50 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20  st loop,.       
2bf60 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76   ** then loop ov
2bf70 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  er the sorting i
2bf80 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f  ndex in order to
2bf90 20 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a   get the output.
2bfa0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f          ** in so
2bfb0 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20  rted order.     
2bfc0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
2bfd0 74 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20  t regBase;.     
2bfe0 20 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64     int regRecord
2bff0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  ;.        int nC
2c000 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ol;.        int 
2c010 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20  nGroupBy;..     
2c020 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61     explainTempTa
2c030 62 6c 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  ble(pParse, .   
2c040 20 20 20 20 20 20 20 20 20 28 73 44 69 73 74 69           (sDisti
2c050 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20 28 70  nct.isTnct && (p
2c060 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69  ->selFlags&SF_Di
2c070 73 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20  stinct)==0) ?.  
2c080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c090 20 20 22 44 49 53 54 49 4e 43 54 22 20 3a 20 22    "DISTINCT" : "
2c0a0 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20 20  GROUP BY");..   
2c0b0 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74       groupBySort
2c0c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47   = 1;.        nG
2c0d0 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
2c0e0 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
2c0f0 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42    nCol = nGroupB
2c100 79 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 6a  y + 1;.        j
2c110 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20   = nGroupBy+1;. 
2c120 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
2c130 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  i<sAggInfo.nColu
2c140 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
2c150 20 20 20 20 69 66 28 20 73 41 67 67 49 6e 66 6f      if( sAggInfo
2c160 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72  .aCol[i].iSorter
2c170 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20  Column>=j ){.   
2c180 20 20 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b           nCol++;
2c190 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b  .            j++
2c1a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2c1b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c1c0 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65  regBase = sqlite
2c1d0 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
2c1e0 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  arse, nCol);.   
2c1f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2c200 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
2c210 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
2c220 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
2c230 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ist(pParse, pGro
2c240 75 70 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30  upBy, regBase, 0
2c250 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2c260 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2c270 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 73 41 67  OP_Sequence, sAg
2c280 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
2c290 2c 72 65 67 42 61 73 65 2b 6e 47 72 6f 75 70 42  ,regBase+nGroupB
2c2a0 79 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  y);.        j = 
2c2b0 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20  nGroupBy+1;.    
2c2c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
2c2d0 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
2c2e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
2c2f0 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
2c300 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67  col *pCol = &sAg
2c310 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20  gInfo.aCol[i];. 
2c320 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
2c330 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
2c340 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=j ){.         
2c350 20 20 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20     int r1 = j + 
2c360 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20  regBase;.       
2c370 20 20 20 20 20 69 6e 74 20 72 32 3b 0a 0a 20 20       int r2;..  
2c380 20 20 20 20 20 20 20 20 20 20 72 32 20 3d 20 73            r2 = s
2c390 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
2c3a0 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
2c3b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c3d0 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c  pCol->pTab, pCol
2c3e0 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d  ->iColumn, pCol-
2c3f0 3e 69 54 61 62 6c 65 2c 20 72 31 2c 20 30 29 3b  >iTable, r1, 0);
2c400 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2c410 20 72 31 21 3d 72 32 20 29 7b 0a 20 20 20 20 20   r1!=r2 ){.     
2c420 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2c430 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2c440 5f 53 43 6f 70 79 2c 20 72 32 2c 20 72 31 29 3b  _SCopy, r2, r1);
2c450 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2c460 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a             j++;.
2c470 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c480 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
2c490 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65  gRecord = sqlite
2c4a0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
2c4b0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
2c4c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2c4d0 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
2c4e0 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20   regBase, nCol, 
2c4f0 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20  regRecord);.    
2c500 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2c510 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
2c520 65 72 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e  erInsert, sAggIn
2c530 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72  fo.sortingIdx, r
2c540 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
2c550 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
2c560 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
2c570 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
2c580 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
2c590 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
2c5a0 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  rse, regBase, nC
2c5b0 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
2c5c0 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
2c5d0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 41  nfo);.        sA
2c5e0 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
2c5f0 78 50 54 61 62 20 3d 20 73 6f 72 74 50 54 61 62  xPTab = sortPTab
2c600 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
2c610 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f 72 74 4f  +;.        sortO
2c620 75 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ut = sqlite3GetT
2c630 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
2c640 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2c650 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
2c660 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73 6f 72 74  OpenPseudo, sort
2c670 50 54 61 62 2c 20 73 6f 72 74 4f 75 74 2c 20 6e  PTab, sortOut, n
2c680 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
2c690 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2c6a0 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74  v, OP_SorterSort
2c6b0 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
2c6c0 6e 67 49 64 78 2c 20 61 64 64 72 45 6e 64 29 3b  ngIdx, addrEnd);
2c6d0 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
2c6e0 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f 55 50 20  ment((v, "GROUP 
2c6f0 42 59 20 73 6f 72 74 22 29 29 3b 20 56 64 62 65  BY sort")); Vdbe
2c700 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
2c710 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 75 73       sAggInfo.us
2c720 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 31 3b  eSortingIdx = 1;
2c730 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2c740 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
2c750 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 7d  Parse);..      }
2c760 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
2c770 65 20 69 6e 64 65 78 20 6f 72 20 74 65 6d 70 6f  e index or tempo
2c780 72 61 72 79 20 74 61 62 6c 65 20 75 73 65 64 20  rary table used 
2c790 62 79 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  by the GROUP BY 
2c7a0 73 6f 72 74 0a 20 20 20 20 20 20 2a 2a 20 77 69  sort.      ** wi
2c7b0 6c 6c 20 6e 61 74 75 72 61 6c 6c 79 20 64 65 6c  ll naturally del
2c7c0 69 76 65 72 20 72 6f 77 73 20 69 6e 20 74 68 65  iver rows in the
2c7d0 20 6f 72 64 65 72 20 72 65 71 75 69 72 65 64 20   order required 
2c7e0 62 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a  by the ORDER BY.
2c7f0 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 2c        ** clause,
2c800 20 63 61 6e 63 65 6c 20 74 68 65 20 65 70 68 65   cancel the ephe
2c810 6d 65 72 61 6c 20 74 61 62 6c 65 20 6f 70 65 6e  meral table open
2c820 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 2e 0a   coded earlier..
2c830 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2c840 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74  * This is an opt
2c850 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20  imization - the 
2c860 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 73  correct answer s
2c870 68 6f 75 6c 64 20 72 65 73 75 6c 74 20 72 65 67  hould result reg
2c880 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 20 2a  ardless..      *
2c890 2a 20 55 73 65 20 74 68 65 20 53 51 4c 49 54 45  * Use the SQLITE
2c8a0 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 20 66 6c  _GroupByOrder fl
2c8b0 61 67 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54  ag with SQLITE_T
2c8c0 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 45  ESTCTRL_OPTIMIZE
2c8d0 52 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 64  R to .      ** d
2c8e0 69 73 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69  isable this opti
2c8f0 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65 73  mization for tes
2c900 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20  ting purposes.  
2c910 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 72 64  */.      if( ord
2c920 65 72 42 79 47 72 70 20 26 26 20 4f 70 74 69 6d  erByGrp && Optim
2c930 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64  izationEnabled(d
2c940 62 2c 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42  b, SQLITE_GroupB
2c950 79 4f 72 64 65 72 29 20 0a 20 20 20 20 20 20 20  yOrder) .       
2c960 26 26 20 28 67 72 6f 75 70 42 79 53 6f 72 74 20  && (groupBySort 
2c970 7c 7c 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  || sqlite3WhereI
2c980 73 53 6f 72 74 65 64 28 70 57 49 6e 66 6f 29 29  sSorted(pWInfo))
2c990 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
2c9a0 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
2c9b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71   = 0;.        sq
2c9c0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
2c9d0 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61  oNoop(v, sSort.a
2c9e0 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20  ddrSortIndex);. 
2c9f0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
2ca00 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 63 75   Evaluate the cu
2ca10 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74  rrent GROUP BY t
2ca20 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69  erms and store i
2ca30 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a  n b0, b1, b2....
2ca40 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20        ** (b0 is 
2ca50 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
2ca60 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69  iBMem+0, b1 is i
2ca70 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66  BMem+1, and so f
2ca80 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54  orth).      ** T
2ca90 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20  hen compare the 
2caa0 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
2cab0 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74   terms against t
2cac0 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  he GROUP BY term
2cad0 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20  s.      ** from 
2cae0 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
2caf0 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
2cb00 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e  d in a0, a1, a2.
2cb10 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ...      */.    
2cb20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20    addrTopOfLoop 
2cb30 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
2cb40 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
2cb50 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
2cb60 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
2cb70 3b 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75  ;.      if( grou
2cb80 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  pBySort ){.     
2cb90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2cba0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
2cbb0 72 44 61 74 61 2c 20 73 41 67 67 49 6e 66 6f 2e  rData, sAggInfo.
2cbc0 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 6f 72 74  sortingIdx, sort
2cbd0 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Out);.      }.  
2cbe0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
2cbf0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20  GroupBy->nExpr; 
2cc00 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
2cc10 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
2cc20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2cc30 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2cc40 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50  OP_Column, sortP
2cc50 54 61 62 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29  Tab, j, iBMem+j)
2cc60 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2cc70 6a 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64  j==0 ) sqlite3Vd
2cc80 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
2cc90 46 4c 41 47 5f 43 4c 45 41 52 43 41 43 48 45 29  FLAG_CLEARCACHE)
2cca0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2ccb0 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49  .          sAggI
2ccc0 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d  nfo.directMode =
2ccd0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   1;.          sq
2cce0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
2ccf0 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e  arse, pGroupBy->
2cd00 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65  a[j].pExpr, iBMe
2cd10 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  m+j);.        }.
2cd20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
2cd30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2cd40 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69  v, OP_Compare, i
2cd50 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72  AMem, iBMem, pGr
2cd60 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20  oupBy->nExpr,.  
2cd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd80 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 73          (char*)s
2cd90 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66  qlite3KeyInfoRef
2cda0 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b  (pKeyInfo), P4_K
2cdb0 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 6a  EYINFO);.      j
2cdc0 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  1 = sqlite3VdbeC
2cdd0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
2cde0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2cdf0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
2ce00 70 2c 20 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31  p, j1+1, 0, j1+1
2ce10 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
2ce20 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  v);..      /* Ge
2ce30 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
2ce40 20 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74   runs whenever t
2ce50 68 65 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e  he GROUP BY chan
2ce60 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68  ges..      ** Ch
2ce70 61 6e 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f  anges in the GRO
2ce80 55 50 20 42 59 20 61 72 65 20 64 65 74 65 63 74  UP BY are detect
2ce90 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f  ed by the previo
2cea0 75 73 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a  us code.      **
2ceb0 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72   block.  If ther
2cec0 65 20 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65  e were no change
2ced0 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73  s, this block is
2cee0 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20   skipped..      
2cef0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  **.      ** This
2cf00 20 63 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72   code copies cur
2cf10 72 65 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65  rent group by te
2cf20 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c  rms in b0,b1,b2,
2cf30 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  ....      ** ove
2cf40 72 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20  r to a0,a1,a2.  
2cf50 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68  It then calls th
2cf60 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  e output subrout
2cf70 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  ine.      ** and
2cf80 20 72 65 73 65 74 73 20 74 68 65 20 61 67 67 72   resets the aggr
2cf90 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
2cfa0 72 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 70  r registers in p
2cfb0 72 65 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20  reparation.     
2cfc0 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74   ** for the next
2cfd0 20 47 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e   GROUP BY batch.
2cfe0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2cff0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
2d000 6f 76 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65  ove(pParse, iBMe
2d010 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70  m, iAMem, pGroup
2d020 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  By->nExpr);.    
2d030 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2d040 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
2d050 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61   regOutputRow, a
2d060 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
2d070 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2d080 28 28 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65  ((v, "output one
2d090 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73   row"));.      s
2d0a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2d0b0 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41  (v, OP_IfPos, iA
2d0c0 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e  bortFlag, addrEn
2d0d0 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  d); VdbeCoverage
2d0e0 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  (v);.      VdbeC
2d0f0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63  omment((v, "chec
2d100 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  k abort flag"));
2d110 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2d120 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
2d130 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20  osub, regReset, 
2d140 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
2d150 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2d160 2c 20 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c  , "reset accumul
2d170 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
2d180 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 67  /* Update the ag
2d190 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
2d1a0 74 6f 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68  tors based on th
2d1b0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20  e content of.   
2d1c0 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
2d1d0 74 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20  t row.      */. 
2d1e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2d1f0 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b  JumpHere(v, j1);
2d200 0a 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63  .      updateAcc
2d210 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
2d220 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
2d230 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2d240 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
2d250 65 72 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29  er, 1, iUseFlag)
2d260 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2d270 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74  ent((v, "indicat
2d280 65 20 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75  e data in accumu
2d290 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20  lator"));..     
2d2a0 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c   /* End of the l
2d2b0 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  oop.      */.   
2d2c0 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
2d2d0 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rt ){.        sq
2d2e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2d2f0 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74  v, OP_SorterNext
2d300 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
2d310 6e 67 49 64 78 2c 20 61 64 64 72 54 6f 70 4f 66  ngIdx, addrTopOf
2d320 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 56  Loop);.        V
2d330 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2d340 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2d350 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
2d360 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
2d370 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2d380 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
2d390 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 29   addrSortingIdx)
2d3a0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2d3b0 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66   /* Output the f
2d3c0 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75  inal row of resu
2d3d0 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  lt.      */.    
2d3e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2d3f0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
2d400 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61   regOutputRow, a
2d410 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
2d420 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2d430 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e  ((v, "output fin
2d440 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20  al row"));..    
2d450 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74    /* Jump over t
2d460 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 20  he subroutines. 
2d470 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
2d480 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2d490 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
2d4a0 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20  ddrEnd);..      
2d4b0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
2d4c0 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
2d4d0 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72  tputs a single r
2d4e0 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  ow of the result
2d4f0 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20  .      ** set.  
2d500 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  This subroutine 
2d510 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74  first looks at t
2d520 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66  he iUseFlag.  If
2d530 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20   iUseFlag.      
2d540 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ** is less than 
2d550 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f  or equal to zero
2d560 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  , the subroutine
2d570 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66   is a no-op.  If
2d580 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72  .      ** the pr
2d590 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66  ocessing calls f
2d5a0 6f 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20  or the query to 
2d5b0 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72  abort, this subr
2d5c0 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
2d5d0 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69  increments the i
2d5e0 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79  AbortFlag memory
2d5f0 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65   location before
2d600 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20   returning in.  
2d610 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20      ** order to 
2d620 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65  signal the calle
2d630 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20  r to abort..    
2d640 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53    */.      addrS
2d650 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65  etAbort = sqlite
2d660 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
2d670 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
2d680 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2d690 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
2d6a0 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20  AbortFlag);.    
2d6b0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2d6c0 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61  , "set abort fla
2d6d0 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
2d6e0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2d6f0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
2d700 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
2d710 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
2d720 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
2d730 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
2d740 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20    addrOutputRow 
2d750 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
2d760 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
2d770 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2d780 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp2(v, OP_IfPos
2d790 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72  , iUseFlag, addr
2d7a0 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 20 56 64  OutputRow+2); Vd
2d7b0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2d7c0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2d7d0 28 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65  ((v, "Groupby re
2d7e0 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65  sult generator e
2d7f0 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20  ntry point"));. 
2d800 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2d810 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
2d820 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  urn, regOutputRo
2d830 77 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69  w);.      finali
2d840 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70  zeAggFunctions(p
2d850 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
2d860 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2d870 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
2d880 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64  se, pHaving, add
2d890 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51  rOutputRow+1, SQ
2d8a0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
2d8b0 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  ;.      selectIn
2d8c0 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
2d8d0 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31  p, p->pEList, -1
2d8e0 2c 20 26 73 53 6f 72 74 2c 0a 20 20 20 20 20 20  , &sSort,.      
2d8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d900 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73  &sDistinct, pDes
2d910 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
2d920 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75 74           addrOut
2d930 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65  putRow+1, addrSe
2d940 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73  tAbort);.      s
2d950 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
2d960 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
2d970 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
2d980 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2d990 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79  (v, "end groupby
2d9a0 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f   result generato
2d9b0 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
2d9c0 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
2d9d0 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
2d9e0 72 65 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d  reset the group-
2d9f0 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20  by accumulator. 
2da00 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
2da10 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
2da20 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73  Label(v, addrRes
2da30 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74  et);.      reset
2da40 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
2da50 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
2da60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2da70 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
2da80 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b  turn, regReset);
2da90 0a 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20  .     .    } /* 
2daa0 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79 2e 20  endif pGroupBy. 
2dab0 20 42 65 67 69 6e 20 61 67 67 72 65 67 61 74 65   Begin aggregate
2dac0 20 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74   queries without
2dad0 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20   GROUP BY: */.  
2dae0 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 45    else {.      E
2daf0 78 70 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20  xprList *pDel = 
2db00 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
2db10 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e  E_OMIT_BTREECOUN
2db20 54 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  T.      Table *p
2db30 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28  Tab;.      if( (
2db40 70 54 61 62 20 3d 20 69 73 53 69 6d 70 6c 65 43  pTab = isSimpleC
2db50 6f 75 6e 74 28 70 2c 20 26 73 41 67 67 49 6e 66  ount(p, &sAggInf
2db60 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  o))!=0 ){.      
2db70 20 20 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c 65    /* If isSimple
2db80 43 6f 75 6e 74 28 29 20 72 65 74 75 72 6e 73 20  Count() returns 
2db90 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54  a pointer to a T
2dba0 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20  able structure, 
2dbb0 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  then.        ** 
2dbc0 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
2dbd0 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
2dbe0 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
2dbf0 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54       **   SELECT
2dc00 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c   count(*) FROM <
2dc10 74 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  tbl>.        **.
2dc20 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 72 65          ** where
2dc30 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
2dc40 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 72 65  ture returned re
2dc50 70 72 65 73 65 6e 74 73 20 74 61 62 6c 65 20 3c  presents table <
2dc60 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  tbl>..        **
2dc70 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
2dc80 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 6f   statement is so
2dc90 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20   common that it 
2dca0 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 70 65  is optimized spe
2dcb0 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20  cially. The.    
2dcc0 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20      ** OP_Count 
2dcd0 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 65  instruction is e
2dce0 78 65 63 75 74 65 64 20 65 69 74 68 65 72 20 6f  xecuted either o
2dcf0 6e 20 74 68 65 20 69 6e 74 6b 65 79 20 74 61 62  n the intkey tab
2dd00 6c 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  le that.        
2dd10 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
2dd20 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20 3c  data for table <
2dd30 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f  tbl> or on one o
2dd40 66 20 69 74 73 20 69 6e 64 65 78 65 73 2e 20 49  f its indexes. I
2dd50 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  t.        ** is 
2dd60 62 65 74 74 65 72 20 74 6f 20 65 78 65 63 75 74  better to execut
2dd70 65 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69  e the op on an i
2dd80 6e 64 65 78 2c 20 61 73 20 69 6e 64 65 78 65 73  ndex, as indexes
2dd90 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20   are almost.    
2dda0 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 70      ** always sp
2ddb0 72 65 61 64 20 61 63 72 6f 73 73 20 6c 65 73 73  read across less
2ddc0 20 70 61 67 65 73 20 74 68 61 6e 20 74 68 65 69   pages than thei
2ddd0 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  r corresponding 
2dde0 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 20 20  tables..        
2ddf0 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  */.        const
2de00 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
2de10 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
2de20 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
2de30 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
2de40 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43      const int iC
2de50 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  sr = pParse->nTa
2de60 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72 73  b++;     /* Curs
2de70 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d 74 72 65  or to scan b-tre
2de80 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64  e */.        Ind
2de90 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
2dea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2deb0 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
2dec0 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  riable */.      
2ded0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
2dee0 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nfo = 0;        
2def0 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66         /* Keyinf
2df00 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e  o for scanned in
2df10 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 49  dex */.        I
2df20 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30 3b  ndex *pBest = 0;
2df30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df40 20 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65      /* Best inde
2df50 78 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a  x found so far *
2df60 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52  /.        int iR
2df70 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d  oot = pTab->tnum
2df80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2df90 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 73  * Root page of s
2dfa0 63 61 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f  canned b-tree */
2dfb0 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ..        sqlite
2dfc0 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
2dfd0 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
2dfe0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
2dff0 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
2e000 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
2e010 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
2e020 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  );..        /* S
2e030 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 69 6e  earch for the in
2e040 64 65 78 20 74 68 61 74 20 68 61 73 20 74 68 65  dex that has the
2e050 20 6c 6f 77 65 73 74 20 73 63 61 6e 20 63 6f 73   lowest scan cos
2e060 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  t..        **.  
2e070 20 20 20 20 20 20 2a 2a 20 28 32 30 31 31 2d 30        ** (2011-0
2e080 34 2d 31 35 29 20 44 6f 20 6e 6f 74 20 64 6f 20  4-15) Do not do 
2e090 61 20 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20 61  a full scan of a
2e0a0 6e 20 75 6e 6f 72 64 65 72 65 64 20 69 6e 64 65  n unordered inde
2e0b0 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  x..        **.  
2e0c0 20 20 20 20 20 20 2a 2a 20 28 32 30 31 33 2d 31        ** (2013-1
2e0d0 30 2d 30 33 29 20 44 6f 20 6e 6f 74 20 63 6f 75  0-03) Do not cou
2e0e0 6e 74 20 74 68 65 20 65 6e 74 72 69 65 73 20 69  nt the entries i
2e0f0 6e 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65  n a partial inde
2e100 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  x..        **.  
2e110 20 20 20 20 20 20 2a 2a 20 49 6e 20 70 72 61 63        ** In prac
2e120 74 69 63 65 20 74 68 65 20 4b 65 79 49 6e 66 6f  tice the KeyInfo
2e130 20 73 74 72 75 63 74 75 72 65 20 77 69 6c 6c 20   structure will 
2e140 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 49 74 20  not be used. It 
2e150 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20 20  is only .       
2e160 20 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 6b 65   ** passed to ke
2e170 65 70 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 68  ep OP_OpenRead h
2e180 61 70 70 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  appy..        */
2e190 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 48 61  .        if( !Ha
2e1a0 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20 70  sRowid(pTab) ) p
2e1b0 42 65 73 74 20 3d 20 73 71 6c 69 74 65 33 50 72  Best = sqlite3Pr
2e1c0 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
2e1d0 61 62 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ab);.        for
2e1e0 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
2e1f0 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
2e200 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
2e210 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
2e220 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20  >bUnordered==0. 
2e230 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49 64            && pId
2e240 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61 62  x->szIdxRow<pTab
2e250 2d 3e 73 7a 54 61 62 52 6f 77 0a 20 20 20 20 20  ->szTabRow.     
2e260 20 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e 70        && pIdx->p
2e270 50 61 72 74 49 64 78 57 68 65 72 65 3d 3d 30 0a  PartIdxWhere==0.
2e280 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 21             && (!
2e290 70 42 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e 73  pBest || pIdx->s
2e2a0 7a 49 64 78 52 6f 77 3c 70 42 65 73 74 2d 3e 73  zIdxRow<pBest->s
2e2b0 7a 49 64 78 52 6f 77 29 0a 20 20 20 20 20 20 20  zIdxRow).       
2e2c0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2e2d0 20 20 70 42 65 73 74 20 3d 20 70 49 64 78 3b 0a    pBest = pIdx;.
2e2e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2e2f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2e300 28 20 70 42 65 73 74 20 29 7b 0a 20 20 20 20 20  ( pBest ){.     
2e310 20 20 20 20 20 69 52 6f 6f 74 20 3d 20 70 42 65       iRoot = pBe
2e320 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20  st->tnum;.      
2e330 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
2e340 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49  qlite3KeyInfoOfI
2e350 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 42 65  ndex(pParse, pBe
2e360 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  st);.        }..
2e370 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
2e380 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
2e390 6f 72 2c 20 65 78 65 63 75 74 65 20 74 68 65 20  or, execute the 
2e3a0 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73 65 20  OP_Count, close 
2e3b0 74 68 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20  the cursor. */. 
2e3c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2e3d0 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
2e3e0 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 43 73 72  P_OpenRead, iCsr
2e3f0 2c 20 69 52 6f 6f 74 2c 20 69 44 62 2c 20 31 29  , iRoot, iDb, 1)
2e400 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b  ;.        if( pK
2e410 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
2e420 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2e430 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28  hangeP4(v, -1, (
2e440 63 68 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c  char *)pKeyInfo,
2e450 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
2e460 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e470 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2e480 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69  2(v, OP_Count, i
2e490 43 73 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  Csr, sAggInfo.aF
2e4a0 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20  unc[0].iMem);.  
2e4b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2e4c0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
2e4d0 6f 73 65 2c 20 69 43 73 72 29 3b 0a 20 20 20 20  ose, iCsr);.    
2e4e0 20 20 20 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c      explainSimpl
2e4f0 65 43 6f 75 6e 74 28 70 50 61 72 73 65 2c 20 70  eCount(pParse, p
2e500 54 61 62 2c 20 70 42 65 73 74 29 3b 0a 20 20 20  Tab, pBest);.   
2e510 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20     }else.#endif 
2e520 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  /* SQLITE_OMIT_B
2e530 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20  TREECOUNT */.   
2e540 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20     {.        /* 
2e550 43 68 65 63 6b 20 69 66 20 74 68 65 20 71 75 65  Check if the que
2e560 72 79 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20  ry is of one of 
2e570 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f  the following fo
2e580 72 6d 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  rms:.        **.
2e590 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
2e5a0 45 43 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20  ECT min(x) FROM 
2e5b0 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  ....        **  
2e5c0 20 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46   SELECT max(x) F
2e5d0 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20  ROM ....        
2e5e0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66  **.        ** If
2e5f0 20 69 74 20 69 73 2c 20 74 68 65 6e 20 61 73 6b   it is, then ask
2e600 20 74 68 65 20 63 6f 64 65 20 69 6e 20 77 68 65   the code in whe
2e610 72 65 2e 63 20 74 6f 20 61 74 74 65 6d 70 74 20  re.c to attempt 
2e620 74 6f 20 73 6f 72 74 20 72 65 73 75 6c 74 73 0a  to sort results.
2e630 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66          ** as if
2e640 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f   there was an "O
2e650 52 44 45 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f  RDER ON x" or "O
2e660 52 44 45 52 20 4f 4e 20 78 20 44 45 53 43 22 20  RDER ON x DESC" 
2e670 63 6c 61 75 73 65 2e 20 0a 20 20 20 20 20 20 20  clause. .       
2e680 20 2a 2a 20 49 66 20 77 68 65 72 65 2e 63 20 69   ** If where.c i
2e690 73 20 61 62 6c 65 20 74 6f 20 70 72 6f 64 75 63  s able to produc
2e6a0 65 20 72 65 73 75 6c 74 73 20 73 6f 72 74 65 64  e results sorted
2e6b0 20 69 6e 20 74 68 69 73 20 6f 72 64 65 72 2c 20   in this order, 
2e6c0 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  then.        ** 
2e6d0 61 64 64 20 76 64 62 65 20 63 6f 64 65 20 74 6f  add vdbe code to
2e6e0 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
2e6f0 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f  e processing loo
2e700 70 20 61 66 74 65 72 20 74 68 65 20 0a 20 20 20  p after the .   
2e710 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 69 74       ** first it
2e720 65 72 61 74 69 6f 6e 20 28 73 69 6e 63 65 20 74  eration (since t
2e730 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69  he first iterati
2e740 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  on of the loop i
2e750 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75  s .        ** gu
2e760 61 72 61 6e 74 65 65 64 20 74 6f 20 6f 70 65 72  aranteed to oper
2e770 61 74 65 20 6f 6e 20 74 68 65 20 72 6f 77 20 77  ate on the row w
2e780 69 74 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20  ith the minimum 
2e790 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20  or maximum .    
2e7a0 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20      ** value of 
2e7b0 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20  x, the only row 
2e7c0 72 65 71 75 69 72 65 64 29 2e 0a 20 20 20 20 20  required)..     
2e7d0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
2e7e0 20 41 20 73 70 65 63 69 61 6c 20 66 6c 61 67 20   A special flag 
2e7f0 6d 75 73 74 20 62 65 20 70 61 73 73 65 64 20 74  must be passed t
2e800 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
2e810 67 69 6e 28 29 20 74 6f 20 73 6c 69 67 68 74 6c  gin() to slightl
2e820 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64  y.        ** mod
2e830 69 66 79 20 62 65 68 61 76 69 6f 72 20 61 73 20  ify behavior as 
2e840 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20  follows:.       
2e850 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
2e860 20 2b 20 49 66 20 74 68 65 20 71 75 65 72 79 20   + If the query 
2e870 69 73 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e  is a "SELECT min
2e880 28 78 29 22 2c 20 74 68 65 6e 20 74 68 65 20 6c  (x)", then the l
2e890 6f 6f 70 20 63 6f 64 65 64 20 62 79 0a 20 20 20  oop coded by.   
2e8a0 20 20 20 20 20 2a 2a 20 20 20 20 20 77 68 65 72       **     wher
2e8b0 65 2e 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69  e.c should not i
2e8c0 74 65 72 61 74 65 20 6f 76 65 72 20 61 6e 79 20  terate over any 
2e8d0 76 61 6c 75 65 73 20 77 69 74 68 20 61 20 4e 55  values with a NU
2e8e0 4c 4c 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20  LL value.       
2e8f0 20 2a 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a 20   **     for x.. 
2e900 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2e910 20 20 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70 74    **   + The opt
2e920 69 6d 69 7a 65 72 20 63 6f 64 65 20 69 6e 20 77  imizer code in w
2e930 68 65 72 65 2e 63 20 28 74 68 65 20 74 68 69 6e  here.c (the thin
2e940 67 20 74 68 61 74 20 64 65 63 69 64 65 73 20 77  g that decides w
2e950 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20  hich.        ** 
2e960 20 20 20 20 69 6e 64 65 78 20 6f 72 20 69 6e 64      index or ind
2e970 69 63 65 73 20 74 6f 20 75 73 65 29 20 73 68 6f  ices to use) sho
2e980 75 6c 64 20 70 6c 61 63 65 20 61 20 64 69 66 66  uld place a diff
2e990 65 72 65 6e 74 20 70 72 69 6f 72 69 74 79 20 6f  erent priority o
2e9a0 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  n .        **   
2e9b0 20 20 73 61 74 69 73 66 79 69 6e 67 20 74 68 65    satisfying the
2e9c0 20 27 4f 52 44 45 52 20 42 59 27 20 63 6c 61 75   'ORDER BY' clau
2e9d0 73 65 20 74 68 61 6e 20 69 74 20 64 6f 65 73 20  se than it does 
2e9e0 69 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a  in other cases..
2e9f0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52          **     R
2ea00 65 66 65 72 20 74 6f 20 63 6f 64 65 20 61 6e 64  efer to code and
2ea10 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65   comments in whe
2ea20 72 65 2e 63 20 66 6f 72 20 64 65 74 61 69 6c 73  re.c for details
2ea30 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2ea40 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
2ea50 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20  MinMax = 0;.    
2ea60 20 20 20 20 75 38 20 66 6c 61 67 20 3d 20 57 48      u8 flag = WH
2ea70 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
2ea80 41 4c 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20  AL;.        .   
2ea90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
2eaa0 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20  pGroupBy==0 );. 
2eab0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66         assert( f
2eac0 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  lag==0 );.      
2ead0 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67    if( p->pHaving
2eae0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2eaf0 20 66 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75   flag = minMaxQu
2eb00 65 72 79 28 26 73 41 67 67 49 6e 66 6f 2c 20 26  ery(&sAggInfo, &
2eb10 70 4d 69 6e 4d 61 78 29 3b 0a 20 20 20 20 20 20  pMinMax);.      
2eb20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
2eb30 72 74 28 20 66 6c 61 67 3d 3d 30 20 7c 7c 20 28  rt( flag==0 || (
2eb40 70 4d 69 6e 4d 61 78 21 3d 30 20 26 26 20 70 4d  pMinMax!=0 && pM
2eb50 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 29  inMax->nExpr==1)
2eb60 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28   );..        if(
2eb70 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20   flag ){.       
2eb80 20 20 20 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c     pMinMax = sql
2eb90 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
2eba0 64 62 2c 20 70 4d 69 6e 4d 61 78 2c 20 30 29 3b  db, pMinMax, 0);
2ebb0 0a 20 20 20 20 20 20 20 20 20 20 70 44 65 6c 20  .          pDel 
2ebc0 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20 20 20 20 20  = pMinMax;.     
2ebd0 20 20 20 20 20 69 66 28 20 70 4d 69 6e 4d 61 78       if( pMinMax
2ebe0 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
2ebf0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
2ec00 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b       pMinMax->a[
2ec10 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 66  0].sortOrder = f
2ec20 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52 44 45 52  lag!=WHERE_ORDER
2ec30 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20  BY_MIN ?1:0;.   
2ec40 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78           pMinMax
2ec50 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
2ec60 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20   = TK_COLUMN;.  
2ec70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ec80 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f    }.  .        /
2ec90 2a 20 54 68 69 73 20 63 61 73 65 20 72 75 6e 73  * This case runs
2eca0 20 69 66 20 74 68 65 20 61 67 67 72 65 67 61 74   if the aggregat
2ecb0 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42  e has no GROUP B
2ecc0 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20  Y clause.  The. 
2ecd0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
2ece0 73 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d  sing is much sim
2ecf0 70 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72 65  pler since there
2ed00 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c   is only a singl
2ed10 65 20 72 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a  e row.        **
2ed20 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20   of output..    
2ed30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
2ed40 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
2ed50 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
2ed60 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e  o);.        pWIn
2ed70 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
2ed80 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
2ed90 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
2eda0 20 70 4d 69 6e 4d 61 78 2c 30 2c 66 6c 61 67 2c   pMinMax,0,flag,
2edb0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
2edc0 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20  pWInfo==0 ){.   
2edd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
2ede0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
2edf0 20 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20   pDel);.        
2ee00 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
2ee10 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
2ee20 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d       updateAccum
2ee30 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
2ee40 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
2ee50 20 20 20 61 73 73 65 72 74 28 20 70 4d 69 6e 4d     assert( pMinM
2ee60 61 78 3d 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61 78  ax==0 || pMinMax
2ee70 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20  ->nExpr==1 );.  
2ee80 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2ee90 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
2eea0 70 57 49 6e 66 6f 29 3e 30 20 29 7b 0a 20 20 20  pWInfo)>0 ){.   
2eeb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2eec0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
2eed0 6f 74 6f 2c 20 30 2c 20 73 71 6c 69 74 65 33 57  oto, 0, sqlite3W
2eee0 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70  hereBreakLabel(p
2eef0 57 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 20  WInfo));.       
2ef00 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2ef10 76 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64 65  v, "%s() by inde
2ef20 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  x",.            
2ef30 20 20 20 20 28 66 6c 61 67 3d 3d 57 48 45 52 45      (flag==WHERE
2ef40 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69  _ORDERBY_MIN?"mi
2ef50 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20 20  n":"max")));.   
2ef60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
2ef70 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
2ef80 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
2ef90 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
2efa0 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41  ions(pParse, &sA
2efb0 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d  ggInfo);.      }
2efc0 0a 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f  ..      sSort.pO
2efd0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
2efe0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
2eff0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
2f000 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 53  ving, addrEnd, S
2f010 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
2f020 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  );.      selectI
2f030 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
2f040 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d   p, p->pEList, -
2f050 31 2c 20 30 2c 20 30 2c 20 0a 20 20 20 20 20 20  1, 0, 0, .      
2f060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f070 70 44 65 73 74 2c 20 61 64 64 72 45 6e 64 2c 20  pDest, addrEnd, 
2f080 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20  addrEnd);.      
2f090 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
2f0a0 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b  elete(db, pDel);
2f0b0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2f0c0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2f0d0 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a  el(v, addrEnd);.
2f0e0 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69      .  } /* endi
2f0f0 66 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  f aggregate quer
2f100 79 20 2a 2f 0a 0a 20 20 69 66 28 20 73 44 69 73  y */..  if( sDis
2f110 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 3d  tinct.eTnctType=
2f120 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f  =WHERE_DISTINCT_
2f130 55 4e 4f 52 44 45 52 45 44 20 29 7b 0a 20 20 20  UNORDERED ){.   
2f140 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
2f150 65 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49  e(pParse, "DISTI
2f160 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NCT");.  }..  /*
2f170 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
2f180 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
2f190 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f   then we need to
2f1a0 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74   sort the result
2f1b0 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20  s.  ** and send 
2f1c0 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c  them to the call
2f1d0 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e  back one by one.
2f1e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72  .  */.  if( sSor
2f1f0 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  t.pOrderBy ){.  
2f200 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62    explainTempTab
2f210 6c 65 28 70 50 61 72 73 65 2c 20 73 53 6f 72 74  le(pParse, sSort
2f220 2e 6e 4f 42 53 61 74 3e 30 20 3f 20 22 52 49 47  .nOBSat>0 ? "RIG
2f230 48 54 20 50 41 52 54 20 4f 46 20 4f 52 44 45 52  HT PART OF ORDER
2f240 20 42 59 22 3a 22 4f 52 44 45 52 20 42 59 22 29   BY":"ORDER BY")
2f250 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f  ;.    generateSo
2f260 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70  rtTail(pParse, p
2f270 2c 20 26 73 53 6f 72 74 2c 20 70 45 4c 69 73 74  , &sSort, pEList
2f280 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b  ->nExpr, pDest);
2f290 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
2f2a0 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69  here to skip thi
2f2b0 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73  s query.  */.  s
2f2c0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
2f2d0 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b  eLabel(v, iEnd);
2f2e0 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43  ..  /* The SELEC
2f2f0 54 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  T was successful
2f300 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20  ly coded.   Set 
2f310 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
2f320 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  to 0.  ** to ind
2f330 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e  icate no errors.
2f340 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a  .  */.  rc = 0;.
2f350 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75  .  /* Control ju
2f360 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61  mps to here if a
2f370 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
2f380 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72  ntered above, or
2f390 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65   upon.  ** succe
2f3a0 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20  ssful coding of 
2f3b0 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f  the SELECT..  */
2f3c0 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65  .select_end:.  e
2f3d0 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
2f3e0 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74  (pParse->iSelect
2f3f0 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65  Id, iRestoreSele
2f400 63 74 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64 65  ctId);..  /* Ide
2f410 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ntify column nam
2f420 65 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f 66  es if results of
2f430 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65 20   the SELECT are 
2f440 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20  to be output..  
2f450 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
2f460 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d  ITE_OK && pDest-
2f470 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  >eDest==SRT_Outp
2f480 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  ut ){.    genera
2f490 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
2f4a0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
2f4b0 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  pEList);.  }..  
2f4c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2f4d0 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29  , sAggInfo.aCol)
2f4e0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
2f4f0 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61  e(db, sAggInfo.a
2f500 46 75 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20  Func);.  return 
2f510 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  rc;.}..#if defin
2f520 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
2f530 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 76  _TREE_EXPLAIN).v
2f540 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74  oid sqlite3Print
2f550 45 78 70 72 28 45 78 70 72 20 2a 70 29 3b 0a 76  Expr(Expr *p);.v
2f560 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74  oid sqlite3Print
2f570 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73  ExprList(ExprLis
2f580 74 20 2a 70 4c 69 73 74 29 3b 0a 76 6f 69 64 20  t *pList);.void 
2f590 73 71 6c 69 74 65 33 50 72 69 6e 74 53 65 6c 65  sqlite3PrintSele
2f5a0 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  ct(Select *p, in
2f5b0 74 20 69 6e 64 65 6e 74 29 3b 0a 2f 2a 0a 2a 2a  t indent);./*.**
2f5c0 20 47 65 6e 65 72 61 74 65 20 61 20 68 75 6d 61   Generate a huma
2f5d0 6e 2d 72 65 61 64 61 62 6c 65 20 64 65 73 63 72  n-readable descr
2f5e0 69 70 74 69 6f 6e 20 6f 66 20 61 20 74 68 65 20  iption of a the 
2f5f0 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a  Select object..*
2f600 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
2f610 70 6c 61 69 6e 4f 6e 65 53 65 6c 65 63 74 28 56  plainOneSelect(V
2f620 64 62 65 20 2a 70 56 64 62 65 2c 20 53 65 6c 65  dbe *pVdbe, Sele
2f630 63 74 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  ct *p){.  sqlite
2f640 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
2f650 56 64 62 65 2c 20 22 53 45 4c 45 43 54 20 22 29  Vdbe, "SELECT ")
2f660 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  ;.  if( p->selFl
2f670 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
2f680 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
2f690 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73   ){.    if( p->s
2f6a0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
2f6b0 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 73  tinct ){.      s
2f6c0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2f6d0 6e 74 66 28 70 56 64 62 65 2c 20 22 44 49 53 54  ntf(pVdbe, "DIST
2f6e0 49 4e 43 54 20 22 29 3b 0a 20 20 20 20 7d 0a 20  INCT ");.    }. 
2f6f0 20 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61     if( p->selFla
2f700 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
2f710 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
2f720 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2f730 70 56 64 62 65 2c 20 22 61 67 67 5f 66 6c 61 67  pVdbe, "agg_flag
2f740 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   ");.    }.    s
2f750 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28  qlite3ExplainNL(
2f760 70 56 64 62 65 29 3b 0a 20 20 20 20 73 71 6c 69  pVdbe);.    sqli
2f770 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2f780 28 70 56 64 62 65 2c 20 22 20 20 20 22 29 3b 0a  (pVdbe, "   ");.
2f790 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
2f7a0 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70 56 64  lainExprList(pVd
2f7b0 62 65 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  be, p->pEList);.
2f7c0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2f7d0 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 69 66 28  NL(pVdbe);.  if(
2f7e0 20 70 2d 3e 70 53 72 63 20 26 26 20 70 2d 3e 70   p->pSrc && p->p
2f7f0 53 72 63 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20  Src->nSrc ){.   
2f800 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69   int i;.    sqli
2f810 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2f820 28 70 56 64 62 65 2c 20 22 46 52 4f 4d 20 22 29  (pVdbe, "FROM ")
2f830 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2f840 6c 61 69 6e 50 75 73 68 28 70 56 64 62 65 29 3b  lainPush(pVdbe);
2f850 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2f860 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69  p->pSrc->nSrc; i
2f870 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
2f880 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2f890 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63  pItem = &p->pSrc
2f8a0 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71  ->a[i];.      sq
2f8b0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2f8c0 74 66 28 70 56 64 62 65 2c 20 22 7b 25 64 2c 2a  tf(pVdbe, "{%d,*
2f8d0 7d 20 3d 20 22 2c 20 70 49 74 65 6d 2d 3e 69 43  } = ", pItem->iC
2f8e0 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66  ursor);.      if
2f8f0 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
2f900 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2f910 74 65 33 45 78 70 6c 61 69 6e 53 65 6c 65 63 74  te3ExplainSelect
2f920 28 70 56 64 62 65 2c 20 70 49 74 65 6d 2d 3e 70  (pVdbe, pItem->p
2f930 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
2f940 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 54 61 62   if( pItem->pTab
2f950 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2f960 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2f970 74 66 28 70 56 64 62 65 2c 20 22 20 28 74 61 62  tf(pVdbe, " (tab
2f980 6e 61 6d 65 3d 25 73 29 22 2c 20 70 49 74 65 6d  name=%s)", pItem
2f990 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  ->pTab->zName);.
2f9a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f9b0 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65 6d 2d  }else if( pItem-
2f9c0 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  >zName ){.      
2f9d0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2f9e0 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 25  Printf(pVdbe, "%
2f9f0 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  s", pItem->zName
2fa00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2fa10 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69   if( pItem->zAli
2fa20 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  as ){.        sq
2fa30 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2fa40 74 66 28 70 56 64 62 65 2c 20 22 20 28 41 53 20  tf(pVdbe, " (AS 
2fa50 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c  %s)", pItem->zAl
2fa60 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ias);.      }.  
2fa70 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 6a      if( pItem->j
2fa80 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
2fa90 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  T ){.        sql
2faa0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
2fab0 66 28 70 56 64 62 65 2c 20 22 20 4c 45 46 54 2d  f(pVdbe, " LEFT-
2fac0 4a 4f 49 4e 22 29 3b 0a 20 20 20 20 20 20 7d 0a  JOIN");.      }.
2fad0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2fae0 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20  lainNL(pVdbe);. 
2faf0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2fb00 45 78 70 6c 61 69 6e 50 6f 70 28 70 56 64 62 65  ExplainPop(pVdbe
2fb10 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
2fb20 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 73 71  pWhere ){.    sq
2fb30 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2fb40 74 66 28 70 56 64 62 65 2c 20 22 57 48 45 52 45  tf(pVdbe, "WHERE
2fb50 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
2fb60 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62  ExplainExpr(pVdb
2fb70 65 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  e, p->pWhere);. 
2fb80 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2fb90 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a  nNL(pVdbe);.  }.
2fba0 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42    if( p->pGroupB
2fbb0 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
2fbc0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
2fbd0 64 62 65 2c 20 22 47 52 4f 55 50 42 59 20 22 29  dbe, "GROUPBY ")
2fbe0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2fbf0 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70 56 64  lainExprList(pVd
2fc00 62 65 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29  be, p->pGroupBy)
2fc10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2fc20 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20  lainNL(pVdbe);. 
2fc30 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 76   }.  if( p->pHav
2fc40 69 6e 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ing ){.    sqlit
2fc50 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2fc60 70 56 64 62 65 2c 20 22 48 41 56 49 4e 47 20 22  pVdbe, "HAVING "
2fc70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2fc80 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62 65 2c  plainExpr(pVdbe,
2fc90 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
2fca0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2fcb0 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20  NL(pVdbe);.  }. 
2fcc0 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
2fcd0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
2fce0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
2fcf0 62 65 2c 20 22 4f 52 44 45 52 42 59 20 22 29 3b  be, "ORDERBY ");
2fd00 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2fd10 61 69 6e 45 78 70 72 4c 69 73 74 28 70 56 64 62  ainExprList(pVdb
2fd20 65 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  e, p->pOrderBy);
2fd30 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2fd40 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20  ainNL(pVdbe);.  
2fd50 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69  }.  if( p->pLimi
2fd60 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
2fd70 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
2fd80 64 62 65 2c 20 22 4c 49 4d 49 54 20 22 29 3b 0a  dbe, "LIMIT ");.
2fd90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2fda0 69 6e 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d  inExpr(pVdbe, p-
2fdb0 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71  >pLimit);.    sq
2fdc0 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70  lite3ExplainNL(p
2fdd0 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Vdbe);.  }.  if(
2fde0 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20   p->pOffset ){. 
2fdf0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2fe00 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2fe10 4f 46 46 53 45 54 20 22 29 3b 0a 20 20 20 20 73  OFFSET ");.    s
2fe20 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
2fe30 72 28 70 56 64 62 65 2c 20 70 2d 3e 70 4f 66 66  r(pVdbe, p->pOff
2fe40 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  set);.    sqlite
2fe50 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65  3ExplainNL(pVdbe
2fe60 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71  );.  }.}.void sq
2fe70 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65 6c 65  lite3ExplainSele
2fe80 63 74 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20  ct(Vdbe *pVdbe, 
2fe90 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66  Select *p){.  if
2fea0 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ( p==0 ){.    sq
2feb0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2fec0 74 66 28 70 56 64 62 65 2c 20 22 28 6e 75 6c 6c  tf(pVdbe, "(null
2fed0 2d 73 65 6c 65 63 74 29 22 29 3b 0a 20 20 20 20  -select)");.    
2fee0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
2fef0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68  lite3ExplainPush
2ff00 28 70 56 64 62 65 29 3b 0a 20 20 77 68 69 6c 65  (pVdbe);.  while
2ff10 28 20 70 20 29 7b 0a 20 20 20 20 65 78 70 6c 61  ( p ){.    expla
2ff20 69 6e 4f 6e 65 53 65 6c 65 63 74 28 70 56 64 62  inOneSelect(pVdb
2ff30 65 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70  e, p);.    p = p
2ff40 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28  ->pNext;.    if(
2ff50 20 70 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20   p==0 ) break;. 
2ff60 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2ff70 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20  nNL(pVdbe);.    
2ff80 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2ff90 69 6e 74 66 28 70 56 64 62 65 2c 20 22 25 73 5c  intf(pVdbe, "%s\
2ffa0 6e 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65  n", selectOpName
2ffb0 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 20 20  (p->op));.  }.  
2ffc0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2ffd0 69 6e 74 66 28 70 56 64 62 65 2c 20 22 45 4e 44  intf(pVdbe, "END
2ffe0 22 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  ");.  sqlite3Exp
2fff0 6c 61 69 6e 50 6f 70 28 70 56 64 62 65 29 3b 0a  lainPop(pVdbe);.
30000 7d 0a 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65  }../* End of the
30010 20 73 74 72 75 63 74 75 72 65 20 64 65 62 75 67   structure debug
30020 20 70 72 69 6e 74 69 6e 67 20 63 6f 64 65 0a 2a   printing code.*
30030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65  ************/.#e
30080 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
30090 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52  SQLITE_ENABLE_TR
300a0 45 45 5f 45 58 50 4c 41 49 4e 29 20 2a 2f 0a     EE_EXPLAIN) */.