/ Hex Artifact Content
Login

Artifact ed459f7f478a1e533d19c4b953693b3ffa2efd15:


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 42 61 73 65 20 3d 20 73   int regBase = s
3f30: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
3f40: 67 65 28 70 50 61 72 73 65 2c 20 6e 45 78 70 72  ge(pParse, nExpr
3f50: 2b 32 29 3b 0a 20 20 69 6e 74 20 72 65 67 52 65  +2);.  int regRe
3f60: 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
3f70: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
3f80: 3b 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d  ;.  int nOBSat =
3f90: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a   pSort->nOBSat;.
3fa0: 20 20 69 6e 74 20 6f 70 3b 0a 20 20 73 71 6c 69    int op;.  sqli
3fb0: 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
3fc0: 72 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  r(pParse);.  sql
3fd0: 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
3fe0: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f  List(pParse, pSo
3ff0: 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72 65  rt->pOrderBy, re
4000: 67 42 61 73 65 2c 20 30 29 3b 0a 20 20 73 71 6c  gBase, 0);.  sql
4010: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
4020: 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70  , OP_Sequence, p
4030: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20  Sort->iECursor, 
4040: 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a  regBase+nExpr);.
4050: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
4060: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
4070: 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e  gData, regBase+n
4080: 45 78 70 72 2b 31 2c 20 31 29 3b 0a 20 20 73 71  Expr+1, 1);.  sq
4090: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
40a0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
40b0: 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42 53 61 74  , regBase+nOBSat
40c0: 2c 20 6e 45 78 70 72 2b 32 2d 6e 4f 42 53 61 74  , nExpr+2-nOBSat
40d0: 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
40e0: 69 66 28 20 6e 4f 42 53 61 74 3e 30 20 29 7b 0a  if( nOBSat>0 ){.
40f0: 20 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 4b      int regPrevK
4100: 65 79 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72  ey;   /* The fir
4110: 73 74 20 6e 4f 42 53 61 74 20 63 6f 6c 75 6d 6e  st nOBSat column
4120: 73 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75  s of the previou
4130: 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74  s row */.    int
4140: 20 61 64 64 72 46 69 72 73 74 3b 20 20 20 20 2f   addrFirst;    /
4150: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
4160: 20 4f 50 5f 49 66 4e 6f 74 20 6f 70 63 6f 64 65   OP_IfNot opcode
4170: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
4180: 4a 6d 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  Jmp;      /* Add
4190: 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4a  ress of the OP_J
41a0: 75 6d 70 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ump opcode */.  
41b0: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20    VdbeOp *pOp;  
41c0: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 68      /* Opcode th
41d0: 61 74 20 6f 70 65 6e 73 20 74 68 65 20 73 6f 72  at opens the sor
41e0: 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
41f0: 4b 65 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Key;         /* 
4200: 4e 75 6d 62 65 72 20 6f 66 20 73 6f 72 74 69 6e  Number of sortin
4210: 67 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69  g key columns, i
4220: 6e 63 6c 75 64 69 6e 67 20 4f 50 5f 53 65 71 75  ncluding OP_Sequ
4230: 65 6e 63 65 20 2a 2f 0a 20 20 20 20 4b 65 79 49  ence */.    KeyI
4240: 6e 66 6f 20 2a 70 4b 49 3b 20 20 20 20 20 2f 2a  nfo *pKI;     /*
4250: 20 4f 72 69 67 69 6e 61 6c 20 4b 65 79 49 6e 66   Original KeyInf
4260: 6f 20 6f 6e 20 74 68 65 20 73 6f 72 74 65 72 20  o on the sorter 
4270: 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 65  table */..    re
4280: 67 50 72 65 76 4b 65 79 20 3d 20 70 50 61 72 73  gPrevKey = pPars
4290: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
42a0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
42b0: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20  Sort->nOBSat;.  
42c0: 20 20 6e 4b 65 79 20 3d 20 6e 45 78 70 72 20 2d    nKey = nExpr -
42d0: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 20 2b   pSort->nOBSat +
42e0: 20 31 3b 0a 20 20 20 20 61 64 64 72 46 69 72 73   1;.    addrFirs
42f0: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
4300: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
4310: 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  t, regBase+nExpr
4320: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
4330: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
4340: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
4350: 43 6f 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76  Compare, regPrev
4360: 4b 65 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53  Key, regBase, pS
4370: 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20  ort->nOBSat);.  
4380: 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
4390: 64 62 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72  dbeGetOp(v, pSor
43a0: 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  t->addrSortIndex
43b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  );.    if( pPars
43c0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
43d0: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
43e0: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79    pOp->p2 = nKey
43f0: 20 2b 20 31 3b 0a 20 20 20 20 70 4b 49 20 3d 20   + 1;.    pKI = 
4400: 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
4410: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4b 49  ;.    memset(pKI
4420: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 30 2c  ->aSortOrder, 0,
4430: 20 70 4b 49 2d 3e 6e 46 69 65 6c 64 29 3b 20 2f   pKI->nField); /
4440: 2a 20 4d 61 6b 65 73 20 4f 50 5f 4a 75 6d 70 20  * Makes OP_Jump 
4450: 62 65 6c 6f 77 20 74 65 73 74 61 62 6c 65 20 2a  below testable *
4460: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
4470: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
4480: 20 28 63 68 61 72 2a 29 70 4b 49 2c 20 50 34 5f   (char*)pKI, P4_
4490: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 70 4f  KEYINFO);.    pO
44a0: 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20 3d  p->p4.pKeyInfo =
44b0: 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
44c0: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f  List(pParse, pSo
44d0: 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 6e 4f  rt->pOrderBy, nO
44e0: 42 53 61 74 2c 20 31 29 3b 0a 20 20 20 20 61 64  BSat, 1);.    ad
44f0: 64 72 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33 56  drJmp = sqlite3V
4500: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
4510: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4520: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
4530: 75 6d 70 2c 20 61 64 64 72 4a 6d 70 2b 31 2c 20  ump, addrJmp+1, 
4540: 30 2c 20 61 64 64 72 4a 6d 70 2b 31 29 3b 20 56  0, addrJmp+1); V
4550: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
4560: 20 20 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c      pSort->label
4570: 42 6b 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 56  BkOut = sqlite3V
4580: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
4590: 0a 20 20 20 20 70 53 6f 72 74 2d 3e 72 65 67 52  .    pSort->regR
45a0: 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65  eturn = ++pParse
45b0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
45c0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
45d0: 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74   OP_Gosub, pSort
45e0: 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f  ->regReturn, pSo
45f0: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b  rt->labelBkOut);
4600: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4610: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73  AddOp1(v, OP_Res
4620: 65 74 53 6f 72 74 65 72 2c 20 70 53 6f 72 74 2d  etSorter, pSort-
4630: 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  >iECursor);.    
4640: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
4650: 65 72 65 28 76 2c 20 61 64 64 72 46 69 72 73 74  ere(v, addrFirst
4660: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4670: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
4680: 6f 76 65 2c 20 72 65 67 42 61 73 65 2c 20 72 65  ove, regBase, re
4690: 67 50 72 65 76 4b 65 79 2c 20 70 53 6f 72 74 2d  gPrevKey, pSort-
46a0: 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20 73 71  >nOBSat);.    sq
46b0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
46c0: 65 28 76 2c 20 61 64 64 72 4a 6d 70 29 3b 0a 20  e(v, addrJmp);. 
46d0: 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e   }.  if( pSort->
46e0: 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54  sortFlags & SORT
46f0: 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29  FLAG_UseSorter )
4700: 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 53 6f  {.    op = OP_So
4710: 72 74 65 72 49 6e 73 65 72 74 3b 0a 20 20 7d 65  rterInsert;.  }e
4720: 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50  lse{.    op = OP
4730: 5f 49 64 78 49 6e 73 65 72 74 3b 0a 20 20 7d 0a  _IdxInsert;.  }.
4740: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4750: 4f 70 32 28 76 2c 20 6f 70 2c 20 70 53 6f 72 74  Op2(v, op, pSort
4760: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52  ->iECursor, regR
4770: 65 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 6e 4f  ecord);.  if( nO
4780: 42 53 61 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  BSat==0 ){.    s
4790: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
47a0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
47b0: 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 73 71 6c  Record);.    sql
47c0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
47d0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
47e0: 42 61 73 65 2c 20 6e 45 78 70 72 2b 32 29 3b 0a  Base, nExpr+2);.
47f0: 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65 63    }.  if( pSelec
4800: 74 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  t->iLimit ){.   
4810: 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72   int addr1, addr
4820: 32 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69  2;.    int iLimi
4830: 74 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65  t;.    if( pSele
4840: 63 74 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a 20  ct->iOffset ){. 
4850: 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53       iLimit = pS
4860: 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31  elect->iOffset+1
4870: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4880: 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c     iLimit = pSel
4890: 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20  ect->iLimit;.   
48a0: 20 7d 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73   }.    addr1 = s
48b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
48c0: 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69  (v, OP_IfZero, i
48d0: 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65  Limit); VdbeCove
48e0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
48f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
4900: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 69 4c 69  , OP_AddImm, iLi
4910: 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64  mit, -1);.    ad
4920: 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
4930: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
4940: 74 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  to);.    sqlite3
4950: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
4960: 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69  addr1);.    sqli
4970: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
4980: 20 4f 50 5f 4c 61 73 74 2c 20 70 53 6f 72 74 2d   OP_Last, pSort-
4990: 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  >iECursor);.    
49a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
49b0: 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  1(v, OP_Delete, 
49c0: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29  pSort->iECursor)
49d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
49e0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
49f0: 72 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  r2);.  }.}../*.*
4a00: 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20 69 6d  * Add code to im
4a10: 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46 46 53  plement the OFFS
4a20: 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ET.*/.static voi
4a30: 64 20 63 6f 64 65 4f 66 66 73 65 74 28 0a 20 20  d codeOffset(.  
4a40: 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
4a50: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
4a60: 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d 20  de into this VM 
4a70: 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74  */.  int iOffset
4a80: 2c 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74  ,      /* Regist
4a90: 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f  er holding the o
4aa0: 66 66 73 65 74 20 63 6f 75 6e 74 65 72 20 2a 2f  ffset counter */
4ab0: 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
4ac0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
4ad0: 65 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75  e to skip the cu
4ae0: 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a  rrent record */.
4af0: 29 7b 0a 20 20 69 66 28 20 69 4f 66 66 73 65 74  ){.  if( iOffset
4b00: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  >0 ){.    int ad
4b10: 64 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  dr;.    sqlite3V
4b20: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
4b30: 41 64 64 49 6d 6d 2c 20 69 4f 66 66 73 65 74 2c  AddImm, iOffset,
4b40: 20 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 20 3d   -1);.    addr =
4b50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4b60: 70 31 28 76 2c 20 4f 50 5f 49 66 4e 65 67 2c 20  p1(v, OP_IfNeg, 
4b70: 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f  iOffset); VdbeCo
4b80: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
4b90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
4ba0: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
4bb0: 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  iContinue);.    
4bc0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
4bd0: 22 73 6b 69 70 20 4f 46 46 53 45 54 20 72 65 63  "skip OFFSET rec
4be0: 6f 72 64 73 22 29 29 3b 0a 20 20 20 20 73 71 6c  ords"));.    sql
4bf0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
4c00: 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d  (v, addr);.  }.}
4c10: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65  ../*.** Add code
4c20: 20 74 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b   that will check
4c30: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
4c40: 65 20 4e 20 72 65 67 69 73 74 65 72 73 20 73 74  e N registers st
4c50: 61 72 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a  arting at iMem.*
4c60: 2a 20 66 6f 72 6d 20 61 20 64 69 73 74 69 6e 63  * form a distinc
4c70: 74 20 65 6e 74 72 79 2e 20 20 69 54 61 62 20 69  t entry.  iTab i
4c80: 73 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  s a sorting inde
4c90: 78 20 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65  x that holds pre
4ca0: 76 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20  viously.** seen 
4cb0: 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20  combinations of 
4cc0: 74 68 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41  the N values.  A
4cd0: 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61   new entry is ma
4ce0: 64 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66  de in iTab.** if
4cf0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76   the current N v
4d00: 61 6c 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a  alues are new..*
4d10: 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61  *.** A jump to a
4d20: 64 64 72 52 65 70 65 61 74 20 69 73 20 6d 61 64  ddrRepeat is mad
4d30: 65 20 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61  e and the N+1 va
4d40: 6c 75 65 73 20 61 72 65 20 70 6f 70 70 65 64 20  lues are popped 
4d50: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63  from the.** stac
4d60: 6b 20 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65  k if the top N e
4d70: 6c 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20  lements are not 
4d80: 64 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61  distinct..*/.sta
4d90: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73  tic void codeDis
4da0: 74 69 6e 63 74 28 0a 20 20 50 61 72 73 65 20 2a  tinct(.  Parse *
4db0: 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
4dc0: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
4dd0: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
4de0: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  xt */.  int iTab
4df0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ,          /* A 
4e00: 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73  sorting index us
4e10: 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64  ed to test for d
4e20: 69 73 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20  istinctness */. 
4e30: 20 69 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c   int addrRepeat,
4e40: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68      /* Jump to h
4e50: 65 72 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69  ere if not disti
4e60: 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20  nct */.  int N, 
4e70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4e80: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
4e90: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20  s */.  int iMem 
4ea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
4eb0: 73 74 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b  st element */.){
4ec0: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
4ed0: 74 20 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61  t r1;..  v = pPa
4ee0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31  rse->pVdbe;.  r1
4ef0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
4f00: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
4f10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4f20: 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
4f30: 2c 20 69 54 61 62 2c 20 61 64 64 72 52 65 70 65  , iTab, addrRepe
4f40: 61 74 2c 20 69 4d 65 6d 2c 20 4e 29 3b 20 56 64  at, iMem, N); Vd
4f50: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
4f60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4f70: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
4f80: 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31  ord, iMem, N, r1
4f90: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
4fa0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
4fb0: 49 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31  Insert, iTab, r1
4fc0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
4fd0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
4fe0: 65 2c 20 72 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64  e, r1);.}..#ifnd
4ff0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
5000: 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65  UBQUERY./*.** Ge
5010: 6e 65 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20  nerate an error 
5020: 6d 65 73 73 61 67 65 20 77 68 65 6e 20 61 20 53  message when a S
5030: 45 4c 45 43 54 20 69 73 20 75 73 65 64 20 77 69  ELECT is used wi
5040: 74 68 69 6e 20 61 20 73 75 62 65 78 70 72 65 73  thin a subexpres
5050: 73 69 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c 65  sion.** (example
5060: 3a 20 20 22 61 20 49 4e 20 28 53 45 4c 45 43 54  :  "a IN (SELECT
5070: 20 2a 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 29   * FROM table)")
5080: 20 62 75 74 20 69 74 20 68 61 73 20 6d 6f 72 65   but it has more
5090: 20 74 68 61 6e 20 31 20 72 65 73 75 6c 74 0a 2a   than 1 result.*
50a0: 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57 65 20 64 6f  * column.  We do
50b0: 20 74 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f   this in a subro
50c0: 75 74 69 6e 65 20 62 65 63 61 75 73 65 20 74 68  utine because th
50d0: 65 20 65 72 72 6f 72 20 75 73 65 64 20 74 6f 20  e error used to 
50e0: 6f 63 63 75 72 0a 2a 2a 20 69 6e 20 6d 75 6c 74  occur.** in mult
50f0: 69 70 6c 65 20 70 6c 61 63 65 73 2e 20 20 28 54  iple places.  (T
5100: 68 65 20 65 72 72 6f 72 20 6f 6e 6c 79 20 6f 63  he error only oc
5110: 63 75 72 73 20 69 6e 20 6f 6e 65 20 70 6c 61 63  curs in one plac
5120: 65 20 6e 6f 77 2c 20 62 75 74 20 77 65 0a 2a 2a  e now, but we.**
5130: 20 72 65 74 61 69 6e 20 74 68 65 20 73 75 62 72   retain the subr
5140: 6f 75 74 69 6e 65 20 74 6f 20 6d 69 6e 69 6d 69  outine to minimi
5150: 7a 65 20 63 6f 64 65 20 64 69 73 72 75 70 74 69  ze code disrupti
5160: 6f 6e 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69  on.).*/.static i
5170: 6e 74 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69  nt checkForMulti
5180: 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f  ColumnSelectErro
5190: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
51a0: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
51b0: 73 65 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20  se context. */. 
51c0: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
51d0: 73 74 2c 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  st,   /* Destina
51e0: 74 69 6f 6e 20 6f 66 20 53 45 4c 45 43 54 20 72  tion of SELECT r
51f0: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
5200: 6e 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  nExpr           
5210: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
5220: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74  sult columns ret
5230: 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20  urned by SELECT 
5240: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 73  */.){.  int eDes
5250: 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74  t = pDest->eDest
5260: 3b 0a 20 20 69 66 28 20 6e 45 78 70 72 3e 31 20  ;.  if( nExpr>1 
5270: 26 26 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d  && (eDest==SRT_M
5280: 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  em || eDest==SRT
5290: 5f 53 65 74 29 20 29 7b 0a 20 20 20 20 73 71 6c  _Set) ){.    sql
52a0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
52b0: 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e  rse, "only a sin
52c0: 67 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77  gle result allow
52d0: 65 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20  ed for ".       
52e0: 22 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69  "a SELECT that i
52f0: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
5300: 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 72  ression");.    r
5310: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65  eturn 1;.  }else
5320: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
5330: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
5340: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
5350: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
5360: 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69  ode for the insi
5370: 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  de of the inner 
5380: 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c  loop.** of a SEL
5390: 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72  ECT..**.** If sr
53a0: 63 54 61 62 20 69 73 20 6e 65 67 61 74 69 76 65  cTab is negative
53b0: 2c 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73  , then the pELis
53c0: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  t expressions.**
53d0: 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69   are evaluated i
53e0: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
53f0: 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  he data for this
5400: 20 72 6f 77 2e 20 20 49 66 20 73 72 63 54 61 62   row.  If srcTab
5410: 20 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d   is.** zero or m
5420: 6f 72 65 2c 20 74 68 65 6e 20 64 61 74 61 20 69  ore, then data i
5430: 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72  s pulled from sr
5440: 63 54 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20  cTab and pEList 
5450: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 0a 2a 2a  is used only .**
5460: 20 74 6f 20 67 65 74 20 6e 75 6d 62 65 72 20 63   to get number c
5470: 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 64  olumns and the d
5480: 61 74 61 74 79 70 65 20 66 6f 72 20 65 61 63 68  atatype for each
5490: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74   column..*/.stat
54a0: 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e  ic void selectIn
54b0: 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65  nerLoop(.  Parse
54c0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
54d0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
54e0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
54f0: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
5500: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
5510: 70 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74 61  plete select sta
5520: 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
5530: 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
5540: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20   *pEList,       
5550: 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65  /* List of value
5560: 73 20 62 65 69 6e 67 20 65 78 74 72 61 63 74 65  s being extracte
5570: 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61  d */.  int srcTa
5580: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b,             /
5590: 2a 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d  * Pull data from
55a0: 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
55b0: 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c   SortCtx *pSort,
55c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
55d0: 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e  ot NULL, info on
55e0: 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20   how to process 
55f0: 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 44 69  ORDER BY */.  Di
5600: 73 74 69 6e 63 74 43 74 78 20 2a 70 44 69 73 74  stinctCtx *pDist
5610: 69 6e 63 74 2c 20 2f 2a 20 49 66 20 6e 6f 74 20  inct, /* If not 
5620: 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f  NULL, info on ho
5630: 77 20 74 6f 20 70 72 6f 63 65 73 73 20 44 49 53  w to process DIS
5640: 54 49 4e 43 54 20 2a 2f 0a 20 20 53 65 6c 65 63  TINCT */.  Selec
5650: 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20  tDest *pDest,   
5660: 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73     /* How to dis
5670: 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73 75  pose of the resu
5680: 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  lts */.  int iCo
5690: 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20  ntinue,         
56a0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
56b0: 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e   continue with n
56c0: 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74  ext row */.  int
56d0: 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20   iBreak         
56e0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
56f0: 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  e to break out o
5700: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
5710: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
5720: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
5730: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
5740: 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20   hasDistinct;   
5750: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
5760: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
5770: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
5780: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75  */.  int regResu
5790: 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  lt;             
57a0: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d   /* Start of mem
57b0: 6f 72 79 20 68 6f 6c 64 69 6e 67 20 72 65 73 75  ory holding resu
57c0: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  lt set */.  int 
57d0: 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65  eDest = pDest->e
57e0: 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20 74  Dest;   /* How t
57f0: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72 65 73  o dispose of res
5800: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50  ults */.  int iP
5810: 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44  arm = pDest->iSD
5820: 50 61 72 6d 3b 20 2f 2a 20 46 69 72 73 74 20 61  Parm; /* First a
5830: 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73 70 6f  rgument to dispo
5840: 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  sal method */.  
5850: 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 20  int nResultCol; 
5860: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5870: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
5880: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 61 73  columns */..  as
5890: 73 65 72 74 28 20 76 20 29 3b 0a 20 20 61 73 73  sert( v );.  ass
58a0: 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
58b0: 3b 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74 20  ;.  hasDistinct 
58c0: 3d 20 70 44 69 73 74 69 6e 63 74 20 3f 20 70 44  = pDistinct ? pD
58d0: 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79  istinct->eTnctTy
58e0: 70 65 20 3a 20 57 48 45 52 45 5f 44 49 53 54 49  pe : WHERE_DISTI
58f0: 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28 20  NCT_NOOP;.  if( 
5900: 70 53 6f 72 74 20 26 26 20 70 53 6f 72 74 2d 3e  pSort && pSort->
5910: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 70 53  pOrderBy==0 ) pS
5920: 6f 72 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ort = 0;.  if( p
5930: 53 6f 72 74 3d 3d 30 20 26 26 20 21 68 61 73 44  Sort==0 && !hasD
5940: 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61  istinct ){.    a
5950: 73 73 65 72 74 28 20 69 43 6f 6e 74 69 6e 75 65  ssert( iContinue
5960: 21 3d 30 20 29 3b 0a 20 20 20 20 63 6f 64 65 4f  !=0 );.    codeO
5970: 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
5980: 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  set, iContinue);
5990: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20  .  }..  /* Pull 
59a0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
59b0: 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52  lumns..  */.  nR
59c0: 65 73 75 6c 74 43 6f 6c 20 3d 20 70 45 4c 69 73  esultCol = pELis
59d0: 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28  t->nExpr;..  if(
59e0: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30   pDest->iSdst==0
59f0: 20 29 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e 69   ){.    pDest->i
5a00: 53 64 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Sdst = pParse->n
5a10: 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
5a20: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75  e->nMem += nResu
5a30: 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 20 69  ltCol;.  }else i
5a40: 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2b  f( pDest->iSdst+
5a50: 6e 52 65 73 75 6c 74 43 6f 6c 20 3e 20 70 50 61  nResultCol > pPa
5a60: 72 73 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20  rse->nMem ){.   
5a70: 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20 65   /* This is an e
5a80: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 74  rror condition t
5a90: 68 61 74 20 63 61 6e 20 72 65 73 75 6c 74 2c 20  hat can result, 
5aa0: 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
5ab0: 6e 20 61 20 53 45 4c 45 43 54 0a 20 20 20 20 2a  n a SELECT.    *
5ac0: 2a 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68  * on the right-h
5ad0: 61 6e 64 20 73 69 64 65 20 6f 66 20 61 6e 20 49  and side of an I
5ae0: 4e 53 45 52 54 20 63 6f 6e 74 61 69 6e 73 20 6d  NSERT contains m
5af0: 6f 72 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  ore result colum
5b00: 6e 73 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74  ns than.    ** t
5b10: 68 65 72 65 20 61 72 65 20 63 6f 6c 75 6d 6e 73  here are columns
5b20: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 6e   in the table on
5b30: 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68 65 20   the left.  The 
5b40: 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 63 61  error will be ca
5b50: 75 67 68 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20  ught.    ** and 
5b60: 72 65 70 6f 72 74 65 64 20 6c 61 74 65 72 2e 20  reported later. 
5b70: 20 42 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20   But we need to 
5b80: 6d 61 6b 65 20 73 75 72 65 20 65 6e 6f 75 67 68  make sure enough
5b90: 20 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63   memory is alloc
5ba0: 61 74 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 61  ated.    ** to a
5bb0: 76 6f 69 64 20 6f 74 68 65 72 20 73 70 75 72 69  void other spuri
5bc0: 6f 75 73 20 65 72 72 6f 72 73 20 69 6e 20 74 68  ous errors in th
5bd0: 65 20 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f 0a 20  e meantime. */. 
5be0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
5bf0: 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20  += nResultCol;. 
5c00: 20 7d 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73   }.  pDest->nSds
5c10: 74 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a  t = nResultCol;.
5c20: 20 20 72 65 67 52 65 73 75 6c 74 20 3d 20 70 44    regResult = pD
5c30: 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20 69 66  est->iSdst;.  if
5c40: 28 20 73 72 63 54 61 62 3e 3d 30 20 29 7b 0a 20  ( srcTab>=0 ){. 
5c50: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52     for(i=0; i<nR
5c60: 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  esultCol; i++){.
5c70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5c80: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
5c90: 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c  lumn, srcTab, i,
5ca0: 20 72 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20   regResult+i);. 
5cb0: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
5cc0: 28 28 76 2c 20 22 25 73 22 2c 20 70 45 4c 69 73  ((v, "%s", pELis
5cd0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 29 3b  t->a[i].zName));
5ce0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
5cf0: 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f 45 78  f( eDest!=SRT_Ex
5d00: 69 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ists ){.    /* I
5d10: 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  f the destinatio
5d20: 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53 28 2e  n is an EXISTS(.
5d30: 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ..) expression, 
5d40: 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20 20 2a  the actual.    *
5d50: 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65  * values returne
5d60: 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20  d by the SELECT 
5d70: 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72 65 64  are not required
5d80: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
5d90: 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
5da0: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c  List(pParse, pEL
5db0: 69 73 74 2c 20 72 65 67 52 65 73 75 6c 74 2c 0a  ist, regResult,.
5dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dd0: 20 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75    (eDest==SRT_Ou
5de0: 74 70 75 74 7c 7c 65 44 65 73 74 3d 3d 53 52 54  tput||eDest==SRT
5df0: 5f 43 6f 72 6f 75 74 69 6e 65 29 3f 53 51 4c 49  _Coroutine)?SQLI
5e00: 54 45 5f 45 43 45 4c 5f 44 55 50 3a 30 29 3b 0a  TE_ECEL_DUP:0);.
5e10: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
5e20: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
5e30: 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e  d was present on
5e40: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
5e50: 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74  ement.  ** and t
5e60: 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e  his row has been
5e70: 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68   seen before, th
5e80: 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74  en do not make t
5e90: 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72  his row.  ** par
5ea0: 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e  t of the result.
5eb0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44  .  */.  if( hasD
5ec0: 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73  istinct ){.    s
5ed0: 77 69 74 63 68 28 20 70 44 69 73 74 69 6e 63 74  witch( pDistinct
5ee0: 2d 3e 65 54 6e 63 74 54 79 70 65 20 29 7b 0a 20  ->eTnctType ){. 
5ef0: 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
5f00: 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
5f10: 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65  : {.        Vdbe
5f20: 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 20 20  Op *pOp;        
5f30: 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72      /* No longer
5f40: 20 72 65 71 75 69 72 65 64 20 4f 70 65 6e 45 70   required OpenEp
5f50: 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a  hemeral instr. *
5f60: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a  /.        int iJ
5f70: 75 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  ump;            
5f80: 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e    /* Jump destin
5f90: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ation */.       
5fa0: 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20   int regPrev;   
5fb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
5fc0: 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74  ious row content
5fd0: 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   */..        /* 
5fe0: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
5ff0: 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  or the previous 
6000: 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  row */.        r
6010: 65 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d  egPrev = pParse-
6020: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20  >nMem+1;.       
6030: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
6040: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20   nResultCol;..  
6050: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20        /* Change 
6060: 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  the OP_OpenEphem
6070: 65 72 61 6c 20 63 6f 64 65 64 20 65 61 72 6c 69  eral coded earli
6080: 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c  er to an OP_Null
6090: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 73  .        ** sets
60a0: 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64   the MEM_Cleared
60b0: 20 62 69 74 20 6f 6e 20 74 68 65 20 66 69 72 73   bit on the firs
60c0: 74 20 72 65 67 69 73 74 65 72 20 6f 66 20 74 68  t register of th
60d0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65  e.        ** pre
60e0: 76 69 6f 75 73 20 76 61 6c 75 65 2e 20 20 54 68  vious value.  Th
60f0: 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68  is will cause th
6100: 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f  e OP_Ne below to
6110: 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20 20 20   always.        
6120: 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 66  ** fail on the f
6130: 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  irst iteration o
6140: 66 20 74 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20  f the loop even 
6150: 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 20  if the first.   
6160: 20 20 20 20 20 2a 2a 20 72 6f 77 20 69 73 20 61       ** row is a
6170: 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20  ll NULLs..      
6180: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c    */.        sql
6190: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
61a0: 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63  Noop(v, pDistinc
61b0: 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20  t->addrTnct);.  
61c0: 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69        pOp = sqli
61d0: 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
61e0: 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54  pDistinct->addrT
61f0: 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  nct);.        pO
6200: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e  p->opcode = OP_N
6210: 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ull;.        pOp
6220: 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20 20 20 20  ->p1 = 1;.      
6230: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50    pOp->p2 = regP
6240: 72 65 76 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a  rev;..        iJ
6250: 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ump = sqlite3Vdb
6260: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
6270: 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  + nResultCol;.  
6280: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
6290: 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b  <nResultCol; i++
62a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 43 6f 6c  ){.          Col
62b0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
62c0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
62d0: 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d  (pParse, pEList-
62e0: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
62f0: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 52          if( i<nR
6300: 65 73 75 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20 20  esultCol-1 ){.  
6310: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6320: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6330: 50 5f 4e 65 2c 20 72 65 67 52 65 73 75 6c 74 2b  P_Ne, regResult+
6340: 69 2c 20 69 4a 75 6d 70 2c 20 72 65 67 50 72 65  i, iJump, regPre
6350: 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  v+i);.          
6360: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
6370: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
6380: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
6390: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
63a0: 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67 52  3(v, OP_Eq, regR
63b0: 65 73 75 6c 74 2b 69 2c 20 69 43 6f 6e 74 69 6e  esult+i, iContin
63c0: 75 65 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a  ue, regPrev+i);.
63d0: 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
63e0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
63f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6400: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
6410: 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28  hangeP4(v, -1, (
6420: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f  const char *)pCo
6430: 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
6440: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
6450: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
6460: 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  , SQLITE_NULLEQ)
6470: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6480: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
6490: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
64a0: 64 72 28 76 29 3d 3d 69 4a 75 6d 70 20 29 3b 0a  dr(v)==iJump );.
64b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
64c0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
64d0: 43 6f 70 79 2c 20 72 65 67 52 65 73 75 6c 74 2c  Copy, regResult,
64e0: 20 72 65 67 50 72 65 76 2c 20 6e 52 65 73 75 6c   regPrev, nResul
64f0: 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20  tCol-1);.       
6500: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
6510: 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
6520: 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
6530: 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  E: {.        sql
6540: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
6550: 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63  Noop(v, pDistinc
6560: 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20  t->addrTnct);.  
6570: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6580: 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65 66 61     }..      defa
6590: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 61  ult: {.        a
65a0: 73 73 65 72 74 28 20 70 44 69 73 74 69 6e 63 74  ssert( pDistinct
65b0: 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45  ->eTnctType==WHE
65c0: 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52  RE_DISTINCT_UNOR
65d0: 44 45 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20  DERED );.       
65e0: 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50   codeDistinct(pP
65f0: 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2d  arse, pDistinct-
6600: 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e 74 69  >tabTnct, iConti
6610: 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  nue, nResultCol,
6620: 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20   regResult);.   
6630: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6640: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
6650: 28 20 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20 20  ( pSort==0 ){.  
6660: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
6670: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43  , p->iOffset, iC
6680: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a  ontinue);.    }.
6690: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65    }..  switch( e
66a0: 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Dest ){.    /* I
66b0: 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69  n this mode, wri
66c0: 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72 65  te each query re
66d0: 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20  sult to the key 
66e0: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
66f0: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50  .    ** table iP
6700: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  arm..    */.#ifn
6710: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6720: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
6730: 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69      case SRT_Uni
6740: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  on: {.      int 
6750: 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  r1;.      r1 = s
6760: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
6770: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
6780: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6790: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
67a0: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
67b0: 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a  ResultCol, r1);.
67c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
67d0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
67e0: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  xInsert, iParm, 
67f0: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
6800: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
6810: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
6820: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6830: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75  ..    /* Constru
6840: 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d  ct a record from
6850: 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c   the query resul
6860: 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f  t, but instead o
6870: 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20  f.    ** saving 
6880: 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65  that record, use
6890: 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20   it as a key to 
68a0: 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20  delete elements 
68b0: 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
68c0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
68d0: 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20  iParm..    */.  
68e0: 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65 70    case SRT_Excep
68f0: 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t: {.      sqlit
6900: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6910: 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 50  OP_IdxDelete, iP
6920: 61 72 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  arm, regResult, 
6930: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
6940: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6950: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
6960: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
6970: 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a  ELECT */..    /*
6980: 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
6990: 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20  t as data using 
69a0: 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20  a unique key..  
69b0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
69c0: 54 5f 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65  T_Fifo:.    case
69d0: 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a 20   SRT_DistFifo:. 
69e0: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
69f0: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
6a00: 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
6a10: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
6a20: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
6a30: 72 73 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  rse);.      test
6a40: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
6a50: 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20  _Table );.      
6a60: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
6a70: 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b  =SRT_EphemTab );
6a80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6a90: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
6aa0: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
6ab0: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
6ac0: 2c 20 72 31 29 3b 0a 23 69 66 6e 64 65 66 20 53  , r1);.#ifndef S
6ad0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20  QLITE_OMIT_CTE. 
6ae0: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
6af0: 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29 7b 0a  SRT_DistFifo ){.
6b00: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
6b10: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73  e destination is
6b20: 20 44 69 73 74 46 69 66 6f 2c 20 74 68 65 6e 20   DistFifo, then 
6b30: 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31 29  cursor (iParm+1)
6b40: 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20   is open.       
6b50: 20 2a 2a 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65   ** on an epheme
6b60: 72 61 6c 20 69 6e 64 65 78 2e 20 49 66 20 74 68  ral index. If th
6b70: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73  e current row is
6b80: 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74   already present
6b90: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  .        ** in t
6ba0: 68 65 20 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74  he index, do not
6bb0: 20 77 72 69 74 65 20 69 74 20 74 6f 20 74 68 65   write it to the
6bc0: 20 6f 75 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c   output. If not,
6bd0: 20 61 64 64 20 74 68 65 0a 20 20 20 20 20 20 20   add the.       
6be0: 20 2a 2a 20 63 75 72 72 65 6e 74 20 72 6f 77 20   ** current row 
6bf0: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  to the index and
6c00: 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 77 72   proceed with wr
6c10: 69 74 69 6e 67 20 69 74 20 74 6f 20 74 68 65 0a  iting it to the.
6c20: 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75          ** outpu
6c30: 74 20 74 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e  t table as well.
6c40: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
6c50: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
6c60: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
6c70: 29 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20 73  ) + 4;.        s
6c80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
6c90: 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
6ca0: 20 69 50 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20   iParm+1, addr, 
6cb0: 72 31 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65  r1, 0); VdbeCove
6cc0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
6cd0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6ce0: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
6cf0: 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 31 29  rt, iParm+1, r1)
6d00: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
6d10: 28 20 70 53 6f 72 74 3d 3d 30 20 29 3b 0a 20 20  ( pSort==0 );.  
6d20: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
6d30: 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a     if( pSort ){.
6d40: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
6d50: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70  Sorter(pParse, p
6d60: 53 6f 72 74 2c 20 70 2c 20 72 31 29 3b 0a 20 20  Sort, p, r1);.  
6d70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6d80: 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69     int r2 = sqli
6d90: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
6da0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
6db0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6dc0: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
6dd0: 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20   iParm, r2);.   
6de0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6df0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
6e00: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20  ert, iParm, r1, 
6e10: 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r2);.        sql
6e20: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
6e30: 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
6e40: 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  D);.        sqli
6e50: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
6e60: 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
6e70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
6e80: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
6e90: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
6ea0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6eb0: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
6ec0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
6ed0: 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
6ee0: 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74  e creating a set
6ef0: 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e   for an "expr IN
6f00: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63   (SELECT ...)" c
6f10: 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a  onstruct,.    **
6f20: 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75   then there shou
6f30: 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69  ld be a single i
6f40: 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  tem on the stack
6f50: 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20  .  Write this.  
6f60: 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74    ** item into t
6f70: 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74  he set table wit
6f80: 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20  h bogus data..  
6f90: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
6fa0: 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61  T_Set: {.      a
6fb0: 73 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f  ssert( nResultCo
6fc0: 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 44  l==1 );.      pD
6fd0: 65 73 74 2d 3e 61 66 66 53 64 73 74 20 3d 0a 20  est->affSdst =. 
6fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ff0: 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
7000: 66 66 69 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e  ffinity(pEList->
7010: 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73  a[0].pExpr, pDes
7020: 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20 20 20  t->affSdst);.   
7030: 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a     if( pSort ){.
7040: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 66 69          /* At fi
7050: 72 73 74 20 67 6c 61 6e 63 65 20 79 6f 75 20 77  rst glance you w
7060: 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65 20 63 6f  ould think we co
7070: 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74  uld optimize out
7080: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
7090: 4f 52 44 45 52 20 42 59 20 69 6e 20 74 68 69 73  ORDER BY in this
70a0: 20 63 61 73 65 20 73 69 6e 63 65 20 74 68 65 20   case since the 
70b0: 6f 72 64 65 72 20 6f 66 20 65 6e 74 72 69 65 73  order of entries
70c0: 20 69 6e 20 74 68 65 20 73 65 74 0a 20 20 20 20   in the set.    
70d0: 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20      ** does not 
70e0: 6d 61 74 74 65 72 2e 20 20 42 75 74 20 74 68 65  matter.  But the
70f0: 72 65 20 6d 69 67 68 74 20 62 65 20 61 20 4c 49  re might be a LI
7100: 4d 49 54 20 63 6c 61 75 73 65 2c 20 69 6e 20 77  MIT clause, in w
7110: 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20  hich.        ** 
7120: 63 61 73 65 20 74 68 65 20 6f 72 64 65 72 20 64  case the order d
7130: 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20  oes matter */.  
7140: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
7150: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f  rter(pParse, pSo
7160: 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74  rt, p, regResult
7170: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7180: 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
7190: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
71a0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
71b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
71c0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
71d0: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
71e0: 74 2c 31 2c 72 31 2c 20 26 70 44 65 73 74 2d 3e  t,1,r1, &pDest->
71f0: 61 66 66 53 64 73 74 2c 20 31 29 3b 0a 20 20 20  affSdst, 1);.   
7200: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
7210: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
7220: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
7230: 65 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20 20 20  esult, 1);.     
7240: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7250: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
7260: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29  sert, iParm, r1)
7270: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7280: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
7290: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
72a0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
72b0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
72c0: 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74  If any row exist
72d0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
72e0: 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20  et, record that 
72f0: 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a  fact and abort..
7300: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
7310: 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20  SRT_Exists: {.  
7320: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7330: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
7340: 67 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a  ger, 1, iParm);.
7350: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
7360: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
7370: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
7380: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
7390: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
73a0: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
73b0: 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63  s a scalar selec
73c0: 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  t that is part o
73d0: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  f an expression,
73e0: 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f   then.    ** sto
73f0: 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
7400: 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
7410: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  e memory cell an
7420: 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20  d break out.    
7430: 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c  ** of the scan l
7440: 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
7450: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
7460: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 52        assert( nR
7470: 65 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20  esultCol==1 );. 
7480: 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29       if( pSort )
7490: 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  {.        pushOn
74a0: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
74b0: 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65   pSort, p, regRe
74c0: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  sult);.      }el
74d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
74e0: 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
74f0: 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c  pParse, regResul
7500: 74 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20  t, iParm, 1);.  
7510: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
7520: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a  IT clause will j
7530: 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  ump out of the l
7540: 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
7550: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
7560: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
7570: 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
7580: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
7590: 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20 53 52 54  */..    case SRT
75a0: 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 20 20 20 20  _Coroutine:     
75b0: 20 20 2f 2a 20 53 65 6e 64 20 64 61 74 61 20 74    /* Send data t
75c0: 6f 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a  o a co-routine *
75d0: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f  /.    case SRT_O
75e0: 75 74 70 75 74 3a 20 7b 20 20 20 20 20 20 20 20  utput: {        
75f0: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  /* Return the re
7600: 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 74  sults */.      t
7610: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
7620: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b  SRT_Coroutine );
7630: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7640: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
7650: 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ut );.      if( 
7660: 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  pSort ){.       
7670: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
7680: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
7690: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
76a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
76b0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
76c0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
76d0: 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a 20 20 20  ultCol, r1);.   
76e0: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
76f0: 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ter(pParse, pSor
7700: 74 2c 20 70 2c 20 72 31 29 3b 0a 20 20 20 20 20  t, p, r1);.     
7710: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
7720: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
7730: 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73   r1);.      }els
7740: 65 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54  e if( eDest==SRT
7750: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  _Coroutine ){.  
7760: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7770: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
7780: 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  eld, pDest->iSDP
7790: 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  arm);.      }els
77a0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
77b0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
77c0: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65  OP_ResultRow, re
77d0: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
77e0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
77f0: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
7800: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
7810: 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  rse, regResult, 
7820: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
7830: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
7840: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
7850: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
7860: 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
7870: 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61  e results into a
7880: 20 70 72 69 6f 72 69 74 79 20 71 75 65 75 65 20   priority queue 
7890: 74 68 61 74 20 69 73 20 6f 72 64 65 72 20 61 63  that is order ac
78a0: 63 6f 72 64 69 6e 67 20 74 6f 0a 20 20 20 20 2a  cording to.    *
78b0: 2a 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72 42  * pDest->pOrderB
78c0: 79 20 28 69 6e 20 70 53 4f 29 2e 20 20 70 44 65  y (in pSO).  pDe
78d0: 73 74 2d 3e 69 53 44 50 61 72 6d 20 28 69 6e 20  st->iSDParm (in 
78e0: 69 50 61 72 6d 29 20 69 73 20 74 68 65 20 63 75  iParm) is the cu
78f0: 72 73 6f 72 20 66 6f 72 20 61 6e 0a 20 20 20 20  rsor for an.    
7900: 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 70 53  ** index with pS
7910: 4f 2d 3e 6e 45 78 70 72 2b 32 20 63 6f 6c 75 6d  O->nExpr+2 colum
7920: 6e 73 2e 20 20 42 75 69 6c 64 20 61 20 6b 65 79  ns.  Build a key
7930: 20 75 73 69 6e 67 20 70 53 4f 20 66 6f 72 20 74   using pSO for t
7940: 68 65 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20  he first.    ** 
7950: 70 53 4f 2d 3e 6e 45 78 70 72 20 63 6f 6c 75 6d  pSO->nExpr colum
7960: 6e 73 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75  ns, then make su
7970: 72 65 20 61 6c 6c 20 6b 65 79 73 20 61 72 65 20  re all keys are 
7980: 75 6e 69 71 75 65 20 62 79 20 61 64 64 69 6e 67  unique by adding
7990: 20 61 0a 20 20 20 20 2a 2a 20 66 69 6e 61 6c 20   a.    ** final 
79a0: 4f 50 5f 53 65 71 75 65 6e 63 65 20 63 6f 6c 75  OP_Sequence colu
79b0: 6d 6e 2e 20 20 54 68 65 20 6c 61 73 74 20 63 6f  mn.  The last co
79c0: 6c 75 6d 6e 20 69 73 20 74 68 65 20 72 65 63 6f  lumn is the reco
79d0: 72 64 20 61 73 20 61 20 62 6c 6f 62 2e 0a 20 20  rd as a blob..  
79e0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
79f0: 54 5f 44 69 73 74 51 75 65 75 65 3a 0a 20 20 20  T_DistQueue:.   
7a00: 20 63 61 73 65 20 53 52 54 5f 51 75 65 75 65 3a   case SRT_Queue:
7a10: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65   {.      int nKe
7a20: 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 2c  y;.      int r1,
7a30: 20 72 32 2c 20 72 33 3b 0a 20 20 20 20 20 20 69   r2, r3;.      i
7a40: 6e 74 20 61 64 64 72 54 65 73 74 20 3d 20 30 3b  nt addrTest = 0;
7a50: 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
7a60: 2a 70 53 4f 3b 0a 20 20 20 20 20 20 70 53 4f 20  *pSO;.      pSO 
7a70: 3d 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72 42  = pDest->pOrderB
7a80: 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  y;.      assert(
7a90: 20 70 53 4f 20 29 3b 0a 20 20 20 20 20 20 6e 4b   pSO );.      nK
7aa0: 65 79 20 3d 20 70 53 4f 2d 3e 6e 45 78 70 72 3b  ey = pSO->nExpr;
7ab0: 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
7ac0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
7ad0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 32 20  arse);.      r2 
7ae0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
7af0: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 4b  Range(pParse, nK
7b00: 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 72 33 20  ey+2);.      r3 
7b10: 3d 20 72 32 2b 6e 4b 65 79 2b 31 3b 0a 20 20 20  = r2+nKey+1;.   
7b20: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
7b30: 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20  T_DistQueue ){. 
7b40: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
7b50: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20   destination is 
7b60: 44 69 73 74 51 75 65 75 65 2c 20 74 68 65 6e 20  DistQueue, then 
7b70: 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31 29  cursor (iParm+1)
7b80: 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20   is open.       
7b90: 20 2a 2a 20 6f 6e 20 61 20 73 65 63 6f 6e 64 20   ** on a second 
7ba0: 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20  ephemeral index 
7bb0: 74 68 61 74 20 68 6f 6c 64 73 20 61 6c 6c 20 76  that holds all v
7bc0: 61 6c 75 65 73 20 65 76 65 72 79 20 70 72 65 76  alues every prev
7bd0: 69 6f 75 73 6c 79 0a 20 20 20 20 20 20 20 20 2a  iously.        *
7be0: 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 71  * added to the q
7bf0: 75 65 75 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ueue. */.       
7c00: 20 61 64 64 72 54 65 73 74 20 3d 20 73 71 6c 69   addrTest = sqli
7c10: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
7c20: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50  (v, OP_Found, iP
7c30: 61 72 6d 2b 31 2c 20 30 2c 20 0a 20 20 20 20 20  arm+1, 0, .     
7c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c60: 20 20 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52     regResult, nR
7c70: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
7c80: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
7c90: 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  v);.      }.    
7ca0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7cb0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
7cc0: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
7cd0: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 33 29   nResultCol, r3)
7ce0: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  ;.      if( eDes
7cf0: 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65  t==SRT_DistQueue
7d00: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
7d10: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
7d20: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
7d30: 50 61 72 6d 2b 31 2c 20 72 33 29 3b 0a 20 20 20  Parm+1, r3);.   
7d40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7d50: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
7d60: 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
7d70: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7d80: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4b 65 79   for(i=0; i<nKey
7d90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
7da0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7db0: 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 0a 20  2(v, OP_SCopy,. 
7dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7dd0: 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75           regResu
7de0: 6c 74 20 2b 20 70 53 4f 2d 3e 61 5b 69 5d 2e 75  lt + pSO->a[i].u
7df0: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d  .x.iOrderByCol -
7e00: 20 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   1,.            
7e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 32                r2
7e20: 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +i);.      }.   
7e30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7e40: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65  dOp2(v, OP_Seque
7e50: 6e 63 65 2c 20 69 50 61 72 6d 2c 20 72 32 2b 6e  nce, iParm, r2+n
7e60: 4b 65 79 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Key);.      sqli
7e70: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7e80: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
7e90: 72 32 2c 20 6e 4b 65 79 2b 32 2c 20 72 31 29 3b  r2, nKey+2, r1);
7ea0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7eb0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
7ec0: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
7ed0: 20 72 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20   r1);.      if( 
7ee0: 61 64 64 72 54 65 73 74 20 29 20 73 71 6c 69 74  addrTest ) sqlit
7ef0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
7f00: 2c 20 61 64 64 72 54 65 73 74 29 3b 0a 20 20 20  , addrTest);.   
7f10: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
7f20: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
7f30: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
7f40: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
7f50: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 32 2c 20  nge(pParse, r2, 
7f60: 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 62  nKey+2);.      b
7f70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
7f80: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
7f90: 54 5f 43 54 45 20 2a 2f 0a 0a 0a 0a 23 69 66 20  T_CTE */....#if 
7fa0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
7fb0: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20  OMIT_TRIGGER).  
7fc0: 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65    /* Discard the
7fd0: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20   results.  This 
7fe0: 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45  is used for SELE
7ff0: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  CT statements in
8000: 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  side.    ** the 
8010: 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47 45  body of a TRIGGE
8020: 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20  R.  The purpose 
8030: 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73 20  of such selects 
8040: 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a  is to call.    *
8050: 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  * user-defined f
8060: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  unctions that ha
8070: 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73 2e  ve side effects.
8080: 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65    We do not care
8090: 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68  .    ** about th
80a0: 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73  e actual results
80b0: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a   of the select..
80c0: 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
80d0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
80e0: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  rt( eDest==SRT_D
80f0: 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20  iscard );.      
8100: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
8110: 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75  dif.  }..  /* Ju
8120: 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
8130: 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65   the loop if the
8140: 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65   LIMIT is reache
8150: 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66 0a 20  d.  Except, if. 
8160: 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 73   ** there is a s
8170: 6f 72 74 65 72 2c 20 69 6e 20 77 68 69 63 68 20  orter, in which 
8180: 63 61 73 65 20 74 68 65 20 73 6f 72 74 65 72 20  case the sorter 
8190: 68 61 73 20 61 6c 72 65 61 64 79 20 6c 69 6d 69  has already limi
81a0: 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 6f 75 74  ted.  ** the out
81b0: 70 75 74 20 66 6f 72 20 75 73 2e 0a 20 20 2a 2f  put for us..  */
81c0: 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20  .  if( pSort==0 
81d0: 26 26 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  && p->iLimit ){.
81e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
81f0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a 65  ddOp3(v, OP_IfZe
8200: 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69  ro, p->iLimit, i
8210: 42 72 65 61 6b 2c 20 2d 31 29 3b 20 56 64 62 65  Break, -1); Vdbe
8220: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
8230: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
8240: 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a  te a KeyInfo obj
8250: 65 63 74 20 73 75 66 66 69 63 69 65 6e 74 20 66  ect sufficient f
8260: 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 66 20 4e  or an index of N
8270: 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64   key columns and
8280: 0a 2a 2a 20 58 20 65 78 74 72 61 20 63 6f 6c 75  .** X extra colu
8290: 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20  mns..*/.KeyInfo 
82a0: 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41  *sqlite3KeyInfoA
82b0: 6c 6c 6f 63 28 73 71 6c 69 74 65 33 20 2a 64 62  lloc(sqlite3 *db
82c0: 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20 58 29 7b  , int N, int X){
82d0: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 20 3d 20  .  KeyInfo *p = 
82e0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
82f0: 65 72 6f 28 30 2c 20 0a 20 20 20 20 20 20 20 20  ero(0, .        
8300: 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
8310: 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 28 4e 2b  f(KeyInfo) + (N+
8320: 58 29 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  X)*(sizeof(CollS
8330: 65 71 2a 29 2b 31 29 29 3b 0a 20 20 69 66 28 20  eq*)+1));.  if( 
8340: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f 72  p ){.    p->aSor
8350: 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70  tOrder = (u8*)&p
8360: 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20  ->aColl[N+X];.  
8370: 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75    p->nField = (u
8380: 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e 6e 58 46  16)N;.    p->nXF
8390: 69 65 6c 64 20 3d 20 28 75 31 36 29 58 3b 0a 20  ield = (u16)X;. 
83a0: 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28     p->enc = ENC(
83b0: 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d  db);.    p->db =
83c0: 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66   db;.    p->nRef
83d0: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
83e0: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
83f0: 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  led = 1;.  }.  r
8400: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
8410: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b  * Deallocate a K
8420: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f  eyInfo object.*/
8430: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4b 65 79  .void sqlite3Key
8440: 49 6e 66 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66  InfoUnref(KeyInf
8450: 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  o *p){.  if( p )
8460: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
8470: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70  >nRef>0 );.    p
8480: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
8490: 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73  ( p->nRef==0 ) s
84a0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
84b0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
84c0: 20 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e   Make a new poin
84d0: 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f  ter to a KeyInfo
84e0: 20 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e   object.*/.KeyIn
84f0: 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e  fo *sqlite3KeyIn
8500: 66 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70  foRef(KeyInfo *p
8510: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
8520: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65    assert( p->nRe
8530: 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52  f>0 );.    p->nR
8540: 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ef++;.  }.  retu
8550: 72 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  rn p;.}..#ifdef 
8560: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
8570: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
8580: 66 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  f a KeyInfo obje
8590: 63 74 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  ct can be change
85a0: 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f  .  The KeyInfo o
85b0: 62 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c  bject.** can onl
85c0: 79 20 62 65 20 63 68 61 6e 67 65 64 20 69 66 20  y be changed if 
85d0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 61 20 73  this is just a s
85e0: 69 6e 67 6c 65 20 72 65 66 65 72 65 6e 63 65 20  ingle reference 
85f0: 74 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a  to the object..*
8600: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8610: 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 69  e is used only i
8620: 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28  nside of assert(
8630: 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  ) statements..*/
8640: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4b 65 79 49  .int sqlite3KeyI
8650: 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 4b  nfoIsWriteable(K
8660: 65 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75  eyInfo *p){ retu
8670: 72 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d  rn p->nRef==1; }
8680: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
8690: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a  E_DEBUG */../*.*
86a0: 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65  * Given an expre
86b0: 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65  ssion list, gene
86c0: 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73  rate a KeyInfo s
86d0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
86e0: 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c  cords.** the col
86f0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
8700: 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73  for each express
8710: 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72  ion in that expr
8720: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
8730: 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69  ** If the ExprLi
8740: 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  st is an ORDER B
8750: 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
8760: 61 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65  ause then the re
8770: 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e  sulting.** KeyIn
8780: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
8790: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
87a0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76  initializing a v
87b0: 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a  irtual index to.
87c0: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61  ** implement tha
87d0: 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68  t clause.  If th
87e0: 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68  e ExprList is th
87f0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
8800: 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e  a SELECT.** then
8810: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
8820: 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70  ucture is approp
8830: 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61  riate for initia
8840: 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c  lizing a virtual
8850: 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70  .** index to imp
8860: 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43  lement a DISTINC
8870: 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70  T test..**.** Sp
8880: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
8890: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
88a0: 65 20 69 73 20 6f 62 74 61 69 6e 20 66 72 6f 6d  e is obtain from
88b0: 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61   malloc.  The ca
88c0: 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
88d0: 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  n is responsible
88e0: 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74   for seeing that
88f0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
8900: 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a  is eventually.**
8910: 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69   freed..*/.stati
8920: 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e  c KeyInfo *keyIn
8930: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a  foFromExprList(.
8940: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
8950: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
8960: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
8970: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
8980: 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20      /* Form the 
8990: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66  KeyInfo object f
89a0: 72 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73  rom this ExprLis
89b0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72  t */.  int iStar
89c0: 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  t,          /* B
89d0: 65 67 69 6e 20 77 69 74 68 20 74 68 69 73 20 63  egin with this c
89e0: 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a  olumn of pList *
89f0: 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20  /.  int nExtra  
8a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
8a10: 74 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20  this many extra 
8a20: 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65  columns to the e
8a30: 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  nd */.){.  int n
8a40: 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  Expr;.  KeyInfo 
8a50: 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  *pInfo;.  struct
8a60: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
8a70: 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pItem;.  sqlite3
8a80: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
8a90: 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e  b;.  int i;..  n
8aa0: 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  Expr = pList->nE
8ab0: 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73  xpr;.  pInfo = s
8ac0: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
8ad0: 6f 63 28 64 62 2c 20 6e 45 78 70 72 2b 6e 45 78  oc(db, nExpr+nEx
8ae0: 74 72 61 2d 69 53 74 61 72 74 2c 20 31 29 3b 0a  tra-iStart, 1);.
8af0: 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20    if( pInfo ){. 
8b00: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
8b10: 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
8b20: 61 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a 20  able(pInfo) );. 
8b30: 20 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 2c     for(i=iStart,
8b40: 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2b   pItem=pList->a+
8b50: 69 53 74 61 72 74 3b 20 69 3c 6e 45 78 70 72 3b  iStart; i<nExpr;
8b60: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
8b70: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
8b80: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c  Coll;.      pCol
8b90: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
8ba0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
8bb0: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
8bc0: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
8bd0: 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
8be0: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49  ltColl;.      pI
8bf0: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74  nfo->aColl[i-iSt
8c00: 61 72 74 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  art] = pColl;.  
8c10: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74      pInfo->aSort
8c20: 4f 72 64 65 72 5b 69 2d 69 53 74 61 72 74 5d 20  Order[i-iStart] 
8c30: 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64  = pItem->sortOrd
8c40: 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  er;.    }.  }.  
8c50: 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a  return pInfo;.}.
8c60: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8c70: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
8c80: 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20  LECT./*.** Name 
8c90: 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  of the connectio
8ca0: 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64  n operator, used
8cb0: 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61   for error messa
8cc0: 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ges..*/.static c
8cd0: 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63  onst char *selec
8ce0: 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b  tOpName(int id){
8cf0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77  .  char *z;.  sw
8d00: 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20  itch( id ){.    
8d10: 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20  case TK_ALL:    
8d20: 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c     z = "UNION AL
8d30: 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  L";   break;.   
8d40: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45   case TK_INTERSE
8d50: 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45  CT: z = "INTERSE
8d60: 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  CT";   break;.  
8d70: 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
8d80: 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54  :    z = "EXCEPT
8d90: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
8da0: 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20     default:     
8db0: 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e        z = "UNION
8dc0: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
8dd0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a    }.  return z;.
8de0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
8df0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
8e00: 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e  _SELECT */..#ifn
8e10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8e20: 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e  EXPLAIN./*.** Un
8e30: 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e  less an "EXPLAIN
8e40: 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d   QUERY PLAN" com
8e50: 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72  mand is being pr
8e60: 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20 66 75  ocessed, this fu
8e70: 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e  nction.** is a n
8e80: 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  o-op. Otherwise,
8e90: 20 69 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c   it adds a singl
8ea0: 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20  e row of output 
8eb0: 74 6f 20 74 68 65 20 45 51 50 20 72 65 73 75 6c  to the EQP resul
8ec0: 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20  t,.** where the 
8ed0: 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 74 68  caption is of th
8ee0: 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
8ef0: 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45  "USE TEMP B-TREE
8f00: 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20   FOR xxx".**.** 
8f10: 77 68 65 72 65 20 78 78 78 20 69 73 20 6f 6e 65  where xxx is one
8f20: 20 6f 66 20 22 44 49 53 54 49 4e 43 54 22 2c 20   of "DISTINCT", 
8f30: 22 4f 52 44 45 52 20 42 59 22 20 6f 72 20 22 47  "ORDER BY" or "G
8f40: 52 4f 55 50 20 42 59 22 2e 20 45 78 61 63 74 6c  ROUP BY". Exactl
8f50: 79 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 65  y which.** is de
8f60: 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
8f70: 7a 55 73 61 67 65 20 61 72 67 75 6d 65 6e 74 2e  zUsage argument.
8f80: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8f90: 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
8fa0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
8fb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 61  const char *zUsa
8fc0: 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  ge){.  if( pPars
8fd0: 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
8fe0: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70  .    Vdbe *v = p
8ff0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
9000: 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73    char *zMsg = s
9010: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50  qlite3MPrintf(pP
9020: 61 72 73 65 2d 3e 64 62 2c 20 22 55 53 45 20 54  arse->db, "USE T
9030: 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 25  EMP B-TREE FOR %
9040: 73 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20 20 20  s", zUsage);.   
9050: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9060: 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  p4(v, OP_Explain
9070: 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  , pParse->iSelec
9080: 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c  tId, 0, 0, zMsg,
9090: 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
90a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67  }.}../*.** Assig
90b0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62 20 74  n expression b t
90c0: 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41 20 73 65  o lvalue a. A se
90d0: 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72  cond, no-op, ver
90e0: 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61 63  sion of this mac
90f0: 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64 65  ro.** is provide
9100: 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4d  d when SQLITE_OM
9110: 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 64 65  IT_EXPLAIN is de
9120: 66 69 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f  fined. This allo
9130: 77 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 69  ws the code.** i
9140: 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  n sqlite3Select(
9150: 29 20 74 6f 20 61 73 73 69 67 6e 20 76 61 6c 75  ) to assign valu
9160: 65 73 20 74 6f 20 73 74 72 75 63 74 75 72 65 20  es to structure 
9170: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
9180: 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78   that.** only ex
9190: 69 73 74 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d  ist if SQLITE_OM
91a0: 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e 6f  IT_EXPLAIN is no
91b0: 74 20 64 65 66 69 6e 65 64 20 77 69 74 68 6f 75  t defined withou
91c0: 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65 0a  t polluting the.
91d0: 2a 2a 20 63 6f 64 65 20 77 69 74 68 20 23 69 66  ** code with #if
91e0: 6e 64 65 66 20 64 69 72 65 63 74 69 76 65 73 2e  ndef directives.
91f0: 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70  .*/.# define exp
9200: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 61  lainSetInteger(a
9210: 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c 73  , b) a = b..#els
9220: 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69  e./* No-op versi
9230: 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61  ons of the expla
9240: 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e  inXXX() function
9250: 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f  s and macros. */
9260: 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
9270: 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29 0a  nTempTable(y,z).
9280: 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
9290: 53 65 74 49 6e 74 65 67 65 72 28 79 2c 7a 29 0a  SetInteger(y,z).
92a0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
92b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
92c0: 5f 45 58 50 4c 41 49 4e 29 20 26 26 20 21 64 65  _EXPLAIN) && !de
92d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
92e0: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
92f0: 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  T)./*.** Unless 
9300: 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52  an "EXPLAIN QUER
9310: 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20  Y PLAN" command 
9320: 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73  is being process
9330: 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
9340: 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  n.** is a no-op.
9350: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 61   Otherwise, it a
9360: 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  dds a single row
9370: 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74 68   of output to th
9380: 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a  e EQP result,.**
9390: 20 77 68 65 72 65 20 74 68 65 20 63 61 70 74 69   where the capti
93a0: 6f 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20  on is of one of 
93b0: 74 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a  the two forms:.*
93c0: 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54  *.**   "COMPOSIT
93d0: 45 20 53 55 42 51 55 45 52 49 45 53 20 69 53 75  E SUBQUERIES iSu
93e0: 62 31 20 61 6e 64 20 69 53 75 62 32 20 28 6f 70  b1 and iSub2 (op
93f0: 29 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49  )".**   "COMPOSI
9400: 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69 53  TE SUBQUERIES iS
9410: 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 55 53  ub1 and iSub2 US
9420: 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45 20  ING TEMP B-TREE 
9430: 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72  (op)".**.** wher
9440: 65 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62  e iSub1 and iSub
9450: 32 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65  2 are the intege
9460: 72 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  rs passed as the
9470: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
9480: 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d  * function param
9490: 65 74 65 72 73 2c 20 61 6e 64 20 6f 70 20 69 73  eters, and op is
94a0: 20 74 68 65 20 74 65 78 74 20 72 65 70 72 65 73   the text repres
94b0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
94c0: 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20  parameter.** of 
94d0: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 54  the same name. T
94e0: 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 6f 70  he parameter "op
94f0: 22 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  " must be one of
9500: 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58   TK_UNION, TK_EX
9510: 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54 45  CEPT,.** TK_INTE
9520: 52 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c 4c 2e  RSECT or TK_ALL.
9530: 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20   The first form 
9540: 69 73 20 75 73 65 64 20 69 66 20 61 72 67 75 6d  is used if argum
9550: 65 6e 74 20 62 55 73 65 54 6d 70 20 69 73 20 0a  ent bUseTmp is .
9560: 2a 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74 68 65  ** false, or the
9570: 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 66 20   second form if 
9580: 69 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73  it is true..*/.s
9590: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61  tatic void expla
95a0: 69 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20 20 50  inComposite(.  P
95b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
95c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
95d0: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
95e0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
95f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9600: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54       /* One of T
9610: 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45  K_UNION, TK_EXCE
9620: 50 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74  PT etc. */.  int
9630: 20 69 53 75 62 31 2c 20 20 20 20 20 20 20 20 20   iSub1,         
9640: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9650: 53 75 62 71 75 65 72 79 20 69 64 20 31 20 2a 2f  Subquery id 1 */
9660: 0a 20 20 69 6e 74 20 69 53 75 62 32 2c 20 20 20  .  int iSub2,   
9670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9680: 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69     /* Subquery i
9690: 64 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62 55 73  d 2 */.  int bUs
96a0: 65 54 6d 70 20 20 20 20 20 20 20 20 20 20 20 20  eTmp            
96b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
96c0: 20 69 66 20 61 20 74 65 6d 70 20 74 61 62 6c 65   if a temp table
96d0: 20 77 61 73 20 75 73 65 64 20 2a 2f 0a 29 7b 0a   was used */.){.
96e0: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b    assert( op==TK
96f0: 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54 4b  _UNION || op==TK
9700: 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54  _EXCEPT || op==T
9710: 4b 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c 20 6f  K_INTERSECT || o
9720: 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20 69  p==TK_ALL );.  i
9730: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
9740: 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62  in==2 ){.    Vdb
9750: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
9760: 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  Vdbe;.    char *
9770: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
9780: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 70  rintf(.        p
9790: 50 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f 4d 50  Parse->db, "COMP
97a0: 4f 55 4e 44 20 53 55 42 51 55 45 52 49 45 53 20  OUND SUBQUERIES 
97b0: 25 64 20 41 4e 44 20 25 64 20 25 73 28 25 73 29  %d AND %d %s(%s)
97c0: 22 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c  ", iSub1, iSub2,
97d0: 0a 20 20 20 20 20 20 20 20 62 55 73 65 54 6d 70  .        bUseTmp
97e0: 3f 22 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54  ?"USING TEMP B-T
97f0: 52 45 45 20 22 3a 22 22 2c 20 73 65 6c 65 63 74  REE ":"", select
9800: 4f 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20 20 29  OpName(op).    )
9810: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
9820: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78  eAddOp4(v, OP_Ex
9830: 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69  plain, pParse->i
9840: 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20  SelectId, 0, 0, 
9850: 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zMsg, P4_DYNAMIC
9860: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 2f  );.  }.}.#else./
9870: 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73  * No-op versions
9880: 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58   of the explainX
9890: 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61  XX() functions a
98a0: 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20  nd macros. */.# 
98b0: 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 43 6f  define explainCo
98c0: 6d 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c 79 2c  mposite(v,w,x,y,
98d0: 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  z).#endif../*.**
98e0: 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   If the inner lo
98f0: 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74 65 64  op was generated
9900: 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c   using a non-nul
9910: 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d  l pOrderBy argum
9920: 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ent,.** then the
9930: 20 72 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c   results were pl
9940: 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72  aced in a sorter
9950: 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f  .  After the loo
9960: 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a  p is terminated.
9970: 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75  ** we need to ru
9980: 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64  n the sorter and
9990: 20 6f 75 74 70 75 74 20 74 68 65 20 72 65 73 75   output the resu
99a0: 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  lts.  The follow
99b0: 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67  ing.** routine g
99c0: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
99d0: 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74  e needed to do t
99e0: 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  hat..*/.static v
99f0: 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74  oid generateSort
9a00: 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70  Tail(.  Parse *p
9a10: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
9a20: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
9a30: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
9a40: 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
9a50: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
9a60: 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c   SortCtx *pSort,
9a70: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
9a80: 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42  n on the ORDER B
9a90: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
9aa0: 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  t nColumn,      
9ab0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
9ac0: 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a  umns of data */.
9ad0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
9ae0: 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68 65  est /* Write the
9af0: 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20   sorted results 
9b00: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  here */.){.  Vdb
9b10: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
9b20: 56 64 62 65 3b 20 20 20 20 20 20 20 20 20 20 20  Vdbe;           
9b30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
9b40: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
9b50: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ent */.  int add
9b60: 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  rBreak = sqlite3
9b70: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
9b80: 3b 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65  ;     /* Jump he
9b90: 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70 20  re to exit loop 
9ba0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e  */.  int addrCon
9bb0: 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56  tinue = sqlite3V
9bc0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
9bd0: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 66    /* Jump here f
9be0: 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f  or next cycle */
9bf0: 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 69  .  int addr;.  i
9c00: 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b  nt addrOnce = 0;
9c10: 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 69  .  int iTab;.  i
9c20: 6e 74 20 70 73 65 75 64 6f 54 61 62 20 3d 20 30  nt pseudoTab = 0
9c30: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  ;.  ExprList *pO
9c40: 72 64 65 72 42 79 20 3d 20 70 53 6f 72 74 2d 3e  rderBy = pSort->
9c50: 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20  pOrderBy;.  int 
9c60: 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65  eDest = pDest->e
9c70: 44 65 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72  Dest;.  int iPar
9c80: 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61  m = pDest->iSDPa
9c90: 72 6d 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77  rm;.  int regRow
9ca0: 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64  ;.  int regRowid
9cb0: 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 0a 20  ;.  int nKey;.. 
9cc0: 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65   if( pSort->labe
9cd0: 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 73 71  lBkOut ){.    sq
9ce0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
9cf0: 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f  v, OP_Gosub, pSo
9d00: 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70  rt->regReturn, p
9d10: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
9d20: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
9d30: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
9d40: 6f 74 6f 2c 20 30 2c 20 61 64 64 72 42 72 65 61  oto, 0, addrBrea
9d50: 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  k);.    sqlite3V
9d60: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
9d70: 76 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42  v, pSort->labelB
9d80: 6b 4f 75 74 29 3b 0a 20 20 20 20 61 64 64 72 4f  kOut);.    addrO
9d90: 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  nce = sqlite3Cod
9da0: 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56  eOnce(pParse); V
9db0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
9dc0: 20 20 7d 0a 20 20 69 54 61 62 20 3d 20 70 53 6f    }.  iTab = pSo
9dd0: 72 74 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20  rt->iECursor;.  
9de0: 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  regRow = sqlite3
9df0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
9e00: 65 29 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d  e);.  if( eDest=
9e10: 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65  =SRT_Output || e
9e20: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
9e30: 69 6e 65 20 29 7b 0a 20 20 20 20 70 73 65 75 64  ine ){.    pseud
9e40: 6f 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  oTab = pParse->n
9e50: 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  Tab++;.    sqlit
9e60: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
9e70: 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70  OP_OpenPseudo, p
9e80: 73 65 75 64 6f 54 61 62 2c 20 72 65 67 52 6f 77  seudoTab, regRow
9e90: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
9ea0: 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20  regRowid = 0;.  
9eb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 52 6f  }else{.    regRo
9ec0: 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  wid = sqlite3Get
9ed0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
9ee0: 0a 20 20 7d 0a 20 20 6e 4b 65 79 20 3d 20 70 4f  .  }.  nKey = pO
9ef0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2d 20  rderBy->nExpr - 
9f00: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20  pSort->nOBSat;. 
9f10: 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74   if( pSort->sort
9f20: 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47  Flags & SORTFLAG
9f30: 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20  _UseSorter ){.  
9f40: 20 20 69 6e 74 20 72 65 67 53 6f 72 74 4f 75 74    int regSortOut
9f50: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
9f60: 6d 3b 0a 20 20 20 20 69 6e 74 20 70 74 61 62 32  m;.    int ptab2
9f70: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
9f80: 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  +;.    sqlite3Vd
9f90: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
9fa0: 70 65 6e 50 73 65 75 64 6f 2c 20 70 74 61 62 32  penPseudo, ptab2
9fb0: 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c 20 6e 4b  , regSortOut, nK
9fc0: 65 79 2b 32 29 3b 0a 20 20 20 20 69 66 28 20 61  ey+2);.    if( a
9fd0: 64 64 72 4f 6e 63 65 20 29 20 73 71 6c 69 74 65  ddrOnce ) sqlite
9fe0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
9ff0: 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20   addrOnce);.    
a000: 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74  addr = 1 + sqlit
a010: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a020: 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69  OP_SorterSort, i
a030: 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  Tab, addrBreak);
a040: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
a050: 65 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66  e(v);.    codeOf
a060: 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73  fset(v, p->iOffs
a070: 65 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65  et, addrContinue
a080: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a090: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
a0a0: 6f 72 74 65 72 44 61 74 61 2c 20 69 54 61 62 2c  orterData, iTab,
a0b0: 20 72 65 67 53 6f 72 74 4f 75 74 29 3b 0a 20 20   regSortOut);.  
a0c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a0d0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
a0e0: 2c 20 70 74 61 62 32 2c 20 6e 4b 65 79 2b 31 2c  , ptab2, nKey+1,
a0f0: 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20 73 71   regRow);.    sq
a100: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
a110: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41  5(v, OPFLAG_CLEA
a120: 52 43 41 43 48 45 29 3b 0a 20 20 7d 65 6c 73 65  RCACHE);.  }else
a130: 7b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4f 6e  {.    if( addrOn
a140: 63 65 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  ce ) sqlite3Vdbe
a150: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
a160: 4f 6e 63 65 29 3b 0a 20 20 20 20 61 64 64 72 20  Once);.    addr 
a170: 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  = 1 + sqlite3Vdb
a180: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
a190: 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72  rt, iTab, addrBr
a1a0: 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
a1b0: 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f  ge(v);.    codeO
a1c0: 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
a1d0: 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  set, addrContinu
a1e0: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
a1f0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
a200: 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 6e 4b  Column, iTab, nK
a210: 65 79 2b 31 2c 20 72 65 67 52 6f 77 29 3b 0a 20  ey+1, regRow);. 
a220: 20 7d 0a 20 20 73 77 69 74 63 68 28 20 65 44 65   }.  switch( eDe
a230: 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  st ){.    case S
a240: 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61  RT_Table:.    ca
a250: 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a  se SRT_EphemTab:
a260: 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
a270: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 61  e( eDest==SRT_Ta
a280: 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ble );.      tes
a290: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
a2a0: 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20  T_EphemTab );.  
a2b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a2c0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
a2d0: 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 65 67  owid, iParm, reg
a2e0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71  Rowid);.      sq
a2f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
a300: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50  v, OP_Insert, iP
a310: 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65 67  arm, regRow, reg
a320: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71  Rowid);.      sq
a330: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
a340: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
a350: 4e 44 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ND);.      break
a360: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
a370: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
a380: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 53 52  UERY.    case SR
a390: 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61  T_Set: {.      a
a3a0: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
a3b0: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
a3c0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
a3d0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
a3e0: 65 67 52 6f 77 2c 20 31 2c 20 72 65 67 52 6f 77  egRow, 1, regRow
a3f0: 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  id,.            
a400: 20 20 20 20 20 20 20 20 20 20 20 20 26 70 44 65              &pDe
a410: 73 74 2d 3e 61 66 66 53 64 73 74 2c 20 31 29 3b  st->affSdst, 1);
a420: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
a430: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
a440: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
a450: 67 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20 20 20  gRow, 1);.      
a460: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a470: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
a480: 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77  t, iParm, regRow
a490: 69 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  id);.      break
a4a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
a4b0: 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20   SRT_Mem: {.    
a4c0: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
a4d0: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  n==1 );.      sq
a4e0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
a4f0: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  e(pParse, regRow
a500: 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20  , iParm, 1);.   
a510: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
a520: 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d  clause will term
a530: 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66  inate the loop f
a540: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
a550: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
a560: 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  if.    default: 
a570: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
a580: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
a590: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c  st==SRT_Output |
a5a0: 7c 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 20 0a 20 20 20 20 20  outine ); .     
a5c0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
a5d0: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a  ==SRT_Output );.
a5e0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
a5f0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
a600: 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 66 6f  tine );.      fo
a610: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e  r(i=0; i<nColumn
a620: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
a630: 61 73 73 65 72 74 28 20 72 65 67 52 6f 77 21 3d  assert( regRow!=
a640: 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 69 20 29  pDest->iSdst+i )
a650: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a660: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
a670: 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73 65 75 64 6f  P_Column, pseudo
a680: 54 61 62 2c 20 69 2c 20 70 44 65 73 74 2d 3e 69  Tab, i, pDest->i
a690: 53 64 73 74 2b 69 29 3b 0a 20 20 20 20 20 20 20  Sdst+i);.       
a6a0: 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20   if( i==0 ){.   
a6b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a6c0: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
a6d0: 46 4c 41 47 5f 43 4c 45 41 52 43 41 43 48 45 29  FLAG_CLEARCACHE)
a6e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a6f0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65 44    }.      if( eD
a700: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
a710: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
a720: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a730: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 44  OP_ResultRow, pD
a740: 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c  est->iSdst, nCol
a750: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  umn);.        sq
a760: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
a770: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
a780: 72 73 65 2c 20 70 44 65 73 74 2d 3e 69 53 64 73  rse, pDest->iSds
a790: 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t, nColumn);.   
a7a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a7b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a7c0: 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
a7d0: 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29   pDest->iSDParm)
a7e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a7f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
a800: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
a810: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
a820: 20 72 65 67 52 6f 77 29 3b 0a 20 20 73 71 6c 69   regRow);.  sqli
a830: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
a840: 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  g(pParse, regRow
a850: 69 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 62  id);..  /* The b
a860: 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f  ottom of the loo
a870: 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  p.  */.  sqlite3
a880: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
a890: 28 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65  (v, addrContinue
a8a0: 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e  );.  if( pSort->
a8b0: 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54  sortFlags & SORT
a8c0: 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29  FLAG_UseSorter )
a8d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
a8e0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
a8f0: 72 74 65 72 4e 65 78 74 2c 20 69 54 61 62 2c 20  rterNext, iTab, 
a900: 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72  addr); VdbeCover
a910: 61 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b  age(v);.  }else{
a920: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a930: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
a940: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20  t, iTab, addr); 
a950: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
a960: 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74  .  }.  if( pSort
a970: 2d 3e 72 65 67 52 65 74 75 72 6e 20 29 20 73 71  ->regReturn ) sq
a980: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
a990: 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 53  v, OP_Return, pS
a9a0: 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b  ort->regReturn);
a9b0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
a9c0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
a9d0: 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28 20  drBreak);.  if( 
a9e0: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
a9f0: 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  t || eDest==SRT_
aa00: 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
aa10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
aa20: 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
aa30: 70 73 65 75 64 6f 54 61 62 2c 20 30 29 3b 0a 20  pseudoTab, 0);. 
aa40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
aa50: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
aa60: 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  a string contain
aa70: 69 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72 61  ing the 'declara
aa80: 74 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68  tion type' of th
aa90: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
aaa0: 70 45 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e  pExpr. The strin
aab0: 67 20 6d 61 79 20 62 65 20 74 72 65 61 74 65 64  g may be treated
aac0: 20 61 73 20 73 74 61 74 69 63 20 62 79 20 74 68   as static by th
aad0: 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20  e caller..**.** 
aae0: 41 6c 73 6f 20 74 72 79 20 74 6f 20 65 73 74 69  Also try to esti
aaf0: 6d 61 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66  mate the size of
ab00: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   the returned va
ab10: 6c 75 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74  lue and return t
ab20: 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  hat.** result in
ab30: 20 2a 70 45 73 74 57 69 64 74 68 2e 0a 2a 2a 0a   *pEstWidth..**.
ab40: 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69  ** The declarati
ab50: 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65  on type is the e
ab60: 78 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65  xact datatype de
ab70: 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74  finition extract
ab80: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f  ed from the.** o
ab90: 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54  riginal CREATE T
aba0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
abb0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
abc0: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68   is a column. Th
abd0: 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e  e.** declaration
abe0: 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49   type for a ROWI
abf0: 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47  D field is INTEG
ac00: 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e  ER. Exactly when
ac10: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a   an expression.*
ac20: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
ac30: 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20  a column can be 
ac40: 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70  complex in the p
ac50: 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75  resence of subqu
ac60: 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65  eries. The.** re
ac70: 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73  sult-set express
ac80: 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68  ion in all of th
ac90: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45  e following SELE
aca0: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73  CT statements is
acb0: 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20   .** considered 
acc0: 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73  a column by this
acd0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
ace0: 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52     SELECT col FR
acf0: 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c  OM tbl;.**   SEL
ad00: 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20  ECT (SELECT col 
ad10: 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53  FROM tbl;.**   S
ad20: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f  ELECT (SELECT co
ad30: 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20  l FROM tbl);.** 
ad40: 20 20 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f    SELECT abc FRO
ad50: 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53  M (SELECT col AS
ad60: 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a   abc FROM tbl);.
ad70: 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61  ** .** The decla
ad80: 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20  ration type for 
ad90: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  any expression o
ada0: 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75  ther than a colu
adb0: 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  mn is NULL..**.*
adc0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
add0: 61 73 20 65 69 74 68 65 72 20 33 20 6f 72 20 36  as either 3 or 6
ade0: 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 70 65   parameters depe
adf0: 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
ae00: 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 53   or not.** the S
ae10: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
ae20: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 63 6f 6d  UMN_METADATA com
ae30: 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
ae40: 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 23 69 66   is used..*/.#if
ae50: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
ae60: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
ae70: 41 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d  A.# define colum
ae80: 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c  nType(A,B,C,D,E,
ae90: 46 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70  F) columnTypeImp
aea0: 6c 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 0a 73  l(A,B,C,D,E,F).s
aeb0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
aec0: 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c   *columnTypeImpl
aed0: 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  (.  NameContext 
aee0: 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70  *pNC, .  Expr *p
aef0: 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Expr,.  const ch
af00: 61 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20  ar **pzOrigDb,. 
af10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
af20: 4f 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74  OrigTab,.  const
af30: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f   char **pzOrigCo
af40: 6c 2c 0a 20 20 75 38 20 2a 70 45 73 74 57 69 64  l,.  u8 *pEstWid
af50: 74 68 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e  th.){.  char con
af60: 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b  st *zOrigDb = 0;
af70: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
af80: 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 63  OrigTab = 0;.  c
af90: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
afa0: 43 6f 6c 20 3d 20 30 3b 0a 23 65 6c 73 65 20 2f  Col = 0;.#else /
afb0: 2a 20 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  * if !defined(SQ
afc0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
afd0: 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a  MN_METADATA) */.
afe0: 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54  # define columnT
aff0: 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29  ype(A,B,C,D,E,F)
b000: 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28   columnTypeImpl(
b010: 41 2c 42 2c 46 29 0a 73 74 61 74 69 63 20 63 6f  A,B,F).static co
b020: 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e  nst char *column
b030: 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d 65  TypeImpl(.  Name
b040: 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20  Context *pNC, . 
b050: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20   Expr *pExpr,.  
b060: 75 38 20 2a 70 45 73 74 57 69 64 74 68 0a 29 7b  u8 *pEstWidth.){
b070: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
b080: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
b090: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
b0a0: 41 29 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e  A) */.  char con
b0b0: 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20  st *zType = 0;. 
b0c0: 20 69 6e 74 20 6a 3b 0a 20 20 75 38 20 65 73 74   int j;.  u8 est
b0d0: 57 69 64 74 68 20 3d 20 31 3b 0a 0a 20 20 69 66  Width = 1;..  if
b0e0: 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30  ( NEVER(pExpr==0
b0f0: 29 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69  ) || pNC->pSrcLi
b100: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
b110: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ;.  switch( pExp
b120: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
b130: 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
b140: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
b150: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  UMN: {.      /* 
b160: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
b170: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61  s a column. Loca
b180: 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68 65  te the table the
b190: 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67   column is being
b1a0: 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63  .      ** extrac
b1b0: 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65  ted from in Name
b1c0: 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74  Context.pSrcList
b1d0: 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79  . This table may
b1e0: 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a   be real.      *
b1f0: 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  * database table
b200: 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a   or a subquery..
b210: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54        */.      T
b220: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20  able *pTab = 0; 
b230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
b240: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  ble structure co
b250: 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65  lumn is extracte
b260: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20  d from */.      
b270: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20  Select *pS = 0; 
b280: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
b290: 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e  elect the column
b2a0: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
b2b0: 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  om */.      int 
b2c0: 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43  iCol = pExpr->iC
b2d0: 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78  olumn;  /* Index
b2e0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54   of column in pT
b2f0: 61 62 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  ab */.      test
b300: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
b310: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
b320: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
b330: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
b340: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
b350: 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70  while( pNC && !p
b360: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53  Tab ){.        S
b370: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
b380: 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
b390: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
b3a0: 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  0;j<pTabList->nS
b3b0: 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e  rc && pTabList->
b3c0: 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45  a[j].iCursor!=pE
b3d0: 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29  xpr->iTable;j++)
b3e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c  ;.        if( j<
b3f0: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
b400: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62  {.          pTab
b410: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
b420: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ].pTab;.        
b430: 20 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74 2d    pS = pTabList-
b440: 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20  >a[j].pSelect;. 
b450: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
b460: 20 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e          pNC = pN
b470: 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  C->pNext;.      
b480: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
b490: 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
b4a0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20  {.        /* At 
b4b0: 6f 6e 65 20 74 69 6d 65 2c 20 63 6f 64 65 20 73  one time, code s
b4c0: 75 63 68 20 61 73 20 22 53 45 4c 45 43 54 20 6e  uch as "SELECT n
b4d0: 65 77 2e 78 22 20 77 69 74 68 69 6e 20 61 20 74  ew.x" within a t
b4e0: 72 69 67 67 65 72 20 77 6f 75 6c 64 0a 20 20 20  rigger would.   
b4f0: 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68       ** cause th
b500: 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20  is condition to 
b510: 72 75 6e 2e 20 20 53 69 6e 63 65 20 74 68 65 6e  run.  Since then
b520: 2c 20 77 65 20 68 61 76 65 20 72 65 73 74 72 75  , we have restru
b530: 63 74 75 72 65 64 20 68 6f 77 0a 20 20 20 20 20  ctured how.     
b540: 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 63 6f     ** trigger co
b550: 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  de is generated 
b560: 61 6e 64 20 73 6f 20 74 68 69 73 20 63 6f 6e 64  and so this cond
b570: 69 74 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67  ition is no long
b580: 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  er .        ** p
b590: 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65 76 65 72  ossible. However
b5a0: 2c 20 69 74 20 63 61 6e 20 73 74 69 6c 6c 20 62  , it can still b
b5b0: 65 20 74 72 75 65 20 66 6f 72 20 73 74 61 74 65  e true for state
b5c0: 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20 20 20 20  ments like.     
b5d0: 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77     ** the follow
b5e0: 69 6e 67 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ing:.        **.
b5f0: 20 20 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45          **   CRE
b600: 41 54 45 20 54 41 42 4c 45 20 74 31 28 63 6f 6c  ATE TABLE t1(col
b610: 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 20 20 20   INTEGER);.     
b620: 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 28     **   SELECT (
b630: 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 20 46  SELECT t1.col) F
b640: 52 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  ROM FROM t1;.   
b650: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
b660: 2a 2a 20 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79  ** when columnTy
b670: 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  pe() is called o
b680: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
b690: 20 22 74 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65   "t1.col" in the
b6a0: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75 62   .        ** sub
b6b0: 2d 73 65 6c 65 63 74 2e 20 49 6e 20 74 68 69 73  -select. In this
b6c0: 20 63 61 73 65 2c 20 73 65 74 20 74 68 65 20 63   case, set the c
b6d0: 6f 6c 75 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55  olumn type to NU
b6e0: 4c 4c 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 20  LL, even.       
b6f0: 20 2a 2a 20 74 68 6f 75 67 68 20 69 74 20 73 68   ** though it sh
b700: 6f 75 6c 64 20 72 65 61 6c 6c 79 20 62 65 20 22  ould really be "
b710: 49 4e 54 45 47 45 52 22 2e 0a 20 20 20 20 20 20  INTEGER"..      
b720: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
b730: 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 70 72  This is not a pr
b740: 6f 62 6c 65 6d 2c 20 61 73 20 74 68 65 20 63 6f  oblem, as the co
b750: 6c 75 6d 6e 20 74 79 70 65 20 6f 66 20 22 74 31  lumn type of "t1
b760: 2e 63 6f 6c 22 20 69 73 20 6e 65 76 65 72 0a 20  .col" is never. 
b770: 20 20 20 20 20 20 20 2a 2a 20 75 73 65 64 2e 20         ** used. 
b780: 57 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28  When columnType(
b790: 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
b7a0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a 20  he expression . 
b7b0: 20 20 20 20 20 20 20 2a 2a 20 22 28 53 45 4c 45         ** "(SELE
b7c0: 43 54 20 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65  CT t1.col)", the
b7d0: 20 63 6f 72 72 65 63 74 20 74 79 70 65 20 69 73   correct type is
b7e0: 20 72 65 74 75 72 6e 65 64 20 28 73 65 65 20 74   returned (see t
b7f0: 68 65 20 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20  he TK_SELECT.   
b800: 20 20 20 20 20 2a 2a 20 62 72 61 6e 63 68 20 62       ** branch b
b810: 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20  elow.  */.      
b820: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
b830: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
b840: 70 54 61 62 20 26 26 20 70 45 78 70 72 2d 3e 70  pTab && pExpr->p
b850: 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20  Tab==pTab );.   
b860: 20 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20     if( pS ){.   
b870: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62       /* The "tab
b880: 6c 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20  le" is actually 
b890: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  a sub-select or 
b8a0: 61 20 76 69 65 77 20 69 6e 20 74 68 65 20 46 52  a view in the FR
b8b0: 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20  OM clause.      
b8c0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45    ** of the SELE
b8d0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65  CT statement. Re
b8e0: 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61  turn the declara
b8f0: 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72  tion type and or
b900: 69 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  igin.        ** 
b910: 64 61 74 61 20 66 6f 72 20 74 68 65 20 72 65 73  data for the res
b920: 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f  ult-set column o
b930: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
b940: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
b950: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30       if( iCol>=0
b960: 20 26 26 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c   && ALWAYS(iCol<
b970: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  pS->pEList->nExp
b980: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
b990: 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65  /* If iCol is le
b9a0: 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
b9b0: 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  en the expressio
b9c0: 6e 20 72 65 71 75 65 73 74 73 20 74 68 65 0a 20  n requests the. 
b9d0: 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69           ** rowi
b9e0: 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c  d of the sub-sel
b9f0: 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69  ect or view. Thi
ba00: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
ba10: 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20  legal (see .    
ba20: 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61        ** test ca
ba30: 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20  se misc2.2.2) - 
ba40: 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61  it always evalua
ba50: 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20  tes to NULL..   
ba60: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
ba70: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
ba80: 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45  sNC;.          E
ba90: 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c  xpr *p = pS->pEL
baa0: 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78  ist->a[iCol].pEx
bab0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  pr;.          sN
bac0: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d  C.pSrcList = pS-
bad0: 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20  >pSrc;.         
bae0: 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43   sNC.pNext = pNC
baf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
bb00: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
bb10: 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  arse;.          
bb20: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
bb30: 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f 72 69  pe(&sNC, p,&zOri
bb40: 67 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c 26 7a  gDb,&zOrigTab,&z
bb50: 4f 72 69 67 43 6f 6c 2c 20 26 65 73 74 57 69 64  OrigCol, &estWid
bb60: 74 68 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a  th); .        }.
bb70: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
bb80: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b  pTab->pSchema ){
bb90: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65  .        /* A re
bba0: 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  al table */.    
bbb0: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53 20      assert( !pS 
bbc0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
bbd0: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
bbe0: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
bbf0: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
bc00: 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30  ==-1 || (iCol>=0
bc10: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
bc20: 43 6f 6c 29 20 29 3b 0a 23 69 66 64 65 66 20 53  Col) );.#ifdef S
bc30: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
bc40: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20  UMN_METADATA.   
bc50: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
bc60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  ){.          zTy
bc70: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
bc80: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43            zOrigC
bc90: 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20  ol = "rowid";.  
bca0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
bcb0: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70         zType = p
bcc0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
bcd0: 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20  zType;.         
bce0: 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54 61 62   zOrigCol = pTab
bcf0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
bd00: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73  me;.          es
bd10: 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61  tWidth = pTab->a
bd20: 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b  Col[iCol].szEst;
bd30: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
bd40: 20 20 20 7a 4f 72 69 67 54 61 62 20 3d 20 70 54     zOrigTab = pT
bd50: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
bd60: 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72     if( pNC->pPar
bd70: 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  se ){.          
bd80: 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
bd90: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
bda0: 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20  NC->pParse->db, 
bdb0: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
bdc0: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 44            zOrigD
bdd0: 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d  b = pNC->pParse-
bde0: 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e  >db->aDb[iDb].zN
bdf0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  ame;.        }.#
be00: 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28  else.        if(
be10: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
be20: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e       zType = "IN
be30: 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20  TEGER";.        
be40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
be50: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
be60: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
be70: 0a 20 20 20 20 20 20 20 20 20 20 65 73 74 57 69  .          estWi
be80: 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  dth = pTab->aCol
be90: 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20  [iCol].szEst;.  
bea0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
beb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
bec0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
bed0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
bee0: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
bef0: 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
bf00: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
bf10: 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65  sion is a sub-se
bf20: 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65  lect. Return the
bf30: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
bf40: 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f  e and.      ** o
bf50: 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74  rigin info for t
bf60: 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e  he single column
bf70: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
bf80: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
bf90: 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
bfa0: 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
bfb0: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
bfc0: 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63  sNC;.      Selec
bfd0: 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 78  t *pS = pExpr->x
bfe0: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
bff0: 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45  Expr *p = pS->pE
c000: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
c010: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
c020: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
c030: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
c040: 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e  ect) );.      sN
c050: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d  C.pSrcList = pS-
c060: 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43  >pSrc;.      sNC
c070: 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20  .pNext = pNC;.  
c080: 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
c090: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
c0a0: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
c0b0: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
c0c0: 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67  &zOrigDb, &zOrig
c0d0: 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20  Tab, &zOrigCol, 
c0e0: 26 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20 20  &estWidth); .   
c0f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c100: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64  #endif.  }..#ifd
c110: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
c120: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
c130: 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 44    .  if( pzOrigD
c140: 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
c150: 20 70 7a 4f 72 69 67 54 61 62 20 26 26 20 70 7a   pzOrigTab && pz
c160: 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a  OrigCol );.    *
c170: 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69 67  pzOrigDb = zOrig
c180: 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54  Db;.    *pzOrigT
c190: 61 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20  ab = zOrigTab;. 
c1a0: 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20     *pzOrigCol = 
c1b0: 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65  zOrigCol;.  }.#e
c1c0: 6e 64 69 66 0a 20 20 69 66 28 20 70 45 73 74 57  ndif.  if( pEstW
c1d0: 69 64 74 68 20 29 20 2a 70 45 73 74 57 69 64 74  idth ) *pEstWidt
c1e0: 68 20 3d 20 65 73 74 57 69 64 74 68 3b 0a 20 20  h = estWidth;.  
c1f0: 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a  return zType;.}.
c200: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
c210: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74  code that will t
c220: 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65  ell the VDBE the
c230: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
c240: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  es of columns.**
c250: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
c260: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  et..*/.static vo
c270: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
c280: 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20  nTypes(.  Parse 
c290: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
c2a0: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
c2b0: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
c2c0: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
c2d0: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
c2e0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
c2f0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
c300: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
c310: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
c320: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c330: 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20  OMIT_DECLTYPE.  
c340: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
c350: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
c360: 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
c370: 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c  sNC;.  sNC.pSrcL
c380: 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
c390: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
c3a0: 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30  Parse;.  for(i=0
c3b0: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
c3c0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
c3d0: 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *p = pEList->a
c3e0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63  [i].pExpr;.    c
c3f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
c400: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
c410: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
c420: 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74  TADATA.    const
c430: 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d   char *zOrigDb =
c440: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
c450: 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30  ar *zOrigTab = 0
c460: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
c470: 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a   *zOrigCol = 0;.
c480: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
c490: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
c4a0: 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67  &zOrigDb, &zOrig
c4b0: 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20  Tab, &zOrigCol, 
c4c0: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  0);..    /* The 
c4d0: 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69  vdbe must make i
c4e0: 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74  ts own copy of t
c4f0: 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61  he column-type a
c500: 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a  nd other .    **
c510: 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63   column specific
c520: 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73   strings, in cas
c530: 65 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20  e the schema is 
c540: 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69  reset before thi
c550: 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c  s.    ** virtual
c560: 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65   machine is dele
c570: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
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 44 41 54 41 42 41 53 45 2c 20 7a 4f  AME_DATABASE, zO
c5b0: 72 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52  rigDb, SQLITE_TR
c5c0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
c5d0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
c5e0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
c5f0: 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61  E_TABLE, zOrigTa
c600: 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  b, SQLITE_TRANSI
c610: 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
c620: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
c630: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f  v, i, COLNAME_CO
c640: 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20  LUMN, zOrigCol, 
c650: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
c660: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79  );.#else.    zTy
c670: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
c680: 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30  &sNC, p, 0, 0, 0
c690: 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
c6a0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
c6b0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
c6c0: 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a  NAME_DECLTYPE, z
c6d0: 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  Type, SQLITE_TRA
c6e0: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e  NSIENT);.  }.#en
c6f0: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
c700: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
c710: 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  TYPE) */.}../*.*
c720: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
c730: 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74  that will tell t
c740: 68 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65  he VDBE the name
c750: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
c760: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
c770: 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  t.  This informa
c780: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
c790: 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61  provide the.** a
c7a0: 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e  zCol[] values in
c7b0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a   the callback..*
c7c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
c7d0: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
c7e0: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
c7f0: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
c800: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
c810: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
c820: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74  t,  /* List of t
c830: 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c  ables */.  ExprL
c840: 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f  ist *pEList    /
c850: 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65  * Expressions de
c860: 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c  fining the resul
c870: 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64  t set */.){.  Vd
c880: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
c890: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20  pVdbe;.  int i, 
c8a0: 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  j;.  sqlite3 *db
c8b0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
c8c0: 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20   int fullNames, 
c8d0: 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66  shortNames;..#if
c8e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c8f0: 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66  _EXPLAIN.  /* If
c900: 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c   this is an EXPL
c910: 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73  AIN, skip this s
c920: 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  tep */.  if( pPa
c930: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
c940: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
c950: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50  #endif..  if( pP
c960: 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
c970: 74 20 7c 7c 20 4e 45 56 45 52 28 76 3d 3d 30 29  t || NEVER(v==0)
c980: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
c990: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
c9a0: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
c9b0: 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c  sSet = 1;.  full
c9c0: 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61  Names = (db->fla
c9d0: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c  gs & SQLITE_Full
c9e0: 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20  ColNames)!=0;.  
c9f0: 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64 62  shortNames = (db
ca00: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
ca10: 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21  _ShortColNames)!
ca20: 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  =0;.  sqlite3Vdb
ca30: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70  eSetNumCols(v, p
ca40: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
ca50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
ca60: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
ca70: 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20  .    Expr *p;.  
ca80: 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b    p = pEList->a[
ca90: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
caa0: 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20  ( NEVER(p==0) ) 
cab0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
cac0: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ( pEList->a[i].z
cad0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68  Name ){.      ch
cae0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69  ar *zName = pELi
caf0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[i].zName;.
cb00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cb10: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
cb20: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
cb30: 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54 52  zName, SQLITE_TR
cb40: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65  ANSIENT);.    }e
cb50: 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f 70 3d 3d  lse if( (p->op==
cb60: 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e  TK_COLUMN || p->
cb70: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
cb80: 4e 29 20 26 26 20 70 54 61 62 4c 69 73 74 20 29  N) && pTabList )
cb90: 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
cba0: 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20  Tab;.      char 
cbb0: 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74  *zCol;.      int
cbc0: 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75   iCol = p->iColu
cbd0: 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  mn;.      for(j=
cbe0: 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70 54 61 62  0; ALWAYS(j<pTab
cbf0: 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 20 6a 2b 2b  List->nSrc); j++
cc00: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
cc10: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43  TabList->a[j].iC
cc20: 75 72 73 6f 72 3d 3d 70 2d 3e 69 54 61 62 6c 65  ursor==p->iTable
cc30: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
cc40: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
cc50: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
cc60: 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   );.      pTab =
cc70: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
cc80: 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
cc90: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
cca0: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
ccb0: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
ccc0: 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  =-1 || (iCol>=0 
ccd0: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
cce0: 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ol) );.      if(
ccf0: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
cd00: 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64     zCol = "rowid
cd10: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
cd20: 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70          zCol = p
cd30: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
cd40: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20  zName;.      }. 
cd50: 20 20 20 20 20 69 66 28 20 21 73 68 6f 72 74 4e       if( !shortN
cd60: 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d  ames && !fullNam
cd70: 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  es ){.        sq
cd80: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
cd90: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
cda0: 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20 20  E_NAME, .       
cdb0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 53 74       sqlite3DbSt
cdc0: 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d  rDup(db, pEList-
cdd0: 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20 53 51  >a[i].zSpan), SQ
cde0: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  LITE_DYNAMIC);. 
cdf0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66       }else if( f
ce00: 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ullNames ){.    
ce10: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
ce20: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  = 0;.        zNa
ce30: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
ce40: 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c  ntf(db, "%s.%s",
ce50: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43   pTab->zName, zC
ce60: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
ce70: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
ce80: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
ce90: 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51  _NAME, zName, SQ
cea0: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  LITE_DYNAMIC);. 
ceb0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
cec0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
ced0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
cee0: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43  COLNAME_NAME, zC
cef0: 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  ol, SQLITE_TRANS
cf00: 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20  IENT);.      }. 
cf10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cf20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
cf30: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70  pEList->a[i].zSp
cf40: 61 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a 3d  an;.      z = z=
cf50: 3d 30 20 3f 20 73 71 6c 69 74 65 33 4d 50 72 69  =0 ? sqlite3MPri
cf60: 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25  ntf(db, "column%
cf70: 64 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69 74  d", i+1) : sqlit
cf80: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a  e3DbStrDup(db, z
cf90: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
cfa0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
cfb0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
cfc0: 45 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59 4e  E, z, SQLITE_DYN
cfd0: 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  AMIC);.    }.  }
cfe0: 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  .  generateColum
cff0: 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70  nTypes(pParse, p
d000: 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
d010: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
d020: 20 61 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e   a an expression
d030: 20 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 20   list (which is 
d040: 72 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20  really the list 
d050: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  of expressions.*
d060: 2a 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20  * that form the 
d070: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20  result set of a 
d080: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
d090: 29 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70  ) compute approp
d0a0: 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  riate.** column 
d0b0: 6e 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c  names for a tabl
d0c0: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c  e that would hol
d0d0: 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  d the expression
d0e0: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c   list..**.** All
d0f0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69   column names wi
d100: 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a  ll be unique..**
d110: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c  .** Only the col
d120: 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f  umn names are co
d130: 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e  mputed.  Column.
d140: 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43  zType, Column.zC
d150: 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65  oll,.** and othe
d160: 72 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75  r fields of Colu
d170: 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a  mn are zeroed..*
d180: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
d190: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
d1a0: 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  .  If a memory a
d1b0: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
d1c0: 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65  occurs,.** store
d1d0: 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20   NULL in *paCol 
d1e0: 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20  and 0 in *pnCol 
d1f0: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
d200: 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74  E_NOMEM..*/.stat
d210: 69 63 20 69 6e 74 20 73 65 6c 65 63 74 43 6f 6c  ic int selectCol
d220: 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
d230: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
d240: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
d250: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
d260: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
d270: 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45  List,       /* E
d280: 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68  xpr list from wh
d290: 69 63 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f  ich to derive co
d2a0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
d2b0: 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20  i16 *pnCol,     
d2c0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
d2d0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
d2e0: 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20  olumns here */. 
d2f0: 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20   Column **paCol 
d300: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
d310: 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e  e the new column
d320: 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b   list here */.){
d330: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
d340: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
d350: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
d360: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
d370: 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
d380: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
d390: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
d3a0: 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20   cnt;           
d3b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
d3c0: 78 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20  x added to make 
d3d0: 74 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20  the name unique 
d3e0: 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  */.  Column *aCo
d3f0: 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20  l, *pCol;       
d400: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
d410: 6f 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75  over result colu
d420: 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  mns */.  int nCo
d430: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
d440: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
d450: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
d460: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
d470: 20 45 78 70 72 20 2a 70 3b 20 20 20 20 20 20 20   Expr *p;       
d480: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d490: 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 61  Expression for a
d4a0: 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63   single result c
d4b0: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20  olumn */.  char 
d4c0: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  *zName;         
d4d0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
d4e0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   name */.  int n
d4f0: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
d500: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
d510: 66 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b  f name in zName[
d520: 5d 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 4c 69  ] */..  if( pELi
d530: 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d  st ){.    nCol =
d540: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
d550: 20 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74      aCol = sqlit
d560: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
d570: 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30  b, sizeof(aCol[0
d580: 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65  ])*nCol);.    te
d590: 73 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20  stcase( aCol==0 
d5a0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
d5b0: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43  nCol = 0;.    aC
d5c0: 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70  ol = 0;.  }.  *p
d5d0: 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a  nCol = nCol;.  *
d5e0: 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20  paCol = aCol;.. 
d5f0: 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61   for(i=0, pCol=a
d600: 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  Col; i<nCol; i++
d610: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f  , pCol++){.    /
d620: 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72  * Get an appropr
d630: 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  iate name for th
d640: 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a  e column.    */.
d650: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45      p = sqlite3E
d660: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
d670: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
d680: 72 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e 61  r);.    if( (zNa
d690: 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  me = pEList->a[i
d6a0: 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  ].zName)!=0 ){. 
d6b0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63       /* If the c
d6c0: 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61  olumn contains a
d6d0: 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68  n "AS <name>" ph
d6e0: 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e  rase, use <name>
d6f0: 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a   as the name */.
d700: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
d710: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
d720: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  , zName);.    }e
d730: 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
d740: 2a 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20  *pColExpr = p;  
d750: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
d760: 6e 20 74 68 61 74 20 69 73 20 74 68 65 20 72 65  n that is the re
d770: 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  sult column name
d780: 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
d790: 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 2f  *pTab;         /
d7a0: 2a 20 54 61 62 6c 65 20 61 73 73 6f 63 69 61 74  * Table associat
d7b0: 65 64 20 77 69 74 68 20 74 68 69 73 20 65 78 70  ed with this exp
d7c0: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
d7d0: 20 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72   while( pColExpr
d7e0: 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a  ->op==TK_DOT ){.
d7f0: 20 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70 72          pColExpr
d800: 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69   = pColExpr->pRi
d810: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ght;.        ass
d820: 65 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d 30  ert( pColExpr!=0
d830: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
d840: 20 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e    if( pColExpr->
d850: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
d860: 20 41 4c 57 41 59 53 28 70 43 6f 6c 45 78 70 72   ALWAYS(pColExpr
d870: 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20  ->pTab!=0) ){.  
d880: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c        /* For col
d890: 75 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f 6c  umns use the col
d8a0: 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f  umn name name */
d8b0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
d8c0: 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43  l = pColExpr->iC
d8d0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70  olumn;.        p
d8e0: 54 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e  Tab = pColExpr->
d8f0: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69 66  pTab;.        if
d900: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
d910: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
d920: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73         zName = s
d930: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
d940: 2c 20 22 25 73 22 2c 0a 20 20 20 20 20 20 20 20  , "%s",.        
d950: 20 20 20 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30           iCol>=0
d960: 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   ? pTab->aCol[iC
d970: 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77  ol].zName : "row
d980: 69 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  id");.      }els
d990: 65 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e  e if( pColExpr->
d9a0: 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20  op==TK_ID ){.   
d9b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
d9c0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 43  prHasProperty(pC
d9d0: 6f 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  olExpr, EP_IntVa
d9e0: 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
d9f0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
da00: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c  Printf(db, "%s",
da10: 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f   pColExpr->u.zTo
da20: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ken);.      }els
da30: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73  e{.        /* Us
da40: 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74  e the original t
da50: 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ext of the colum
da60: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20  n expression as 
da70: 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  its name */.    
da80: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
da90: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
daa0: 25 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  %s", pEList->a[i
dab0: 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20  ].zSpan);.      
dac0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
dad0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
dae0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
daf0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
db00: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
db10: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
db20: 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c  ake sure the col
db30: 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71  umn name is uniq
db40: 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65  ue.  If the name
db50: 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a   is not unique,.
db60: 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 20      ** append a 
db70: 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e  integer to the n
db80: 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20 62  ame so that it b
db90: 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20  ecomes unique.. 
dba0: 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20     */.    nName 
dbb0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
dbc0: 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f  0(zName);.    fo
dbd0: 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20  r(j=cnt=0; j<i; 
dbe0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
dbf0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61  sqlite3StrICmp(a
dc00: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e  Col[j].zName, zN
dc10: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
dc20: 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d     char *zNewNam
dc30: 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b  e;.        int k
dc40: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d  ;.        for(k=
dc50: 6e 4e 61 6d 65 2d 31 3b 20 6b 3e 31 20 26 26 20  nName-1; k>1 && 
dc60: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a  sqlite3Isdigit(z
dc70: 4e 61 6d 65 5b 6b 5d 29 3b 20 6b 2d 2d 29 7b 7d  Name[k]); k--){}
dc80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3e 3d  .        if( k>=
dc90: 30 20 26 26 20 7a 4e 61 6d 65 5b 6b 5d 3d 3d 27  0 && zName[k]=='
dca0: 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6b 3b 0a  :' ) nName = k;.
dcb0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e          zName[nN
dcc0: 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  ame] = 0;.      
dcd0: 20 20 7a 4e 65 77 4e 61 6d 65 20 3d 20 73 71 6c    zNewName = sql
dce0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
dcf0: 22 25 73 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20  "%s:%d", zName, 
dd00: 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  ++cnt);.        
dd10: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
dd20: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
dd30: 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e 61    zName = zNewNa
dd40: 6d 65 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  me;.        j = 
dd50: 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  -1;.        if( 
dd60: 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b  zName==0 ) break
dd70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dd80: 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20      pCol->zName 
dd90: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69  = zName;.  }.  i
dda0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
ddb0: 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a  led ){.    for(j
ddc0: 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<i; j++){. 
ddd0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
dde0: 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a  ee(db, aCol[j].z
ddf0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
de00: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
de10: 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70  b, aCol);.    *p
de20: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70  aCol = 0;.    *p
de30: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65  nCol = 0;.    re
de40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
de50: 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  M;.  }.  return 
de60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
de70: 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64  .** Add type and
de80: 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72   collation infor
de90: 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75  mation to a colu
dea0: 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e  mn list based on
deb0: 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61  .** a SELECT sta
dec0: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54  tement..** .** T
ded0: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70  he column list p
dee0: 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66  resumably came f
def0: 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e  rom selectColumn
df00: 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73  NamesFromExprLis
df10: 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75  t()..** The colu
df20: 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79  mn list has only
df30: 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65   names, not type
df40: 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e  s or collations.
df50: 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
df60: 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61  e goes through a
df70: 6e 64 20 61 64 64 73 20 74 68 65 20 74 79 70 65  nd adds the type
df80: 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  s and collations
df90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
dfa0: 74 69 6e 65 20 72 65 71 75 69 72 65 73 20 74 68  tine requires th
dfb0: 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65  at all identifie
dfc0: 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54  rs in the SELECT
dfd0: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65  .** statement be
dfe0: 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73 74   resolved..*/.st
dff0: 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
e000: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
e010: 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72  Collation(.  Par
e020: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
e030: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
e040: 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c  ntexts */.  Tabl
e050: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
e060: 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20    /* Add column 
e070: 74 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  type information
e080: 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a   to this table *
e090: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
e0a0: 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c  ect       /* SEL
e0b0: 45 43 54 20 75 73 65 64 20 74 6f 20 64 65 74 65  ECT used to dete
e0c0: 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20  rmine types and 
e0d0: 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b  collations */.){
e0e0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
e0f0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e   pParse->db;.  N
e100: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
e110: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
e120: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
e130: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70  ;.  int i;.  Exp
e140: 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45  r *p;.  struct E
e150: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  xprList_item *a;
e160: 0a 20 20 75 36 34 20 73 7a 41 6c 6c 20 3d 20 30  .  u64 szAll = 0
e170: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 65  ;..  assert( pSe
e180: 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  lect!=0 );.  ass
e190: 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73  ert( (pSelect->s
e1a0: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73  elFlags & SF_Res
e1b0: 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61  olved)!=0 );.  a
e1c0: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f  ssert( pTab->nCo
e1d0: 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  l==pSelect->pELi
e1e0: 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d  st->nExpr || db-
e1f0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
e200: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
e210: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
e220: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c  ;.  memset(&sNC,
e230: 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
e240: 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74  ;.  sNC.pSrcList
e250: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63   = pSelect->pSrc
e260: 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d  ;.  a = pSelect-
e270: 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f  >pEList->a;.  fo
e280: 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62  r(i=0, pCol=pTab
e290: 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e  ->aCol; i<pTab->
e2a0: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
e2b0: 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d  +){.    p = a[i]
e2c0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 43 6f 6c  .pExpr;.    pCol
e2d0: 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65  ->zType = sqlite
e2e0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 63 6f  3DbStrDup(db, co
e2f0: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
e300: 2c 30 2c 30 2c 30 2c 20 26 70 43 6f 6c 2d 3e 73  ,0,0,0, &pCol->s
e310: 7a 45 73 74 29 29 3b 0a 20 20 20 20 73 7a 41 6c  zEst));.    szAl
e320: 6c 20 2b 3d 20 70 43 6f 6c 2d 3e 73 7a 45 73 74  l += pCol->szEst
e330: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69  ;.    pCol->affi
e340: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78  nity = sqlite3Ex
e350: 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20  prAffinity(p);. 
e360: 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66     if( pCol->aff
e370: 69 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d  inity==0 ) pCol-
e380: 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49  >affinity = SQLI
e390: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
e3a0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
e3b0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
e3c0: 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20  se, p);.    if( 
e3d0: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
e3e0: 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c  Col->zColl = sql
e3f0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
e400: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
e410: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62      }.  }.  pTab
e420: 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c  ->szTabRow = sql
e430: 69 74 65 33 4c 6f 67 45 73 74 28 73 7a 41 6c 6c  ite3LogEst(szAll
e440: 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  *4);.}../*.** Gi
e450: 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  ven a SELECT sta
e460: 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65  tement, generate
e470: 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
e480: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
e490: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
e4a0: 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45  set of that SELE
e4b0: 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  CT..*/.Table *sq
e4c0: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
e4d0: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
e4e0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
e4f0: 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20  elect){.  Table 
e500: 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  *pTab;.  sqlite3
e510: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
e520: 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c  b;.  int savedFl
e530: 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61  ags;..  savedFla
e540: 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a  gs = db->flags;.
e550: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
e560: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
e570: 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  mes;.  db->flags
e580: 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74   |= SQLITE_Short
e590: 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69  ColNames;.  sqli
e5a0: 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50  te3SelectPrep(pP
e5b0: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30  arse, pSelect, 0
e5c0: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
e5d0: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30  >nErr ) return 0
e5e0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  ;.  while( pSele
e5f0: 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  ct->pPrior ) pSe
e600: 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  lect = pSelect->
e610: 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c  pPrior;.  db->fl
e620: 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73  ags = savedFlags
e630: 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
e640: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
e650: 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
e660: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   );.  if( pTab==
e670: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
e680: 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20  0;.  }.  /* The 
e690: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
e6a0: 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e  OfSelect() is on
e6b0: 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78  ly used n contex
e6c0: 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69  ts where lookasi
e6d0: 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62  de.  ** is disab
e6e0: 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  led */.  assert(
e6f0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
e700: 45 6e 61 62 6c 65 64 3d 3d 30 20 29 3b 0a 20 20  Enabled==0 );.  
e710: 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  pTab->nRef = 1;.
e720: 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
e730: 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c  0;.  pTab->nRowL
e740: 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73  ogEst = 200; ass
e750: 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65  ert( 200==sqlite
e760: 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29  3LogEst(1048576)
e770: 20 29 3b 0a 20 20 73 65 6c 65 63 74 43 6f 6c 75   );.  selectColu
e780: 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
e790: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d  pParse, pSelect-
e7a0: 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e  >pEList, &pTab->
e7b0: 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f  nCol, &pTab->aCo
e7c0: 6c 29 3b 0a 20 20 73 65 6c 65 63 74 41 64 64 43  l);.  selectAddC
e7d0: 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c  olumnTypeAndColl
e7e0: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54  ation(pParse, pT
e7f0: 61 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  ab, pSelect);.  
e800: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
e810: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
e820: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
e830: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
e840: 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  le(db, pTab);.  
e850: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
e860: 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d    return pTab;.}
e870: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44  ../*.** Get a VD
e880: 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  BE for the given
e890: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e   parser context.
e8a0: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f    Create a new o
e8b0: 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
e8c0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
e8d0: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
e8e0: 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20  ULL and leave a 
e8f0: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
e900: 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69  e..*/.Vdbe *sqli
e910: 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73 65  te3GetVdbe(Parse
e920: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
e930: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
e940: 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30  Vdbe;.  if( v==0
e950: 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72   ){.    v = pPar
e960: 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69  se->pVdbe = sqli
e970: 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50  te3VdbeCreate(pP
e980: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
e990: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   ) sqlite3VdbeAd
e9a0: 64 4f 70 30 28 76 2c 20 4f 50 5f 49 6e 69 74 29  dOp0(v, OP_Init)
e9b0: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  ;.    if( pParse
e9c0: 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 0a 20  ->pToplevel==0. 
e9d0: 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74      && Optimizat
e9e0: 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61 72 73  ionEnabled(pPars
e9f0: 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 46 61 63  e->db,SQLITE_Fac
ea00: 74 6f 72 4f 75 74 43 6f 6e 73 74 29 0a 20 20 20  torOutConst).   
ea10: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
ea20: 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20  ->okConstFactor 
ea30: 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a  = 1;.    }..  }.
ea40: 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a    return v;.}...
ea50: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
ea60: 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  e iLimit and iOf
ea70: 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74  fset fields of t
ea80: 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20  he SELECT based 
ea90: 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74  on the.** pLimit
eaa0: 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70   and pOffset exp
eab0: 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69  ressions.  pLimi
eac0: 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 68 6f  t and pOffset ho
ead0: 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ld the expressio
eae0: 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61  ns.** that appea
eaf0: 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  r in the origina
eb00: 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  l SQL statement 
eb10: 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20  after the LIMIT 
eb20: 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65  and OFFSET.** ke
eb30: 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c  ywords.  Or NULL
eb40: 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72   if those keywor
eb50: 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20  ds are omitted. 
eb60: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
eb70: 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69  et .** are the i
eb80: 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65  nteger memory re
eb90: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66  gister numbers f
eba0: 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  or counters used
ebb0: 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20   to compute .** 
ebc0: 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66  the limit and of
ebd0: 66 73 65 74 2e 20 20 49 66 20 74 68 65 72 65 20  fset.  If there 
ebe0: 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f  is no limit and/
ebf0: 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20  or offset, then 
ec00: 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  .** iLimit and i
ec10: 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67 61 74  Offset are negat
ec20: 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ive..**.** This 
ec30: 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20  routine changes 
ec40: 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c  the values of iL
ec50: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
ec60: 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69   only if.** a li
ec70: 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73  mit or offset is
ec80: 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d   defined by pLim
ec90: 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 2e 20  it and pOffset. 
eca0: 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69   iLimit and.** i
ecb0: 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61  Offset should ha
ecc0: 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74  ve been preset t
ecd0: 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65  o appropriate de
ece0: 66 61 75 6c 74 20 76 61 6c 75 65 73 20 28 7a 65  fault values (ze
ecf0: 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20  ro).** prior to 
ed00: 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
ed10: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tine..**.** The 
ed20: 69 4f 66 66 73 65 74 20 72 65 67 69 73 74 65 72  iOffset register
ed30: 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20   (if it exists) 
ed40: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
ed50: 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f  o the value.** o
ed60: 66 20 74 68 65 20 4f 46 46 53 45 54 2e 20 20 54  f the OFFSET.  T
ed70: 68 65 20 69 4c 69 6d 69 74 20 72 65 67 69 73 74  he iLimit regist
ed80: 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
ed90: 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67  d to LIMIT.  Reg
eda0: 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74  ister.** iOffset
edb0: 2b 31 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  +1 is initialize
edc0: 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45  d to LIMIT+OFFSE
edd0: 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66  T..**.** Only if
ede0: 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f   pLimit!=0 or pO
edf0: 66 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20  ffset!=0 do the 
ee00: 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20  limit registers 
ee10: 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64  get.** redefined
ee20: 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  .  The UNION ALL
ee30: 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74   operator uses t
ee40: 68 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20  his property to 
ee50: 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75  force.** the reu
ee60: 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c  se of the same l
ee70: 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20  imit and offset 
ee80: 72 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73  registers across
ee90: 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c   multiple.** SEL
eea0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
eeb0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
eec0: 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
eed0: 74 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72  ters(Parse *pPar
eee0: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
eef0: 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64  nt iBreak){.  Vd
ef00: 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74  be *v = 0;.  int
ef10: 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69   iLimit = 0;.  i
ef20: 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e  nt iOffset;.  in
ef30: 74 20 61 64 64 72 31 2c 20 6e 3b 0a 20 20 69 66  t addr1, n;.  if
ef40: 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65  ( p->iLimit ) re
ef50: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  turn;..  /* .  *
ef60: 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77  * "LIMIT -1" alw
ef70: 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f  ays shows all ro
ef80: 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f  ws.  There is so
ef90: 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65  me.  ** controve
efa0: 72 73 79 20 61 62 6f 75 74 20 77 68 61 74 20 74  rsy about what t
efb0: 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76  he correct behav
efc0: 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20  ior should be.. 
efd0: 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   ** The current 
efe0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
eff0: 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54  nterprets "LIMIT
f000: 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a   0" to mean.  **
f010: 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20   no rows..  */. 
f020: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
f030: 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
f040: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66    assert( p->pOf
f050: 66 73 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c  fset==0 || p->pL
f060: 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69 66 28  imit!=0 );.  if(
f070: 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20   p->pLimit ){.  
f080: 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c    p->iLimit = iL
f090: 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  imit = ++pParse-
f0a0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73  >nMem;.    v = s
f0b0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
f0c0: 61 72 73 65 29 3b 0a 20 20 20 20 61 73 73 65 72  arse);.    asser
f0d0: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 20 20 69  t( v!=0 );.    i
f0e0: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
f0f0: 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 69 6d 69  Integer(p->pLimi
f100: 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20  t, &n) ){.      
f110: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f120: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
f130: 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20   n, iLimit);.   
f140: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
f150: 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65  v, "LIMIT counte
f160: 72 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  r"));.      if( 
f170: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
f180: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f190: 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
f1a0: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
f1b0: 7d 65 6c 73 65 20 69 66 28 20 6e 3e 3d 30 20 26  }else if( n>=0 &
f1c0: 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e  & p->nSelectRow>
f1d0: 28 75 36 34 29 6e 20 29 7b 0a 20 20 20 20 20 20  (u64)n ){.      
f1e0: 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
f1f0: 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = n;.      }.   
f200: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
f210: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
f220: 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c  arse, p->pLimit,
f230: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
f240: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f250: 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  1(v, OP_MustBeIn
f260: 74 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64 62 65  t, iLimit); Vdbe
f270: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
f280: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
f290: 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65  v, "LIMIT counte
f2a0: 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r"));.      sqli
f2b0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f2c0: 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69 6d   OP_IfZero, iLim
f2d0: 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  it, iBreak); Vdb
f2e0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
f2f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 70    }.    if( p->p
f300: 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Offset ){.      
f310: 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66  p->iOffset = iOf
f320: 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  fset = ++pParse-
f330: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61  >nMem;.      pPa
f340: 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f  rse->nMem++;   /
f350: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78  * Allocate an ex
f360: 74 72 61 20 72 65 67 69 73 74 65 72 20 66 6f 72  tra register for
f370: 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f   limit+offset */
f380: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
f390: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
f3a0: 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66 66 73  ->pOffset, iOffs
f3b0: 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
f3c0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
f3d0: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f  OP_MustBeInt, iO
f3e0: 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65  ffset); VdbeCove
f3f0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56  rage(v);.      V
f400: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
f410: 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29  OFFSET counter")
f420: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d  );.      addr1 =
f430: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f440: 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p1(v, OP_IfPos, 
f450: 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f  iOffset); VdbeCo
f460: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
f470: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f480: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
f490: 2c 20 30 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  , 0, iOffset);. 
f4a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f4b0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
f4c0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
f4d0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
f4e0: 50 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c 20 69  P_Add, iLimit, i
f4f0: 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 2b  Offset, iOffset+
f500: 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
f510: 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
f520: 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20  +OFFSET"));.    
f530: 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
f540: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
f550: 50 5f 49 66 50 6f 73 2c 20 69 4c 69 6d 69 74 29  P_IfPos, iLimit)
f560: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
f570: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f580: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f590: 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 69 4f  _Integer, -1, iO
f5a0: 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20  ffset+1);.      
f5b0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
f5c0: 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
f5d0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e     }.  }.}..#ifn
f5e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f5f0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
f600: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
f610: 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c   appropriate col
f620: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
f630: 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20  for the iCol-th 
f640: 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65  column of.** the
f650: 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20   result set for 
f660: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c  the compound-sel
f670: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70  ect statement "p
f680: 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  ".  Return NULL 
f690: 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  if.** the column
f6a0: 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20   has no default 
f6b0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
f6c0: 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ce..**.** The co
f6d0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
f6e0: 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e   for the compoun
f6f0: 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65  d select is take
f700: 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65  n from the.** le
f710: 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20  ft-most term of 
f720: 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74 20  the select that 
f730: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
f740: 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61  sequence..*/.sta
f750: 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c  tic CollSeq *mul
f760: 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
f770: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
f780: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43  elect *p, int iC
f790: 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ol){.  CollSeq *
f7a0: 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  pRet;.  if( p->p
f7b0: 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65  Prior ){.    pRe
f7c0: 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  t = multiSelectC
f7d0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
f7e0: 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b  ->pPrior, iCol);
f7f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52  .  }else{.    pR
f800: 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  et = 0;.  }.  as
f810: 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b  sert( iCol>=0 );
f820: 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 26  .  if( pRet==0 &
f830: 26 20 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74  & iCol<p->pEList
f840: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 70  ->nExpr ){.    p
f850: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Ret = sqlite3Exp
f860: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
f870: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43   p->pEList->a[iC
f880: 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  ol].pExpr);.  }.
f890: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
f8a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65  ../*.** The sele
f8b0: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
f8c0: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
f8d0: 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  d parameter is a
f8e0: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
f8f0: 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52 44 45  .** with an ORDE
f900: 52 20 42 59 20 63 6c 61 75 73 65 2e 20 54 68 69  R BY clause. Thi
f910: 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  s function alloc
f920: 61 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73  ates and returns
f930: 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73 74   a KeyInfo.** st
f940: 72 75 63 74 75 72 65 20 73 75 69 74 61 62 6c 65  ructure suitable
f950: 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e   for implementin
f960: 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a  g the ORDER BY..
f970: 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
f980: 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  old the KeyInfo 
f990: 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74  structure is obt
f9a0: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
f9b0: 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  c. The calling.*
f9c0: 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  * function is re
f9d0: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e  sponsible for en
f9e0: 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 69 73  suring that this
f9f0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76   structure is ev
fa00: 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65  entually.** free
fa10: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79  d..*/.static Key
fa20: 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c 65 63  Info *multiSelec
fa30: 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28  tOrderByKeyInfo(
fa40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
fa50: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 6e 45  elect *p, int nE
fa60: 78 74 72 61 29 7b 0a 20 20 45 78 70 72 4c 69 73  xtra){.  ExprLis
fa70: 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  t *pOrderBy = p-
fa80: 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74  >pOrderBy;.  int
fa90: 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   nOrderBy = p->p
faa0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
fab0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
fac0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65  pParse->db;.  Ke
fad0: 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20 73 71  yInfo *pRet = sq
fae0: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
faf0: 63 28 64 62 2c 20 6e 4f 72 64 65 72 42 79 2b 6e  c(db, nOrderBy+n
fb00: 45 78 74 72 61 2c 20 31 29 3b 0a 20 20 69 66 28  Extra, 1);.  if(
fb10: 20 70 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74   pRet ){.    int
fb20: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
fb30: 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
fb40: 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
fb50: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
fb60: 49 74 65 6d 20 3d 20 26 70 4f 72 64 65 72 42 79  Item = &pOrderBy
fb70: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 45 78  ->a[i];.      Ex
fb80: 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 49 74 65  pr *pTerm = pIte
fb90: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
fba0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
fbb0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
fbc0: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
fbd0: 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  late ){.        
fbe0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
fbf0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
fc00: 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20  e, pTerm);.     
fc10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
fc20: 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c  pColl = multiSel
fc30: 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
fc40: 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75 2e 78  e, p, pItem->u.x
fc50: 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 29 3b  .iOrderByCol-1);
fc60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
fc70: 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20  ll==0 ) pColl = 
fc80: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
fc90: 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d         pOrderBy-
fca0: 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20  >a[i].pExpr =.  
fcb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
fcc0: 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72  xprAddCollateStr
fcd0: 69 6e 67 28 70 50 61 72 73 65 2c 20 70 54 65 72  ing(pParse, pTer
fce0: 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  m, pColl->zName)
fcf0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
fd00: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
fd10: 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
fd20: 65 28 70 52 65 74 29 20 29 3b 0a 20 20 20 20 20  e(pRet) );.     
fd30: 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20   pRet->aColl[i] 
fd40: 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70  = pColl;.      p
fd50: 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Ret->aSortOrder[
fd60: 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  i] = pOrderBy->a
fd70: 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [i].sortOrder;. 
fd80: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
fd90: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e  rn pRet;.}..#ifn
fda0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fdb0: 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  CTE./*.** This r
fdc0: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
fdd0: 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 63 6f   VDBE code to co
fde0: 6d 70 75 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  mpute the conten
fdf0: 74 20 6f 66 20 61 20 57 49 54 48 20 52 45 43 55  t of a WITH RECU
fe00: 52 53 49 56 45 0a 2a 2a 20 71 75 65 72 79 20 6f  RSIVE.** query o
fe10: 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
fe20: 2a 20 20 20 3c 72 65 63 75 72 73 69 76 65 2d 74  *   <recursive-t
fe30: 61 62 6c 65 3e 20 41 53 20 28 3c 73 65 74 75 70  able> AS (<setup
fe40: 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20 5b 41  -query> UNION [A
fe50: 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76 65 2d 71  LL] <recursive-q
fe60: 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20 20 20  uery>).**       
fe70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe80: 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20    \___________/ 
fe90: 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
fea0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a  ____________/.**
feb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fec0: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50             p->pP
fed0: 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20  rior            
fee0: 20 20 20 20 20 20 20 20 20 20 70 0a 2a 2a 0a 2a            p.**.*
fef0: 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 65 78  *.** There is ex
ff00: 61 63 74 6c 79 20 6f 6e 65 20 72 65 66 65 72 65  actly one refere
ff10: 6e 63 65 20 74 6f 20 74 68 65 20 72 65 63 75 72  nce to the recur
ff20: 73 69 76 65 2d 74 61 62 6c 65 20 69 6e 20 74 68  sive-table in th
ff30: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a  e FROM clause.**
ff40: 20 6f 66 20 72 65 63 75 72 73 69 76 65 2d 71 75   of recursive-qu
ff50: 65 72 79 2c 20 6d 61 72 6b 65 64 20 77 69 74 68  ery, marked with
ff60: 20 74 68 65 20 53 72 63 4c 69 73 74 2d 3e 61 5b   the SrcList->a[
ff70: 5d 2e 69 73 52 65 63 75 72 73 69 76 65 20 66 6c  ].isRecursive fl
ff80: 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  ag..**.** The se
ff90: 74 75 70 2d 71 75 65 72 79 20 72 75 6e 73 20 6f  tup-query runs o
ffa0: 6e 63 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20  nce to generate 
ffb0: 61 6e 20 69 6e 69 74 69 61 6c 20 73 65 74 20 6f  an initial set o
ffc0: 66 20 72 6f 77 73 20 74 68 61 74 20 67 6f 0a 2a  f rows that go.*
ffd0: 2a 20 69 6e 74 6f 20 61 20 51 75 65 75 65 20 74  * into a Queue t
ffe0: 61 62 6c 65 2e 20 20 52 6f 77 73 20 61 72 65 20  able.  Rows are 
fff0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
10000 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 6f  he Queue table o
10010 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45  ne by.** one.  E
10020 61 63 68 20 72 6f 77 20 65 78 74 72 61 63 74 65  ach row extracte
10030 64 20 66 72 6f 6d 20 51 75 65 75 65 20 69 73 20  d from Queue is 
10040 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e  output to pDest.
10050 20 20 54 68 65 6e 20 74 68 65 20 73 69 6e 67 6c    Then the singl
10060 65 0a 2a 2a 20 65 78 74 72 61 63 74 65 64 20 72  e.** extracted r
10070 6f 77 20 28 6e 6f 77 20 69 6e 20 74 68 65 20 69  ow (now in the i
10080 43 75 72 72 65 6e 74 20 74 61 62 6c 65 29 20 62  Current table) b
10090 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e 74 65  ecomes the conte
100a0 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63  nt of the.** rec
100b0 75 72 73 69 76 65 2d 74 61 62 6c 65 20 66 6f 72  ursive-table for
100c0 20 61 20 72 65 63 75 72 73 69 76 65 2d 71 75 65   a recursive-que
100d0 72 79 20 72 75 6e 2e 20 20 54 68 65 20 6f 75 74  ry run.  The out
100e0 70 75 74 20 6f 66 20 74 68 65 20 72 65 63 75 72  put of the recur
100f0 73 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20 69 73  sive-query.** is
10100 20 61 64 64 65 64 20 62 61 63 6b 20 69 6e 74 6f   added back into
10110 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
10120 2e 20 20 54 68 65 6e 20 61 6e 6f 74 68 65 72 20  .  Then another 
10130 72 6f 77 20 69 73 20 65 78 74 72 61 63 74 65 64  row is extracted
10140 20 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a 20 61   from Queue.** a
10150 6e 64 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e  nd the iteration
10160 20 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74 69 6c   continues until
10170 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
10180 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a   is empty..**.**
10190 20 49 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   If the compound
101a0 20 71 75 65 72 79 20 6f 70 65 72 61 74 6f 72 20   query operator 
101b0 69 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f  is UNION then no
101c0 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77 73 20   duplicate rows 
101d0 61 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e 73 65  are ever.** inse
101e0 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 51 75  rted into the Qu
101f0 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  eue table.  The 
10200 69 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20  iDistinct table 
10210 6b 65 65 70 73 20 61 20 63 6f 70 79 20 6f 66 20  keeps a copy of 
10220 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68 61 74  all rows.** that
10230 20 68 61 76 65 20 65 76 65 72 20 62 65 65 6e 20   have ever been 
10240 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 51 75  inserted into Qu
10250 65 75 65 20 61 6e 64 20 63 61 75 73 65 73 20 64  eue and causes d
10260 75 70 6c 69 63 61 74 65 73 20 74 6f 20 62 65 0a  uplicates to be.
10270 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20 20 49  ** discarded.  I
10280 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 69  f the operator i
10290 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74 68 65  s UNION ALL, the
102a0 6e 20 64 75 70 6c 69 63 61 74 65 73 20 61 72 65  n duplicates are
102b0 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a   allowed..** .**
102c0 20 49 66 20 74 68 65 20 71 75 65 72 79 20 68 61   If the query ha
102d0 73 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74  s an ORDER BY, t
102e0 68 65 6e 20 65 6e 74 72 69 65 73 20 69 6e 20 74  hen entries in t
102f0 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 61  he Queue table a
10300 72 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20 4f 52  re kept in.** OR
10310 44 45 52 20 42 59 20 6f 72 64 65 72 20 61 6e 64  DER BY order and
10320 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
10330 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 6f   is extracted fo
10340 72 20 65 61 63 68 20 63 79 63 6c 65 2e 20 20 57  r each cycle.  W
10350 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f 52 44  ithout.** an ORD
10360 45 52 20 42 59 2c 20 74 68 65 20 51 75 65 75 65  ER BY, the Queue
10370 20 74 61 62 6c 65 20 69 73 20 6a 75 73 74 20 61   table is just a
10380 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   FIFO..**.** If 
10390 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 69  a LIMIT clause i
103a0 73 20 70 72 6f 76 69 64 65 64 2c 20 74 68 65 6e  s provided, then
103b0 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20 73   the iteration s
103c0 74 6f 70 73 20 61 66 74 65 72 20 4c 49 4d 49 54  tops after LIMIT
103d0 20 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20 62 65   rows.** have be
103e0 65 6e 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65  en output to pDe
103f0 73 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f 66 20  st.  A LIMIT of 
10400 7a 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20 6f 75  zero means to ou
10410 74 70 75 74 20 6e 6f 20 72 6f 77 73 20 61 6e 64  tput no rows and
10420 20 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 4c   a.** negative L
10430 49 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20 6f 75  IMIT means to ou
10440 74 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e 20 20  tput all rows.  
10450 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 73 6f  If there is also
10460 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73   an OFFSET claus
10470 65 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f 73 69  e.** with a posi
10480 74 69 76 65 20 76 61 6c 75 65 2c 20 74 68 65 6e  tive value, then
10490 20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45   the first OFFSE
104a0 54 20 6f 75 74 70 75 74 73 20 61 72 65 20 64 69  T outputs are di
104b0 73 63 61 72 64 65 64 20 72 61 74 68 65 72 0a 2a  scarded rather.*
104c0 2a 20 74 68 61 6e 20 62 65 69 6e 67 20 73 65 6e  * than being sen
104d0 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65  t to pDest.  The
104e0 20 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64 6f 65   LIMIT count doe
104f0 73 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e 74 69  s not begin unti
10500 6c 20 61 66 74 65 72 20 4f 46 46 53 45 54 0a 2a  l after OFFSET.*
10510 2a 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e  * rows have been
10520 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61   skipped..*/.sta
10530 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
10540 65 57 69 74 68 52 65 63 75 72 73 69 76 65 51 75  eWithRecursiveQu
10550 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ery(.  Parse *pP
10560 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
10570 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
10580 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
10590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
105a0 65 20 72 65 63 75 72 73 69 76 65 20 53 45 4c 45  e recursive SELE
105b0 43 54 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  CT to be coded *
105c0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
105d0 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
105e0 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
105f0 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
10600 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
10610 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20 20 20   = p->pSrc;     
10620 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
10630 75 73 65 20 6f 66 20 74 68 65 20 72 65 63 75 72  use of the recur
10640 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20  sive query */.  
10650 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45  int nCol = p->pE
10660 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a  List->nExpr;  /*
10670 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
10680 6e 73 20 69 6e 20 74 68 65 20 72 65 63 75 72 73  ns in the recurs
10690 69 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 56  ive table */.  V
106a0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
106b0 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20  >pVdbe;      /* 
106c0 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
106d0 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e  tement under con
106e0 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 53  struction */.  S
106f0 65 6c 65 63 74 20 2a 70 53 65 74 75 70 20 3d 20  elect *pSetup = 
10700 70 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f 2a 20  p->pPrior;   /* 
10710 54 68 65 20 73 65 74 75 70 20 71 75 65 72 79 20  The setup query 
10720 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70  */.  int addrTop
10730 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10740 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
10750 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61   loop */.  int a
10760 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65  ddrCont, addrBre
10770 61 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f 4e 54  ak;      /* CONT
10780 49 4e 55 45 20 61 6e 64 20 42 52 45 41 4b 20 61  INUE and BREAK a
10790 64 64 72 65 73 73 65 73 20 2a 2f 0a 20 20 69 6e  ddresses */.  in
107a0 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 20  t iCurrent = 0; 
107b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
107c0 68 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65  he Current table
107d0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43 75 72   */.  int regCur
107e0 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  rent;           
107f0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
10800 68 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e 74 20  holding Current 
10810 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
10820 51 75 65 75 65 3b 20 20 20 20 20 20 20 20 20 20  Queue;          
10830 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10840 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20  Queue table */. 
10850 20 69 6e 74 20 69 44 69 73 74 69 6e 63 74 20 3d   int iDistinct =
10860 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
10870 2a 20 54 6f 20 65 6e 73 75 72 65 20 75 6e 69 71  * To ensure uniq
10880 75 65 20 72 65 73 75 6c 74 73 20 69 66 20 55 4e  ue results if UN
10890 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65  ION */.  int eDe
108a0 73 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b 20 20  st = SRT_Fifo;  
108b0 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f         /* How to
108c0 20 77 72 69 74 65 20 74 6f 20 51 75 65 75 65 20   write to Queue 
108d0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
108e0 64 65 73 74 51 75 65 75 65 3b 20 20 20 20 20 20  destQueue;      
108f0 20 20 20 2f 2a 20 53 65 6c 65 63 74 44 65 73 74     /* SelectDest
10900 20 74 61 72 67 65 74 74 69 6e 67 20 74 68 65 20   targetting the 
10910 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20  Queue table */. 
10920 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
10930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10940 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
10950 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
10960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10970 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
10980 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
10990 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  pOrderBy;       
109a0 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
109b0 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
109c0 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70  Expr *pLimit, *p
109d0 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a  Offset;       /*
109e0 20 53 61 76 65 64 20 4c 49 4d 49 54 20 61 6e 64   Saved LIMIT and
109f0 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 6e 74   OFFSET */.  int
10a00 20 72 65 67 4c 69 6d 69 74 2c 20 72 65 67 4f 66   regLimit, regOf
10a10 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 52 65  fset;      /* Re
10a20 67 69 73 74 65 72 73 20 75 73 65 64 20 62 79 20  gisters used by 
10a30 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
10a40 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e   */..  /* Obtain
10a50 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74   authorization t
10a60 6f 20 64 6f 20 61 20 72 65 63 75 72 73 69 76 65  o do a recursive
10a70 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20   query */.  if( 
10a80 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
10a90 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
10aa0 52 45 43 55 52 53 49 56 45 2c 20 30 2c 20 30 2c  RECURSIVE, 0, 0,
10ab0 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20   0) ) return;.. 
10ac0 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20   /* Process the 
10ad0 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
10ae0 20 63 6c 61 75 73 65 73 2c 20 69 66 20 74 68 65   clauses, if the
10af0 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 61 64 64  y exist */.  add
10b00 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  rBreak = sqlite3
10b10 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
10b20 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  ;.  computeLimit
10b30 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
10b40 2c 20 70 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  , p, addrBreak);
10b50 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  .  pLimit = p->p
10b60 4c 69 6d 69 74 3b 0a 20 20 70 4f 66 66 73 65 74  Limit;.  pOffset
10b70 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
10b80 20 72 65 67 4c 69 6d 69 74 20 3d 20 70 2d 3e 69   regLimit = p->i
10b90 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4f 66 66 73  Limit;.  regOffs
10ba0 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b  et = p->iOffset;
10bb0 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  .  p->pLimit = p
10bc0 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
10bd0 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e   p->iLimit = p->
10be0 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70  iOffset = 0;.  p
10bf0 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
10c00 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63  derBy;..  /* Loc
10c10 61 74 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e  ate the cursor n
10c20 75 6d 62 65 72 20 6f 66 20 74 68 65 20 43 75 72  umber of the Cur
10c30 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  rent table */.  
10c40 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59 53 28  for(i=0; ALWAYS(
10c50 69 3c 70 53 72 63 2d 3e 6e 53 72 63 29 3b 20 69  i<pSrc->nSrc); i
10c60 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 53 72  ++){.    if( pSr
10c70 63 2d 3e 61 5b 69 5d 2e 69 73 52 65 63 75 72 73  c->a[i].isRecurs
10c80 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 43 75  ive ){.      iCu
10c90 72 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b  rrent = pSrc->a[
10ca0 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  i].iCursor;.    
10cb0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
10cc0 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
10cd0 65 20 63 75 72 73 6f 72 73 20 6e 75 6d 62 65 72  e cursors number
10ce0 73 20 66 6f 72 20 51 75 65 75 65 20 61 6e 64 20  s for Queue and 
10cf0 44 69 73 74 69 6e 63 74 2e 20 20 54 68 65 20 63  Distinct.  The c
10d00 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
10d10 0a 20 20 2a 2a 20 74 68 65 20 44 69 73 74 69 6e  .  ** the Distin
10d20 63 74 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  ct table must be
10d30 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 67 72 65   exactly one gre
10d40 61 74 65 72 20 74 68 61 6e 20 51 75 65 75 65 20  ater than Queue 
10d50 69 6e 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f  in order.  ** fo
10d60 72 20 74 68 65 20 53 52 54 5f 44 69 73 74 46 69  r the SRT_DistFi
10d70 66 6f 20 61 6e 64 20 53 52 54 5f 44 69 73 74 51  fo and SRT_DistQ
10d80 75 65 75 65 20 64 65 73 74 69 6e 61 74 69 6f 6e  ueue destination
10d90 73 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20  s to work. */.  
10da0 69 51 75 65 75 65 20 3d 20 70 50 61 72 73 65 2d  iQueue = pParse-
10db0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70  >nTab++;.  if( p
10dc0 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
10dd0 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f  {.    eDest = pO
10de0 72 64 65 72 42 79 20 3f 20 53 52 54 5f 44 69 73  rderBy ? SRT_Dis
10df0 74 51 75 65 75 65 20 3a 20 53 52 54 5f 44 69 73  tQueue : SRT_Dis
10e00 74 46 69 66 6f 3b 0a 20 20 20 20 69 44 69 73 74  tFifo;.    iDist
10e10 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  inct = pParse->n
10e20 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Tab++;.  }else{.
10e30 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64      eDest = pOrd
10e40 65 72 42 79 20 3f 20 53 52 54 5f 51 75 65 75 65  erBy ? SRT_Queue
10e50 20 3a 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d   : SRT_Fifo;.  }
10e60 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
10e70 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 51 75  DestInit(&destQu
10e80 65 75 65 2c 20 65 44 65 73 74 2c 20 69 51 75 65  eue, eDest, iQue
10e90 75 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  ue);..  /* Alloc
10ea0 61 74 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20  ate cursors for 
10eb0 43 75 72 72 65 6e 74 2c 20 51 75 65 75 65 2c 20  Current, Queue, 
10ec0 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f  and Distinct. */
10ed0 0a 20 20 72 65 67 43 75 72 72 65 6e 74 20 3d 20  .  regCurrent = 
10ee0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
10ef0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10f00 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73  Op3(v, OP_OpenPs
10f10 65 75 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20  eudo, iCurrent, 
10f20 72 65 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c  regCurrent, nCol
10f30 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  );.  if( pOrderB
10f40 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  y ){.    KeyInfo
10f50 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c   *pKeyInfo = mul
10f60 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b  tiSelectOrderByK
10f70 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
10f80 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
10f90 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
10fa0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
10fb0 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42   iQueue, pOrderB
10fc0 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20  y->nExpr+2, 0,. 
10fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fe0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
10ff0 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
11000 29 3b 0a 20 20 20 20 64 65 73 74 51 75 65 75 65  );.    destQueue
11010 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  .pOrderBy = pOrd
11020 65 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  erBy;.  }else{. 
11030 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11040 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
11050 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65  phemeral, iQueue
11060 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56  , nCol);.  }.  V
11070 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
11080 51 75 65 75 65 20 74 61 62 6c 65 22 29 29 3b 0a  Queue table"));.
11090 20 20 69 66 28 20 69 44 69 73 74 69 6e 63 74 20    if( iDistinct 
110a0 29 7b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  ){.    p->addrOp
110b0 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69  enEphm[0] = sqli
110c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
110d0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
110e0 6c 2c 20 69 44 69 73 74 69 6e 63 74 2c 20 30 29  l, iDistinct, 0)
110f0 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  ;.    p->selFlag
11100 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65  s |= SF_UsesEphe
11110 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  meral;.  }..  /*
11120 20 44 65 74 61 63 68 20 74 68 65 20 4f 52 44 45   Detach the ORDE
11130 52 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d  R BY clause from
11140 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45   the compound SE
11150 4c 45 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72  LECT */.  p->pOr
11160 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a  derBy = 0;..  /*
11170 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
11180 74 73 20 6f 66 20 74 68 65 20 73 65 74 75 70 2d  ts of the setup-
11190 71 75 65 72 79 20 69 6e 20 51 75 65 75 65 2e 20  query in Queue. 
111a0 2a 2f 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65  */.  pSetup->pNe
111b0 78 74 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73  xt = 0;.  rc = s
111c0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
111d0 72 73 65 2c 20 70 53 65 74 75 70 2c 20 26 64 65  rse, pSetup, &de
111e0 73 74 51 75 65 75 65 29 3b 0a 20 20 70 53 65 74  stQueue);.  pSet
111f0 75 70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20  up->pNext = p;. 
11200 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
11210 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f  nd_of_recursive_
11220 71 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e  query;..  /* Fin
11230 64 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69  d the next row i
11240 6e 20 74 68 65 20 51 75 65 75 65 20 61 6e 64 20  n the Queue and 
11250 6f 75 74 70 75 74 20 74 68 61 74 20 72 6f 77 20  output that row 
11260 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73  */.  addrTop = s
11270 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11280 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
11290 51 75 65 75 65 2c 20 61 64 64 72 42 72 65 61 6b  Queue, addrBreak
112a0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
112b0 76 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66  v);..  /* Transf
112c0 65 72 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20  er the next row 
112d0 69 6e 20 51 75 65 75 65 20 6f 76 65 72 20 74 6f  in Queue over to
112e0 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 73 71   Current */.  sq
112f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
11300 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69  v, OP_NullRow, i
11310 43 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54 6f 20  Current); /* To 
11320 72 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63 61 63  reset column cac
11330 68 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  he */.  if( pOrd
11340 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  erBy ){.    sqli
11350 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
11360 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75 65   OP_Column, iQue
11370 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ue, pOrderBy->nE
11380 78 70 72 2b 31 2c 20 72 65 67 43 75 72 72 65 6e  xpr+1, regCurren
11390 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
113a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
113b0 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61  p2(v, OP_RowData
113c0 2c 20 69 51 75 65 75 65 2c 20 72 65 67 43 75 72  , iQueue, regCur
113d0 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  rent);.  }.  sql
113e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
113f0 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 51 75  , OP_Delete, iQu
11400 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70  eue);..  /* Outp
11410 75 74 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f  ut the single ro
11420 77 20 69 6e 20 43 75 72 72 65 6e 74 20 2a 2f 0a  w in Current */.
11430 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c    addrCont = sql
11440 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
11450 6c 28 76 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73  l(v);.  codeOffs
11460 65 74 28 76 2c 20 72 65 67 4f 66 66 73 65 74 2c  et(v, regOffset,
11470 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65   addrCont);.  se
11480 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
11490 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
114a0 73 74 2c 20 69 43 75 72 72 65 6e 74 2c 0a 20 20  st, iCurrent,.  
114b0 20 20 20 20 30 2c 20 30 2c 20 70 44 65 73 74 2c      0, 0, pDest,
114c0 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42   addrCont, addrB
114d0 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 72 65 67  reak);.  if( reg
114e0 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
114f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
11500 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 72 65 67  , OP_IfZero, reg
11510 4c 69 6d 69 74 2c 20 61 64 64 72 42 72 65 61 6b  Limit, addrBreak
11520 2c 20 2d 31 29 3b 0a 20 20 20 20 56 64 62 65 43  , -1);.    VdbeC
11530 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
11540 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
11550 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
11560 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20 45 78  rCont);..  /* Ex
11570 65 63 75 74 65 20 74 68 65 20 72 65 63 75 72 73  ecute the recurs
11580 69 76 65 20 53 45 4c 45 43 54 20 74 61 6b 69 6e  ive SELECT takin
11590 67 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77  g the single row
115a0 20 69 6e 20 43 75 72 72 65 6e 74 20 61 73 0a 20   in Current as. 
115b0 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 66 6f   ** the value fo
115c0 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65 2d  r the recursive-
115d0 74 61 62 6c 65 2e 20 53 74 6f 72 65 20 74 68 65  table. Store the
115e0 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
115f0 51 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20 70 2d  Queue..  */.  p-
11600 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 73  >pPrior = 0;.  s
11610 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
11620 72 73 65 2c 20 70 2c 20 26 64 65 73 74 51 75 65  rse, p, &destQue
11630 75 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ue);.  assert( p
11640 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20  ->pPrior==0 );. 
11650 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 53 65   p->pPrior = pSe
11660 74 75 70 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70 20  tup;..  /* Keep 
11670 72 75 6e 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 70  running the loop
11680 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65   until the Queue
11690 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 73   is empty */.  s
116a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
116b0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
116c0 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69  addrTop);.  sqli
116d0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
116e0 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b  bel(v, addrBreak
116f0 29 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63 75 72  );..end_of_recur
11700 73 69 76 65 5f 71 75 65 72 79 3a 0a 20 20 73 71  sive_query:.  sq
11710 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
11720 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
11730 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
11740 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
11750 72 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69  rderBy;.  p->pLi
11760 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
11770 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
11780 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  fset;.  return;.
11790 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
117a0 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a  TE_OMIT_CTE */..
117b0 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
117c0 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69 63 20  ences */.static 
117d0 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  int multiSelectO
117e0 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
117f0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
11800 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
11810 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
11820 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
11830 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
11840 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
11850 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
11860 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
11870 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
11880 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
11890 74 73 20 2a 2f 0a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a  ts */.);.../*.**
118a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
118b0 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65   called to proce
118c0 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  ss a compound qu
118d0 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a  ery form from.**
118e0 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70   two or more sep
118f0 61 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73  arate queries us
11900 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e  ing UNION, UNION
11910 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72   ALL, EXCEPT, or
11920 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a  .** INTERSECT.**
11930 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74  .** "p" points t
11940 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
11950 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72   of the two quer
11960 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20  ies.  the query 
11970 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69  on the.** left i
11980 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68  s p->pPrior.  Th
11990 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75  e left query cou
119a0 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d  ld also be a com
119b0 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69  pound query.** i
119c0 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69  n which case thi
119d0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62  s routine will b
119e0 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  e called recursi
119f0 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  vely. .**.** The
11a00 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
11a10 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20  total query are 
11a20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
11a30 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e  to a destination
11a40 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73  .** of type eDes
11a50 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  t with parameter
11a60 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78   iParm..**.** Ex
11a70 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64  ample 1:  Consid
11a80 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63  er a three-way c
11a90 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74  ompound SQL stat
11aa0 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ement..**.**    
11ab0 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
11ac0 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62  1 UNION SELECT b
11ad0 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53   FROM t2 UNION S
11ae0 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
11af0 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65  **.** This state
11b00 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75  ment is parsed u
11b10 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  p as follows:.**
11b20 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63  .**     SELECT c
11b30 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20   FROM t3.**     
11b40 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d   |.**      `----
11b50 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ->  SELECT b FRO
11b60 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20  M t2.**         
11b70 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
11b80 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d             `----
11b90 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52  -->  SELECT a FR
11ba0 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20  OM t1.**.** The 
11bb0 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69  arrows in the di
11bc0 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72  agram above repr
11bd0 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74  esent the Select
11be0 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e  .pPrior pointer.
11bf0 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72  .** So if this r
11c00 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
11c10 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f   with p equal to
11c20 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74   the t3 query, t
11c30 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69  hen.** pPrior wi
11c40 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65  ll be the t2 que
11c50 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20  ry.  p->op will 
11c60 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74  be TK_UNION in t
11c70 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
11c80 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61  Notice that beca
11c90 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53  use of the way S
11ca0 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d  QLite parses com
11cb0 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74  pound SELECTs, t
11cc0 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
11cd0 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20   selects always 
11ce0 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20  group from left 
11cf0 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61  to right..*/.sta
11d00 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
11d10 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
11d20 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
11d30 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
11d40 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
11d50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11d60 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
11d70 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
11d80 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
11d90 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
11da0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
11db0 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
11dc0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
11dd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a   SQLITE_OK;   /*
11de0 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72   Success code fr
11df0 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  om a subroutine 
11e00 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
11e10 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e  ior;       /* An
11e20 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
11e30 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
11e40 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
11e50 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
11e60 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
11e70 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
11e80 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
11e90 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65  st;      /* Alte
11ea0 72 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73  rnative data des
11eb0 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65  tination */.  Se
11ec0 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20  lect *pDelete = 
11ed0 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20  0;  /* Chain of 
11ee0 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74  simple selects t
11ef0 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71  o delete */.  sq
11f00 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
11f10 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
11f20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69  connection */.#i
11f30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11f40 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20  T_EXPLAIN.  int 
11f50 69 53 75 62 31 20 3d 20 30 3b 20 20 20 20 20 20  iSub1 = 0;      
11f60 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c    /* EQP id of l
11f70 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a  eft-hand query *
11f80 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 20 3d 20  /.  int iSub2 = 
11f90 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50  0;        /* EQP
11fa0 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e   id of right-han
11fb0 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69  d query */.#endi
11fc0 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  f..  /* Make sur
11fd0 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52  e there is no OR
11fe0 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20  DER BY or LIMIT 
11ff0 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20  clause on prior 
12000 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20  SELECTs.  Only. 
12010 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69   ** the last (ri
12020 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54  ght-most) SELECT
12030 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d   in the series m
12040 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  ay have an ORDER
12050 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20   BY or LIMIT..  
12060 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26  */.  assert( p &
12070 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20  & p->pPrior );  
12080 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74  /* Calling funct
12090 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74  ion guarantees t
120a0 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73  his much */.  as
120b0 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61  sert( (p->selFla
120c0 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
120d0 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  e)==0 || p->op==
120e0 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d  TK_ALL || p->op=
120f0 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 64  =TK_UNION );.  d
12100 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
12110 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
12120 72 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d 20 2a  rior;.  dest = *
12130 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50 72  pDest;.  if( pPr
12140 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ior->pOrderBy ){
12150 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
12160 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44  rMsg(pParse,"ORD
12170 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f  ER BY clause sho
12180 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25  uld come after %
12190 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20  s not before",. 
121a0 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
121b0 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
121c0 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
121d0 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
121e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69  ;.  }.  if( pPri
121f0 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  or->pLimit ){.  
12200 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
12210 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20  g(pParse,"LIMIT 
12220 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f  clause should co
12230 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20  me after %s not 
12240 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73  before",.      s
12250 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
12260 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
12270 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
12280 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
12290 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
122a0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
122b0 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
122c0 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61 6c    /* The VDBE al
122d0 72 65 61 64 79 20 63 72 65 61 74 65 64 20 62 79  ready created by
122e0 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
122f0 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74  n */..  /* Creat
12300 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  e the destinatio
12310 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
12320 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20  e if necessary. 
12330 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65   */.  if( dest.e
12340 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
12350 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ab ){.    assert
12360 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
12370 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12380 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
12390 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69  phemeral, dest.i
123a0 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73  SDParm, p->pELis
123b0 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 73  t->nExpr);.    s
123c0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
123d0 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52  P5(v, BTREE_UNOR
123e0 44 45 52 45 44 29 3b 0a 20 20 20 20 64 65 73 74  DERED);.    dest
123f0 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62  .eDest = SRT_Tab
12400 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  le;.  }..  /* Ma
12410 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45  ke sure all SELE
12420 43 54 73 20 69 6e 20 74 68 65 20 73 74 61 74 65  CTs in the state
12430 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20 73 61  ment have the sa
12440 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  me number of ele
12450 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68  ments.  ** in th
12460 65 69 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e  eir result sets.
12470 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
12480 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72  p->pEList && pPr
12490 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ior->pEList );. 
124a0 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e   if( p->pEList->
124b0 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70  nExpr!=pPrior->p
124c0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
124d0 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c      if( p->selFl
124e0 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20  ags & SF_Values 
124f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12500 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
12510 20 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d 75 73   "all VALUES mus
12520 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
12530 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 22  number of terms"
12540 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
12550 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
12560 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c  Msg(pParse, "SEL
12570 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ECTs to the left
12580 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73   and right of %s
12590 22 0a 20 20 20 20 20 20 20 20 22 20 64 6f 20 6e  ".        " do n
125a0 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ot have the same
125b0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
125c0 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65  t columns", sele
125d0 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
125e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
125f0 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c   1;.    goto mul
12600 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
12610 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
12620 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 69 66  TE_OMIT_CTE.  if
12630 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
12640 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a  SF_Recursive ){.
12650 20 20 20 20 67 65 6e 65 72 61 74 65 57 69 74 68      generateWith
12660 52 65 63 75 72 73 69 76 65 51 75 65 72 79 28 70  RecursiveQuery(p
12670 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29  Parse, p, &dest)
12680 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
12690 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20  ..  /* Compound 
126a0 53 45 4c 45 43 54 73 20 74 68 61 74 20 68 61 76  SELECTs that hav
126b0 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  e an ORDER BY cl
126c0 61 75 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64  ause are handled
126d0 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a   separately..  *
126e0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  /.  if( p->pOrde
126f0 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  rBy ){.    retur
12700 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  n multiSelectOrd
12710 65 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20  erBy(pParse, p, 
12720 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a  pDest);.  }else.
12730 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
12740 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74  ode for the left
12750 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43   and right SELEC
12760 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  T statements..  
12770 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  */.  switch( p->
12780 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
12790 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69  K_ALL: {.      i
127a0 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20  nt addr = 0;.   
127b0 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20     int nLimit;. 
127c0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
127d0 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a  rior->pLimit );.
127e0 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c        pPrior->iL
127f0 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74  imit = p->iLimit
12800 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
12810 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66  iOffset = p->iOf
12820 66 73 65 74 3b 0a 20 20 20 20 20 20 70 50 72 69  fset;.      pPri
12830 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e  or->pLimit = p->
12840 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50  pLimit;.      pP
12850 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20  rior->pOffset = 
12860 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
12870 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
12880 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
12890 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
128a0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
128b0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
128c0 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73  se, pPrior, &des
128d0 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
128e0 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
128f0 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
12900 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
12910 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
12920 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
12930 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
12940 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
12950 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72   p->iLimit = pPr
12960 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20  ior->iLimit;.   
12970 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
12980 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b  pPrior->iOffset;
12990 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c  .      if( p->iL
129a0 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
129b0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
129c0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
129d0 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74  fZero, p->iLimit
129e0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
129f0 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  v);.        Vdbe
12a00 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d  Comment((v, "Jum
12a10 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54  p ahead if LIMIT
12a20 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20   reached"));.   
12a30 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70 6c 61     }.      expla
12a40 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
12a50 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b2, pParse->iNex
12a60 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
12a70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
12a80 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
12a90 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65  &dest);.      te
12aa0 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
12ab0 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70  TE_OK );.      p
12ac0 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69  Delete = p->pPri
12ad0 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  or;.      p->pPr
12ae0 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
12af0 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
12b00 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  w += pPrior->nSe
12b10 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 69  lectRow;.      i
12b20 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  f( pPrior->pLimi
12b30 74 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  t.       && sqli
12b40 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
12b50 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c  (pPrior->pLimit,
12b60 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20 20   &nLimit).      
12b70 20 26 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20   && nLimit>0 && 
12b80 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20  p->nSelectRow > 
12b90 28 75 36 34 29 6e 4c 69 6d 69 74 20 0a 20 20 20  (u64)nLimit .   
12ba0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d     ){.        p-
12bb0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 4c  >nSelectRow = nL
12bc0 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  imit;.      }.  
12bd0 20 20 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a      if( addr ){.
12be0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12bf0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
12c00 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ddr);.      }.  
12c10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
12c20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
12c30 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  EPT:.    case TK
12c40 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  _UNION: {.      
12c50 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20  int unionTab;   
12c60 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
12c70 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  r of the tempora
12c80 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67  ry table holding
12c90 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20   result */.     
12ca0 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20   u8 op = 0;     
12cb0 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
12cc0 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20  SRT_ operations 
12cd0 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66  to apply to self
12ce0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72   */.      int pr
12cf0 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68  iorOp;     /* Th
12d00 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
12d10 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69   to apply to pri
12d20 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20  or selects */.  
12d30 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
12d40 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53  , *pOffset; /* S
12d50 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70  aved values of p
12d60 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e  ->nLimit and p->
12d70 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20  nOffset */.     
12d80 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
12d90 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69 6f   SelectDest unio
12da0 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 74 65  ndest;..      te
12db0 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
12dc0 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20 20 20 20  K_EXCEPT );.    
12dd0 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f    testcase( p->o
12de0 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
12df0 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53       priorOp = S
12e00 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20  RT_Union;.      
12e10 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
12e20 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20  priorOp ){.     
12e30 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75     /* We can reu
12e40 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  se a temporary t
12e50 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62  able generated b
12e60 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75  y a SELECT to ou
12e70 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67  r.        ** rig
12e80 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ht..        */. 
12e90 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
12ea0 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20  ->pLimit==0 );  
12eb0 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77      /* Not allow
12ec0 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65  ed on leftward e
12ed0 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  lements */.     
12ee0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
12ef0 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20  ffset==0 );     
12f00 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f  /* Not allowed o
12f10 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65  n leftward eleme
12f20 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75  nts */.        u
12f30 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69  nionTab = dest.i
12f40 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65  SDParm;.      }e
12f50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
12f60 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  We will need to 
12f70 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74  create our own t
12f80 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74  emporary table t
12f90 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20  o hold the.     
12fa0 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61     ** intermedia
12fb0 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20  te results..    
12fc0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75      */.        u
12fd0 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65  nionTab = pParse
12fe0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
12ff0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
13000 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  derBy==0 );.    
13010 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
13020 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13030 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
13040 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
13050 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13060 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
13070 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  0] == -1 );.    
13080 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
13090 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[0] = addr;. 
130a0 20 20 20 20 20 20 20 66 69 6e 64 52 69 67 68 74         findRight
130b0 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67  most(p)->selFlag
130c0 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65  s |= SF_UsesEphe
130d0 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61  meral;.        a
130e0 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
130f0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
13100 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53     /* Code the S
13110 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
13120 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20   to our left.   
13130 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
13140 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72  rt( !pPrior->pOr
13150 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20 73  derBy );.      s
13160 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
13170 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c  Init(&uniondest,
13180 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54   priorOp, unionT
13190 61 62 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  ab);.      expla
131a0 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
131b0 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b1, pParse->iNex
131c0 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
131d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
131e0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
131f0 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29  ior, &uniondest)
13200 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
13210 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
13220 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
13230 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
13240 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
13250 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ent SELECT state
13260 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ment.      */.  
13270 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
13280 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20 20 20  K_EXCEPT ){.    
13290 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63      op = SRT_Exc
132a0 65 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ept;.      }else
132b0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
132c0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
132d0 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 20  N );.        op 
132e0 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20  = SRT_Union;.   
132f0 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50     }.      p->pP
13300 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
13310 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
13320 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  it;.      p->pLi
13330 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
13340 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
13350 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  set;.      p->pO
13360 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
13370 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74   uniondest.eDest
13380 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 65 78 70   = op;.      exp
13390 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
133a0 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
133b0 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
133c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
133d0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
133e0 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20  , &uniondest);. 
133f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
13400 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
13410 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66        /* Query f
13420 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c  lattening in sql
13430 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67  ite3Select() mig
13440 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72  ht refill p->pOr
13450 64 65 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20  derBy..      ** 
13460 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74  Be sure to delet
13470 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74  e p->pOrderBy, t
13480 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f  herefore, to avo
13490 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b  id a memory leak
134a0 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
134b0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
134c0 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
134d0 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65  );.      pDelete
134e0 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
134f0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
13500 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
13510 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
13520 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d       if( p->op==
13530 54 4b 5f 55 4e 49 4f 4e 20 29 20 70 2d 3e 6e 53  TK_UNION ) p->nS
13540 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69  electRow += pPri
13550 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  or->nSelectRow;.
13560 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
13570 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
13580 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d  Limit);.      p-
13590 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
135a0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
135b0 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20  et = pOffset;.  
135c0 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
135d0 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  0;.      p->iOff
135e0 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  set = 0;..      
135f0 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64  /* Convert the d
13600 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f  ata in the tempo
13610 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20  rary table into 
13620 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20  whatever form.  
13630 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61      ** it is tha
13640 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e  t we currently n
13650 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  eed..      */.  
13660 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 6f      assert( unio
13670 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53 44 50 61  nTab==dest.iSDPa
13680 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65 73 74  rm || dest.eDest
13690 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20  !=priorOp );.   
136a0 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
136b0 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20  t!=priorOp ){.  
136c0 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
136d0 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b   iBreak, iStart;
136e0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
136f0 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
13700 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
13710 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
13720 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65   ){.          Se
13730 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70  lect *pFirst = p
13740 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  ;.          whil
13750 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f  e( pFirst->pPrio
13760 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69  r ) pFirst = pFi
13770 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  rst->pPrior;.   
13780 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43         generateC
13790 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
137a0 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45  e, 0, pFirst->pE
137b0 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  List);.        }
137c0 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20  .        iBreak 
137d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
137e0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
137f0 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
13800 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
13810 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70  v);.        comp
13820 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
13830 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72  s(pParse, p, iBr
13840 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
13850 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13860 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e  v, OP_Rewind, un
13870 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b  ionTab, iBreak);
13880 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
13890 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74  ;.        iStart
138a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
138b0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
138c0 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
138d0 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
138e0 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f   p->pEList, unio
138f0 6e 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20  nTab,.          
13900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
13910 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74   0, &dest, iCont
13920 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
13930 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
13940 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
13950 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ont);.        sq
13960 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13970 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f  v, OP_Next, unio
13980 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 20 56  nTab, iStart); V
13990 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
139a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
139b0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
139c0 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
139d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
139e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
139f0 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  e, unionTab, 0);
13a00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
13a10 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
13a20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28  default: assert(
13a30 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52   p->op==TK_INTER
13a40 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20  SECT ); {.      
13a50 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a  int tab1, tab2;.
13a60 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
13a70 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b   iBreak, iStart;
13a80 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69  .      Expr *pLi
13a90 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20  mit, *pOffset;. 
13aa0 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
13ab0 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
13ac0 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a 20  intersectdest;. 
13ad0 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20       int r1;..  
13ae0 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54      /* INTERSECT
13af0 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72   is different fr
13b00 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73 69  om the others si
13b10 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73 0a  nce it requires.
13b20 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d        ** two tem
13b30 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20  porary tables.  
13b40 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73  Hence it has its
13b50 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69   own case.  Begi
13b60 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c  n.      ** by al
13b70 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61 62  locating the tab
13b80 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  les we will need
13b90 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
13ba0 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e   tab1 = pParse->
13bb0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61  nTab++;.      ta
13bc0 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b2 = pParse->nTa
13bd0 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  b++;.      asser
13be0 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
13bf0 30 20 29 3b 0a 0a 20 20 20 20 20 20 61 64 64 72  0 );..      addr
13c00 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
13c10 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
13c20 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20  phemeral, tab1, 
13c30 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
13c40 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
13c50 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[0] == -1 );.  
13c60 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
13c70 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[0] = addr;. 
13c80 20 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f       findRightmo
13c90 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20  st(p)->selFlags 
13ca0 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65  |= SF_UsesEpheme
13cb0 72 61 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ral;.      asser
13cc0 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
13cd0 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
13ce0 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75  he SELECTs to ou
13cf0 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70  r left into temp
13d00 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62  orary table "tab
13d10 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  1"..      */.   
13d20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
13d30 44 65 73 74 49 6e 69 74 28 26 69 6e 74 65 72 73  DestInit(&inters
13d40 65 63 74 64 65 73 74 2c 20 53 52 54 5f 55 6e 69  ectdest, SRT_Uni
13d50 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20  on, tab1);.     
13d60 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
13d70 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65  er(iSub1, pParse
13d80 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
13d90 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
13da0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
13db0 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74 65  e, pPrior, &inte
13dc0 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20  rsectdest);.    
13dd0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
13de0 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
13df0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
13e00 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
13e10 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45  e the current SE
13e20 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72  LECT into tempor
13e30 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32 22  ary table "tab2"
13e40 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13e50 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
13e60 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
13e70 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
13e80 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  b2, 0);.      as
13e90 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
13ea0 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29  nEphm[1] == -1 )
13eb0 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
13ec0 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64  penEphm[1] = add
13ed0 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
13ee0 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c  or = 0;.      pL
13ef0 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
13f00 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
13f10 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66  t = 0;.      pOf
13f20 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
13f30 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
13f40 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  set = 0;.      i
13f50 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69 53 44  ntersectdest.iSD
13f60 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20  Parm = tab2;.   
13f70 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
13f80 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72  eger(iSub2, pPar
13f90 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
13fa0 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
13fb0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
13fc0 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73 65  rse, p, &interse
13fd0 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74  ctdest);.      t
13fe0 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
13ff0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
14000 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72  pDelete = p->pPr
14010 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ior;.      p->pP
14020 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
14030 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c       if( p->nSel
14040 65 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e  ectRow>pPrior->n
14050 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e  SelectRow ) p->n
14060 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69  SelectRow = pPri
14070 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  or->nSelectRow;.
14080 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
14090 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
140a0 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d  Limit);.      p-
140b0 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
140c0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
140d0 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 0a 20  et = pOffset;.. 
140e0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
140f0 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68   code to take th
14100 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f  e intersection o
14110 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72  f the two tempor
14120 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62  ary.      ** tab
14130 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  les..      */.  
14140 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
14150 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69  EList );.      i
14160 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53  f( dest.eDest==S
14170 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
14180 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69       Select *pFi
14190 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rst = p;.       
141a0 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e   while( pFirst->
141b0 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20  pPrior ) pFirst 
141c0 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  = pFirst->pPrior
141d0 3b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72 61  ;.        genera
141e0 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
141f0 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d  arse, 0, pFirst-
14200 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
14210 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d  }.      iBreak =
14220 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
14230 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
14240 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  iCont = sqlite3V
14250 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
14260 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69  .      computeLi
14270 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
14280 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b  rse, p, iBreak);
14290 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
142a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
142b0 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72  ewind, tab1, iBr
142c0 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
142d0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 72 31 20  ge(v);.      r1 
142e0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
142f0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
14300 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
14310 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14320 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31   OP_RowKey, tab1
14330 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
14340 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
14350 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  t(v, OP_NotFound
14360 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72  , tab2, iCont, r
14370 31 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72  1, 0); VdbeCover
14380 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
14390 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
143a0 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
143b0 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
143c0 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
143d0 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62  , p->pEList, tab
143e0 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
143f0 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26           0, 0, &
14400 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72  dest, iCont, iBr
14410 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
14420 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
14430 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
14440 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14450 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
14460 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29  t, tab1, iStart)
14470 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
14480 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14490 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
144a0 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
144b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
144c0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
144d0 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
144e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
144f0 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
14500 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
14510 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14520 7d 0a 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70  }..  explainComp
14530 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d  osite(pParse, p-
14540 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62  >op, iSub1, iSub
14550 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  2, p->op!=TK_ALL
14560 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  );..  /* Compute
14570 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
14580 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a 20 20  nces used by .  
14590 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ** temporary tab
145a0 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d  les needed to im
145b0 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70  plement the comp
145c0 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
145d0 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b 65 79  * Attach the Key
145e0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
145f0 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20  o all temporary 
14600 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tables..  **.  *
14610 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69  * This section i
14620 73 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67  s run by the rig
14630 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73  ht-most SELECT s
14640 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20  tatement only.. 
14650 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   ** SELECT state
14660 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66  ments to the lef
14670 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68  t always skip th
14680 69 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69  is part.  The ri
14690 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45  ght-most.  ** SE
146a0 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20  LECT might also 
146b0 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69  skip this part i
146c0 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45  f it has no ORDE
146d0 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a  R BY clause and.
146e0 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62    ** no temp tab
146f0 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  les are required
14700 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
14710 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73  selFlags & SF_Us
14720 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20  esEphemeral ){. 
14730 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
14740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14750 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
14760 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   */.    KeyInfo 
14770 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20  *pKeyInfo;      
14780 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
14790 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
147a0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
147b0 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c  /.    Select *pL
147c0 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
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 53 45 4c 45 43  ng through SELEC
147f0 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  T statements */.
14800 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70      CollSeq **ap
14810 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
14820 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
14830 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66   through pKeyInf
14840 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20  o->aColl[] */.  
14850 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
14860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14870 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
14880 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73  umns in result s
14890 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  et */..    asser
148a0 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29  t( p->pNext==0 )
148b0 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e  ;.    nCol = p->
148c0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
148d0 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
148e0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
148f0 63 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a  c(db, nCol, 1);.
14900 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66      if( !pKeyInf
14910 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  o ){.      rc = 
14920 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
14930 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
14940 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
14950 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70  .    for(i=0, ap
14960 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61  Coll=pKeyInfo->a
14970 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  Coll; i<nCol; i+
14980 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20  +, apColl++){.  
14990 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75      *apColl = mu
149a0 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
149b0 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a  (pParse, p, i);.
149c0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70        if( 0==*ap
149d0 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
149e0 2a 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  *apColl = db->pD
149f0 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  fltColl;.      }
14a00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
14a10 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20  pLoop=p; pLoop; 
14a20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72  pLoop=pLoop->pPr
14a30 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  ior){.      for(
14a40 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a  i=0; i<2; i++){.
14a50 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
14a60 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70   = pLoop->addrOp
14a70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20  enEphm[i];.     
14a80 20 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b     if( addr<0 ){
14a90 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
14aa0 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74   [0] is unused t
14ab0 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20  hen [1] is also 
14ac0 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63  unused.  So we c
14ad0 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  an.          ** 
14ae0 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62  always safely ab
14af0 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74  ort as soon as t
14b00 68 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20  he first unused 
14b10 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f  slot is found */
14b20 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
14b30 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70  t( pLoop->addrOp
14b40 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20  enEphm[1]<0 );. 
14b50 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
14b60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14b70 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
14b80 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e  ngeP2(v, addr, n
14b90 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
14ba0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
14bb0 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72  4(v, addr, (char
14bc0 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  *)sqlite3KeyInfo
14bd0 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 0a 20  Ref(pKeyInfo),. 
14be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bf0 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45             P4_KE
14c00 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20  YINFO);.        
14c10 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
14c20 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20  phm[i] = -1;.   
14c30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
14c40 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
14c50 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  ef(pKeyInfo);.  
14c60 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  }..multi_select_
14c70 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53  end:.  pDest->iS
14c80 64 73 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74  dst = dest.iSdst
14c90 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74  ;.  pDest->nSdst
14ca0 20 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20   = dest.nSdst;. 
14cb0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
14cc0 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 65 74 65  lete(db, pDelete
14cd0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
14ce0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
14cf0 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
14d00 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a  _SELECT */../*.*
14d10 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74  * Code an output
14d20 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   subroutine for 
14d30 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c  a coroutine impl
14d40 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a  ementation of a.
14d50 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65  ** SELECT statme
14d60 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61  nt..**.** The da
14d70 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20  ta to be output 
14d80 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  is contained in 
14d90 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68 65  pIn->iSdst.  The
14da0 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e  re are.** pIn->n
14db0 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  Sdst columns to 
14dc0 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73  be output.  pDes
14dd0 74 20 69 73 20 77 68 65 72 65 20 74 68 65 20 6f  t is where the o
14de0 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  utput should.** 
14df0 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72  be sent..**.** r
14e00 65 67 52 65 74 75 72 6e 20 69 73 20 74 68 65 20  egReturn is the 
14e10 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65  number of the re
14e20 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74  gister holding t
14e30 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a  he subroutine.**
14e40 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e   return address.
14e50 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65  .**.** If regPre
14e60 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20 74  v>0 then it is t
14e70 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
14e80 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68  r in a vector th
14e90 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68  at.** records th
14ea0 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  e previous outpu
14eb0 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d  t.  mem[regPrev]
14ec0 20 69 73 20 61 20 66 6c 61 67 20 74 68 61 74 20   is a flag that 
14ed0 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74  is false.** if t
14ee0 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f  here has been no
14ef0 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
14f00 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e 30 20  .  If regPrev>0 
14f10 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20  then code is.** 
14f20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70  generated to sup
14f30 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73  press duplicates
14f40 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75  .  pKeyInfo is u
14f50 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e  sed for comparin
14f60 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a  g.** keys..**.**
14f70 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f   If the LIMIT fo
14f80 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74  und in p->iLimit
14f90 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d   is reached, jum
14fa0 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
14fb0 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73  .** iBreak..*/.s
14fc0 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61  tatic int genera
14fd0 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
14fe0 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ne(.  Parse *pPa
14ff0 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
15000 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
15010 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
15020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15030 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
15040 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ement */.  Selec
15050 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20  tDest *pIn,     
15060 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20     /* Coroutine 
15070 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a  supplying data *
15080 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
15090 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57  pDest,      /* W
150a0 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65  here to send the
150b0 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72   data */.  int r
150c0 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20  egReturn,       
150d0 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
150e0 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
150f0 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  r */.  int regPr
15100 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ev,            /
15110 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c  * Previous resul
15120 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20  t register.  No 
15130 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30 20  uniqueness if 0 
15140 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
15150 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20  eyInfo,      /* 
15160 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69  For comparing wi
15170 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  th previous entr
15180 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61  y */.  int iBrea
15190 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k              /
151a0 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77  * Jump here if w
151b0 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20  e hit the LIMIT 
151c0 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
151d0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
151e0 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
151f0 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20  ;.  int addr;.. 
15200 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
15210 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
15220 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d  );.  iContinue =
15230 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
15240 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20  Label(v);..  /* 
15250 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61  Suppress duplica
15260 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45  tes for UNION, E
15270 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52  XCEPT, and INTER
15280 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28  SECT .  */.  if(
15290 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20   regPrev ){.    
152a0 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20 20  int j1, j2;.    
152b0 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
152c0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
152d0 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 20 56 64  ot, regPrev); Vd
152e0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
152f0 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56     j2 = sqlite3V
15300 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
15310 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 53  Compare, pIn->iS
15320 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20  dst, regPrev+1, 
15330 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20 20 20  pIn->nSdst,.    
15340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15350 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
15360 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  )sqlite3KeyInfoR
15370 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34  ef(pKeyInfo), P4
15380 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73  _KEYINFO);.    s
15390 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
153a0 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 32 2b  (v, OP_Jump, j2+
153b0 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6a 32  2, iContinue, j2
153c0 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +2); VdbeCoverag
153d0 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
153e0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
153f0 20 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   j1);.    sqlite
15400 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
15410 50 5f 43 6f 70 79 2c 20 70 49 6e 2d 3e 69 53 64  P_Copy, pIn->iSd
15420 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70  st, regPrev+1, p
15430 49 6e 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a 20 20  In->nSdst-1);.  
15440 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15450 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
15460 72 2c 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a  r, 1, regPrev);.
15470 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65    }.  if( pParse
15480 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
15490 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  ed ) return 0;..
154a0 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68    /* Suppress th
154b0 65 20 66 69 72 73 74 20 4f 46 46 53 45 54 20 65  e first OFFSET e
154c0 6e 74 72 69 65 73 20 69 66 20 74 68 65 72 65 20  ntries if there 
154d0 69 73 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61  is an OFFSET cla
154e0 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f  use.  */.  codeO
154f0 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
15500 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  set, iContinue);
15510 0a 0a 20 20 73 77 69 74 63 68 28 20 70 44 65 73  ..  switch( pDes
15520 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20  t->eDest ){.    
15530 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
15540 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e  ult as data usin
15550 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a  g a unique key..
15560 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
15570 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
15580 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
15590 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
155a0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
155b0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
155c0 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c      int r2 = sql
155d0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
155e0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 74 65  Parse);.      te
155f0 73 74 63 61 73 65 28 20 70 44 65 73 74 2d 3e 65  stcase( pDest->e
15600 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20  Dest==SRT_Table 
15610 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
15620 65 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  e( pDest->eDest=
15630 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b  =SRT_EphemTab );
15640 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15650 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
15660 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e  akeRecord, pIn->
15670 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
15680 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  t, r1);.      sq
15690 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
156a0 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
156b0 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
156c0 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r2);.      sqlit
156d0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
156e0 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74  OP_Insert, pDest
156f0 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c 20 72  ->iSDParm, r1, r
15700 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
15710 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
15720 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
15730 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
15740 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
15750 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  rse, r2);.      
15760 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
15770 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
15780 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
15790 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
157a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
157b0 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  ERY.    /* If we
157c0 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20   are creating a 
157d0 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72  set for an "expr
157e0 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
157f0 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20  " construct,.   
15800 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73   ** then there s
15810 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c  hould be a singl
15820 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74  e item on the st
15830 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73  ack.  Write this
15840 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74  .    ** item int
15850 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20  o the set table 
15860 77 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e  with bogus data.
15870 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
15880 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
15890 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20    int r1;.      
158a0 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64  assert( pIn->nSd
158b0 73 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70  st==1 );.      p
158c0 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20 3d 20  Dest->affSdst = 
158d0 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
158e0 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
158f0 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  (p->pEList->a[0]
15900 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61  .pExpr, pDest->a
15910 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 72  ffSdst);.      r
15920 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
15930 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
15940 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15950 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
15960 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53  eRecord, pIn->iS
15970 64 73 74 2c 20 31 2c 20 72 31 2c 20 26 70 44 65  dst, 1, r1, &pDe
15980 73 74 2d 3e 61 66 66 53 64 73 74 2c 31 29 3b 0a  st->affSdst,1);.
15990 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
159a0 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
159b0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  ange(pParse, pIn
159c0 2d 3e 69 53 64 73 74 2c 20 31 29 3b 0a 20 20 20  ->iSdst, 1);.   
159d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
159e0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
159f0 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44  sert, pDest->iSD
15a00 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20  Parm, r1);.     
15a10 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
15a20 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
15a30 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
15a40 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 20 20 2f  .    }..#if 0  /
15a50 2a 20 4e 65 76 65 72 20 6f 63 63 75 72 73 20 6f  * Never occurs o
15a60 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 71 75  n an ORDER BY qu
15a70 65 72 79 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66  ery */.    /* If
15a80 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69   any row exist i
15a90 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
15aa0 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61  , record that fa
15ab0 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20  ct and abort..  
15ac0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
15ad0 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20  T_Exists: {.    
15ae0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15af0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
15b00 72 2c 20 31 2c 20 70 44 65 73 74 2d 3e 69 53 44  r, 1, pDest->iSD
15b10 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20  Parm);.      /* 
15b20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
15b30 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   will terminate 
15b40 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
15b50 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
15b60 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
15b70 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
15b80 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20  a scalar select 
15b90 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
15ba0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  an expression, t
15bb0 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65  hen.    ** store
15bc0 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
15bd0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
15be0 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
15bf0 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a  break out.    **
15c00 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f   of the scan loo
15c10 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  p..    */.    ca
15c20 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
15c30 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d      assert( pIn-
15c40 3e 6e 53 64 73 74 3d 3d 31 20 29 3b 0a 20 20 20  >nSdst==1 );.   
15c50 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
15c60 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70  deMove(pParse, p
15c70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74  In->iSdst, pDest
15c80 2d 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20  ->iSDParm, 1);. 
15c90 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
15ca0 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75  T clause will ju
15cb0 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f  mp out of the lo
15cc0 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
15cd0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
15ce0 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
15cf0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
15d00 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f  BQUERY */..    /
15d10 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72  * The results ar
15d20 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65  e stored in a se
15d30 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
15d40 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  ers.    ** start
15d50 69 6e 67 20 61 74 20 70 44 65 73 74 2d 3e 69 53  ing at pDest->iS
15d60 64 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 63  dst.  Then the c
15d70 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73  o-routine yields
15d80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
15d90 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a  e SRT_Coroutine:
15da0 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65   {.      if( pDe
15db0 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a  st->iSdst==0 ){.
15dc0 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69          pDest->i
15dd0 53 64 73 74 20 3d 20 73 71 6c 69 74 65 33 47 65  Sdst = sqlite3Ge
15de0 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
15df0 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  e, pIn->nSdst);.
15e00 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e          pDest->n
15e10 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73  Sdst = pIn->nSds
15e20 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
15e30 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
15e40 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
15e50 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e  ->iSdst, pDest->
15e60 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 6e 53  iSdst, pDest->nS
15e70 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dst);.      sqli
15e80 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
15e90 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74   OP_Yield, pDest
15ea0 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  ->iSDParm);.    
15eb0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
15ec0 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f      /* If none o
15ed0 66 20 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65  f the above, the
15ee0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 64 65 73  n the result des
15ef0 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65  tination must be
15f00 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70  .    ** SRT_Outp
15f10 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ut.  This routin
15f20 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
15f30 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72  d with any other
15f40 0a 20 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74  .    ** destinat
15f50 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ion other than t
15f60 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20  he ones handled 
15f70 61 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74  above or SRT_Out
15f80 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  put..    **.    
15f90 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75  ** For SRT_Outpu
15fa0 74 2c 20 72 65 73 75 6c 74 73 20 61 72 65 20 73  t, results are s
15fb0 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65  tored in a seque
15fc0 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nce of registers
15fd0 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20  .  .    ** Then 
15fe0 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  the OP_ResultRow
15ff0 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20   opcode is used 
16000 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74 65 33  to cause sqlite3
16010 5f 73 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a  _step() to.    *
16020 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78  * return the nex
16030 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e  t row of result.
16040 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
16050 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
16060 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73  ert( pDest->eDes
16070 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
16080 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16090 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
160a0 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69  esultRow, pIn->i
160b0 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
160c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
160d0 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
160e0 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
160f0 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d  pIn->iSdst, pIn-
16100 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 62  >nSdst);.      b
16110 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
16120 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
16130 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  e end of the loo
16140 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69  p if the LIMIT i
16150 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a  s reached..  */.
16160 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
16170 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
16180 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
16190 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74  fZero, p->iLimit
161a0 2c 20 69 42 72 65 61 6b 2c 20 2d 31 29 3b 20 56  , iBreak, -1); V
161b0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
161c0 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
161d0 74 65 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  te the subroutin
161e0 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20  e return.  */.  
161f0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
16200 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
16210 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  inue);.  sqlite3
16220 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
16230 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75  _Return, regRetu
16240 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61  rn);..  return a
16250 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  ddr;.}../*.** Al
16260 74 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75  ternative compou
16270 6e 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67  nd select code g
16280 65 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73  enerator for cas
16290 65 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a  es when there.**
162a0 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
162b0 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65  clause..**.** We
162c0 20 61 73 73 75 6d 65 20 61 20 71 75 65 72 79 20   assume a query 
162d0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
162e0 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
162f0 20 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70    <selectA>  <op
16300 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74  erator>  <select
16310 42 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72  B>  ORDER BY <or
16320 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a  derbylist>.**.**
16330 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f   <operator> is o
16340 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c  ne of UNION ALL,
16350 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
16360 6f 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54  or INTERSECT.  T
16370 68 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f  he idea.** is to
16380 20 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65   code both <sele
16390 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74  ctA> and <select
163a0 42 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44 45  B> with the ORDE
163b0 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a  R BY clause as.*
163c0 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20  * co-routines.  
163d0 54 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d  Then run the co-
163e0 72 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61  routines in para
163f0 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74  llel and merge t
16400 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e  he results.** in
16410 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20  to the output.  
16420 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74  In addition to t
16430 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65  he two coroutine
16440 73 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74  s (called select
16450 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42  A and.** selectB
16460 29 20 74 68 65 72 65 20 61 72 65 20 37 20 73 75  ) there are 7 su
16470 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a  broutines:.**.**
16480 20 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76      outA:    Mov
16490 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  e the output of 
164a0 74 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f  the selectA coro
164b0 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f  utine into the o
164c0 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  utput.**        
164d0 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70       of the comp
164e0 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a  ound query..**.*
164f0 2a 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f  *    outB:    Mo
16500 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66  ve the output of
16510 20 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72   the selectB cor
16520 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20  outine into the 
16530 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20  output.**       
16540 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d        of the com
16550 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f  pound query.  (O
16560 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f  nly generated fo
16570 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20  r UNION and.**  
16580 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e             UNION
16590 20 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e   ALL.  EXCEPT an
165a0 64 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76  d INSERTSECT nev
165b0 65 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20  er output a row 
165c0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
165d0 20 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79      appears only
165e0 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20   in B.).**.**   
165f0 20 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64   AltB:    Called
16600 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64   when there is d
16610 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f  ata from both co
16620 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42  routines and A<B
16630 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a  ..**.**    AeqB:
16640 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
16650 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72  there is data fr
16660 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e  om both coroutin
16670 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a  es and A==B..**.
16680 2a 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20 43  **    AgtB:    C
16690 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
166a0 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f   is data from bo
166b0 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  th coroutines an
166c0 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  d A>B..**.**    
166d0 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20  EofA:    Called 
166e0 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68  when data is exh
166f0 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65  austed from sele
16700 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f  ctA..**.**    Eo
16710 66 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  fB:    Called wh
16720 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75  en data is exhau
16730 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74  sted from select
16740 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  B..**.** The imp
16750 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
16760 68 65 20 6c 61 74 74 65 72 20 66 69 76 65 20 73  he latter five s
16770 75 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e  ubroutines depen
16780 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c  d on which .** <
16790 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65  operator> is use
167a0 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  d:.**.**.**     
167b0 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
167c0 4c 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  L         UNION 
167d0 20 20 20 20 20 20 20 20 20 20 20 45 58 43 45 50             EXCEP
167e0 54 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52  T          INTER
167f0 53 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  SECT.**         
16800 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20   -------------  
16810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16820 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
16830 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
16840 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20  ----.**   AltB: 
16850 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
16860 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
16870 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
16880 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a           nextA.*
16890 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f  *.**   AeqB:   o
168a0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
168b0 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20     nextA        
168c0 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20       nextA      
168d0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a     outA, nextA.*
168e0 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f  *.**   AgtB:   o
168f0 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
16900 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
16910 20 20 20 20 20 6e 65 78 74 42 20 20 20 20 20 20       nextB      
16920 20 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a        nextB.**.*
16930 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42  *   EofA:   outB
16940 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74  , nextB      out
16950 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20  B, nextB        
16960 20 20 68 61 6c 74 20 20 20 20 20 20 20 20 20 20    halt          
16970 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20     halt.**.**   
16980 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65  EofB:   outA, ne
16990 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  xtA      outA, n
169a0 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c  extA       outA,
169b0 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 68   nextA         h
169c0 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  alt.**.** In the
169d0 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64   AltB, AeqB, and
169e0 20 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65   AgtB subroutine
169f0 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66  s, an EOF on A f
16a00 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a  ollowing nextA.*
16a10 2a 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65  * causes an imme
16a20 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f  diate jump to Eo
16a30 66 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e  fA and an EOF on
16a40 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78   B following nex
16a50 74 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20  tB causes.** an 
16a60 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74  immediate jump t
16a70 6f 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20  o EofB.  Within 
16a80 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61  EofA and EofB, a
16a90 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20  nd EOF on entry 
16aa0 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  or.** following 
16ab0 6e 65 78 74 58 20 63 61 75 73 65 73 20 61 20 6a  nextX causes a j
16ac0 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ump to the end o
16ad0 66 20 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f  f the select pro
16ae0 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44  cessing..**.** D
16af0 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c  uplicate removal
16b00 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45   in the UNION, E
16b10 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52  XCEPT, and INTER
16b20 53 45 43 54 20 63 61 73 65 73 20 69 73 20 68 61  SECT cases is ha
16b30 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20  ndled.** within 
16b40 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f  the output subro
16b50 75 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50  utine.  The regP
16b60 72 65 76 20 72 65 67 69 73 74 65 72 20 73 65 74  rev register set
16b70 20 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69   holds the previ
16b80 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20  ously.** output 
16b90 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72  value.  A compar
16ba0 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61  ison is made aga
16bb0 69 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65 20  inst this value 
16bc0 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  and the output.*
16bd0 2a 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  * is skipped if 
16be0 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73  the next results
16bf0 20 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61   would be the sa
16c00 6d 65 20 61 73 20 74 68 65 20 70 72 65 76 69 6f  me as the previo
16c10 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d  us..**.** The im
16c20 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61  plementation pla
16c30 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  n is to implemen
16c40 74 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74  t the two corout
16c50 69 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a  ines and seven.*
16c60 2a 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69  * subroutines fi
16c70 72 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68  rst, then put th
16c80 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20  e control logic 
16c90 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20  at the bottom.  
16ca0 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  Like this:.**.**
16cb0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49            goto I
16cc0 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20  nit.**     coA: 
16cd0 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65  coroutine for le
16ce0 66 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20  ft query (A).** 
16cf0 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69      coB: corouti
16d00 6e 65 20 66 6f 72 20 72 69 67 68 74 20 71 75 65  ne for right que
16d10 72 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74  ry (B).**    out
16d20 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  A: output one ro
16d30 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74  w of A.**    out
16d40 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  B: output one ro
16d50 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e  w of B (UNION an
16d60 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79  d UNION ALL only
16d70 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e  ).**    EofA: ..
16d80 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e  ..**    EofB: ..
16d90 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e  ..**    AltB: ..
16da0 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e  ..**    AeqB: ..
16db0 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e  ..**    AgtB: ..
16dc0 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e  ..**    Init: in
16dd0 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69  itialize corouti
16de0 6e 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20  ne registers.** 
16df0 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63           yield c
16e00 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  oA.**          i
16e10 66 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f  f eof(A) goto Eo
16e20 66 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79  fA.**          y
16e30 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20  ield coB.**     
16e40 20 20 20 20 20 69 66 20 65 6f 66 28 42 29 20 67       if eof(B) g
16e50 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43  oto EofB.**    C
16e60 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20  mpr: Compare A, 
16e70 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75  B.**          Ju
16e80 6d 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41  mp AltB, AeqB, A
16e90 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20  gtB.**     End: 
16ea0 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c  ....**.** We cal
16eb0 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67  l AltB, AeqB, Ag
16ec0 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f  tB, EofA, and Eo
16ed0 66 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22  fB "subroutines"
16ee0 20 62 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f   but they are no
16ef0 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61  t.** actually ca
16f00 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62  lled using Gosub
16f10 20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74   and they do not
16f20 20 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61   Return.  EofA a
16f30 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20  nd EofB loop.** 
16f40 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69  until all data i
16f50 73 20 65 78 68 61 75 73 74 65 64 20 74 68 65 6e  s exhausted then
16f60 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e   jump to the "en
16f70 64 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20  d" labe.  AltB, 
16f80 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74  AeqB,.** and Agt
16f90 42 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72  B jump to either
16fa0 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66   L2 or to one of
16fb0 20 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a   EofA or EofB..*
16fc0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
16fd0 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
16fe0 45 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74  ELECT.static int
16ff0 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
17000 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rBy(.  Parse *pP
17010 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
17020 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
17030 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
17040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
17050 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
17060 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
17070 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
17080 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
17090 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
170a0 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
170b0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
170c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
170d0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
170e0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
170f0 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
17100 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
17110 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
17120 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
17130 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
17140 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
17150 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
17160 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
17170 74 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69  tA;     /* Desti
17180 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75  nation for corou
17190 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65  tine A */.  Sele
171a0 63 74 44 65 73 74 20 64 65 73 74 42 3b 20 20 20  ctDest destB;   
171b0 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e    /* Destination
171c0 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42   for coroutine B
171d0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64   */.  int regAdd
171e0 72 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  rA;         /* A
171f0 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
17200 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72  for select-A cor
17210 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
17220 72 65 67 41 64 64 72 42 3b 20 20 20 20 20 20 20  regAddrB;       
17230 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
17240 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
17250 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -B coroutine */.
17260 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74    int addrSelect
17270 41 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  A;      /* Addre
17280 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
17290 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -A coroutine */.
172a0 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74    int addrSelect
172b0 42 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  B;      /* Addre
172c0 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
172d0 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -B coroutine */.
172e0 20 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20    int regOutA;  
172f0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
17300 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
17310 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62  the output-A sub
17320 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
17330 20 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20   regOutB;       
17340 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
17350 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f  gister for the o
17360 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69  utput-B subrouti
17370 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
17380 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  OutA;         /*
17390 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
173a0 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74  output-A subrout
173b0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
173c0 72 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f  rOutB = 0;     /
173d0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
173e0 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75   output-B subrou
173f0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
17400 64 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20  drEofA;         
17410 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
17420 65 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75  e select-A-exhau
17430 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20  sted subroutine 
17440 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66  */.  int addrEof
17450 41 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41 6c  A_noB;     /* Al
17460 74 65 72 6e 61 74 65 20 61 64 64 72 45 6f 66 41  ternate addrEofA
17470 20 69 66 20 42 20 69 73 20 75 6e 69 6e 69 74 69   if B is uniniti
17480 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20  alized */.  int 
17490 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20  addrEofB;       
174a0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
174b0 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68  the select-B-exh
174c0 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e  austed subroutin
174d0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
174e0 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ltB;         /* 
174f0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
17500 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  <B subroutine */
17510 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b  .  int addrAeqB;
17520 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
17530 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20  ess of the A==B 
17540 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
17550 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20 20  int addrAgtB;   
17560 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
17570 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62 72   of the A>B subr
17580 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
17590 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20  regLimitA;      
175a0 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73    /* Limit regis
175b0 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41  ter for select-A
175c0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d   */.  int regLim
175d0 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  itB;        /* L
175e0 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f  imit register fo
175f0 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20  r select-A */.  
17600 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20  int regPrev;    
17610 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65        /* A range
17620 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f   of registers to
17630 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f   hold previous o
17640 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73  utput */.  int s
17650 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20  avedLimit;      
17660 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20   /* Saved value 
17670 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a  of p->iLimit */.
17680 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65    int savedOffse
17690 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  t;      /* Saved
176a0 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66   value of p->iOf
176b0 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  fset */.  int la
176c0 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20  belCmpr;        
176d0 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65  /* Label for the
176e0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65   start of the me
176f0 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f  rge algorithm */
17700 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b  .  int labelEnd;
17710 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65           /* Labe
17720 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66  l for the end of
17730 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c   the overall SEL
17740 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e  ECT stmt */.  in
17750 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20  t j1;           
17760 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74      /* Jump inst
17770 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65  ructions that ge
17780 74 20 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f  t retargetted */
17790 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
177a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
177b0 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e  of TK_ALL, TK_UN
177c0 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20  ION, TK_EXCEPT, 
177d0 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a  TK_INTERSECT */.
177e0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44    KeyInfo *pKeyD
177f0 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61  up = 0; /* Compa
17800 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  rison informatio
17810 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20  n for duplicate 
17820 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79  removal */.  Key
17830 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b  Info *pKeyMerge;
17840 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e     /* Comparison
17850 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
17860 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f   merging rows */
17870 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
17880 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
17890 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
178a0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
178b0 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68  OrderBy;   /* Th
178c0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
178d0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65  e */.  int nOrde
178e0 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rBy;         /* 
178f0 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
17900 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
17910 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
17920 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20  *aPermute;      
17930 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f    /* Mapping fro
17940 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  m ORDER BY terms
17950 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63   to result set c
17960 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65  olumns */.#ifnde
17970 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
17980 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62  PLAIN.  int iSub
17990 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
179a0 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d   EQP id of left-
179b0 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20  hand query */.  
179c0 69 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20 20  int iSub2;      
179d0 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20        /* EQP id 
179e0 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75  of right-hand qu
179f0 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ery */.#endif.. 
17a00 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
17a10 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73  erBy!=0 );.  ass
17a20 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20  ert( pKeyDup==0 
17a30 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20  ); /* "Managed" 
17a40 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e  code needs this.
17a50 20 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20    Ticket #3382. 
17a60 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  */.  db = pParse
17a70 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72  ->db;.  v = pPar
17a80 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
17a90 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20  ert( v!=0 );    
17aa0 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68     /* Already th
17ab0 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69  rown the error i
17ac0 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69  f VDBE alloc fai
17ad0 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e  led */.  labelEn
17ae0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
17af0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c  akeLabel(v);.  l
17b00 61 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74  abelCmpr = sqlit
17b10 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
17b20 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68  v);...  /* Patch
17b30 20 75 70 20 74 68 65 20 4f 52 44 45 52 20 42 59   up the ORDER BY
17b40 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f   clause.  */.  o
17b50 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70  p = p->op;  .  p
17b60 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
17b70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72  r;.  assert( pPr
17b80 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ior->pOrderBy==0
17b90 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d   );.  pOrderBy =
17ba0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
17bb0 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
17bc0 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d   );.  nOrderBy =
17bd0 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
17be0 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72  ;..  /* For oper
17bf0 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e  ators other than
17c00 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61   UNION ALL we ha
17c10 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ve to make sure 
17c20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52  that.  ** the OR
17c30 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f  DER BY clause co
17c40 76 65 72 73 20 65 76 65 72 79 20 74 65 72 6d 20  vers every term 
17c50 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  of the result se
17c60 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72  t.  Add.  ** ter
17c70 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20  ms to the ORDER 
17c80 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63  BY clause as nec
17c90 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69  essary..  */.  i
17ca0 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b  f( op!=TK_ALL ){
17cb0 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62  .    for(i=1; db
17cc0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
17cd0 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73  0 && i<=p->pELis
17ce0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
17cf0 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
17d00 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
17d10 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  m;.      for(j=0
17d20 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79  , pItem=pOrderBy
17d30 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b  ->a; j<nOrderBy;
17d40 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   j++, pItem++){.
17d50 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17d60 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
17d70 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20  rByCol>0 );.    
17d80 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75      if( pItem->u
17d90 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d  .x.iOrderByCol==
17da0 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  i ) break;.     
17db0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d   }.      if( j==
17dc0 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
17dd0 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
17de0 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
17df0 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b   TK_INTEGER, 0);
17e00 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
17e10 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  w==0 ) return SQ
17e20 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
17e30 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
17e40 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a  |= EP_IntValue;.
17e50 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
17e60 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20  iValue = i;.    
17e70 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 73      pOrderBy = s
17e80 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
17e90 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72  pend(pParse, pOr
17ea0 64 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20  derBy, pNew);.  
17eb0 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
17ec0 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61  By ) pOrderBy->a
17ed0 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78  [nOrderBy++].u.x
17ee0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28  .iOrderByCol = (
17ef0 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20  u16)i;.      }. 
17f00 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
17f10 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61  ompute the compa
17f20 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f  rison permutatio
17f30 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68  n and keyinfo th
17f40 61 74 20 69 73 20 75 73 65 64 20 77 69 74 68 0a  at is used with.
17f50 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61    ** the permuta
17f60 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74  tion used to det
17f70 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65  ermine if the ne
17f80 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72  xt.  ** row of r
17f90 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f  esults comes fro
17fa0 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c  m selectA or sel
17fb0 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20  ectB.  Also add 
17fc0 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f  explicit.  ** co
17fd0 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  llations to the 
17fe0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
17ff0 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68  terms so that wh
18000 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 69 65  en the subquerie
18010 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69  s.  ** to the ri
18020 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74  ght and the left
18030 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20   are evaluated, 
18040 74 68 65 79 20 75 73 65 20 74 68 65 20 63 6f 72  they use the cor
18050 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74  rect.  ** collat
18060 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72  ion..  */.  aPer
18070 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62  mute = sqlite3Db
18080 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
18090 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f 72 64 65 72  zeof(int)*nOrder
180a0 42 79 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d  By);.  if( aPerm
180b0 75 74 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ute ){.    struc
180c0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
180d0 2a 70 49 74 65 6d 3b 0a 20 20 20 20 66 6f 72 28  *pItem;.    for(
180e0 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65  i=0, pItem=pOrde
180f0 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65 72  rBy->a; i<nOrder
18100 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  By; i++, pItem++
18110 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
18120 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
18130 65 72 42 79 43 6f 6c 3e 30 0a 20 20 20 20 20 20  erByCol>0.      
18140 20 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 75 2e      && pItem->u.
18150 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70  x.iOrderByCol<=p
18160 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
18170 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74  );.      aPermut
18180 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e  e[i] = pItem->u.
18190 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20  x.iOrderByCol - 
181a0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65  1;.    }.    pKe
181b0 79 4d 65 72 67 65 20 3d 20 6d 75 6c 74 69 53 65  yMerge = multiSe
181c0 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
181d0 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29  fo(pParse, p, 1)
181e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
181f0 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20  KeyMerge = 0;.  
18200 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68  }..  /* Reattach
18210 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
18220 61 75 73 65 20 74 6f 20 74 68 65 20 71 75 65 72  ause to the quer
18230 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72  y..  */.  p->pOr
18240 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
18250 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  ;.  pPrior->pOrd
18260 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
18270 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65  prListDup(pParse
18280 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20  ->db, pOrderBy, 
18290 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  0);..  /* Alloca
182a0 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65  te a range of te
182b0 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
182c0 73 20 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66  s and the KeyInf
182d0 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f  o needed.  ** fo
182e0 72 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  r the logic that
182f0 20 72 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61   removes duplica
18300 74 65 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77  te result rows w
18310 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65  hen the.  ** ope
18320 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20  rator is UNION, 
18330 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52  EXCEPT, or INTER
18340 53 45 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e  SECT (but not UN
18350 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20  ION ALL)..  */. 
18360 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
18370 29 7b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d  ){.    regPrev =
18380 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
18390 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e   int nExpr = p->
183a0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
183b0 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65     assert( nOrde
183c0 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62  rBy>=nExpr || db
183d0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
183e0 3b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20  ;.    regPrev = 
183f0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
18400 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
18410 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20   += nExpr+1;.   
18420 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18430 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
18440 2c 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20  , 0, regPrev);. 
18450 20 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c     pKeyDup = sql
18460 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
18470 28 64 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a  (db, nExpr, 1);.
18480 20 20 20 20 69 66 28 20 70 4b 65 79 44 75 70 20      if( pKeyDup 
18490 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
184a0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
184b0 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 44  sWriteable(pKeyD
184c0 75 70 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  up) );.      for
184d0 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
184e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65  ++){.        pKe
184f0 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  yDup->aColl[i] =
18500 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
18510 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69  Seq(pParse, p, i
18520 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44  );.        pKeyD
18530 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  up->aSortOrder[i
18540 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
18550 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20     }.  }. .  /* 
18560 53 65 70 61 72 61 74 65 20 74 68 65 20 6c 65 66  Separate the lef
18570 74 20 61 6e 64 20 74 68 65 20 72 69 67 68 74 20  t and the right 
18580 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61  query from one a
18590 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d  nother.  */.  p-
185a0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70  >pPrior = 0;.  p
185b0 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 30  Prior->pNext = 0
185c0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
185d0 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70  veOrderGroupBy(p
185e0 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72  Parse, p, p->pOr
185f0 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b  derBy, "ORDER");
18600 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
18610 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
18620 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
18630 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
18640 65 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f  e, pPrior, pPrio
18650 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52  r->pOrderBy, "OR
18660 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  DER");.  }..  /*
18670 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d   Compute the lim
18680 69 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  it registers */.
18690 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
186a0 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
186b0 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
186c0 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26  if( p->iLimit &&
186d0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
186e0 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b     regLimitA = +
186f0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
18700 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b     regLimitB = +
18710 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
18720 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18730 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
18740 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d   p->iOffset ? p-
18750 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e  >iOffset+1 : p->
18760 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20  iLimit,.        
18770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18780 20 20 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d            regLim
18790 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  itA);.    sqlite
187a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
187b0 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74  P_Copy, regLimit
187c0 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20  A, regLimitB);. 
187d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c   }else{.    regL
187e0 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74  imitA = regLimit
187f0 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  B = 0;.  }.  sql
18800 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
18810 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
18820 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
18830 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
18840 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73  ete(db, p->pOffs
18850 65 74 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65  et);.  p->pOffse
18860 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64  t = 0;..  regAdd
18870 72 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rA = ++pParse->n
18880 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72 42 20  Mem;.  regAddrB 
18890 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
188a0 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b  ;.  regOutA = ++
188b0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
188c0 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72  regOutB = ++pPar
188d0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69  se->nMem;.  sqli
188e0 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
188f0 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f  t(&destA, SRT_Co
18900 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
18910 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  A);.  sqlite3Sel
18920 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
18930 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  tB, SRT_Coroutin
18940 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20  e, regAddrB);.. 
18950 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63   /* Generate a c
18960 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c  oroutine to eval
18970 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20  uate the SELECT 
18980 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65  statement to the
18990 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68  .  ** left of th
189a0 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61  e compound opera
189b0 74 6f 72 20 2d 20 74 68 65 20 22 41 22 20 73 65  tor - the "A" se
189c0 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 61 64 64  lect..  */.  add
189d0 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74  rSelectA = sqlit
189e0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
189f0 72 28 76 29 20 2b 20 31 3b 0a 20 20 6a 31 20 3d  r(v) + 1;.  j1 =
18a00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18a10 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
18a20 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41  outine, regAddrA
18a30 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74 41  , 0, addrSelectA
18a40 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
18a50 28 28 76 2c 20 22 6c 65 66 74 20 53 45 4c 45 43  ((v, "left SELEC
18a60 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e  T"));.  pPrior->
18a70 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69  iLimit = regLimi
18a80 74 41 3b 0a 20 20 65 78 70 6c 61 69 6e 53 65 74  tA;.  explainSet
18a90 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
18aa0 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
18ab0 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ctId);.  sqlite3
18ac0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
18ad0 50 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a  Prior, &destA);.
18ae0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18af0 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72  Op1(v, OP_EndCor
18b00 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41  outine, regAddrA
18b10 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
18b20 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b  JumpHere(v, j1);
18b30 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
18b40 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65  a coroutine to e
18b50 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45  valuate the SELE
18b60 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20  CT statement on 
18b70 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20  .  ** the right 
18b80 2d 20 74 68 65 20 22 42 22 20 73 65 6c 65 63 74  - the "B" select
18b90 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65  .  */.  addrSele
18ba0 63 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ctB = sqlite3Vdb
18bb0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
18bc0 2b 20 31 3b 0a 20 20 6a 31 20 3d 20 73 71 6c 69  + 1;.  j1 = sqli
18bd0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
18be0 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e   OP_InitCoroutin
18bf0 65 2c 20 72 65 67 41 64 64 72 42 2c 20 30 2c 20  e, regAddrB, 0, 
18c00 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20  addrSelectB);.  
18c10 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
18c20 22 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29  "right SELECT"))
18c30 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d  ;.  savedLimit =
18c40 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61   p->iLimit;.  sa
18c50 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69  vedOffset = p->i
18c60 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69  Offset;.  p->iLi
18c70 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b  mit = regLimitB;
18c80 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20  .  p->iOffset = 
18c90 30 3b 20 20 0a 20 20 65 78 70 6c 61 69 6e 53 65  0;  .  explainSe
18ca0 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20  tInteger(iSub2, 
18cb0 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
18cc0 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65  ectId);.  sqlite
18cd0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
18ce0 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d  p, &destB);.  p-
18cf0 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c  >iLimit = savedL
18d00 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73  imit;.  p->iOffs
18d10 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74  et = savedOffset
18d20 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
18d30 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43  ddOp1(v, OP_EndC
18d40 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
18d50 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  rB);..  /* Gener
18d60 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
18d70 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68   that outputs th
18d80 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66  e current row of
18d90 20 74 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65   the A.  ** sele
18da0 63 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f  ct as the next o
18db0 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65  utput row of the
18dc0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
18dd0 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  ..  */.  VdbeNoo
18de0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75  pComment((v, "Ou
18df0 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  tput routine for
18e00 20 41 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74   A"));.  addrOut
18e10 41 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70  A = generateOutp
18e20 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61  utSubroutine(pPa
18e30 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
18e40 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 41 2c        p, &destA,
18e50 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 41 2c   pDest, regOutA,
18e60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18e70 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44    regPrev, pKeyD
18e80 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  up, labelEnd);. 
18e90 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20   .  /* Generate 
18ea0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
18eb0 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75  t outputs the cu
18ec0 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65  rrent row of the
18ed0 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61   B.  ** select a
18ee0 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75  s the next outpu
18ef0 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d  t row of the com
18f00 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
18f10 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
18f20 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e  ALL || op==TK_UN
18f30 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e  ION ){.    VdbeN
18f40 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
18f50 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66  Output routine f
18f60 6f 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64  or B"));.    add
18f70 72 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65  rOutB = generate
18f80 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65  OutputSubroutine
18f90 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
18fa0 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65            p, &de
18fb0 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f  stB, pDest, regO
18fc0 75 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20  utB,.           
18fd0 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70        regPrev, p
18fe0 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64  KeyDup, labelEnd
18ff0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
19000 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65  KeyInfoUnref(pKe
19010 79 44 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  yDup);..  /* Gen
19020 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
19030 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74  ne to run when t
19040 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  he results from 
19050 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72  select A.  ** ar
19060 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20  e exhausted and 
19070 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c  only data in sel
19080 65 63 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20  ect B remains.. 
19090 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
190a0 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54  _EXCEPT || op==T
190b0 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
190c0 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20     addrEofA_noB 
190d0 3d 20 61 64 64 72 45 6f 66 41 20 3d 20 6c 61 62  = addrEofA = lab
190e0 65 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 20  elEnd;.  }else{ 
190f0 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f   .    VdbeNoopCo
19100 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41  mment((v, "eof-A
19110 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
19120 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73      addrEofA = s
19130 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19140 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
19150 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29  gOutB, addrOutB)
19160 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e  ;.    addrEofA_n
19170 6f 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  oB = sqlite3Vdbe
19180 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
19190 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 6c 61  ld, regAddrB, la
191a0 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 20 20 20  belEnd);.       
191b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64                Vd
191d0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
191e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
191f0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
19200 20 30 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20   0, addrEofA);. 
19210 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
19220 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c   += pPrior->nSel
19230 65 63 74 52 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f  ectRow;.  }..  /
19240 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
19250 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77  routine to run w
19260 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  hen the results 
19270 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20  from select B.  
19280 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64  ** are exhausted
19290 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69   and only data i
192a0 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69  n select A remai
192b0 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ns..  */.  if( o
192c0 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
192d0 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20  ){.    addrEofB 
192e0 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20 20  = addrEofA;.    
192f0 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  if( p->nSelectRo
19300 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  w > pPrior->nSel
19310 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c  ectRow ) p->nSel
19320 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d  ectRow = pPrior-
19330 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d  >nSelectRow;.  }
19340 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65  else{  .    Vdbe
19350 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
19360 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e  "eof-B subroutin
19370 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f  e"));.    addrEo
19380 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  fB = sqlite3Vdbe
19390 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
193a0 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64  ub, regOutA, add
193b0 72 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69  rOutA);.    sqli
193c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
193d0 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
193e0 64 72 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 20  drA, labelEnd); 
193f0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
19400 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19410 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
19420 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 42 29 3b  o, 0, addrEofB);
19430 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
19440 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64  ate code to hand
19450 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41  le the case of A
19460 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  <B.  */.  VdbeNo
19470 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
19480 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -lt-B subroutine
19490 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20  "));.  addrAltB 
194a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
194b0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
194c0 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75   regOutA, addrOu
194d0 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  tA);.  sqlite3Vd
194e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
194f0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
19500 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43  addrEofA); VdbeC
19510 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
19520 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19530 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c  v, OP_Goto, 0, l
19540 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a  abelCmpr);..  /*
19550 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
19560 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
19570 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20  e of A==B.  */. 
19580 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
19590 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20  ){.    addrAeqB 
195a0 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65  = addrAltB;.  }e
195b0 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  lse if( op==TK_I
195c0 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
195d0 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41  addrAeqB = addrA
195e0 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74  ltB;.    addrAlt
195f0 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  B++;.  }else{.  
19600 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
19610 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75  t((v, "A-eq-B su
19620 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
19630 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20   addrAeqB =.    
19640 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19650 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
19660 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66  egAddrA, addrEof
19670 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  A); VdbeCoverage
19680 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
19690 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
196a0 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43  _Goto, 0, labelC
196b0 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  mpr);.  }..  /* 
196c0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
196d0 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65   handle the case
196e0 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56   of A>B.  */.  V
196f0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
19700 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62 72 6f  v, "A-gt-B subro
19710 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72  utine"));.  addr
19720 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64  AgtB = sqlite3Vd
19730 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
19740 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  ;.  if( op==TK_A
19750 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49  LL || op==TK_UNI
19760 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ON ){.    sqlite
19770 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19780 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42  P_Gosub, regOutB
19790 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d  , addrOutB);.  }
197a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
197b0 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
197c0 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72  , regAddrB, addr
197d0 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72  EofB); VdbeCover
197e0 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
197f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19800 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c  P_Goto, 0, label
19810 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  Cmpr);..  /* Thi
19820 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65  s code runs once
19830 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65   to initialize e
19840 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a  verything..  */.
19850 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
19860 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20  pHere(v, j1);.  
19870 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19880 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
19890 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66  egAddrA, addrEof
198a0 41 5f 6e 6f 42 29 3b 20 56 64 62 65 43 6f 76 65  A_noB); VdbeCove
198b0 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
198c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
198d0 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
198e0 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56  rB, addrEofB); V
198f0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
19900 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20  .  /* Implement 
19910 74 68 65 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c  the main merge l
19920 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  oop.  */.  sqlit
19930 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
19940 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29  el(v, labelCmpr)
19950 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
19960 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d  ddOp4(v, OP_Perm
19970 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30  utation, 0, 0, 0
19980 2c 20 28 63 68 61 72 2a 29 61 50 65 72 6d 75 74  , (char*)aPermut
19990 65 2c 20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b  e, P4_INTARRAY);
199a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
199b0 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp4(v, OP_Compa
199c0 72 65 2c 20 64 65 73 74 41 2e 69 53 64 73 74 2c  re, destA.iSdst,
199d0 20 64 65 73 74 42 2e 69 53 64 73 74 2c 20 6e 4f   destB.iSdst, nO
199e0 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20  rderBy,.        
199f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a00 20 28 63 68 61 72 2a 29 70 4b 65 79 4d 65 72 67   (char*)pKeyMerg
19a10 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  e, P4_KEYINFO);.
19a20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
19a30 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
19a40 50 45 52 4d 55 54 45 29 3b 0a 20 20 73 71 6c 69  PERMUTE);.  sqli
19a50 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
19a60 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c   OP_Jump, addrAl
19a70 74 42 2c 20 61 64 64 72 41 65 71 42 2c 20 61 64  tB, addrAeqB, ad
19a80 64 72 41 67 74 42 29 3b 20 56 64 62 65 43 6f 76  drAgtB); VdbeCov
19a90 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20  erage(v);..  /* 
19aa0 4a 75 6d 70 20 74 6f 20 74 68 65 20 74 68 69 73  Jump to the this
19ab0 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20   point in order 
19ac0 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
19ad0 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73   query..  */.  s
19ae0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
19af0 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45  eLabel(v, labelE
19b00 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  nd);..  /* Set t
19b10 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
19b20 70 75 74 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f  put columns.  */
19b30 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44  .  if( pDest->eD
19b40 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
19b50 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ){.    Select *p
19b60 46 69 72 73 74 20 3d 20 70 50 72 69 6f 72 3b 0a  First = pPrior;.
19b70 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73      while( pFirs
19b80 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72  t->pPrior ) pFir
19b90 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72  st = pFirst->pPr
19ba0 69 6f 72 3b 0a 20 20 20 20 67 65 6e 65 72 61 74  ior;.    generat
19bb0 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
19bc0 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e  rse, 0, pFirst->
19bd0 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  pEList);.  }..  
19be0 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68  /* Reassembly th
19bf0 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
19c00 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c   so that it will
19c10 20 62 65 20 66 72 65 65 64 20 63 6f 72 72 65 63   be freed correc
19c20 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20  tly.  ** by the 
19c30 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
19c40 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
19c50 69 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ior ){.    sqlit
19c60 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
19c70 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  b, p->pPrior);. 
19c80 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d   }.  p->pPrior =
19c90 20 70 50 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f   pPrior;.  pPrio
19ca0 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20  r->pNext = p;.. 
19cb0 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65   /*** TBD:  Inse
19cc0 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61  rt subroutine ca
19cd0 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72  lls to close cur
19ce0 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65  sors on incomple
19cf0 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65  te.  **** subque
19d00 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70  ries ****/.  exp
19d10 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50  lainComposite(pP
19d20 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75  arse, p->op, iSu
19d30 62 31 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a 20  b1, iSub2, 0);. 
19d40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19d50 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  K;.}.#endif..#if
19d60 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
19d70 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
19d80 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
19d90 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a  TE_OMIT_VIEW)./*
19da0 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61   Forward Declara
19db0 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20  tions */.static 
19dc0 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
19dd0 73 74 28 73 71 6c 69 74 65 33 2a 2c 20 45 78 70  st(sqlite3*, Exp
19de0 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70  rList*, int, Exp
19df0 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20  rList*);.static 
19e00 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74  void substSelect
19e10 28 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63  (sqlite3*, Selec
19e20 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69  t *, int, ExprLi
19e30 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63  st *);../*.** Sc
19e40 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65  an through the e
19e50 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
19e60 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20    Replace every 
19e70 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20  reference to.** 
19e80 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c  a column in tabl
19e90 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20  e number iTable 
19ea0 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
19eb0 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a  he iColumn-th.**
19ec0 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74   entry in pEList
19ed0 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65  .  (But leave re
19ee0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
19ef0 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a  ROWID column .**
19f00 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a   unchanged.).**.
19f10 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
19f20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  is part of the f
19f30 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64  lattening proced
19f40 75 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79  ure.  A subquery
19f50 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74  .** whose result
19f60 20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20   set is defined 
19f70 62 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72  by pEList appear
19f80 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68  s as entry in th
19f90 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65  e.** FROM clause
19fa0 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63   of a SELECT suc
19fb0 68 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20  h that the VDBE 
19fc0 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20  cursor assigned 
19fd0 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20  to that.** FORM 
19fe0 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20  clause entry is 
19ff0 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f  iTable.  This ro
1a000 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e  utine make the n
1a010 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61  ecessary .** cha
1a020 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f  nges to pExpr so
1a030 20 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20   that it refers 
1a040 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20  directly to the 
1a050 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20  source table.** 
1a060 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
1a070 72 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c  rather the resul
1a080 74 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62  t set of the sub
1a090 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  query..*/.static
1a0a0 20 45 78 70 72 20 2a 73 75 62 73 74 45 78 70 72   Expr *substExpr
1a0b0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1a0c0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72          /* Repor
1a0d0 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  t malloc errors 
1a0e0 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  to this connecti
1a0f0 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  on */.  Expr *pE
1a100 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 45  xpr,        /* E
1a110 78 70 72 20 69 6e 20 77 68 69 63 68 20 73 75 62  xpr in which sub
1a120 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 73  stitution occurs
1a130 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
1a140 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ,         /* Tab
1a150 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74 69 74  le to be substit
1a160 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  uted */.  ExprLi
1a170 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a  st *pEList    /*
1a180 20 53 75 62 73 74 69 74 75 74 65 20 65 78 70 72   Substitute expr
1a190 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20  essions */.){.  
1a1a0 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
1a1b0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
1a1c0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
1a1d0 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54  UMN && pExpr->iT
1a1e0 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a  able==iTable ){.
1a1f0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
1a200 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
1a210 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
1a220 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _NULL;.    }else
1a230 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
1a240 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ew;.      assert
1a250 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70  ( pEList!=0 && p
1a260 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45  Expr->iColumn<pE
1a270 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
1a280 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
1a290 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20  pr->pLeft==0 && 
1a2a0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
1a2b0 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   );.      pNew =
1a2c0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
1a2d0 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45  db, pEList->a[pE
1a2e0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45  xpr->iColumn].pE
1a2f0 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  xpr, 0);.      s
1a300 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
1a310 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  (db, pExpr);.   
1a320 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b     pExpr = pNew;
1a330 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1a340 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
1a350 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
1a360 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69   pExpr->pLeft, i
1a370 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1a380 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
1a390 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  t = substExpr(db
1a3a0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1a3b0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1a3c0 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  ;.    if( ExprHa
1a3d0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1a3e0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
1a3f0 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c  {.      substSel
1a400 65 63 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78  ect(db, pExpr->x
1a410 2e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65  .pSelect, iTable
1a420 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  , pEList);.    }
1a430 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75 62 73  else{.      subs
1a440 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 45  tExprList(db, pE
1a450 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54  xpr->x.pList, iT
1a460 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1a470 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1a480 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69  n pExpr;.}.stati
1a490 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
1a4a0 4c 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20  List(.  sqlite3 
1a4b0 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *db,         /* 
1a4c0 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
1a4d0 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45  rors here */.  E
1a4e0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
1a4f0 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73      /* List to s
1a500 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68  can and in which
1a510 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
1a520 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  utes */.  int iT
1a530 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f  able,          /
1a540 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75  * Table to be su
1a550 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45  bstituted */.  E
1a560 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
1a570 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
1a580 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20  e values */.){. 
1a590 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
1a5a0 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
1a5b0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
1a5c0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
1a5d0 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69  {.    pList->a[i
1a5e0 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74 45  ].pExpr = substE
1a5f0 78 70 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  xpr(db, pList->a
1a600 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c  [i].pExpr, iTabl
1a610 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  e, pEList);.  }.
1a620 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
1a630 62 73 74 53 65 6c 65 63 74 28 0a 20 20 73 71 6c  bstSelect(.  sql
1a640 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
1a650 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c    /* Report mall
1a660 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a  oc errors here *
1a670 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
1a680 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45           /* SELE
1a690 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
1a6a0 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75  which to make su
1a6b0 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20  bstitutions */. 
1a6c0 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
1a6d0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
1a6e0 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20 2a 2f  o be replaced */
1a6f0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
1a700 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74  ist     /* Subst
1a710 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a  itute values */.
1a720 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
1a730 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  rc;.  struct Src
1a740 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1a750 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
1a760 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !p ) return;.  
1a770 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
1a780 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61  , p->pEList, iTa
1a790 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1a7a0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
1a7b0 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69  , p->pGroupBy, i
1a7c0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1a7d0 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1a7e0 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  db, p->pOrderBy,
1a7f0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1a800 3b 0a 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d  ;.  p->pHaving =
1a810 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
1a820 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c  ->pHaving, iTabl
1a830 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d  e, pEList);.  p-
1a840 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73 74 45  >pWhere = substE
1a850 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72  xpr(db, p->pWher
1a860 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  e, iTable, pELis
1a870 74 29 3b 0a 20 20 73 75 62 73 74 53 65 6c 65 63  t);.  substSelec
1a880 74 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  t(db, p->pPrior,
1a890 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1a8a0 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ;.  pSrc = p->pS
1a8b0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
1a8c0 72 63 20 29 3b 20 20 2f 2a 20 45 76 65 6e 20 66  rc );  /* Even f
1a8d0 6f 72 20 28 53 45 4c 45 43 54 20 31 29 20 77 65  or (SELECT 1) we
1a8e0 20 68 61 76 65 3a 20 70 53 72 63 21 3d 30 20 62   have: pSrc!=0 b
1a8f0 75 74 20 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 30  ut pSrc->nSrc==0
1a900 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53   */.  if( ALWAYS
1a910 28 70 53 72 63 29 20 29 7b 0a 20 20 20 20 66 6f  (pSrc) ){.    fo
1a920 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20  r(i=pSrc->nSrc, 
1a930 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69  pItem=pSrc->a; i
1a940 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
1a950 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65  ){.      substSe
1a960 6c 65 63 74 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lect(db, pItem->
1a970 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c  pSelect, iTable,
1a980 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a   pEList);.    }.
1a990 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
1a9a0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1a9b0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
1a9c0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
1a9d0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
1a9e0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
1a9f0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1aa00 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
1aa10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1aa20 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  )./*.** This rou
1aa30 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
1aa40 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72   flatten subquer
1aa50 69 65 73 20 61 73 20 61 20 70 65 72 66 6f 72 6d  ies as a perform
1aa60 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ance optimizatio
1aa70 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
1aa80 6e 65 20 72 65 74 75 72 6e 73 20 31 20 69 66 20  ne returns 1 if 
1aa90 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73  it makes changes
1aaa0 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61   and 0 if no fla
1aab0 74 74 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a  ttening occurs..
1aac0 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74  **.** To underst
1aad0 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20  and the concept 
1aae0 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63  of flattening, c
1aaf0 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
1ab00 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a  owing.** query:.
1ab10 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
1ab20 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   a FROM (SELECT 
1ab30 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
1ab40 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48   WHERE z<100) WH
1ab50 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  ERE a>5.**.** Th
1ab60 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66  e default way of
1ab70 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
1ab80 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65  is query is to e
1ab90 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75  xecute the.** su
1aba0 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64  bquery first and
1abb0 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
1abc0 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ts in a temporar
1abd0 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a  y table, then.**
1abe0 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71   run the outer q
1abf0 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d  uery on that tem
1ac00 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54  porary table.  T
1ac10 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f  his requires two
1ac20 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20  .** passes over 
1ac30 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68  the data.  Furth
1ac40 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20  ermore, because 
1ac50 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
1ac60 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e  ble.** has no in
1ac70 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45  dices, the WHERE
1ac80 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f   clause on the o
1ac90 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f  uter query canno
1aca0 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65  t be.** optimize
1acb0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
1acc0 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
1acd0 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65  o rewrite querie
1ace0 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62  s such as the ab
1acf0 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69  ove into.** a si
1ad00 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74  ngle flat select
1ad10 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  , like this:.**.
1ad20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
1ad30 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
1ad40 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61  HERE z<100 AND a
1ad50 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  >5.**.** The cod
1ad60 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  e generated for 
1ad70 74 68 69 73 20 73 69 6d 70 69 66 69 63 61 74 69  this simpificati
1ad80 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d  on gives the sam
1ad90 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20  e result.** but 
1ada0 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e  only has to scan
1adb0 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20   the data once. 
1adc0 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64   And because ind
1add0 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65  ices might .** e
1ade0 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c  xist on the tabl
1adf0 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65  e t1, a complete
1ae00 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74   scan of the dat
1ae10 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76  a might be.** av
1ae20 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61  oided..**.** Fla
1ae30 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20  ttening is only 
1ae40 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c  attempted if all
1ae50 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1ae60 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
1ae70 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62  *   (1)  The sub
1ae80 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
1ae90 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
1aea0 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67   both use aggreg
1aeb0 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32  ates..**.**   (2
1aec0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1aed0 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
1aee0 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72  ate or the outer
1aef0 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
1af00 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33  join..**.**   (3
1af10 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1af20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  is not the right
1af30 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65   operand of a le
1af40 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a  ft outer join.**
1af50 20 20 20 20 20 20 20 20 28 4f 72 69 67 69 6e 61          (Origina
1af60 6c 6c 79 20 74 69 63 6b 65 74 20 23 33 30 36 2e  lly ticket #306.
1af70 20 20 53 74 72 65 6e 67 74 68 65 6e 65 64 20 62    Strengthened b
1af80 79 20 74 69 63 6b 65 74 20 23 33 33 30 30 29 0a  y ticket #3300).
1af90 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65  **.**   (4)  The
1afa0 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
1afb0 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a   DISTINCT..**.**
1afc0 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70    (**)  At one p
1afd0 6f 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f 6e  oint restriction
1afe0 73 20 28 34 29 20 61 6e 64 20 28 35 29 20 64 65  s (4) and (5) de
1aff0 66 69 6e 65 64 20 61 20 73 75 62 73 65 74 20 6f  fined a subset o
1b000 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20  f DISTINCT.**   
1b010 20 20 20 20 20 73 75 62 2d 71 75 65 72 69 65 73       sub-queries
1b020 20 74 68 61 74 20 77 65 72 65 20 65 78 63 6c 75   that were exclu
1b030 64 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70  ded from this op
1b040 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74  timization. Rest
1b050 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20  riction .**     
1b060 20 20 20 28 34 29 20 68 61 73 20 73 69 6e 63 65     (4) has since
1b070 20 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20 74   been expanded t
1b080 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44 49  o exclude all DI
1b090 53 54 49 4e 43 54 20 73 75 62 71 75 65 72 69 65  STINCT subquerie
1b0a0 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20  s..**.**   (6)  
1b0b0 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1b0c0 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67  s not use aggreg
1b0d0 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65  ates or the oute
1b0e0 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a  r query is not.*
1b0f0 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43  *        DISTINC
1b100 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20  T..**.**   (7)  
1b110 54 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  The subquery has
1b120 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20   a FROM clause. 
1b130 20 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62 71   TODO:  For subq
1b140 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 0a 2a  ueries without.*
1b150 2a 20 20 20 20 20 20 20 20 41 20 46 52 4f 4d 20  *        A FROM 
1b160 63 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64 65 72  clause, consider
1b170 20 61 64 64 69 6e 67 20 61 20 46 52 4f 4d 20 63   adding a FROM c
1b180 6c 6f 73 65 20 77 69 74 68 20 74 68 65 20 73 70  lose with the sp
1b190 65 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  ecial.**        
1b1a0 74 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63  table sqlite_onc
1b1b0 65 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20  e that consists 
1b1c0 6f 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  of a single row 
1b1d0 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20  containing a.** 
1b1e0 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e 55         single NU
1b1f0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20  LL..**.**   (8) 
1b200 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
1b210 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
1b220 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
1b230 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
1b240 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20  n..**.**   (9)  
1b250 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1b260 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
1b270 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1b280 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a  ry does not use.
1b290 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67  **        aggreg
1b2a0 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30  ates..**.**  (10
1b2b0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1b2c0 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67  does not use agg
1b2d0 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f  regates or the o
1b2e0 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
1b2f0 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73  not.**        us
1b300 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20  e LIMIT..**.**  
1b310 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65  (11)  The subque
1b320 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
1b330 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
1b340 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59  th have ORDER BY
1b350 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
1b360 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65   (**)  Not imple
1b370 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65  mented.  Subsume
1b380 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69  d into restricti
1b390 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72 65  on (3).  Was pre
1b3a0 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20  viously.**      
1b3b0 20 20 61 20 73 65 70 61 72 61 74 65 20 72 65 73    a separate res
1b3c0 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e  triction derivin
1b3d0 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33  g from ticket #3
1b3e0 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20  50..**.**  (13) 
1b3f0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
1b400 64 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  d outer query do
1b410 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49   not both use LI
1b420 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29  MIT..**.**  (14)
1b430 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
1b440 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53  oes not use OFFS
1b450 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20  ET..**.**  (15) 
1b460 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   The outer query
1b470 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
1b480 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
1b490 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20  t or the.**     
1b4a0 20 20 20 73 75 62 71 75 65 72 79 20 64 6f 65 73     subquery does
1b4b0 20 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49   not have a LIMI
1b4c0 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20  T clause..**    
1b4d0 20 20 20 20 28 53 65 65 20 74 69 63 6b 65 74 20      (See ticket 
1b4e0 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65 74  #2339 and ticket
1b4f0 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e 0a   [02a8e81d44])..
1b500 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65  **.**  (16)  The
1b510 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
1b520 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
1b530 20 6f 72 20 74 68 65 20 73 75 62 71 75 65 72 79   or the subquery
1b540 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20   does.**        
1b550 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45  not contain ORDE
1b560 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23  R BY.  (Ticket #
1b570 32 39 34 32 29 20 20 54 68 69 73 20 75 73 65 64  2942)  This used
1b580 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a   to not matter.*
1b590 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77  *        until w
1b5a0 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65  e introduced the
1b5b0 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20   group_concat() 
1b5c0 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a  function.  .**.*
1b5d0 2a 20 20 28 31 37 29 20 20 54 68 65 20 73 75 62  *  (17)  The sub
1b5e0 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20  -query is not a 
1b5f0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
1b600 20 6f 72 20 69 74 20 69 73 20 61 20 55 4e 49 4f   or it is a UNIO
1b610 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20  N ALL .**       
1b620 20 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65   compound clause
1b630 20 6d 61 64 65 20 75 70 20 65 6e 74 69 72 65 6c   made up entirel
1b640 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61  y of non-aggrega
1b650 74 65 20 71 75 65 72 69 65 73 2c 20 61 6e 64 20  te queries, and 
1b660 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 70  .**        the p
1b670 61 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a  arent query:.**.
1b680 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73  **          * is
1b690 20 6e 6f 74 20 69 74 73 65 6c 66 20 70 61 72 74   not itself part
1b6a0 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
1b6b0 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20  elect,.**       
1b6c0 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61     * is not an a
1b6d0 67 67 72 65 67 61 74 65 20 6f 72 20 44 49 53 54  ggregate or DIST
1b6e0 49 4e 43 54 20 71 75 65 72 79 2c 20 61 6e 64 0a  INCT query, and.
1b6f0 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73  **          * is
1b700 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 0a 2a   not a join.**.*
1b710 2a 20 20 20 20 20 20 20 20 54 68 65 20 70 61 72  *        The par
1b720 65 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72  ent and sub-quer
1b730 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48  y may contain WH
1b740 45 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62  ERE clauses. Sub
1b750 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20  ject to.**      
1b760 20 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31    rules (11), (1
1b770 33 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65  3) and (14), the
1b780 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61  y may also conta
1b790 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20  in ORDER BY,.** 
1b7a0 20 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64         LIMIT and
1b7b0 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e   OFFSET clauses.
1b7c0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 63    The subquery c
1b7d0 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f  annot use any co
1b7e0 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20  mpound.**       
1b7f0 20 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20   operator other 
1b800 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62  than UNION ALL b
1b810 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f  ecause all the o
1b820 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a  ther compound.**
1b830 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72          operator
1b840 73 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65  s have an implie
1b850 64 20 44 49 53 54 49 4e 43 54 20 77 68 69 63 68  d DISTINCT which
1b860 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62   is disallowed b
1b870 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74  y.**        rest
1b880 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a  riction (4)..**.
1b890 2a 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20  **        Also, 
1b8a0 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f  each component o
1b8b0 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
1b8c0 6d 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20  must return the 
1b8d0 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20  same number.**  
1b8e0 20 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20        of result 
1b8f0 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73  columns. This is
1b900 20 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75   actually a requ
1b910 69 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20  irement for any 
1b920 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20  compound.**     
1b930 20 20 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d     SELECT statem
1b940 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65  ent, but all the
1b950 20 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20   code here does 
1b960 69 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  is make sure tha
1b970 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73  t no.**        s
1b980 75 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75  uch (illegal) su
1b990 62 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74 74  b-query is flatt
1b9a0 65 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  ened. The caller
1b9b0 20 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65   will detect the
1b9c0 0a 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61  .**        synta
1b9d0 78 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75  x error and retu
1b9e0 72 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65  rn a detailed me
1b9f0 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  ssage..**.**  (1
1ba00 38 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71  8)  If the sub-q
1ba10 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
1ba20 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20  nd select, then 
1ba30 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
1ba40 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52  .**        ORDER
1ba50 20 62 79 20 63 6c 61 75 73 65 20 6f 66 20 74 68   by clause of th
1ba60 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65  e parent must be
1ba70 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63   simple referenc
1ba80 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20  es to .**       
1ba90 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
1baa0 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a  sub-query..**.**
1bab0 20 20 28 31 39 29 20 20 54 68 65 20 73 75 62 71    (19)  The subq
1bac0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
1bad0 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
1bae0 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
1baf0 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61  not.**        ha
1bb00 76 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  ve a WHERE claus
1bb10 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20  e..**.**  (20)  
1bb20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
1bb30 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   is a compound s
1bb40 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d  elect, then it m
1bb50 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20  ust not use.**  
1bb60 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42        an ORDER B
1bb70 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65  Y clause.  Ticke
1bb80 74 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75  t #3773.  We cou
1bb90 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f  ld relax this co
1bba0 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20  nstraint.**     
1bbb0 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73     somewhat by s
1bbc0 61 79 69 6e 67 20 74 68 61 74 20 74 68 65 20 74  aying that the t
1bbd0 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
1bbe0 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74  R BY clause must
1bbf0 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65 61  .**        appea
1bc00 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20  r as unmodified 
1bc10 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69  result columns i
1bc20 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1bc30 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20 20 20  y.  But we.**   
1bc40 20 20 20 20 20 68 61 76 65 20 6f 74 68 65 72 20       have other 
1bc50 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e  optimizations in
1bc60 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69   mind to deal wi
1bc70 74 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a  th that case..**
1bc80 0a 2a 2a 20 20 28 32 31 29 20 20 54 68 65 20 73  .**  (21)  The s
1bc90 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1bca0 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
1bcb0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
1bcc0 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44   not.**        D
1bcd0 49 53 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74  ISTINCT.  (See t
1bce0 69 63 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66  icket [752e1646f
1bcf0 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29  c])..**.**  (22)
1bd00 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
1bd10 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76  s not a recursiv
1bd20 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 32  e CTE..**.**  (2
1bd30 33 29 20 20 54 68 65 20 70 61 72 65 6e 74 20 69  3)  The parent i
1bd40 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76  s not a recursiv
1bd50 65 20 43 54 45 2c 20 6f 72 20 74 68 65 20 73 75  e CTE, or the su
1bd60 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  b-query is not a
1bd70 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f  .**        compo
1bd80 75 6e 64 20 71 75 65 72 79 2e 20 54 68 69 73 20  und query. This 
1bd90 72 65 73 74 72 69 63 74 69 6f 6e 20 69 73 20 62  restriction is b
1bda0 65 63 61 75 73 65 20 74 72 61 6e 73 66 6f 72 6d  ecause transform
1bdb0 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ing the.**      
1bdc0 20 20 70 61 72 65 6e 74 20 74 6f 20 61 20 63 6f    parent to a co
1bdd0 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 63 6f 6e  mpound query con
1bde0 66 75 73 65 73 20 74 68 65 20 63 6f 64 65 20 74  fuses the code t
1bdf0 68 61 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 20  hat handles.**  
1be00 20 20 20 20 20 20 72 65 63 75 72 73 69 76 65 20        recursive 
1be10 71 75 65 72 69 65 73 20 69 6e 20 6d 75 6c 74 69  queries in multi
1be20 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 0a  Select()..**.**.
1be30 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69  ** In this routi
1be40 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61  ne, the "p" para
1be50 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
1be60 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20  er to the outer 
1be70 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75  query..** The su
1be80 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72  bquery is p->pSr
1be90 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73  c->a[iFrom].  is
1bea0 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
1beb0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a  he outer query.*
1bec0 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  * uses aggregate
1bed0 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49 73  s and subqueryIs
1bee0 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
1bef0 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
1bf00 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
1bf10 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
1bf20 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65   is not attempte
1bf30 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
1bf40 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72  is a no-op and r
1bf50 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20  eturns 0..** If 
1bf60 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74  flattening is at
1bf70 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75  tempted this rou
1bf80 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a  tine returns 1..
1bf90 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65  **.** All of the
1bfa0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c   expression anal
1bfb0 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20  ysis must occur 
1bfc0 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65  on both the oute
1bfd0 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74  r query and.** t
1bfe0 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f  he subquery befo
1bff0 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
1c000 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  runs..*/.static 
1c010 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75  int flattenSubqu
1c020 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ery(.  Parse *pP
1c030 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
1c040 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1c050 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
1c060 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1c070 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20  parent or outer 
1c080 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1c090 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c   */.  int iFrom,
1c0a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1c0b0 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e  dex in p->pSrc->
1c0c0 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  a[] of the inner
1c0d0 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
1c0e0 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20  nt isAgg,       
1c0f0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
1c100 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73  uter SELECT uses
1c110 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1c120 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75  ions */.  int su
1c130 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f  bqueryIsAgg    /
1c140 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75  * True if the su
1c150 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
1c160 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
1c170 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
1c180 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
1c190 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e  ntext = pParse->
1c1a0 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  zAuthContext;.  
1c1b0 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b  Select *pParent;
1c1c0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b  .  Select *pSub;
1c1d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
1c1e0 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75  ner query or "su
1c1f0 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c  bquery" */.  Sel
1c200 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20  ect *pSub1;     
1c210 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
1c220 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c  he rightmost sel
1c230 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79  ect in sub-query
1c240 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1c250 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Src;      /* The
1c260 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1c270 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1c280 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
1c290 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20  ubSrc;   /* The 
1c2a0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1c2b0 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
1c2c0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1c2d0 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75  ;    /* The resu
1c2e0 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75  lt set of the ou
1c2f0 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ter query */.  i
1c300 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20  nt iParent;     
1c310 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f     /* VDBE curso
1c320 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
1c330 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20  pSub result set 
1c340 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
1c350 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
1c360 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1c370 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ter */.  Expr *p
1c380 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20  Where;          
1c390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1c3a0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
1c3b0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1c3c0 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d  t_item *pSubitem
1c3d0 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75  ;   /* The subqu
1c3e0 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
1c3f0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1c400 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  b;..  /* Check t
1c410 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e  o see if flatten
1c420 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
1c430 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
1c440 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ot..  */.  asser
1c450 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
1c460 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  ert( p->pPrior==
1c470 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65 20  0 );  /* Unable 
1c480 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70 6f  to flatten compo
1c490 75 6e 64 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  und queries */. 
1c4a0 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f   if( Optimizatio
1c4b0 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51  nDisabled(db, SQ
1c4c0 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65  LITE_QueryFlatte
1c4d0 6e 65 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ner) ) return 0;
1c4e0 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
1c4f0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
1c500 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26  c && iFrom>=0 &&
1c510 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72   iFrom<pSrc->nSr
1c520 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20  c );.  pSubitem 
1c530 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  = &pSrc->a[iFrom
1c540 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70  ];.  iParent = p
1c550 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72  Subitem->iCursor
1c560 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69  ;.  pSub = pSubi
1c570 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
1c580 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20  assert( pSub!=0 
1c590 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 26  );.  if( isAgg &
1c5a0 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  & subqueryIsAgg 
1c5b0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1c5c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1c5d0 65 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20  estriction (1)  
1c5e0 2a 2f 0a 20 20 69 66 28 20 73 75 62 71 75 65 72  */.  if( subquer
1c5f0 79 49 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e  yIsAgg && pSrc->
1c600 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20  nSrc>1 ) return 
1c610 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  0;          /* R
1c620 65 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20 20  estriction (2)  
1c630 2a 2f 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70  */.  pSubSrc = p
1c640 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  Sub->pSrc;.  ass
1c650 65 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a  ert( pSubSrc );.
1c660 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65    /* Prior to ve
1c670 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65  rsion 3.1.2, whe
1c680 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  n LIMIT and OFFS
1c690 45 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d  ET had to be sim
1c6a0 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20  ple constants,. 
1c6b0 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72   ** not arbitrar
1c6c0 79 20 65 78 70 72 65 73 73 73 69 6f 6e 73 2c 20  y expresssions, 
1c6d0 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20  we allowed some 
1c6e0 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d  combining of LIM
1c6f0 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20  IT and OFFSET.  
1c700 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20  ** because they 
1c710 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  could be compute
1c720 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
1c730 65 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d  e.  But when LIM
1c740 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20  IT and OFFSET.  
1c750 2a 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72  ** became arbitr
1c760 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ary expressions,
1c770 20 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20   we were forced 
1c780 74 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69  to add restricti
1c790 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e  ons (13).  ** an
1c7a0 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28  d (14). */.  if(
1c7b0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1c7c0 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74   p->pLimit ) ret
1c7d0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1c7e0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1c7f0 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28  on (13) */.  if(
1c800 20 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29   pSub->pOffset )
1c810 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1c820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c830 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1c840 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28  on (14) */.  if(
1c850 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
1c860 53 46 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d 30 20  SF_Compound)!=0 
1c870 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  && pSub->pLimit 
1c880 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1c890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1c8c0 65 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20  estriction (15) 
1c8d0 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75  */.  }.  if( pSu
1c8e0 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20  bSrc->nSrc==0 ) 
1c8f0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1c900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c910 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1c920 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  7)  */.  if( pSu
1c930 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
1c940 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75  _Distinct ) retu
1c950 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1c960 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1c970 35 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  5)  */.  if( pSu
1c980 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 53  b->pLimit && (pS
1c990 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73  rc->nSrc>1 || is
1c9a0 41 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74  Agg) ){.     ret
1c9b0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f  urn 0;         /
1c9c0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28  * Restrictions (
1c9d0 38 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69  8)(9) */.  }.  i
1c9e0 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
1c9f0 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d  & SF_Distinct)!=
1ca00 30 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41  0 && subqueryIsA
1ca10 67 67 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  gg ){.     retur
1ca20 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  n 0;         /* 
1ca30 52 65 73 74 72 69 63 74 69 6f 6e 20 28 36 29 20  Restriction (6) 
1ca40 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d   */.  }.  if( p-
1ca50 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70 53 75  >pOrderBy && pSu
1ca60 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
1ca70 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1ca80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1caa0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1cab0 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20  iction (11) */. 
1cac0 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20 26   }.  if( isAgg &
1cad0 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  & pSub->pOrderBy
1cae0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1caf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1cb00 65 73 74 72 69 63 74 69 6f 6e 20 28 31 36 29 20  estriction (16) 
1cb10 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1cb20 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 57 68 65  Limit && p->pWhe
1cb30 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  re ) return 0;  
1cb40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1cb50 65 73 74 72 69 63 74 69 6f 6e 20 28 31 39 29 20  estriction (19) 
1cb60 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1cb70 4c 69 6d 69 74 20 26 26 20 28 70 2d 3e 73 65 6c  Limit && (p->sel
1cb80 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
1cb90 6e 63 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  nct)!=0 ){.     
1cba0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1cbb0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1cbc0 20 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69   (21) */.  }.  i
1cbd0 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  f( pSub->selFlag
1cbe0 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
1cbf0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1cc00 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1cc10 74 69 6f 6e 20 28 32 32 29 20 20 2a 2f 0a 20 20  tion (22)  */.  
1cc20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
1cc30 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 29   & SF_Recursive)
1cc40 20 26 26 20 70 53 75 62 2d 3e 70 50 72 69 6f 72   && pSub->pPrior
1cc50 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1cc60 20 20 20 2f 2a 20 28 32 33 29 20 20 2a 2f 0a 0a     /* (23)  */..
1cc70 20 20 2f 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f    /* OBSOLETE CO
1cc80 4d 4d 45 4e 54 20 31 3a 0a 20 20 2a 2a 20 52 65  MMENT 1:.  ** Re
1cc90 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20 49 66  striction 3:  If
1cca0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
1ccb0 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75   a join, make su
1ccc0 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  re the subquery 
1ccd0 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65  is .  ** not use
1cce0 64 20 61 73 20 74 68 65 20 72 69 67 68 74 20 6f  d as the right o
1ccf0 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74  perand of an out
1cd00 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c  er join.  Exampl
1cd10 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20  es of why this. 
1cd20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77   ** is not allow
1cd30 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
1cd40 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55        t1 LEFT OU
1cd50 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49  TER JOIN (t2 JOI
1cd60 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  N t3).  **.  ** 
1cd70 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68  If we flatten th
1cd80 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c  e above, we woul
1cd90 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20  d get.  **.  ** 
1cda0 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54          (t1 LEFT
1cdb0 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20   OUTER JOIN t2) 
1cdc0 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a  JOIN t3.  **.  *
1cdd0 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61  * which is not a
1cde0 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74  t all the same t
1cdf0 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  hing..  **.  ** 
1ce00 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54  OBSOLETE COMMENT
1ce10 20 32 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63   2:.  ** Restric
1ce20 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68 65  tion 12:  If the
1ce30 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65   subquery is the
1ce40 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
1ce50 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a 20  f a left outer. 
1ce60 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73   ** join, make s
1ce70 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ure the subquery
1ce80 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c   has no WHERE cl
1ce90 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78  ause..  ** An ex
1cea0 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68  amples of why th
1ceb0 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  is is not allowe
1cec0 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  d:.  **.  **    
1ced0 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54       t1 LEFT OUT
1cee0 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20  ER JOIN (SELECT 
1cef0 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20  * FROM t2 WHERE 
1cf00 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a  t2.x>0).  **.  *
1cf10 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20  * If we flatten 
1cf20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f  the above, we wo
1cf30 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a  uld get.  **.  *
1cf40 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45  *         (t1 LE
1cf50 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32  FT OUTER JOIN t2
1cf60 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a 20  ) WHERE t2.x>0. 
1cf70 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68 65   **.  ** But the
1cf80 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69 6c   t2.x>0 test wil
1cf90 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e  l always fail on
1cfa0 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74   a NULL row of t
1cfb0 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65 66  2, which.  ** ef
1cfc0 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65 72  fectively conver
1cfd0 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f 49  ts the OUTER JOI
1cfe0 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20  N into an INNER 
1cff0 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  JOIN..  **.  ** 
1d000 54 48 49 53 20 4f 56 45 52 52 49 44 45 53 20 4f  THIS OVERRIDES O
1d010 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 53  BSOLETE COMMENTS
1d020 20 31 20 41 4e 44 20 32 20 41 42 4f 56 45 3a 0a   1 AND 2 ABOVE:.
1d030 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 33 33 30    ** Ticket #330
1d040 30 20 73 68 6f 77 73 20 74 68 61 74 20 66 6c 61  0 shows that fla
1d050 74 74 65 6e 69 6e 67 20 74 68 65 20 72 69 67 68  ttening the righ
1d060 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54  t term of a LEFT
1d070 20 4a 4f 49 4e 0a 20 20 2a 2a 20 69 73 20 66 72   JOIN.  ** is fr
1d080 61 75 67 68 74 20 77 69 74 68 20 64 61 6e 67 65  aught with dange
1d090 72 2e 20 20 42 65 73 74 20 74 6f 20 61 76 6f 69  r.  Best to avoi
1d0a0 64 20 74 68 65 20 77 68 6f 6c 65 20 74 68 69 6e  d the whole thin
1d0b0 67 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  g.  If the.  ** 
1d0c0 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20  subquery is the 
1d0d0 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20  right term of a 
1d0e0 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20  LEFT JOIN, then 
1d0f0 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e 2e 0a  do not flatten..
1d100 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62    */.  if( (pSub
1d110 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  item->jointype &
1d120 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b   JT_OUTER)!=0 ){
1d130 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1d140 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63   }..  /* Restric
1d150 74 69 6f 6e 20 31 37 3a 20 49 66 20 74 68 65 20  tion 17: If the 
1d160 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
1d170 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20  ompound SELECT, 
1d180 74 68 65 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a  then it must.  *
1d190 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 55  * use only the U
1d1a0 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
1d1b0 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74  r. And none of t
1d1c0 68 65 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74  he simple select
1d1d0 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 68   queries.  ** th
1d1e0 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63  at make up the c
1d1f0 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61  ompound SELECT a
1d200 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  re allowed to be
1d210 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 64 69   aggregate or di
1d220 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72  stinct.  ** quer
1d230 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ies..  */.  if( 
1d240 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  pSub->pPrior ){.
1d250 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f      if( pSub->pO
1d260 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
1d270 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65  return 0;  /* Re
1d280 73 74 72 69 63 74 69 6f 6e 20 32 30 20 2a 2f 0a  striction 20 */.
1d290 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
1d2a0 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c  Agg || (p->selFl
1d2b0 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
1d2c0 74 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e  t)!=0 || pSrc->n
1d2d0 53 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  Src!=1 ){.      
1d2e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1d2f0 20 20 20 20 66 6f 72 28 70 53 75 62 31 3d 70 53      for(pSub1=pS
1d300 75 62 3b 20 70 53 75 62 31 3b 20 70 53 75 62 31  ub; pSub1; pSub1
1d310 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b  =pSub1->pPrior){
1d320 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d330 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67   (pSub1->selFlag
1d340 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
1d350 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
1d360 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a  =SF_Distinct );.
1d370 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1d380 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73  (pSub1->selFlags
1d390 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
1d3a0 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
1d3b0 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a  SF_Aggregate );.
1d3c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
1d3d0 75 62 2d 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20  ub->pSrc!=0 );. 
1d3e0 20 20 20 20 20 69 66 28 20 28 70 53 75 62 31 2d       if( (pSub1-
1d3f0 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
1d400 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
1d410 65 67 61 74 65 29 29 21 3d 30 0a 20 20 20 20 20  egate))!=0.     
1d420 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70 50 72    || (pSub1->pPr
1d430 69 6f 72 20 26 26 20 70 53 75 62 31 2d 3e 6f 70  ior && pSub1->op
1d440 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20 20 20 20  !=TK_ALL) .     
1d450 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72 63    || pSub1->pSrc
1d460 2d 3e 6e 53 72 63 3c 31 0a 20 20 20 20 20 20 20  ->nSrc<1.       
1d470 7c 7c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d  || pSub->pEList-
1d480 3e 6e 45 78 70 72 21 3d 70 53 75 62 31 2d 3e 70  >nExpr!=pSub1->p
1d490 45 4c 69 73 74 2d 3e 6e 45 78 70 72 0a 20 20 20  EList->nExpr.   
1d4a0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65     ){.        re
1d4b0 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
1d4c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1d4d0 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72  pSub1->pSrc->nSr
1d4e0 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  c>1 );.    }..  
1d4f0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1d500 20 31 38 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   18. */.    if( 
1d510 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
1d520 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
1d530 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
1d540 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  p->pOrderBy->nEx
1d550 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  pr; ii++){.     
1d560 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
1d570 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f  By->a[ii].u.x.iO
1d580 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72  rderByCol==0 ) r
1d590 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
1d5a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1d5b0 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68  **** If we reach
1d5c0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61   this point, fla
1d5d0 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
1d5e0 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 0a 20 20  tted. *****/..  
1d5f0 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65  /* Authorize the
1d600 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70   subquery */.  p
1d610 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
1d620 65 78 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ext = pSubitem->
1d630 7a 4e 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c  zName;.  TESTONL
1d640 59 28 69 20 3d 29 20 73 71 6c 69 74 65 33 41 75  Y(i =) sqlite3Au
1d650 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
1d660 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30  SQLITE_SELECT, 0
1d670 2c 20 30 2c 20 30 29 3b 0a 20 20 74 65 73 74 63  , 0, 0);.  testc
1d680 61 73 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44  ase( i==SQLITE_D
1d690 45 4e 59 20 29 3b 0a 20 20 70 50 61 72 73 65 2d  ENY );.  pParse-
1d6a0 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
1d6b0 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
1d6c0 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  t;..  /* If the 
1d6d0 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
1d6e0 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73  ompound SELECT s
1d6f0 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28  tatement, then (
1d700 62 79 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a  by restrictions.
1d710 20 20 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61    ** 17 and 18 a
1d720 62 6f 76 65 29 20 69 74 20 6d 75 73 74 20 62 65  bove) it must be
1d730 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64   a UNION ALL and
1d740 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
1d750 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20  y must .  ** be 
1d760 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a  of the form:.  *
1d770 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
1d780 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52  T <expr-list> FR
1d790 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29  OM (<sub-query>)
1d7a0 20 3c 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20   <where-clause> 
1d7b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f  .  **.  ** follo
1d7c0 77 65 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52  wed by any ORDER
1d7d0 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f   BY, LIMIT and/o
1d7e0 72 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  r OFFSET clauses
1d7f0 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a  . This block.  *
1d800 2a 20 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f  * creates N-1 co
1d810 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 65  pies of the pare
1d820 6e 74 20 71 75 65 72 79 20 77 69 74 68 6f 75 74  nt query without
1d830 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c   any ORDER BY, L
1d840 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46  IMIT or .  ** OF
1d850 46 53 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64  FSET clauses and
1d860 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74   joins them to t
1d870 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64  he left-hand-sid
1d880 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
1d890 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49  l.  ** using UNI
1d8a0 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73  ON ALL operators
1d8b0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e  . In this case N
1d8c0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1d8d0 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65  f simple.  ** se
1d8e0 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20  lect statements 
1d8f0 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  in the compound 
1d900 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a  sub-query..  **.
1d910 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
1d920 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
1d930 43 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20  CT a+1 FROM (.  
1d940 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
1d950 20 78 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a   x FROM tab.  **
1d960 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
1d970 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  L.  **        SE
1d980 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a  LECT y FROM tab.
1d990 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f    **        UNIO
1d9a0 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20  N ALL.  **      
1d9b0 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32    SELECT abs(z*2
1d9c0 29 20 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a  ) FROM tab2.  **
1d9d0 20 20 20 20 20 29 20 57 48 45 52 45 20 61 21 3d       ) WHERE a!=
1d9e0 35 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a  5 ORDER BY 1.  *
1d9f0 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d  *.  ** Transform
1da00 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20  ed into:.  **.  
1da10 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
1da20 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45  1 FROM tab WHERE
1da30 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20   x+1!=5.  **    
1da40 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
1da50 20 20 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46      SELECT y+1 F
1da60 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b  ROM tab WHERE y+
1da70 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e  1!=5.  **     UN
1da80 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20  ION ALL.  **    
1da90 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29   SELECT abs(z*2)
1daa0 2b 31 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45  +1 FROM tab2 WHE
1dab0 52 45 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35  RE abs(z*2)+1!=5
1dac0 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20  .  **     ORDER 
1dad0 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  BY 1.  **.  ** W
1dae0 65 20 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20  e call this the 
1daf0 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65  "compound-subque
1db00 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a  ry flattening"..
1db10 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d    */.  for(pSub=
1db20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53  pSub->pPrior; pS
1db30 75 62 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70  ub; pSub=pSub->p
1db40 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65  Prior){.    Sele
1db50 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78  ct *pNew;.    Ex
1db60 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
1db70 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
1db80 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
1db90 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
1dba0 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20    Expr *pOffset 
1dbb0 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
1dbc0 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
1dbd0 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
1dbe0 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
1dbf0 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d  0;.    p->pSrc =
1dc00 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f   0;.    p->pPrio
1dc10 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c  r = 0;.    p->pL
1dc20 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d  imit = 0;.    p-
1dc30 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
1dc40 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
1dc50 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2c  SelectDup(db, p,
1dc60 20 30 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66   0);.    p->pOff
1dc70 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20  set = pOffset;. 
1dc80 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
1dc90 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f  Limit;.    p->pO
1dca0 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
1dcb0 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d  y;.    p->pSrc =
1dcc0 20 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70   pSrc;.    p->op
1dcd0 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69   = TK_ALL;.    i
1dce0 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
1dcf0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
1dd00 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73  pPrior;.    }els
1dd10 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  e{.      pNew->p
1dd20 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
1dd30 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72        if( pPrior
1dd40 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74   ) pPrior->pNext
1dd50 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70   = pNew;.      p
1dd60 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a  New->pNext = p;.
1dd70 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
1dd80 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20  = pNew;.    }.  
1dd90 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1dda0 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
1ddb0 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67  1;.  }..  /* Beg
1ddc0 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68  in flattening th
1ddd0 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79  e iFrom-th entry
1dde0 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1ddf0 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65  use .  ** in the
1de00 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
1de10 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62  */.  pSub = pSub
1de20 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53  1 = pSubitem->pS
1de30 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c  elect;..  /* Del
1de40 65 74 65 20 74 68 65 20 74 72 61 6e 73 69 65 6e  ete the transien
1de50 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  t table structur
1de60 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
1de70 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75  h the.  ** subqu
1de80 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ery.  */.  sqlit
1de90 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75  e3DbFree(db, pSu
1dea0 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  bitem->zDatabase
1deb0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
1dec0 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d  ee(db, pSubitem-
1ded0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  >zName);.  sqlit
1dee0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75  e3DbFree(db, pSu
1def0 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  bitem->zAlias);.
1df00 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74    pSubitem->zDat
1df10 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70 53 75  abase = 0;.  pSu
1df20 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30  bitem->zName = 0
1df30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41  ;.  pSubitem->zA
1df40 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53 75 62  lias = 0;.  pSub
1df50 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  item->pSelect = 
1df60 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20 64  0;..  /* Defer d
1df70 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61 62 6c  eleting the Tabl
1df80 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61  e object associa
1df90 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a  ted with the.  *
1dfa0 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74 69 6c  * subquery until
1dfb0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e   code generation
1dfc0 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74   is.  ** complet
1dfd0 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 6d  e, since there m
1dfe0 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74 20 45  ay still exist E
1dff0 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69 65 73  xpr.pTab entries
1e000 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66 65 72   that.  ** refer
1e010 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79   to the subquery
1e020 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c 61 74   even after flat
1e030 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74 20  tening.  Ticket 
1e040 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  #3346..  **.  **
1e050 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20   pSubitem->pTab 
1e060 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55  is always non-NU
1e070 4c 4c 20 62 79 20 74 65 73 74 20 72 65 73 74 72  LL by test restr
1e080 69 63 74 69 6f 6e 73 20 61 6e 64 20 74 65 73 74  ictions and test
1e090 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20  s above..  */.  
1e0a0 69 66 28 20 41 4c 57 41 59 53 28 70 53 75 62 69  if( ALWAYS(pSubi
1e0b0 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b  tem->pTab!=0) ){
1e0c0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
1e0d0 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74 65 6d  ToDel = pSubitem
1e0e0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20  ->pTab;.    if( 
1e0f0 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d  pTabToDel->nRef=
1e100 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73  =1 ){.      Pars
1e110 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73  e *pToplevel = s
1e120 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
1e130 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  vel(pParse);.   
1e140 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e     pTabToDel->pN
1e150 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70  extZombie = pTop
1e160 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61  level->pZombieTa
1e170 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76  b;.      pToplev
1e180 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d  el->pZombieTab =
1e190 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20   pTabToDel;.    
1e1a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61  }else{.      pTa
1e1b0 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a  bToDel->nRef--;.
1e1c0 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69 74      }.    pSubit
1e1d0 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20  em->pTab = 0;.  
1e1e0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
1e1f0 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20  owing loop runs 
1e200 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 65  once for each te
1e210 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64  rm in a compound
1e220 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 66  -subquery.  ** f
1e230 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64 65  lattening (as de
1e240 73 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e 20  scribed above). 
1e250 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67   If we are doing
1e260 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69 6e   a different kin
1e270 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65  d.  ** of flatte
1e280 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65 6e  ning - a flatten
1e290 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ing other than a
1e2a0 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65   compound-subque
1e2b0 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a  ry flattening -.
1e2c0 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 6c    ** then this l
1e2d0 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e  oop only runs on
1e2e0 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ce..  **.  ** Th
1e2f0 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c  is loop moves al
1e300 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c  l of the FROM el
1e310 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75  ements of the su
1e320 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a  bquery into the.
1e330 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    ** the FROM cl
1e340 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
1e350 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65  r query.  Before
1e360 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d   doing this, rem
1e370 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63  ember.  ** the c
1e380 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
1e390 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75   the original ou
1e3a0 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65  ter query FROM e
1e3b0 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69  lement in.  ** i
1e3c0 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61  Parent.  The iPa
1e3d0 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c  rent cursor will
1e3e0 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20   never be used. 
1e3f0 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65   Subsequent code
1e400 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20  .  ** will scan 
1e410 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b  expressions look
1e420 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20  ing for iParent 
1e430 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72  references and r
1e440 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73  eplace.  ** thos
1e450 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74  e references wit
1e460 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  h expressions th
1e470 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68  at resolve to th
1e480 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a  e subquery FROM.
1e490 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65    ** elements we
1e4a0 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67   are now copying
1e4b0 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28   in..  */.  for(
1e4c0 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72 65  pParent=p; pPare
1e4d0 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61 72  nt; pParent=pPar
1e4e0 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75  ent->pPrior, pSu
1e4f0 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b  b=pSub->pPrior){
1e500 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63  .    int nSubSrc
1e510 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79 70  ;.    u8 jointyp
1e520 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 53  e = 0;.    pSubS
1e530 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b  rc = pSub->pSrc;
1e540 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
1e550 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79 20  use of subquery 
1e560 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20 3d  */.    nSubSrc =
1e570 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20   pSubSrc->nSrc; 
1e580 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
1e590 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79 20  rms in subquery 
1e5a0 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
1e5b0 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e     pSrc = pParen
1e5c0 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20  t->pSrc;     /* 
1e5d0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1e5e0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
1e5f0 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 20  /..    if( pSrc 
1e600 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1e610 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20   pParent==p );  
1e620 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74 68  /* First time th
1e630 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a  rough the loop *
1e640 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65  /.      jointype
1e650 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69   = pSubitem->joi
1e660 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65  ntype;.    }else
1e670 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1e680 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f  pParent!=p );  /
1e690 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71  * 2nd and subseq
1e6a0 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72 6f 75  uent times throu
1e6b0 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  gh the loop */. 
1e6c0 20 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72       pSrc = pPar
1e6d0 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69  ent->pSrc = sqli
1e6e0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1e6f0 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  (db, 0, 0, 0);. 
1e700 20 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30       if( pSrc==0
1e710 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1e720 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
1e730 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
1e740 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1e750 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
1e760 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
1e770 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20   single slot of 
1e780 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1e790 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20 20  of the outer.   
1e7a0 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20 74   ** query.  If t
1e7b0 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
1e7c0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c  more than one el
1e7d0 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52 4f  ement in its FRO
1e7e0 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a  M clause,.    **
1e7f0 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68 65   then expand the
1e800 20 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f 20   outer query to 
1e810 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 69  make space for i
1e820 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c  t to hold all el
1e830 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66  ements.    ** of
1e840 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
1e850 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61     **.    ** Exa
1e860 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mple:.    **.   
1e870 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   **    SELECT * 
1e880 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c 45  FROM tabA, (SELE
1e890 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20  CT * FROM sub1, 
1e8a0 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20 20  sub2), tabB;.   
1e8b0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f   **.    ** The o
1e8c0 75 74 65 72 20 71 75 65 72 79 20 68 61 73 20 33  uter query has 3
1e8d0 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46 52   slots in its FR
1e8e0 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20  OM clause.  One 
1e8f0 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20 20  slot of the.    
1e900 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 28  ** outer query (
1e910 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29  the middle slot)
1e920 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
1e930 73 75 62 71 75 65 72 79 2e 20 20 54 68 65 20 6e  subquery.  The n
1e940 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  ext.    ** block
1e950 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65 78   of code will ex
1e960 70 61 6e 64 20 74 68 65 20 6f 75 74 20 71 75 65  pand the out que
1e970 72 79 20 74 6f 20 34 20 73 6c 6f 74 73 2e 20 20  ry to 4 slots.  
1e980 54 68 65 20 6d 69 64 64 6c 65 0a 20 20 20 20 2a  The middle.    *
1e990 2a 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e 64  * slot is expand
1e9a0 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20  ed to two slots 
1e9b0 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65  in order to make
1e9c0 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 0a 20   space for the. 
1e9d0 20 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e     ** two elemen
1e9e0 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ts in the FROM c
1e9f0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62  lause of the sub
1ea00 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  query..    */.  
1ea10 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20    if( nSubSrc>1 
1ea20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  ){.      pParent
1ea30 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d 20  ->pSrc = pSrc = 
1ea40 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e  sqlite3SrcListEn
1ea50 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c 20  large(db, pSrc, 
1ea60 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b  nSubSrc-1,iFrom+
1ea70 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  1);.      if( db
1ea80 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1ea90 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
1eaa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1eab0 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20      /* Transfer 
1eac0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1ead0 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 73  terms from the s
1eae0 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65  ubquery into the
1eaf0 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
1eb00 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ery..    */.    
1eb10 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53  for(i=0; i<nSubS
1eb20 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
1eb30 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
1eb40 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b  ete(db, pSrc->a[
1eb50 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29  i+iFrom].pUsing)
1eb60 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b  ;.      pSrc->a[
1eb70 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53  i+iFrom] = pSubS
1eb80 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
1eb90 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d  memset(&pSubSrc-
1eba0 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  >a[i], 0, sizeof
1ebb0 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29  (pSubSrc->a[i]))
1ebc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63  ;.    }.    pSrc
1ebd0 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74  ->a[iFrom].joint
1ebe0 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a  ype = jointype;.
1ebf0 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65    .    /* Now be
1ec00 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67  gin substituting
1ec10 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74   subquery result
1ec20 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73   set expressions
1ec30 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65 66   for .    ** ref
1ec40 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69  erences to the i
1ec50 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75  Parent in the ou
1ec60 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a  ter query..    *
1ec70 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c  * .    ** Exampl
1ec80 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
1ec90 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62     SELECT a+5, b
1eca0 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  *10 FROM (SELECT
1ecb0 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20   x*3 AS a, y+10 
1ecc0 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48  AS b FROM t1) WH
1ecd0 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20  ERE a>b;.    ** 
1ece0 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
1ecf0 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
1ed00 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20  ______ subquery 
1ed10 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
1ed20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20       /.    **   
1ed30 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
1ed40 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75  _______ outer qu
1ed50 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ery ____________
1ed60 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1ed70 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  __/.    **.    *
1ed80 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65  * We look at eve
1ed90 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
1eda0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1edb0 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65   and every place
1edc0 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20 22   we see.    ** "
1edd0 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  a" we substitute
1ede0 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79   "x*3" and every
1edf0 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62   place we see "b
1ee00 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
1ee10 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20  "y+10"..    */. 
1ee20 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61 72 65     pList = pPare
1ee30 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  nt->pEList;.    
1ee40 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
1ee50 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
1ee60 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e       if( pList->
1ee70 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b  a[i].zName==0 ){
1ee80 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
1ee90 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
1eea0 53 74 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74  StrDup(db, pList
1eeb0 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20  ->a[i].zSpan);. 
1eec0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
1eed0 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  quote(zName);.  
1eee0 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69        pList->a[i
1eef0 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ].zName = zName;
1ef00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1ef10 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1ef20 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 45  (db, pParent->pE
1ef30 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70  List, iParent, p
1ef40 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
1ef50 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20    if( isAgg ){. 
1ef60 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69       substExprLi
1ef70 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  st(db, pParent->
1ef80 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e  pGroupBy, iParen
1ef90 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1efa0 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
1efb0 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74  >pHaving = subst
1efc0 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74  Expr(db, pParent
1efd0 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65  ->pHaving, iPare
1efe0 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
1eff0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1f000 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1f010 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1f020 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72   pParent->pOrder
1f030 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  By==0 );.      p
1f040 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
1f050 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42   = pSub->pOrderB
1f060 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70  y;.      pSub->p
1f070 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
1f080 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72 65   }else if( pPare
1f090 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  nt->pOrderBy ){.
1f0a0 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c        substExprL
1f0b0 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  ist(db, pParent-
1f0c0 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72 65  >pOrderBy, iPare
1f0d0 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
1f0e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1f0f0 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b   pSub->pWhere ){
1f100 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20  .      pWhere = 
1f110 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
1f120 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65 2c  b, pSub->pWhere,
1f130 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
1f140 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 30        pWhere = 0
1f150 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1f160 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b  subqueryIsAgg ){
1f170 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1f180 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d  Parent->pHaving=
1f190 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  =0 );.      pPar
1f1a0 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70  ent->pHaving = p
1f1b0 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a  Parent->pWhere;.
1f1c0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1f1d0 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a  Where = pWhere;.
1f1e0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1f1f0 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78  Having = substEx
1f200 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  pr(db, pParent->
1f210 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74  pHaving, iParent
1f220 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
1f230 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1f240 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
1f250 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61  3ExprAnd(db, pPa
1f260 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a  rent->pHaving, .
1f270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f290 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
1f2a0 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69  (db, pSub->pHavi
1f2b0 6e 67 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 61  ng, 0));.      a
1f2c0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
1f2d0 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20  pGroupBy==0 );. 
1f2e0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47       pParent->pG
1f2f0 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
1f300 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
1f310 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20  pSub->pGroupBy, 
1f320 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
1f330 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57       pParent->pW
1f340 68 65 72 65 20 3d 20 73 75 62 73 74 45 78 70 72  here = substExpr
1f350 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57  (db, pParent->pW
1f360 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70  here, iParent, p
1f370 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
1f380 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68      pParent->pWh
1f390 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
1f3a0 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74  rAnd(db, pParent
1f3b0 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65  ->pWhere, pWhere
1f3c0 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
1f3d0 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64  /* The flattened
1f3e0 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e   query is distin
1f3f0 63 74 20 69 66 20 65 69 74 68 65 72 20 74 68 65  ct if either the
1f400 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20   inner or the.  
1f410 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
1f420 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20   is distinct. . 
1f430 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e     */.    pParen
1f440 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70  t->selFlags |= p
1f450 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
1f460 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a  SF_Distinct;.  .
1f470 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45      /*.    ** SE
1f480 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53  LECT ... FROM (S
1f490 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20  ELECT ... LIMIT 
1f4a0 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49  a OFFSET b) LIMI
1f4b0 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20  T x OFFSET y;.  
1f4c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20    **.    ** One 
1f4d0 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72  is tempted to tr
1f4e0 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62  y to add a and b
1f4f0 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20   to combine the 
1f500 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69  limits.  But thi
1f510 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f  s.    ** does no
1f520 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72  t work if either
1f530 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69   limit is negati
1f540 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ve..    */.    i
1f550 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
1f560 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  ){.      pParent
1f570 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d  ->pLimit = pSub-
1f580 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
1f590 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b  Sub->pLimit = 0;
1f5a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1f5b0 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74   Finially, delet
1f5c0 65 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f  e what is left o
1f5d0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61  f the subquery a
1f5e0 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73  nd return.  ** s
1f5f0 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  uccess..  */.  s
1f600 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
1f610 74 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a  te(db, pSub1);..
1f620 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
1f630 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
1f640 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
1f650 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
1f660 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1f670 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42  IEW) */../*.** B
1f680 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ased on the cont
1f690 65 6e 74 73 20 6f 66 20 74 68 65 20 41 67 67 49  ents of the AggI
1f6a0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e  nfo structure in
1f6b0 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20 66  dicated by the f
1f6c0 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  irst.** argument
1f6d0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1f6e0 63 68 65 63 6b 73 20 69 66 20 74 68 65 20 66 6f  checks if the fo
1f6f0 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
1f700 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65  :.**.**    * the
1f710 20 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20   query contains 
1f720 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20 61 67  just a single ag
1f730 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
1f740 2c 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 67  ,.**    * the ag
1f750 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
1f760 20 69 73 20 65 69 74 68 65 72 20 6d 69 6e 28 29   is either min()
1f770 20 6f 72 20 6d 61 78 28 29 2c 20 61 6e 64 0a 2a   or max(), and.*
1f780 2a 20 20 20 20 2a 20 74 68 65 20 61 72 67 75 6d  *    * the argum
1f790 65 6e 74 20 74 6f 20 74 68 65 20 61 67 67 72 65  ent to the aggre
1f7a0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73  gate function is
1f7b0 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2e   a column value.
1f7c0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 6f 66  .**.** If all of
1f7d0 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 74   the above are t
1f7e0 72 75 65 2c 20 74 68 65 6e 20 57 48 45 52 45 5f  rue, then WHERE_
1f7f0 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57  ORDERBY_MIN or W
1f800 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58  HERE_ORDERBY_MAX
1f810 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
1f820 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20  as appropriate. 
1f830 41 6c 73 6f 2c 20 2a 70 70 4d 69 6e 4d 61 78 20  Also, *ppMinMax 
1f840 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
1f850 74 6f 20 74 68 65 20 0a 2a 2a 20 6c 69 73 74 20  to the .** list 
1f860 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73  of arguments pas
1f870 73 65 64 20 74 6f 20 74 68 65 20 61 67 67 72 65  sed to the aggre
1f880 67 61 74 65 20 62 65 66 6f 72 65 20 72 65 74 75  gate before retu
1f890 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  rning..**.** Or,
1f8a0 20 69 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f   if the conditio
1f8b0 6e 73 20 61 62 6f 76 65 20 61 72 65 20 6e 6f 74  ns above are not
1f8c0 20 6d 65 74 2c 20 2a 70 70 4d 69 6e 4d 61 78 20   met, *ppMinMax 
1f8d0 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a  is set to 0 and.
1f8e0 2a 2a 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  ** WHERE_ORDERBY
1f8f0 5f 4e 4f 52 4d 41 4c 20 69 73 20 72 65 74 75 72  _NORMAL is retur
1f900 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ned..*/.static u
1f910 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 41 67  8 minMaxQuery(Ag
1f920 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 2c  gInfo *pAggInfo,
1f930 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 4d 69   ExprList **ppMi
1f940 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 65 52 65  nMax){.  int eRe
1f950 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42  t = WHERE_ORDERB
1f960 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20 20 20 20  Y_NORMAL;       
1f970 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
1f980 75 65 20 2a 2f 0a 0a 20 20 2a 70 70 4d 69 6e 4d  ue */..  *ppMinM
1f990 61 78 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 41  ax = 0;.  if( pA
1f9a0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 31  ggInfo->nFunc==1
1f9b0 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45   ){.    Expr *pE
1f9c0 78 70 72 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  xpr = pAggInfo->
1f9d0 61 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72 3b 20  aFunc[0].pExpr; 
1f9e0 2f 2a 20 41 67 67 72 65 67 61 74 65 20 66 75 6e  /* Aggregate fun
1f9f0 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78 70  ction */.    Exp
1fa00 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20  rList *pEList = 
1fa10 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 20  pExpr->x.pList; 
1fa20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
1fa30 73 20 74 6f 20 61 67 67 20 66 75 6e 63 74 69 6f  s to agg functio
1fa40 6e 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  n */..    assert
1fa50 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
1fa60 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
1fa70 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26      if( pEList &
1fa80 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  & pEList->nExpr=
1fa90 3d 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b  =1 && pEList->a[
1faa0 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  0].pExpr->op==TK
1fab0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  _AGG_COLUMN ){. 
1fac0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1fad0 2a 7a 46 75 6e 63 20 3d 20 70 45 78 70 72 2d 3e  *zFunc = pExpr->
1fae0 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
1faf0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1fb00 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22 29  mp(zFunc, "min")
1fb10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
1fb20 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  Ret = WHERE_ORDE
1fb30 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 20 20 20  RBY_MIN;.       
1fb40 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c   *ppMinMax = pEL
1fb50 69 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ist;.      }else
1fb60 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
1fb70 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78 22  Cmp(zFunc, "max"
1fb80 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1fb90 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44  eRet = WHERE_ORD
1fba0 45 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20 20 20  ERBY_MAX;.      
1fbb0 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45    *ppMinMax = pE
1fbc0 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  List;.      }.  
1fbd0 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
1fbe0 74 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30 20  t( *ppMinMax==0 
1fbf0 7c 7c 20 28 2a 70 70 4d 69 6e 4d 61 78 29 2d 3e  || (*ppMinMax)->
1fc00 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 72 65  nExpr==1 );.  re
1fc10 74 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn eRet;.}../*
1fc20 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73  .** The select s
1fc30 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
1fc40 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
1fc50 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72  ument is an aggr
1fc60 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20  egate query..** 
1fc70 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 6d 65  The second argme
1fc80 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f 63 69  nt is the associ
1fc90 61 74 65 64 20 61 67 67 72 65 67 61 74 65 2d 69  ated aggregate-i
1fca0 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73  nfo object. This
1fcb0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65   .** function te
1fcc0 73 74 73 20 69 66 20 74 68 65 20 53 45 4c 45 43  sts if the SELEC
1fcd0 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  T is of the form
1fce0 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  :.**.**   SELECT
1fcf0 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c   count(*) FROM <
1fd00 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  tbl>.**.** where
1fd10 20 74 61 62 6c 65 20 69 73 20 61 20 64 61 74 61   table is a data
1fd20 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20  base table, not 
1fd30 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  a sub-select or 
1fd40 76 69 65 77 2e 20 49 66 20 74 68 65 20 71 75 65  view. If the que
1fd50 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68  ry.** does match
1fd60 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74   this pattern, t
1fd70 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  hen a pointer to
1fd80 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63   the Table objec
1fd90 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a  t representing.*
1fda0 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72  * <tbl> is retur
1fdb0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
1fdc0 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  0 is returned..*
1fdd0 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a  /.static Table *
1fde0 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65  isSimpleCount(Se
1fdf0 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f  lect *p, AggInfo
1fe00 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54   *pAggInfo){.  T
1fe10 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78  able *pTab;.  Ex
1fe20 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73  pr *pExpr;..  as
1fe30 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70  sert( !p->pGroup
1fe40 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  By );..  if( p->
1fe50 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c  pWhere || p->pEL
1fe60 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20  ist->nExpr!=1 . 
1fe70 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53    || p->pSrc->nS
1fe80 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63  rc!=1 || p->pSrc
1fe90 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20  ->a[0].pSelect. 
1fea0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
1feb0 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70  ;.  }.  pTab = p
1fec0 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  ->pSrc->a[0].pTa
1fed0 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e  b;.  pExpr = p->
1fee0 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
1fef0 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  pr;.  assert( pT
1ff00 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65  ab && !pTab->pSe
1ff10 6c 65 63 74 20 26 26 20 70 45 78 70 72 20 29 3b  lect && pExpr );
1ff20 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  ..  if( IsVirtua
1ff30 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
1ff40 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
1ff50 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op!=TK_AGG_FUNC
1ff60 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  TION ) return 0;
1ff70 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 41 67  .  if( NEVER(pAg
1ff80 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29  gInfo->nFunc==0)
1ff90 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
1ffa0 66 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46  f( (pAggInfo->aF
1ffb0 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 75  unc[0].pFunc->fu
1ffc0 6e 63 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46  ncFlags&SQLITE_F
1ffd0 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20  UNC_COUNT)==0 ) 
1ffe0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
1fff0 70 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f  pExpr->flags&EP_
20000 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
20010 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70  n 0;..  return p
20020 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  Tab;.}../*.** If
20030 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74   the source-list
20040 20 69 74 65 6d 20 70 61 73 73 65 64 20 61 73 20   item passed as 
20050 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  an argument was 
20060 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61  augmented with a
20070 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20  n.** INDEXED BY 
20080 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79  clause, then try
20090 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73   to locate the s
200a0 70 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20  pecified index. 
200b0 49 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20  If there.** was 
200c0 73 75 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e  such a clause an
200d0 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65  d the named inde
200e0 78 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  x cannot be foun
200f0 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  d, return .** SQ
20100 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c  LITE_ERROR and l
20110 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
20120 20 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69   pParse. Otherwi
20130 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a  se, populate .**
20140 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61   pFrom->pIndex a
20150 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
20160 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
20170 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b  te3IndexedByLook
20180 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  up(Parse *pParse
20190 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74  , struct SrcList
201a0 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20  _item *pFrom){. 
201b0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
201c0 20 26 26 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65   && pFrom->zInde
201d0 78 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  x ){.    Table *
201e0 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
201f0 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49  ab;.    char *zI
20200 6e 64 65 78 20 3d 20 70 46 72 6f 6d 2d 3e 7a 49  ndex = pFrom->zI
20210 6e 64 65 78 3b 0a 20 20 20 20 49 6e 64 65 78 20  ndex;.    Index 
20220 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70  *pIdx;.    for(p
20230 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
20240 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20  ; .        pIdx 
20250 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
20260 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a  p(pIdx->zName, z
20270 49 6e 64 65 78 29 3b 20 0a 20 20 20 20 20 20 20  Index); .       
20280 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
20290 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  t.    );.    if(
202a0 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20   !pIdx ){.      
202b0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
202c0 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
202d0 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e   index: %s", zIn
202e0 64 65 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  dex, 0);.      p
202f0 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
20300 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  ma = 1;.      re
20310 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
20320 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72  R;.    }.    pFr
20330 6f 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 64  om->pIndex = pId
20340 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  x;.  }.  return 
20350 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a  SQLITE_OK;.}./*.
20360 2a 2a 20 44 65 74 65 63 74 20 63 6f 6d 70 6f 75  ** Detect compou
20370 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nd SELECT statem
20380 65 6e 74 73 20 74 68 61 74 20 75 73 65 20 61 6e  ents that use an
20390 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
203a0 20 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61 6c 74   with .** an alt
203b0 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69  ernative collati
203c0 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a  ng sequence..**.
203d0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e  **    SELECT ...
203e0 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20   FROM t1 EXCEPT 
203f0 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
20400 74 32 20 4f 52 44 45 52 20 42 59 20 2e 2e 20 43  t2 ORDER BY .. C
20410 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a  OLLATE ....**.**
20420 20 54 68 65 73 65 20 61 72 65 20 72 65 77 72 69   These are rewri
20430 74 74 65 6e 20 61 73 20 61 20 73 75 62 71 75 65  tten as a subque
20440 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  ry:.**.**    SEL
20450 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45  ECT * FROM (SELE
20460 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45  CT ... FROM t1 E
20470 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e  XCEPT SELECT ...
20480 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20 20 20   FROM t2).**    
20490 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20 43 4f   ORDER BY ... CO
204a0 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  LLATE ....**.** 
204b0 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74  This transformat
204c0 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79  ion is necessary
204d0 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 75 6c   because the mul
204e0 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
204f0 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 62 6f  ) routine.** abo
20500 76 65 20 74 68 61 74 20 67 65 6e 65 72 61 74 65  ve that generate
20510 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61  s the code for a
20520 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
20530 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42   with an ORDER B
20540 59 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73 65 73  Y clause.** uses
20550 20 61 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74   a merge algorit
20560 68 6d 20 74 68 61 74 20 72 65 71 75 69 72 65 73  hm that requires
20570 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74   the same collat
20580 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 6e 20  ing sequence on 
20590 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f  the.** result co
205a0 6c 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68 65 20  lumns as on the 
205b0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
205c0 20 20 53 65 65 20 74 69 63 6b 65 74 0a 2a 2a 20    See ticket.** 
205d0 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74  http://www.sqlit
205e0 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 36  e.org/src/info/6
205f0 37 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20  709574d2a.**.** 
20600 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74  This transformat
20610 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64  ion is only need
20620 65 64 20 66 6f 72 20 45 58 43 45 50 54 2c 20 49  ed for EXCEPT, I
20630 4e 54 45 52 53 45 43 54 2c 20 61 6e 64 20 55 4e  NTERSECT, and UN
20640 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e 49 4f  ION..** The UNIO
20650 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 77  N ALL operator w
20660 6f 72 6b 73 20 66 69 6e 65 20 77 69 74 68 20 6d  orks fine with m
20670 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
20680 79 28 29 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a  y() even when.**
20690 20 74 68 65 72 65 20 61 72 65 20 43 4f 4c 4c 41   there are COLLA
206a0 54 45 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  TE terms in the 
206b0 4f 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73 74 61  ORDER BY..*/.sta
206c0 74 69 63 20 69 6e 74 20 63 6f 6e 76 65 72 74 43  tic int convertC
206d0 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53  ompoundSelectToS
206e0 75 62 71 75 65 72 79 28 57 61 6c 6b 65 72 20 2a  ubquery(Walker *
206f0 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
20700 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
20710 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
20720 53 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20 73 71  Select *pX;.  sq
20730 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74 72  lite3 *db;.  str
20740 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
20750 6d 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73 74 20  m *a;.  SrcList 
20760 2a 70 4e 65 77 53 72 63 3b 0a 20 20 50 61 72 73  *pNewSrc;.  Pars
20770 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 54 6f 6b  e *pParse;.  Tok
20780 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69 66 28  en dummy;..  if(
20790 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20   p->pPrior==0 ) 
207a0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
207b0 6e 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f  nue;.  if( p->pO
207c0 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75  rderBy==0 ) retu
207d0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
207e0 0a 20 20 66 6f 72 28 70 58 3d 70 3b 20 70 58 20  .  for(pX=p; pX 
207f0 26 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41  && (pX->op==TK_A
20800 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b  LL || pX->op==TK
20810 5f 53 45 4c 45 43 54 29 3b 20 70 58 3d 70 58 2d  _SELECT); pX=pX-
20820 3e 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69 66 28  >pPrior){}.  if(
20830 20 70 58 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   pX==0 ) return 
20840 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
20850 61 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d  a = p->pOrderBy-
20860 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 70  >a;.  for(i=p->p
20870 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31  OrderBy->nExpr-1
20880 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
20890 20 20 69 66 28 20 61 5b 69 5d 2e 70 45 78 70 72    if( a[i].pExpr
208a0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
208b0 6c 61 74 65 20 29 20 62 72 65 61 6b 3b 0a 20 20  late ) break;.  
208c0 7d 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65  }.  if( i<0 ) re
208d0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
208e0 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72  e;..  /* If we r
208f0 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
20900 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   that means the 
20910 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
20920 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 0a  s required. */..
20930 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b    pParse = pWalk
20940 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62  er->pParse;.  db
20950 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
20960 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
20970 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
20980 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
20990 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
209a0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
209b0 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 6d  t;.  memset(&dum
209c0 6d 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75  my, 0, sizeof(du
209d0 6d 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53 72 63  mmy));.  pNewSrc
209e0 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
209f0 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28  tAppendFromTerm(
20a00 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26 64 75  pParse,0,0,0,&du
20a10 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a 20  mmy,pNew,0,0);. 
20a20 20 69 66 28 20 70 4e 65 77 53 72 63 3d 3d 30 20   if( pNewSrc==0 
20a30 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
20a40 72 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70  rt;.  *pNew = *p
20a50 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 4e  ;.  p->pSrc = pN
20a60 65 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45 4c 69  ewSrc;.  p->pELi
20a70 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
20a80 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
20a90 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70  e, 0, sqlite3Exp
20aa0 72 28 64 62 2c 20 54 4b 5f 41 4c 4c 2c 20 30 29  r(db, TK_ALL, 0)
20ab0 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f  );.  p->op = TK_
20ac0 53 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68  SELECT;.  p->pWh
20ad0 65 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ere = 0;.  pNew-
20ae0 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20  >pGroupBy = 0;. 
20af0 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d   pNew->pHaving =
20b00 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64   0;.  pNew->pOrd
20b10 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  erBy = 0;.  p->p
20b20 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 2d 3e  Prior = 0;.  p->
20b30 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  pNext = 0;.  p->
20b40 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
20b50 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 61 73 73 65  Compound;.  asse
20b60 72 74 28 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  rt( pNew->pPrior
20b70 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  !=0 );.  pNew->p
20b80 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Prior->pNext = p
20b90 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  New;.  pNew->pLi
20ba0 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  mit = 0;.  pNew-
20bb0 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
20bc0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
20bd0 6e 75 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  nue;.}..#ifndef 
20be0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
20bf0 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
20c00 57 69 74 68 20 28 77 68 69 63 68 20 6d 61 79 20  With (which may 
20c10 62 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73 20  be NULL) points 
20c20 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  to a linked list
20c30 20 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20 57   of nested .** W
20c40 49 54 48 20 63 6f 6e 74 65 78 74 73 2c 20 66 72  ITH contexts, fr
20c50 6f 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74 65  om inner to oute
20c60 72 6d 6f 73 74 2e 20 49 66 20 74 68 65 20 74 61  rmost. If the ta
20c70 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  ble identified b
20c80 79 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73  y .** FROM claus
20c90 65 20 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d 20  e element pItem 
20ca0 69 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d 6d  is really a comm
20cb0 6f 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65 73 73  on-table-express
20cc0 69 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74 68  ion (CTE) .** th
20cd0 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  en return a poin
20ce0 74 65 72 20 74 6f 20 74 68 65 20 43 54 45 20 64  ter to the CTE d
20cf0 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74 68  efinition for th
20d00 61 74 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 77  at table. Otherw
20d10 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e 55  ise.** return NU
20d20 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e  LL..**.** If a n
20d30 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73  on-NULL value is
20d40 20 72 65 74 75 72 6e 65 64 2c 20 73 65 74 20 2a   returned, set *
20d50 70 70 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f 69  ppContext to poi
20d60 6e 74 20 74 6f 20 74 68 65 20 57 69 74 68 0a 2a  nt to the With.*
20d70 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68  * object that th
20d80 65 20 72 65 74 75 72 6e 65 64 20 43 54 45 20 62  e returned CTE b
20d90 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74  elongs to..*/.st
20da0 61 74 69 63 20 73 74 72 75 63 74 20 43 74 65 20  atic struct Cte 
20db0 2a 73 65 61 72 63 68 57 69 74 68 28 0a 20 20 57  *searchWith(.  W
20dc0 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20  ith *pWith,     
20dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20de0 2a 20 43 75 72 72 65 6e 74 20 6f 75 74 65 72 6d  * Current outerm
20df0 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65 20  ost WITH clause 
20e00 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
20e10 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c  ist_item *pItem,
20e20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
20e30 75 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20 72  use element to r
20e40 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74 68  esolve */.  With
20e50 20 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20 20 20   **ppContext    
20e60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
20e70 55 54 3a 20 57 49 54 48 20 63 6c 61 75 73 65 20  UT: WITH clause 
20e80 72 65 74 75 72 6e 20 76 61 6c 75 65 20 62 65 6c  return value bel
20e90 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20  ongs to */.){.  
20ea0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
20eb0 65 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  e;.  if( pItem->
20ec0 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 26 26 20  zDatabase==0 && 
20ed0 28 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e  (zName = pItem->
20ee0 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
20ef0 20 57 69 74 68 20 2a 70 3b 0a 20 20 20 20 66 6f   With *p;.    fo
20f00 72 28 70 3d 70 57 69 74 68 3b 20 70 3b 20 70 3d  r(p=pWith; p; p=
20f10 70 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20 20  p->pOuter){.    
20f20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
20f30 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74  or(i=0; i<p->nCt
20f40 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
20f50 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
20f60 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b  Cmp(zName, p->a[
20f70 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
20f80 20 20 20 20 20 20 20 20 20 20 2a 70 70 43 6f 6e            *ppCon
20f90 74 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  text = p;.      
20fa0 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61      return &p->a
20fb0 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  [i];.        }. 
20fc0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
20fd0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
20fe0 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  /* The code gene
20ff0 72 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73 20  rator maintains 
21000 61 20 73 74 61 63 6b 20 6f 66 20 61 63 74 69 76  a stack of activ
21010 65 20 57 49 54 48 20 63 6c 61 75 73 65 73 0a 2a  e WITH clauses.*
21020 2a 20 77 69 74 68 20 74 68 65 20 69 6e 6e 65 72  * with the inner
21030 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73  -most WITH claus
21040 65 20 62 65 69 6e 67 20 61 74 20 74 68 65 20 74  e being at the t
21050 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  op of the stack.
21060 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
21070 69 6e 65 20 70 75 73 68 65 73 20 74 68 65 20 57  ine pushes the W
21080 49 54 48 20 63 6c 61 75 73 65 20 70 61 73 73 65  ITH clause passe
21090 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
210a0 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f  argument.** onto
210b0 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
210c0 73 74 61 63 6b 2e 20 49 66 20 61 72 67 75 6d 65  stack. If argume
210d0 6e 74 20 62 46 72 65 65 20 69 73 20 74 72 75 65  nt bFree is true
210e0 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 57  , then this.** W
210f0 49 54 48 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  ITH clause will 
21100 6e 65 76 65 72 20 62 65 20 70 6f 70 70 65 64 20  never be popped 
21110 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20  from the stack. 
21120 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 0a  In this case it.
21130 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65  ** should be fre
21140 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
21150 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 20  e Parse object. 
21160 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20  In other cases, 
21170 77 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d 30  when.** bFree==0
21180 2c 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63  , the With objec
21190 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  t will be freed 
211a0 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 53  along with the S
211b0 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74 65 6d  ELECT .** statem
211c0 65 6e 74 20 77 69 74 68 20 77 68 69 63 68 20 69  ent with which i
211d0 74 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 2e  t is associated.
211e0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
211f0 57 69 74 68 50 75 73 68 28 50 61 72 73 65 20 2a  WithPush(Parse *
21200 70 50 61 72 73 65 2c 20 57 69 74 68 20 2a 70 57  pParse, With *pW
21210 69 74 68 2c 20 75 38 20 62 46 72 65 65 29 7b 0a  ith, u8 bFree){.
21220 20 20 61 73 73 65 72 74 28 20 62 46 72 65 65 3d    assert( bFree=
21230 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70 57  =0 || pParse->pW
21240 69 74 68 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ith==0 );.  if( 
21250 70 57 69 74 68 20 29 7b 0a 20 20 20 20 70 57 69  pWith ){.    pWi
21260 74 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50 61  th->pOuter = pPa
21270 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20  rse->pWith;.    
21280 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
21290 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73  pWith;.    pPars
212a0 65 2d 3e 62 46 72 65 65 57 69 74 68 20 3d 20 62  e->bFreeWith = b
212b0 46 72 65 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Free;.  }.}../*.
212c0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
212d0 20 63 68 65 63 6b 73 20 69 66 20 61 72 67 75 6d   checks if argum
212e0 65 6e 74 20 70 46 72 6f 6d 20 72 65 66 65 72 73  ent pFrom refers
212f0 20 74 6f 20 61 20 43 54 45 20 64 65 63 6c 61 72   to a CTE declar
21300 65 64 20 62 79 20 0a 2a 2a 20 61 20 57 49 54 48  ed by .** a WITH
21310 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 73   clause on the s
21320 74 61 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 6d  tack currently m
21330 61 69 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65  aintained by the
21340 20 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a   parser. And,.**
21350 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20 70 72   if currently pr
21360 6f 63 65 73 73 69 6e 67 20 61 20 43 54 45 20 65  ocessing a CTE e
21370 78 70 72 65 73 73 69 6f 6e 2c 20 69 66 20 69 74  xpression, if it
21380 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65 0a   is a recursive.
21390 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ** reference to 
213a0 74 68 65 20 63 75 72 72 65 6e 74 20 43 54 45 2e  the current CTE.
213b0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20  .**.** If pFrom 
213c0 66 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68 65  falls into eithe
213d0 72 20 6f 66 20 74 68 65 20 74 77 6f 20 63 61 74  r of the two cat
213e0 65 67 6f 72 69 65 73 20 61 62 6f 76 65 2c 20 70  egories above, p
213f0 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e  From->pTab.** an
21400 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61  d other fields a
21410 72 65 20 70 6f 70 75 6c 61 74 65 64 20 61 63 63  re populated acc
21420 6f 72 64 69 6e 67 6c 79 2e 20 54 68 65 20 63 61  ordingly. The ca
21430 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 68 65 63  ller should chec
21440 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54 61  k.** (pFrom->pTa
21450 62 21 3d 30 29 20 74 6f 20 64 65 74 65 72 6d 69  b!=0) to determi
21460 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
21470 74 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 6d  t a successful m
21480 61 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75 6e  atch.** was foun
21490 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  d..**.** Whether
214a0 20 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63 68 20   or not a match 
214b0 69 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54 45  is found, SQLITE
214c0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
214d0 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f  if no error.** o
214e0 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72  ccurs. If an err
214f0 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 61  or does occur, a
21500 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
21510 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
21520 0a 2a 2a 20 70 61 72 73 65 72 20 61 6e 64 20 73  .** parser and s
21530 6f 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  ome error code o
21540 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
21550 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
21560 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 74 68  .static int with
21570 45 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65 72  Expand(.  Walker
21580 20 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73 74   *pWalker, .  st
21590 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
215a0 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50 61  m *pFrom.){.  Pa
215b0 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
215c0 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
215d0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
215e0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74 72  Parse->db;.  str
215f0 75 63 74 20 43 74 65 20 2a 70 43 74 65 3b 20 20  uct Cte *pCte;  
21600 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21610 4d 61 74 63 68 65 64 20 43 54 45 20 28 6f 72 20  Matched CTE (or 
21620 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63 68  NULL if no match
21630 29 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69  ) */.  With *pWi
21640 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
21650 20 20 20 20 20 20 20 2f 2a 20 57 49 54 48 20 63         /* WITH c
21660 6c 61 75 73 65 20 74 68 61 74 20 70 43 74 65 20  lause that pCte 
21670 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20  belongs to */.. 
21680 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
21690 70 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70 43  pTab==0 );..  pC
216a0 74 65 20 3d 20 73 65 61 72 63 68 57 69 74 68 28  te = searchWith(
216b0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 2c 20 70  pParse->pWith, p
216c0 46 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a 20  From, &pWith);. 
216d0 20 69 66 28 20 70 43 74 65 20 29 7b 0a 20 20 20   if( pCte ){.   
216e0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
216f0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
21700 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  st;.    Select *
21710 70 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63 74  pSel;.    Select
21720 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20   *pLeft;        
21730 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d          /* Left-
21740 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74  most SELECT stat
21750 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74  ement */.    int
21760 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 3b 20   bMayRecursive; 
21770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
21780 75 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20 6a  ue if compound j
21790 6f 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20 5b  oined by UNION [
217a0 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74 68  ALL] */.    With
217b0 20 2a 70 53 61 76 65 64 57 69 74 68 3b 20 20 20   *pSavedWith;   
217c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
217d0 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 50  tial value of pP
217e0 61 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a  arse->pWith */..
217f0 20 20 20 20 2f 2a 20 49 66 20 70 43 74 65 2d 3e      /* If pCte->
21800 7a 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  zErr is non-NULL
21810 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   at this point, 
21820 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 6e 20  then this is an 
21830 69 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20 72  illegal.    ** r
21840 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
21850 63 65 20 74 6f 20 43 54 45 20 70 43 74 65 2e 20  ce to CTE pCte. 
21860 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69  Leave an error i
21870 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
21880 75 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c 79  urn.    ** early
21890 2e 20 49 66 20 70 43 74 65 2d 3e 7a 45 72 72 20  . If pCte->zErr 
218a0 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
218b0 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75  is is not a recu
218c0 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 2e  rsive reference.
218d0 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  .    ** In this 
218e0 63 61 73 65 2c 20 70 72 6f 63 65 65 64 2e 20 20  case, proceed.  
218f0 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d  */.    if( pCte-
21900 3e 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73  >zErr ){.      s
21910 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
21920 50 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a 45 72  Parse, pCte->zEr
21930 72 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b  r, pCte->zName);
21940 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
21950 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
21960 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
21970 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
21980 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62  .    pFrom->pTab
21990 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65   = pTab = sqlite
219a0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
219b0 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29  , sizeof(Table))
219c0 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d  ;.    if( pTab==
219d0 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
219e0 62 6f 72 74 3b 0a 20 20 20 20 70 54 61 62 2d 3e  bort;.    pTab->
219f0 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 54  nRef = 1;.    pT
21a00 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ab->zName = sqli
21a10 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
21a20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCte->zName);.  
21a30 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
21a40 2d 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52  -1;.    pTab->nR
21a50 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20  owLogEst = 200; 
21a60 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c  assert( 200==sql
21a70 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35  ite3LogEst(10485
21a80 37 36 29 20 29 3b 0a 20 20 20 20 70 54 61 62 2d  76) );.    pTab-
21a90 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
21aa0 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 70  Ephemeral;.    p
21ab0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  From->pSelect = 
21ac0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
21ad0 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65  (db, pCte->pSele
21ae0 63 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ct, 0);.    if( 
21af0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
21b00 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
21b10 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 61 73 73 65  _NOMEM;.    asse
21b20 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  rt( pFrom->pSele
21b30 63 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  ct );..    /* Ch
21b40 65 63 6b 20 69 66 20 74 68 69 73 20 69 73 20 61  eck if this is a
21b50 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2e 20   recursive CTE. 
21b60 2a 2f 0a 20 20 20 20 70 53 65 6c 20 3d 20 70 46  */.    pSel = pF
21b70 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  rom->pSelect;.  
21b80 20 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20    bMayRecursive 
21b90 3d 20 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b  = ( pSel->op==TK
21ba0 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70  _ALL || pSel->op
21bb0 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
21bc0 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73    if( bMayRecurs
21bd0 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ive ){.      int
21be0 20 69 3b 0a 20 20 20 20 20 20 53 72 63 4c 69 73   i;.      SrcLis
21bf0 74 20 2a 70 53 72 63 20 3d 20 70 46 72 6f 6d 2d  t *pSrc = pFrom-
21c00 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a  >pSelect->pSrc;.
21c10 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
21c20 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  <pSrc->nSrc; i++
21c30 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
21c40 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
21c50 70 49 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61  pItem = &pSrc->a
21c60 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [i];.        if(
21c70 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
21c80 65 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26  e==0 .         &
21c90 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d  & pItem->zName!=
21ca0 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 30  0 .         && 0
21cb0 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
21cc0 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70  (pItem->zName, p
21cd0 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20 20  Cte->zName).    
21ce0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
21cf0 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 3d     pItem->pTab =
21d00 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20   pTab;.         
21d10 20 70 49 74 65 6d 2d 3e 69 73 52 65 63 75 72 73   pItem->isRecurs
21d20 69 76 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ive = 1;.       
21d30 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b     pTab->nRef++;
21d40 0a 20 20 20 20 20 20 20 20 20 20 70 53 65 6c 2d  .          pSel-
21d50 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
21d60 52 65 63 75 72 73 69 76 65 3b 0a 20 20 20 20 20  Recursive;.     
21d70 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
21d80 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20   }..    /* Only 
21d90 6f 6e 65 20 72 65 63 75 72 73 69 76 65 20 72 65  one recursive re
21da0 66 65 72 65 6e 63 65 20 69 73 20 70 65 72 6d 69  ference is permi
21db0 74 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69 66  tted. */ .    if
21dc0 28 20 70 54 61 62 2d 3e 6e 52 65 66 3e 32 20 29  ( pTab->nRef>2 )
21dd0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
21de0 72 72 6f 72 4d 73 67 28 0a 20 20 20 20 20 20 20  rrorMsg(.       
21df0 20 20 20 70 50 61 72 73 65 2c 20 22 6d 75 6c 74     pParse, "mult
21e00 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20  iple references 
21e10 74 6f 20 72 65 63 75 72 73 69 76 65 20 74 61 62  to recursive tab
21e20 6c 65 3a 20 25 73 22 2c 20 70 43 74 65 2d 3e 7a  le: %s", pCte->z
21e30 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  Name.      );.  
21e40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21e50 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
21e60 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d     assert( pTab-
21e70 3e 6e 52 65 66 3d 3d 31 20 7c 7c 20 28 28 70 53  >nRef==1 || ((pS
21e80 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f  el->selFlags&SF_
21e90 52 65 63 75 72 73 69 76 65 29 20 26 26 20 70 54  Recursive) && pT
21ea0 61 62 2d 3e 6e 52 65 66 3d 3d 32 20 29 29 3b 0a  ab->nRef==2 ));.
21eb0 0a 20 20 20 20 70 43 74 65 2d 3e 7a 45 72 72 20  .    pCte->zErr 
21ec0 3d 20 22 63 69 72 63 75 6c 61 72 20 72 65 66 65  = "circular refe
21ed0 72 65 6e 63 65 3a 20 25 73 22 3b 0a 20 20 20 20  rence: %s";.    
21ee0 70 53 61 76 65 64 57 69 74 68 20 3d 20 70 50 61  pSavedWith = pPa
21ef0 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20  rse->pWith;.    
21f00 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
21f10 70 57 69 74 68 3b 0a 20 20 20 20 73 71 6c 69 74  pWith;.    sqlit
21f20 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
21f30 6c 6b 65 72 2c 20 62 4d 61 79 52 65 63 75 72 73  lker, bMayRecurs
21f40 69 76 65 20 3f 20 70 53 65 6c 2d 3e 70 50 72 69  ive ? pSel->pPri
21f50 6f 72 20 3a 20 70 53 65 6c 29 3b 0a 0a 20 20 20  or : pSel);..   
21f60 20 66 6f 72 28 70 4c 65 66 74 3d 70 53 65 6c 3b   for(pLeft=pSel;
21f70 20 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 3b 20   pLeft->pPrior; 
21f80 70 4c 65 66 74 3d 70 4c 65 66 74 2d 3e 70 50 72  pLeft=pLeft->pPr
21f90 69 6f 72 29 3b 0a 20 20 20 20 70 45 4c 69 73 74  ior);.    pEList
21fa0 20 3d 20 70 4c 65 66 74 2d 3e 70 45 4c 69 73 74   = pLeft->pEList
21fb0 3b 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e  ;.    if( pCte->
21fc0 70 43 6f 6c 73 20 29 7b 0a 20 20 20 20 20 20 69  pCols ){.      i
21fd0 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  f( pEList->nExpr
21fe0 21 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e  !=pCte->pCols->n
21ff0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
22000 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
22010 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
22020 73 20 68 61 73 20 25 64 20 76 61 6c 75 65 73 20  s has %d values 
22030 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22 2c  for %d columns",
22040 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 74  .            pCt
22050 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73 74  e->zName, pEList
22060 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e 70  ->nExpr, pCte->p
22070 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20 20  Cols->nExpr.    
22080 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70      );.        p
22090 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
220a0 53 61 76 65 64 57 69 74 68 3b 0a 20 20 20 20 20  SavedWith;.     
220b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
220c0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
220d0 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70        pEList = p
220e0 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20 20  Cte->pCols;.    
220f0 7d 0a 0a 20 20 20 20 73 65 6c 65 63 74 43 6f 6c  }..    selectCol
22100 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
22110 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c  (pParse, pEList,
22120 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70   &pTab->nCol, &p
22130 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20  Tab->aCol);.    
22140 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76  if( bMayRecursiv
22150 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e ){.      if( p
22160 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sel->selFlags & 
22170 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a  SF_Recursive ){.
22180 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 45          pCte->zE
22190 72 72 20 3d 20 22 6d 75 6c 74 69 70 6c 65 20 72  rr = "multiple r
221a0 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
221b0 63 65 73 3a 20 25 73 22 3b 0a 20 20 20 20 20 20  ces: %s";.      
221c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
221d0 43 74 65 2d 3e 7a 45 72 72 20 3d 20 22 72 65 63  Cte->zErr = "rec
221e0 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
221f0 20 69 6e 20 61 20 73 75 62 71 75 65 72 79 3a 20   in a subquery: 
22200 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  %s";.      }.   
22210 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
22220 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53  lect(pWalker, pS
22230 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  el);.    }.    p
22240 43 74 65 2d 3e 7a 45 72 72 20 3d 20 30 3b 0a 20  Cte->zErr = 0;. 
22250 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68     pParse->pWith
22260 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20   = pSavedWith;. 
22270 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
22280 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
22290 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
222a0 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20  _OMIT_CTE./*.** 
222b0 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 70 61  If the SELECT pa
222c0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
222d0 6e 64 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20  nd argument has 
222e0 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20 57 49  an associated WI
222f0 54 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 70  TH .** clause, p
22300 6f 70 20 69 74 20 66 72 6f 6d 20 74 68 65 20 73  op it from the s
22310 74 61 63 6b 20 73 74 6f 72 65 64 20 61 73 20 70  tack stored as p
22320 61 72 74 20 6f 66 20 74 68 65 20 50 61 72 73 65  art of the Parse
22330 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
22340 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
22350 75 73 65 64 20 61 73 20 74 68 65 20 78 53 65 6c  used as the xSel
22360 65 63 74 43 61 6c 6c 62 61 63 6b 32 28 29 20 63  ectCallback2() c
22370 61 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73 71  allback by.** sq
22380 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
22390 64 28 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e 67  d() when walking
223a0 20 61 20 53 45 4c 45 43 54 20 74 72 65 65 20 74   a SELECT tree t
223b0 6f 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65 0a  o resolve table.
223c0 2a 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74 68  ** names and oth
223d0 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  er FROM clause e
223e0 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61  lements. .*/.sta
223f0 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 50  tic void selectP
22400 6f 70 57 69 74 68 28 57 61 6c 6b 65 72 20 2a 70  opWith(Walker *p
22410 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
22420 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  p){.  Parse *pPa
22430 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
22440 50 61 72 73 65 3b 0a 20 20 57 69 74 68 20 2a 70  Parse;.  With *p
22450 57 69 74 68 20 3d 20 66 69 6e 64 52 69 67 68 74  With = findRight
22460 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68 3b 0a  most(p)->pWith;.
22470 20 20 69 66 28 20 70 57 69 74 68 21 3d 30 20 29    if( pWith!=0 )
22480 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
22490 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57 69  arse->pWith==pWi
224a0 74 68 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65  th );.    pParse
224b0 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 2d  ->pWith = pWith-
224c0 3e 70 4f 75 74 65 72 3b 0a 20 20 7d 0a 7d 0a 23  >pOuter;.  }.}.#
224d0 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 73 65 6c  else.#define sel
224e0 65 63 74 50 6f 70 57 69 74 68 20 30 0a 23 65 6e  ectPopWith 0.#en
224f0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
22500 72 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c  routine is a Wal
22510 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ker callback for
22520 20 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53   "expanding" a S
22530 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
22540 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20  .** "Expanding" 
22550 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20  means to do the 
22560 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
22570 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75      (1)  Make su
22580 72 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  re VDBE cursor n
22590 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e  umbers have been
225a0 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65   assigned to eve
225b0 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c  ry.**         el
225c0 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f  ement of the FRO
225d0 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  M clause..**.** 
225e0 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20     (2)  Fill in 
225f0 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  the pTabList->a[
22600 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e  ].pTab fields in
22610 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61   the SrcList tha
22620 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65  t .**         de
22630 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73  fines FROM claus
22640 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20 61  e.  When views a
22650 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f  ppear in the FRO
22660 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20  M clause,.**    
22670 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69       fill pTabLi
22680 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20  st->a[].pSelect 
22690 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
226a0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
226b0 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74  ent.**         t
226c0 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
226d0 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79  he view.  A copy
226e0 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20   is made of the 
226f0 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a  view's SELECT.**
22700 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65           stateme
22710 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61  nt so that we ca
22720 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20  n freely modify 
22730 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73  or delete that s
22740 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
22750 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72      without worr
22760 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69  ying about messi
22770 6e 67 20 75 70 20 74 68 65 20 70 72 65 73 69 73  ng up the presis
22780 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74  tent representat
22790 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f  ion.**         o
227a0 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a  f the view..**.*
227b0 2a 20 20 20 20 28 33 29 20 20 41 64 64 20 74 65  *    (3)  Add te
227c0 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45  rms to the WHERE
227d0 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d   clause to accom
227e0 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41  odate the NATURA
227f0 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20  L keyword.**    
22800 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e       on joins an
22810 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49  d the ON and USI
22820 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69  NG clause of joi
22830 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29  ns..**.**    (4)
22840 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20    Scan the list 
22850 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
22860 65 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45  e result set (pE
22870 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a  List) looking.**
22880 20 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73           for ins
22890 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a  tances of the "*
228a0 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68  " operator or th
228b0 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74  e TABLE.* operat
228c0 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49  or..**         I
228d0 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20  f found, expand 
228e0 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65  each "*" to be e
228f0 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65  very column in e
22900 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20  very table.**   
22910 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e        and TABLE.
22920 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  * to be every co
22930 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a  lumn in TABLE..*
22940 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  *.*/.static int 
22950 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57  selectExpander(W
22960 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
22970 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
22980 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
22990 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
229a0 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20   int i, j, k;.  
229b0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
229c0 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  t;.  ExprList *p
229d0 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  EList;.  struct 
229e0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
229f0 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  rom;.  sqlite3 *
22a00 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
22a10 0a 20 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 52  .  Expr *pE, *pR
22a20 69 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20  ight, *pExpr;.  
22a30 75 31 36 20 73 65 6c 46 6c 61 67 73 20 3d 20 70  u16 selFlags = p
22a40 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 0a 20 20 70  ->selFlags;..  p
22a50 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
22a60 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 69 66 28  _Expanded;.  if(
22a70 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
22a80 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  d  ){.    return
22a90 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
22aa0 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 70    if( NEVER(p->p
22ab0 53 72 63 3d 3d 30 29 20 7c 7c 20 28 73 65 6c 46  Src==0) || (selF
22ac0 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64  lags & SF_Expand
22ad0 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ed)!=0 ){.    re
22ae0 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
22af0 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d    }.  pTabList =
22b00 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69   p->pSrc;.  pELi
22b10 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
22b20 20 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73    sqlite3WithPus
22b30 68 28 70 50 61 72 73 65 2c 20 66 69 6e 64 52 69  h(pParse, findRi
22b40 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74  ghtmost(p)->pWit
22b50 68 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  h, 0);..  /* Mak
22b60 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75  e sure cursor nu
22b70 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
22b80 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20  assigned to all 
22b90 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20  entries in.  ** 
22ba0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
22bb0 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
22bc0 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
22bd0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
22be0 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
22bf0 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a  se, pTabList);..
22c00 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65    /* Look up eve
22c10 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69  ry table named i
22c20 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
22c30 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  e of the select.
22c40 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74    If.  ** an ent
22c50 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
22c60 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75  lause is a subqu
22c70 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ery instead of a
22c80 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a   table or view,.
22c90 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65    ** then create
22ca0 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62   a transient tab
22cb0 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  le structure to 
22cc0 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62  describe the sub
22cd0 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f  query..  */.  fo
22ce0 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
22cf0 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
22d00 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
22d10 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54   pFrom++){.    T
22d20 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
22d30 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69  assert( pFrom->i
22d40 73 52 65 63 75 72 73 69 76 65 3d 3d 30 20 7c 7c  sRecursive==0 ||
22d50 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29 3b 0a   pFrom->pTab );.
22d60 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69      if( pFrom->i
22d70 73 52 65 63 75 72 73 69 76 65 20 29 20 63 6f 6e  sRecursive ) con
22d80 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
22d90 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b  From->pTab!=0 ){
22da0 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73  .      /* This s
22db0 74 61 74 65 6d 65 6e 74 20 68 61 73 20 61 6c 72  tatement has alr
22dc0 65 61 64 79 20 62 65 65 6e 20 70 72 65 70 61 72  eady been prepar
22dd0 65 64 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ed.  There is no
22de0 20 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74   need.      ** t
22df0 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f  o go further. */
22e00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
22e10 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  ==0 );.#ifndef S
22e20 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20  QLITE_OMIT_CTE. 
22e30 20 20 20 20 20 73 65 6c 65 63 74 50 6f 70 57 69       selectPopWi
22e40 74 68 28 70 57 61 6c 6b 65 72 2c 20 70 29 3b 0a  th(pWalker, p);.
22e50 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74  #endif.      ret
22e60 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
22e70 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
22e80 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20  ITE_OMIT_CTE.   
22e90 20 69 66 28 20 77 69 74 68 45 78 70 61 6e 64 28   if( withExpand(
22ea0 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 29 20  pWalker, pFrom) 
22eb0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
22ec0 72 74 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f  rt;.    if( pFro
22ed0 6d 2d 3e 70 54 61 62 20 29 20 7b 7d 20 65 6c 73  m->pTab ) {} els
22ee0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  e.#endif.    if(
22ef0 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pFrom->zName==0
22f00 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
22f10 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
22f20 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
22f30 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
22f40 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41  lect;.      /* A
22f50 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68   sub-query in th
22f60 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
22f70 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20   a SELECT */.   
22f80 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 21     assert( pSel!
22f90 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
22fa0 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
22fb0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
22fc0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
22fd0 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20  alker, pSel);.  
22fe0 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
22ff0 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33  = pTab = sqlite3
23000 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
23010 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b   sizeof(Table));
23020 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
23030 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
23040 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61  Abort;.      pTa
23050 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  b->nRef = 1;.   
23060 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d     pTab->zName =
23070 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
23080 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 71 5f 25  db, "sqlite_sq_%
23090 70 22 2c 20 28 76 6f 69 64 2a 29 70 54 61 62 29  p", (void*)pTab)
230a0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
230b0 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70  Sel->pPrior ){ p
230c0 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69  Sel = pSel->pPri
230d0 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 65 6c 65  or; }.      sele
230e0 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  ctColumnsFromExp
230f0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  rList(pParse, pS
23100 65 6c 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61  el->pEList, &pTa
23110 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e  b->nCol, &pTab->
23120 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61  aCol);.      pTa
23130 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
23140 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c       pTab->nRowL
23150 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73  ogEst = 200; ass
23160 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65  ert( 200==sqlite
23170 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29  3LogEst(1048576)
23180 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   );.      pTab->
23190 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45  tabFlags |= TF_E
231a0 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66  phemeral;.#endif
231b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
231c0 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79    /* An ordinary
231d0 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e   table or view n
231e0 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ame in the FROM 
231f0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
23200 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
23210 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab==0 );.      
23220 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
23230 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
23240 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72  teTableItem(pPar
23250 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20  se, 0, pFrom);. 
23260 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
23270 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
23280 6f 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ort;.      if( p
23290 54 61 62 2d 3e 6e 52 65 66 3d 3d 30 78 66 66 66  Tab->nRef==0xfff
232a0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  f ){.        sql
232b0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
232c0 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72  rse, "too many r
232d0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c 22 25  eferences to \"%
232e0 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35 22 2c  s\": max 65535",
232f0 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62  .           pTab
23300 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
23310 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
23320 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
23330 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
23340 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d     }.      pTab-
23350 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20 21 64 65  >nRef++;.#if !de
23360 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
23370 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
23380 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ned (SQLITE_OMIT
23390 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20  _VIRTUALTABLE). 
233a0 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70       if( pTab->p
233b0 53 65 6c 65 63 74 20 7c 7c 20 49 73 56 69 72 74  Select || IsVirt
233c0 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
233d0 20 20 20 20 20 2f 2a 20 57 65 20 72 65 61 63 68       /* We reach
233e0 20 68 65 72 65 20 69 66 20 74 68 65 20 6e 61 6d   here if the nam
233f0 65 64 20 74 61 62 6c 65 20 69 73 20 61 20 72 65  ed table is a re
23400 61 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a 20  ally a view */. 
23410 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
23420 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
23430 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
23440 62 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  b) ) return WRC_
23450 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 61  Abort;.        a
23460 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53  ssert( pFrom->pS
23470 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20  elect==0 );.    
23480 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65      pFrom->pSele
23490 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
234a0 63 74 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e  ctDup(db, pTab->
234b0 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
234c0 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
234d0 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
234e0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pFrom->pSelect);
234f0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
23500 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f      }..    /* Lo
23510 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e  cate the index n
23520 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44 45  amed by the INDE
23530 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69  XED BY clause, i
23540 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66  f any. */.    if
23550 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64  ( sqlite3Indexed
23560 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c  ByLookup(pParse,
23570 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20   pFrom) ){.     
23580 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
23590 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
235a0 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52  /* Process NATUR
235b0 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64  AL keywords, and
235c0 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
235d0 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a  auses of joins..
235e0 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d    */.  if( db->m
235f0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73  allocFailed || s
23600 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
23610 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20  (pParse, p) ){. 
23620 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
23630 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ort;.  }..  /* F
23640 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61  or every "*" tha
23650 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  t occurs in the 
23660 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73  column list, ins
23670 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ert the names of
23680 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e  .  ** all column
23690 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e  s in all tables.
236a0 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20    And for every 
236b0 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74  TABLE.* insert t
236c0 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66  he names.  ** of
236d0 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
236e0 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73  TABLE.  The pars
236f0 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70  er inserted a sp
23700 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e  ecial expression
23710 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54  .  ** with the T
23720 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66  K_ALL operator f
23730 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74  or each "*" that
23740 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65   it found in the
23750 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20   column list..  
23760 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
23770 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74   code just has t
23780 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f  o locate the TK_
23790 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ALL expressions 
237a0 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20  and expand.  ** 
237b0 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20  each one to the 
237c0 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75  list of all colu
237d0 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
237e0 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
237f0 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74   first loop just
23800 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69   checks to see i
23810 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
23820 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20  "*" operators.  
23830 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70  ** that need exp
23840 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66  anding..  */.  f
23850 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
23860 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
23870 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e     pE = pEList->
23880 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[k].pExpr;.    
23890 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41  if( pE->op==TK_A
238a0 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  LL ) break;.    
238b0 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d  assert( pE->op!=
238c0 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52  TK_DOT || pE->pR
238d0 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 61  ight!=0 );.    a
238e0 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54  ssert( pE->op!=T
238f0 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c  K_DOT || (pE->pL
23900 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c  eft!=0 && pE->pL
23910 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20  eft->op==TK_ID) 
23920 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  );.    if( pE->o
23930 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d  p==TK_DOT && pE-
23940 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f  >pRight->op==TK_
23950 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ALL ) break;.  }
23960 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d  .  if( k<pEList-
23970 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a  >nExpr ){.    /*
23980 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65  .    ** If we ge
23990 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20  t here it means 
239a0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 63  the result set c
239b0 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
239c0 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f  ore "*".    ** o
239d0 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65  perators that ne
239e0 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
239f0 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68  d.  Loop through
23a00 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
23a10 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72  .    ** in the r
23a20 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78  esult set and ex
23a30 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79  pand them one by
23a40 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   one..    */.   
23a50 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
23a60 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73  _item *a = pELis
23a70 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69  t->a;.    ExprLi
23a80 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20  st *pNew = 0;.  
23a90 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 50    int flags = pP
23aa0 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b  arse->db->flags;
23ab0 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d  .    int longNam
23ac0 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  es = (flags & SQ
23ad0 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
23ae0 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  s)!=0.          
23af0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
23b00 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
23b10 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30  hortColNames)==0
23b20 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 70  ;..    /* When p
23b30 72 6f 63 65 73 73 69 6e 67 20 46 52 4f 4d 2d 63  rocessing FROM-c
23b40 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73  lause subqueries
23b50 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73 20 74  , it is always t
23b60 68 65 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 74  he case.    ** t
23b70 68 61 74 20 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f  hat full_column_
23b80 6e 61 6d 65 73 3d 4f 46 46 20 61 6e 64 20 73 68  names=OFF and sh
23b90 6f 72 74 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73  ort_column_names
23ba0 3d 4f 4e 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a  =ON.  The.    **
23bb0 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
23bc0 74 4f 66 53 65 6c 65 63 74 28 29 20 72 6f 75 74  tOfSelect() rout
23bd0 69 6e 65 20 6d 61 6b 65 73 20 69 74 20 73 6f 2e  ine makes it so.
23be0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
23bf0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
23c00 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30  F_NestedFrom)==0
23c10 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28  .          || ((
23c20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
23c30 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 20  ullColNames)==0 
23c40 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
23c50 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
23c60 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21  _ShortColNames)!
23c70 3d 30 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28  =0) );..    for(
23c80 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
23c90 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
23ca0 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70    pE = a[k].pExp
23cb0 72 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20  r;.      pRight 
23cc0 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20 20  = pE->pRight;.  
23cd0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
23ce0 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52  op!=TK_DOT || pR
23cf0 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  ight!=0 );.     
23d00 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f   if( pE->op!=TK_
23d10 41 4c 4c 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d  ALL && (pE->op!=
23d20 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74  TK_DOT || pRight
23d30 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b  ->op!=TK_ALL) ){
23d40 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
23d50 20 70 61 72 74 69 63 75 6c 61 72 20 65 78 70 72   particular expr
23d60 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  ession does not 
23d70 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
23d80 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ded..        */.
23d90 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
23da0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
23db0 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65  pend(pParse, pNe
23dc0 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a  w, a[k].pExpr);.
23dd0 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
23de0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
23df0 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
23e00 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b  r-1].zName = a[k
23e10 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
23e20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
23e30 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20  >nExpr-1].zSpan 
23e40 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20  = a[k].zSpan;.  
23e50 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61          a[k].zNa
23e60 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
23e70 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30    a[k].zSpan = 0
23e80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23e90 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d      a[k].pExpr =
23ea0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
23eb0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
23ec0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
23ed0 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45   "*" or a "TABLE
23ee0 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f  .*" and needs to
23ef0 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65   be.        ** e
23f00 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20  xpanded. */.    
23f10 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65      int tableSee
23f20 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53  n = 0;      /* S
23f30 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42  et to 1 when TAB
23f40 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20  LE matches */.  
23f50 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61        char *zTNa
23f60 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  me = 0;       /*
23f70 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66   text of name of
23f80 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20   TABLE */.      
23f90 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
23fa0 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20  _DOT ){.        
23fb0 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 70 4c    assert( pE->pL
23fc0 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  eft!=0 );.      
23fd0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
23fe0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2d  rHasProperty(pE-
23ff0 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74 56 61  >pLeft, EP_IntVa
24000 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
24010 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70    zTName = pE->p
24020 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Left->u.zToken;.
24030 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24040 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
24050 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
24060 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
24070 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
24080 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a           Table *
24090 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
240a0 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 53 65  ab;.          Se
240b0 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 46 72  lect *pSub = pFr
240c0 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
240d0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
240e0 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a  bName = pFrom->z
240f0 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20  Alias;.         
24100 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63   const char *zSc
24110 68 65 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  hemaName = 0;.  
24120 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b          int iDb;
24130 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
24140 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  TabName==0 ){.  
24150 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61            zTabNa
24160 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  me = pTab->zName
24170 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
24180 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
24190 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62  mallocFailed ) b
241a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
241b0 69 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20 28  if( pSub==0 || (
241c0 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
241d0 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d   SF_NestedFrom)=
241e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
241f0 20 20 70 53 75 62 20 3d 20 30 3b 0a 20 20 20 20    pSub = 0;.    
24200 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
24210 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  me && sqlite3Str
24220 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61  ICmp(zTName, zTa
24230 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  bName)!=0 ){.   
24240 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
24250 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
24260 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
24270 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
24280 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
24290 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
242a0 20 20 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d            zSchem
242b0 61 4e 61 6d 65 20 3d 20 69 44 62 3e 3d 30 20 3f  aName = iDb>=0 ?
242c0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
242d0 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20  ame : "*";.     
242e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
242f0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
24300 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
24310 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
24320 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43  zName = pTab->aC
24330 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol[j].zName;.   
24340 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
24350 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65  Colname;  /* The
24360 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e   computed column
24370 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
24380 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 46 72       char *zToFr
24390 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65  ee;   /* Malloce
243a0 64 20 73 74 72 69 6e 67 20 74 68 61 74 20 6e 65  d string that ne
243b0 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  eds to be freed 
243c0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  */.            T
243d0 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20  oken sColname;  
243e0 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75  /* Computed colu
243f0 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b  mn name as a tok
24400 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20  en */..         
24410 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65     assert( zName
24420 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
24430 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 70 53  if( zTName && pS
24440 75 62 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ub.             
24450 26 26 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53  && sqlite3MatchS
24460 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45  panName(pSub->pE
24470 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e  List->a[j].zSpan
24480 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d  , 0, zTName, 0)=
24490 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  =0.            )
244a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
244b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
244c0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
244d0 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c       /* If a col
244e0 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73  umn is marked as
244f0 20 27 68 69 64 64 65 6e 27 20 28 63 75 72 72 65   'hidden' (curre
24500 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73 69 62  ntly only possib
24510 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
24520 2a 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74 61  * for virtual ta
24530 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20 69 6e  bles), do not in
24540 63 6c 75 64 65 20 69 74 20 69 6e 20 74 68 65 20  clude it in the 
24550 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20  expanded.       
24560 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73       ** result-s
24570 65 74 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 20  et list..       
24580 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
24590 20 20 20 20 69 66 28 20 49 73 48 69 64 64 65 6e      if( IsHidden
245a0 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43  Column(&pTab->aC
245b0 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20  ol[j]) ){.      
245c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 49          assert(I
245d0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 29 3b  sVirtual(pTab));
245e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
245f0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
24600 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
24610 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31     tableSeen = 1
24620 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ;..            i
24630 66 28 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65  f( i>0 && zTName
24640 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
24650 20 20 20 20 20 69 66 28 20 28 70 46 72 6f 6d 2d       if( (pFrom-
24660 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e  >jointype & JT_N
24670 41 54 55 52 41 4c 29 21 3d 30 0a 20 20 20 20 20  ATURAL)!=0.     
24680 20 20 20 20 20 20 20 20 20 20 20 26 26 20 74 61             && ta
24690 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65  bleAndColumnInde
246a0 78 28 70 54 61 62 4c 69 73 74 2c 20 69 2c 20 7a  x(pTabList, i, z
246b0 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20 20 20 20  Name, 0, 0).    
246c0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
246d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
246e0 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69  In a NATURAL joi
246f0 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e  n, omit the join
24700 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68   columns from th
24710 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e .             
24720 20 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20 74     ** table to t
24730 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20  he right of the 
24740 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  join */.        
24750 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
24760 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
24770 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
24780 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73  if( sqlite3IdLis
24790 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d 3e 70 55  tIndex(pFrom->pU
247a0 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20  sing, zName)>=0 
247b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
247c0 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20     /* In a join 
247d0 77 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61  with a USING cla
247e0 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e  use, omit column
247f0 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20  s in the.       
24800 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e           ** usin
24810 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68  g clause from th
24820 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72  e table on the r
24830 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ight. */.       
24840 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
24850 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
24860 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
24870 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69  .            pRi
24880 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
24890 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61  r(db, TK_ID, zNa
248a0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
248b0 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d   zColname = zNam
248c0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  e;.            z
248d0 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  ToFree = 0;.    
248e0 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67          if( long
248f0 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73  Names || pTabLis
24900 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20  t->nSrc>1 ){.   
24910 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
24920 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20  *pLeft;.        
24930 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71        pLeft = sq
24940 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
24950 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a  _ID, zTabName);.
24960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
24970 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
24980 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f  pr(pParse, TK_DO
24990 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  T, pLeft, pRight
249a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
249b0 20 20 20 20 69 66 28 20 7a 53 63 68 65 6d 61 4e      if( zSchemaN
249c0 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
249d0 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73         pLeft = s
249e0 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
249f0 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61 4e 61 6d  K_ID, zSchemaNam
24a00 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
24a10 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
24a20 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
24a30 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20   TK_DOT, pLeft, 
24a40 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
24a50 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24a60 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e           if( lon
24a70 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20  gNames ){.      
24a80 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61            zColna
24a90 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
24aa0 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c  ntf(db, "%s.%s",
24ab0 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65   zTabName, zName
24ac0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
24ad0 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f     zToFree = zCo
24ae0 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  lname;.         
24af0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
24b00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24b10 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
24b20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
24b30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
24b40 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
24b50 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
24b60 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78  Parse, pNew, pEx
24b70 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pr);.           
24b80 20 73 43 6f 6c 6e 61 6d 65 2e 7a 20 3d 20 7a 43   sColname.z = zC
24b90 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  olname;.        
24ba0 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 6e 20 3d      sColname.n =
24bb0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
24bc0 28 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20  (zColname);.    
24bd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
24be0 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70  xprListSetName(p
24bf0 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43  Parse, pNew, &sC
24c00 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  olname, 0);.    
24c10 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
24c20 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   && (p->selFlags
24c30 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d   & SF_NestedFrom
24c40 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
24c50 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
24c60 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d  rList_item *pX =
24c70 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e   &pNew->a[pNew->
24c80 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20  nExpr-1];.      
24c90 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
24ca0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24cb0 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20      pX->zSpan = 
24cc0 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
24cd0 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  db, pSub->pEList
24ce0 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20  ->a[j].zSpan);. 
24cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
24d00 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70  estcase( pX->zSp
24d10 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  an==0 );.       
24d20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
24d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58                pX
24d40 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
24d50 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
24d60 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20  .%s.%s",.       
24d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d90 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c      zSchemaName,
24da0 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e   zTabName, zColn
24db0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
24dc0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
24dd0 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a  pX->zSpan==0 );.
24de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
24df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58                pX
24e00 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31  ->bSpanIsTab = 1
24e10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
24e20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
24e30 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54  te3DbFree(db, zT
24e40 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20  oFree);.        
24e50 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
24e60 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65        if( !table
24e70 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Seen ){.        
24e80 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a    if( zTName ){.
24e90 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
24ea0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
24eb0 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  se, "no such tab
24ec0 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29  le: %s", zTName)
24ed0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
24ee0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
24ef0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
24f00 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65  Parse, "no table
24f10 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20  s specified");. 
24f20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24f30 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
24f40 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
24f50 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
24f60 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d   pEList);.    p-
24f70 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a  >pEList = pNew;.
24f80 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
24f90 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20  AX_COLUMN.  if( 
24fa0 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e  p->pEList && p->
24fb0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62  pEList->nExpr>db
24fc0 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
24fd0 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b  LIMIT_COLUMN] ){
24fe0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
24ff0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
25000 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69  o many columns i
25010 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a  n result set");.
25020 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
25030 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
25040 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70  ;.}../*.** No-op
25050 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65   routine for the
25060 20 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b   parse-tree walk
25070 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  er..**.** When t
25080 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
25090 68 65 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43  he Walker.xExprC
250a0 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65 78 70  allback then exp
250b0 72 65 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a  ression trees.**
250c0 20 61 72 65 20 77 61 6c 6b 65 64 20 77 69 74 68   are walked with
250d0 6f 75 74 20 61 6e 79 20 61 63 74 69 6f 6e 73 20  out any actions 
250e0 62 65 69 6e 67 20 74 61 6b 65 6e 20 61 74 20 65  being taken at e
250f0 61 63 68 20 6e 6f 64 65 2e 20 20 50 72 65 73 75  ach node.  Presu
25100 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74  mably,.** when t
25110 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
25120 73 65 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78  sed for Walker.x
25130 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65  ExprCallback the
25140 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65  n .** Walker.xSe
25150 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 69 73 20  lectCallback is 
25160 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68  set to do someth
25170 69 6e 67 20 75 73 65 66 75 6c 20 66 6f 72 20 65  ing useful for e
25180 76 65 72 79 20 0a 2a 2a 20 73 75 62 71 75 65 72  very .** subquer
25190 79 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20  y in the parser 
251a0 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
251b0 69 6e 74 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70  int exprWalkNoop
251c0 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64  (Walker *NotUsed
251d0 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73 65 64 32  , Expr *NotUsed2
251e0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
251f0 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
25200 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74  NotUsed2);.  ret
25210 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
25220 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
25230 72 6f 75 74 69 6e 65 20 22 65 78 70 61 6e 64 73  routine "expands
25240 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  " a SELECT state
25250 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20  ment and all of 
25260 69 74 73 20 73 75 62 71 75 65 72 69 65 73 2e 0a  its subqueries..
25270 2a 2a 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61  ** For additiona
25280 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  l information on
25290 20 77 68 61 74 20 69 74 20 6d 65 61 6e 73 20 74   what it means t
252a0 6f 20 22 65 78 70 61 6e 64 22 20 61 20 53 45 4c  o "expand" a SEL
252b0 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ECT.** statement
252c0 2c 20 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  , see the commen
252d0 74 20 6f 6e 20 74 68 65 20 73 65 6c 65 63 74 45  t on the selectE
252e0 78 70 61 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c  xpand worker cal
252f0 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a  lback above..**.
25300 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20 61 20 53  ** Expanding a S
25310 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
25320 69 73 20 74 68 65 20 66 69 72 73 74 20 73 74 65  is the first ste
25330 70 20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  p in processing 
25340 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  a.** SELECT stat
25350 65 6d 65 6e 74 2e 20 20 54 68 65 20 53 45 4c 45  ement.  The SELE
25360 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d 75 73  CT statement mus
25370 74 20 62 65 20 65 78 70 61 6e 64 65 64 20 62 65  t be expanded be
25380 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73  fore.** name res
25390 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65 72 66 6f  olution is perfo
253a0 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rmed..**.** If a
253b0 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  nything goes wro
253c0 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ng, an error mes
253d0 73 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  sage is written 
253e0 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20  into pParse..** 
253f0 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
25400 74 69 6f 6e 20 63 61 6e 20 64 65 74 65 63 74 20  tion can detect 
25410 74 68 65 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c  the problem by l
25420 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61 72 73 65  ooking at pParse
25430 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72  ->nErr.** and/or
25440 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
25450 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74  locFailed..*/.st
25460 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
25470 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 50 61  3SelectExpand(Pa
25480 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
25490 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
254a0 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d   Walker w;.  mem
254b0 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
254c0 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72  f(w));.  w.xExpr
254d0 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57  Callback = exprW
254e0 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61  alkNoop;.  w.pPa
254f0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
25500 69 66 28 20 70 50 61 72 73 65 2d 3e 68 61 73 43  if( pParse->hasC
25510 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 77  ompound ){.    w
25520 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
25530 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75   = convertCompou
25540 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65  ndSelectToSubque
25550 72 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57  ry;.    sqlite3W
25560 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
25570 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e  elect);.  }.  w.
25580 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
25590 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  = selectExpander
255a0 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
255b0 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 50  lback2 = selectP
255c0 6f 70 57 69 74 68 3b 0a 20 20 73 71 6c 69 74 65  opWith;.  sqlite
255d0 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
255e0 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69  pSelect);.}...#i
255f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
25600 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
25610 20 54 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65   This is a Walke
25620 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  r.xSelectCallbac
25630 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74  k callback for t
25640 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  he sqlite3Select
25650 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e  TypeInfo().** in
25660 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46  terface..**.** F
25670 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61  or each FROM-cla
25680 75 73 65 20 73 75 62 71 75 65 72 79 2c 20 61 64  use subquery, ad
25690 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61  d Column.zType a
256a0 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a  nd Column.zColl.
256b0 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  ** information t
256c0 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  o 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 0a 2a 2a 20 6f 66 20 74 68 61 74 20   set.** of that 
25700 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  subquery..**.** 
25710 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  The Table struct
25720 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65  ure that represe
25730 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  nts the result s
25740 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74  et was construct
25750 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74 45  ed.** by selectE
25760 78 70 61 6e 64 65 72 28 29 20 62 75 74 20 74 68  xpander() but th
25770 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61  e type and colla
25780 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tion information
25790 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20   was omitted.** 
257a0 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 62 65  at that point be
257b0 63 61 75 73 65 20 69 64 65 6e 74 69 66 69 65 72  cause identifier
257c0 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 62 65  s had not yet be
257d0 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 54 68  en resolved.  Th
257e0 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
257f0 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 69 64   called after id
25800 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c 75 74  entifier resolut
25810 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
25820 6f 69 64 20 73 65 6c 65 63 74 41 64 64 53 75 62  oid selectAddSub
25830 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28 57 61  queryTypeInfo(Wa
25840 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
25850 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72  elect *p){.  Par
25860 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e  se *pParse;.  in
25870 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  t i;.  SrcList *
25880 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75  pTabList;.  stru
25890 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
258a0 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72  *pFrom;..  asser
258b0 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  t( p->selFlags &
258c0 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a   SF_Resolved );.
258d0 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
258e0 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49  gs & SF_HasTypeI
258f0 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  nfo)==0 ){.    p
25900 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
25910 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20  _HasTypeInfo;.  
25920 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b    pParse = pWalk
25930 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  er->pParse;.    
25940 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
25950 72 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  rc;.    for(i=0,
25960 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
25970 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
25980 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
25990 2b 2b 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  ++){.      Table
259a0 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
259b0 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
259c0 41 4c 57 41 59 53 28 70 54 61 62 21 3d 30 29 20  ALWAYS(pTab!=0) 
259d0 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  && (pTab->tabFla
259e0 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
259f0 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)!=0 ){.       
25a00 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
25a10 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
25a20 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
25a30 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  /.        Select
25a40 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e   *pSel = pFrom->
25a50 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20  pSelect;.       
25a60 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20   if( pSel ){.   
25a70 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
25a80 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  el->pPrior ) pSe
25a90 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  l = pSel->pPrior
25aa0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 65 6c 65  ;.          sele
25ab0 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41  ctAddColumnTypeA
25ac0 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72  ndCollation(pPar
25ad0 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 29 3b  se, pTab, pSel);
25ae0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25af0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23   }.    }.  }.}.#
25b00 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
25b10 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20  is routine adds 
25b20 64 61 74 61 74 79 70 65 20 61 6e 64 20 63 6f 6c  datatype and col
25b30 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
25b40 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a  information to.*
25b50 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  * the Table stru
25b60 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20 46 52  ctures of all FR
25b70 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
25b80 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c  ries in a.** SEL
25b90 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
25ba0 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 72 6f  *.** Use this ro
25bb0 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61 6d 65  utine after name
25bc0 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a   resolution..*/.
25bd0 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
25be0 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65  te3SelectAddType
25bf0 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  Info(Parse *pPar
25c00 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
25c10 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  ect){.#ifndef SQ
25c20 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
25c30 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  RY.  Walker w;. 
25c40 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
25c50 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78  izeof(w));.  w.x
25c60 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
25c70 3d 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75  = selectAddSubqu
25c80 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77  eryTypeInfo;.  w
25c90 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
25ca0 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20   exprWalkNoop;. 
25cb0 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
25cc0 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  se;.  sqlite3Wal
25cd0 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c  kSelect(&w, pSel
25ce0 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ect);.#endif.}..
25cf0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
25d00 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 53 45  ine sets up a SE
25d10 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66  LECT statement f
25d20 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  or processing.  
25d30 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  The.** following
25d40 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64   is accomplished
25d50 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56  :.**.**     *  V
25d60 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65  DBE Cursor numbe
25d70 72 73 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  rs are assigned 
25d80 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  to all FROM-clau
25d90 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20  se terms..**    
25da0 20 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54 61   *  Ephemeral Ta
25db0 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20  ble objects are 
25dc0 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20  created for all 
25dd0 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
25de0 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a  ueries..**     *
25df0 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63    ON and USING c
25e00 6c 61 75 73 65 73 20 61 72 65 20 73 68 69 66 74  lauses are shift
25e10 65 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73 74  ed into WHERE st
25e20 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20  atements.**     
25e30 2a 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a 22  *  Wildcards "*"
25e40 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20 69   and "TABLE.*" i
25e50 6e 20 72 65 73 75 6c 74 20 73 65 74 73 20 61 72  n result sets ar
25e60 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20  e expanded..**  
25e70 20 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65 72     *  Identifier
25e80 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s in expression 
25e90 61 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20 74  are matched to t
25ea0 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ables..**.** Thi
25eb0 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 72  s routine acts r
25ec0 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c  ecursively on al
25ed0 6c 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74  l subqueries wit
25ee0 68 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 0a  hin the SELECT..
25ef0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
25f00 65 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61 72  electPrep(.  Par
25f10 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
25f20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
25f30 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
25f40 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
25f50 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
25f60 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
25f70 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20  ing coded. */.  
25f80 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75  NameContext *pOu
25f90 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63  terNC  /* Name c
25fa0 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74 61  ontext for conta
25fb0 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  iner */.){.  sql
25fc0 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
25fd0 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65  NEVER(p==0) ) re
25fe0 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 50 61  turn;.  db = pPa
25ff0 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64  rse->db;.  if( d
26000 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
26010 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
26020 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
26030 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72  _HasTypeInfo ) r
26040 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
26050 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70 50 61  SelectExpand(pPa
26060 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70  rse, p);.  if( p
26070 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
26080 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
26090 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
260a0 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74  te3ResolveSelect
260b0 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2c  Names(pParse, p,
260c0 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69 66   pOuterNC);.  if
260d0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
260e0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
260f0 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  ed ) return;.  s
26100 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54  qlite3SelectAddT
26110 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  ypeInfo(pParse, 
26120 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  p);.}../*.** Res
26130 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74 65  et the aggregate
26140 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a   accumulator..**
26150 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61 74  .** The aggregat
26160 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73  e accumulator is
26170 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79   a set of memory
26180 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64   cells that hold
26190 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65  .** intermediate
261a0 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63   results while c
261b0 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67  alculating an ag
261c0 67 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a  gregate.  This.*
261d0 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  * routine genera
261e0 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 73 74  tes code that st
261f0 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c  ores NULLs in al
26200 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72  l of those memor
26210 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73  y.** cells..*/.s
26220 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 65 74  tatic void reset
26230 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73  Accumulator(Pars
26240 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
26250 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
26260 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
26270 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
26280 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  i;.  struct AggI
26290 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b  nfo_func *pFunc;
262a0 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d 20 70 41  .  int nReg = pA
262b0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b 20  ggInfo->nFunc + 
262c0 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
262d0 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 30  n;.  if( nReg==0
262e0 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 64 65   ) return;.#ifde
262f0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
26300 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
26310 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65 67 69  all AggInfo regi
26320 73 74 65 72 73 20 61 72 65 20 77 69 74 68 69 6e  sters are within
26330 20 74 68 65 20 72 61 6e 67 65 20 73 70 65 63 69   the range speci
26340 66 69 65 64 20 62 79 0a 20 20 2a 2a 20 41 67 67  fied by.  ** Agg
26350 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67 49  Info.mnReg..AggI
26360 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20 20 61  nfo.mxReg */.  a
26370 73 73 65 72 74 28 20 6e 52 65 67 3d 3d 70 41 67  ssert( nReg==pAg
26380 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70 41 67  gInfo->mxReg-pAg
26390 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20 29  gInfo->mnReg+1 )
263a0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
263b0 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
263c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
263d0 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  rt( pAggInfo->aC
263e0 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67  ol[i].iMem>=pAgg
263f0 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20  Info->mnReg.    
26400 20 20 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f       && pAggInfo
26410 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d  ->aCol[i].iMem<=
26420 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20  pAggInfo->mxReg 
26430 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
26440 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
26450 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  unc; i++){.    a
26460 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d  ssert( pAggInfo-
26470 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e 3d  >aFunc[i].iMem>=
26480 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a  pAggInfo->mnReg.
26490 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67           && pAgg
264a0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69  Info->aFunc[i].i
264b0 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Mem<=pAggInfo->m
264c0 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  xReg );.  }.#end
264d0 69 66 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  if.  sqlite3Vdbe
264e0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp3(v, OP_Nul
264f0 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e  l, 0, pAggInfo->
26500 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e 66 6f 2d  mnReg, pAggInfo-
26510 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72 28 70  >mxReg);.  for(p
26520 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  Func=pAggInfo->a
26530 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67  Func, i=0; i<pAg
26540 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
26550 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20  +, pFunc++){.   
26560 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73   if( pFunc->iDis
26570 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
26580 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75    Expr *pE = pFu
26590 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  nc->pExpr;.     
265a0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
265b0 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  sProperty(pE, EP
265c0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
265d0 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78 2e 70       if( pE->x.p
265e0 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78  List==0 || pE->x
265f0 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  .pList->nExpr!=1
26600 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
26610 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
26620 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20 61 67  se, "DISTINCT ag
26630 67 72 65 67 61 74 65 73 20 6d 75 73 74 20 68 61  gregates must ha
26640 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 22  ve exactly one "
26650 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 72 67  .           "arg
26660 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20 20 20  ument");.       
26670 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
26680 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  t = -1;.      }e
26690 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79  lse{.        Key
266a0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
266b0 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
266c0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d  List(pParse, pE-
266d0 3e 78 2e 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b  >x.pList, 0, 0);
266e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
266f0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
26700 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
26710 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
26720 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
26730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26740 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
26750 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
26760 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
26770 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
26780 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61  e the OP_AggFina
26790 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20  lize opcode for 
267a0 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65 20  every aggregate 
267b0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  function.** in t
267c0 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63  he AggInfo struc
267d0 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
267e0 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67  void finalizeAgg
267f0 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20  Functions(Parse 
26800 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
26810 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
26820 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
26830 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
26840 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
26850 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f  o_func *pF;.  fo
26860 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
26870 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
26880 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
26890 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78  +, pF++){.    Ex
268a0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
268b0 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  pF->pExpr->x.pLi
268c0 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
268d0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
268e0 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78  (pF->pExpr, EP_x
268f0 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
26900 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
26910 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61  p4(v, OP_AggFina
26920 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69  l, pF->iMem, pLi
26930 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
26940 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  r : 0, 0,.      
26950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26960 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63  (void*)pF->pFunc
26970 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
26980 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61   }.}../*.** Upda
26990 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  te the accumulat
269a0 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  or memory cells 
269b0 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65  for an aggregate
269c0 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65   based on.** the
269d0 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
269e0 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  position..*/.sta
269f0 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41  tic void updateA
26a00 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
26a10 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
26a20 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
26a30 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
26a40 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
26a50 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20 3d  ;.  int regHit =
26a60 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48 69   0;.  int addrHi
26a70 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74 72  tTest = 0;.  str
26a80 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
26a90 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41   *pF;.  struct A
26aa0 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a  ggInfo_col *pC;.
26ab0 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
26ac0 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66  ectMode = 1;.  f
26ad0 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
26ae0 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
26af0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
26b00 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69  ++, pF++){.    i
26b10 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74  nt nArg;.    int
26b20 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20   addrNext = 0;. 
26b30 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20     int regAgg;. 
26b40 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
26b50 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
26b60 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73  x.pList;.    ass
26b70 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
26b80 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c  perty(pF->pExpr,
26b90 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
26ba0 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20  ;.    if( pList 
26bb0 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  ){.      nArg = 
26bc0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
26bd0 20 20 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c      regAgg = sql
26be0 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
26bf0 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a  (pParse, nArg);.
26c00 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
26c10 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
26c20 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67  arse, pList, reg
26c30 41 67 67 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c  Agg, SQLITE_ECEL
26c40 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65  _DUP);.    }else
26c50 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30  {.      nArg = 0
26c60 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d  ;.      regAgg =
26c70 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
26c80 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e  ( pF->iDistinct>
26c90 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  =0 ){.      addr
26ca0 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Next = sqlite3Vd
26cb0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
26cc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 41        assert( nA
26cd0 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 63  rg==1 );.      c
26ce0 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72  odeDistinct(pPar
26cf0 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63  se, pF->iDistinc
26d00 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20  t, addrNext, 1, 
26d10 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20  regAgg);.    }. 
26d20 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63     if( pF->pFunc
26d30 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
26d40 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
26d50 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  LL ){.      Coll
26d60 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
26d70 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
26d80 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
26d90 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  m;.      int j;.
26da0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
26db0 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c  ist!=0 );  /* pL
26dc0 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46  ist!=0 if pF->pF
26dd0 75 6e 63 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c  unc has NEEDCOLL
26de0 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   */.      for(j=
26df0 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
26e00 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e  a; !pColl && j<n
26e10 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  Arg; j++, pItem+
26e20 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  +){.        pCol
26e30 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
26e40 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
26e50 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
26e60 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
26e70 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
26e80 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65    pColl = pParse
26e90 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
26ea0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
26eb0 66 28 20 72 65 67 48 69 74 3d 3d 30 20 26 26 20  f( regHit==0 && 
26ec0 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d  pAggInfo->nAccum
26ed0 75 6c 61 74 6f 72 20 29 20 72 65 67 48 69 74 20  ulator ) regHit 
26ee0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
26ef0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
26f00 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
26f10 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48 69 74 2c  CollSeq, regHit,
26f20 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
26f30 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
26f40 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
26f50 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
26f60 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 30 2c  , OP_AggStep, 0,
26f70 20 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65   regAgg, pF->iMe
26f80 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m,.             
26f90 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
26fa0 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55  pF->pFunc, P4_FU
26fb0 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69  NCDEF);.    sqli
26fc0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
26fd0 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20  v, (u8)nArg);.  
26fe0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
26ff0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
27000 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c  (pParse, regAgg,
27010 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69   nArg);.    sqli
27020 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
27030 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41  nge(pParse, regA
27040 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69  gg, nArg);.    i
27050 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20  f( addrNext ){. 
27060 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
27070 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
27080 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20  addrNext);.     
27090 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
270a0 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
270b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
270c0 42 65 66 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e  Before populatin
270d0 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  g the accumulato
270e0 72 20 72 65 67 69 73 74 65 72 73 2c 20 63 6c 65  r registers, cle
270f0 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  ar the column ca
27100 63 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77  che..  ** Otherw
27110 69 73 65 2c 20 69 66 20 61 6e 79 20 6f 66 20 74  ise, if any of t
27120 68 65 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75  he required colu
27130 6d 6e 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c  mn values are al
27140 72 65 61 64 79 20 70 72 65 73 65 6e 74 20 0a 20  ready present . 
27150 20 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73   ** in registers
27160 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  , sqlite3ExprCod
27170 65 28 29 20 6d 61 79 20 75 73 65 20 4f 50 5f 53  e() may use OP_S
27180 43 6f 70 79 20 74 6f 20 63 6f 70 79 20 74 68 65  Copy to copy the
27190 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70   value.  ** to p
271a0 43 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79 20  C->iMem. But by 
271b0 74 68 65 20 74 69 6d 65 20 74 68 65 20 76 61 6c  the time the val
271c0 75 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 20  ue is used, the 
271d0 6f 72 69 67 69 6e 61 6c 20 72 65 67 69 73 74 65  original registe
271e0 72 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20  r.  ** may have 
271f0 62 65 65 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c  been used, inval
27200 69 64 61 74 69 6e 67 20 74 68 65 20 75 6e 64 65  idating the unde
27210 72 6c 79 69 6e 67 20 62 75 66 66 65 72 20 68 6f  rlying buffer ho
27220 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74  lding the.  ** t
27230 65 78 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75  ext or blob valu
27240 65 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b 38  e. See ticket [8
27250 38 33 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a  83034dcb5]..  **
27260 0a 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f  .  ** Another so
27270 6c 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20  lution would be 
27280 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50  to change the OP
27290 5f 53 43 6f 70 79 20 75 73 65 64 20 74 6f 20 63  _SCopy used to c
272a0 6f 70 79 20 63 61 63 68 65 64 0a 20 20 2a 2a 20  opy cached.  ** 
272b0 76 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f  values to an OP_
272c0 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  Copy..  */.  if(
272d0 20 72 65 67 48 69 74 20 29 7b 0a 20 20 20 20 61   regHit ){.    a
272e0 64 64 72 48 69 74 54 65 73 74 20 3d 20 73 71 6c  ddrHitTest = sql
272f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
27300 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48 69 74 29  , OP_If, regHit)
27310 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
27320 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
27330 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
27340 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d  Parse);.  for(i=
27350 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pC=pAggInfo->
27360 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f  aCol; i<pAggInfo
27370 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20  ->nAccumulator; 
27380 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20  i++, pC++){.    
27390 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
273a0 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70  pParse, pC->pExp
273b0 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20  r, pC->iMem);.  
273c0 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69  }.  pAggInfo->di
273d0 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20  rectMode = 0;.  
273e0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
273f0 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
27400 20 69 66 28 20 61 64 64 72 48 69 74 54 65 73 74   if( addrHitTest
27410 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
27420 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
27430 64 64 72 48 69 74 54 65 73 74 29 3b 0a 20 20 7d  ddrHitTest);.  }
27440 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
27450 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69  single OP_Explai
27460 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  n instruction to
27470 20 74 68 65 20 56 44 42 45 20 74 6f 20 65 78 70   the VDBE to exp
27480 6c 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a  lain a simple.**
27490 20 63 6f 75 6e 74 28 2a 29 20 71 75 65 72 79 20   count(*) query 
274a0 28 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  ("SELECT count(*
274b0 29 20 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a  ) FROM pTab")..*
274c0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
274d0 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74  _OMIT_EXPLAIN.st
274e0 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
274f0 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20  nSimpleCount(.  
27500 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
27510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27520 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
27530 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
27540 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
27550 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62        /* Table b
27560 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a  eing queried */.
27570 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
27580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27590 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20    /* Index used 
275a0 74 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e  to optimize scan
275b0 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  , or NULL */.){.
275c0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
275d0 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
275e0 63 68 61 72 20 2a 7a 45 71 70 20 3d 20 73 71 6c  char *zEqp = sql
275f0 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72  ite3MPrintf(pPar
27600 73 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20 54 41  se->db, "SCAN TA
27610 42 4c 45 20 25 73 25 73 25 73 22 2c 0a 20 20 20  BLE %s%s%s",.   
27620 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
27630 2c 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20  , .        pIdx 
27640 3f 20 22 20 55 53 49 4e 47 20 43 4f 56 45 52 49  ? " USING COVERI
27650 4e 47 20 49 4e 44 45 58 20 22 20 3a 20 22 22 2c  NG INDEX " : "",
27660 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 3f 20  .        pIdx ? 
27670 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22  pIdx->zName : ""
27680 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
27690 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20  te3VdbeAddOp4(. 
276a0 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70         pParse->p
276b0 56 64 62 65 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  Vdbe, OP_Explain
276c0 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  , pParse->iSelec
276d0 74 49 64 2c 20 30 2c 20 30 2c 20 7a 45 71 70 2c  tId, 0, 0, zEqp,
276e0 20 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20 20   P4_DYNAMIC.    
276f0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
27700 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53   define explainS
27710 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63  impleCount(a,b,c
27720 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
27730 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
27740 72 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  r the SELECT sta
27750 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20  tement given in 
27760 74 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20  the p argument. 
27770 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75   .**.** The resu
27780 6c 74 73 20 61 72 65 20 72 65 74 75 72 6e 65 64  lts are returned
27790 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
277a0 65 20 53 65 6c 65 63 74 44 65 73 74 20 73 74 72  e SelectDest str
277b0 75 63 74 75 72 65 2e 0a 2a 2a 20 53 65 65 20 63  ucture..** See c
277c0 6f 6d 6d 65 6e 74 73 20 69 6e 20 73 71 6c 69 74  omments in sqlit
277d0 65 49 6e 74 2e 68 20 66 6f 72 20 66 75 72 74 68  eInt.h for furth
277e0 65 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  er information..
277f0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
27800 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ne returns the n
27810 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
27820 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20    If any errors 
27830 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72  are.** encounter
27840 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72  ed, then an appr
27850 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65  opriate error me
27860 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e  ssage is left in
27870 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72  .** pParse->zErr
27880 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Msg..**.** This 
27890 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54  routine does NOT
278a0 20 66 72 65 65 20 74 68 65 20 53 65 6c 65 63 74   free the Select
278b0 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
278c0 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61  d in.  The.** ca
278d0 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e  lling function n
278e0 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e  eeds to do that.
278f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53  .*/.int sqlite3S
27900 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
27910 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
27920 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
27930 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
27940 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
27950 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
27960 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
27970 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65  coded. */.  Sele
27980 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
27990 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
279a0 20 77 69 74 68 20 74 68 65 20 71 75 65 72 79 20   with the query 
279b0 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20  results */.){.  
279c0 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
279d0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
279e0 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65  ounters */.  Whe
279f0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
27a00 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72      /* Return fr
27a10 6f 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  om sqlite3WhereB
27a20 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65  egin() */.  Vdbe
27a30 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
27a40 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
27a50 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20  l machine under 
27a60 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
27a70 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20    int isAgg;    
27a80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
27a90 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74   for select list
27aa0 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29  s like "count(*)
27ab0 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  " */.  ExprList 
27ac0 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a  *pEList;      /*
27ad0 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   List of columns
27ae0 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a   to extract. */.
27af0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
27b00 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74  ist;     /* List
27b10 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65   of tables to se
27b20 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45  lect from */.  E
27b30 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20  xpr *pWhere;    
27b40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
27b50 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  RE clause.  May 
27b60 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
27b70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b  rList *pGroupBy;
27b80 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50      /* The GROUP
27b90 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79   BY clause.  May
27ba0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
27bb0 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20  pr *pHaving;    
27bc0 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49       /* The HAVI
27bd0 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  NG clause.  May 
27be0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
27bf0 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20   rc = 1;        
27c00 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
27c10 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73  return from this
27c20 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44   function */.  D
27c30 69 73 74 69 6e 63 74 43 74 78 20 73 44 69 73 74  istinctCtx sDist
27c40 69 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e  inct; /* Info on
27c50 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65   how to code the
27c60 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
27c70 64 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 73  d */.  SortCtx s
27c80 53 6f 72 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  Sort;         /*
27c90 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20   Info on how to 
27ca0 63 6f 64 65 20 74 68 65 20 4f 52 44 45 52 20 42  code the ORDER B
27cb0 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 41 67  Y clause */.  Ag
27cc0 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20  gInfo sAggInfo; 
27cd0 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
27ce0 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67 72  ion used by aggr
27cf0 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f  egate queries */
27d00 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20  .  int iEnd;    
27d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
27d20 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20  ress of the end 
27d30 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a  of the query */.
27d40 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
27d50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
27d60 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
27d70 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ion */..#ifndef 
27d80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
27d90 41 49 4e 0a 20 20 69 6e 74 20 69 52 65 73 74 6f  AIN.  int iResto
27da0 72 65 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61  reSelectId = pPa
27db0 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b 0a  rse->iSelectId;.
27dc0 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63    pParse->iSelec
27dd0 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 4e  tId = pParse->iN
27de0 65 78 74 53 65 6c 65 63 74 49 64 2b 2b 3b 0a 23  extSelectId++;.#
27df0 65 6e 64 69 66 0a 0a 20 20 64 62 20 3d 20 70 50  endif..  db = pP
27e00 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
27e10 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  p==0 || db->mall
27e20 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
27e30 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
27e40 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
27e50 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
27e60 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
27e70 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30  ITE_SELECT, 0, 0
27e80 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b  , 0) ) return 1;
27e90 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49  .  memset(&sAggI
27ea0 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  nfo, 0, sizeof(s
27eb0 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 20 20 61 73  AggInfo));..  as
27ec0 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
27ed0 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65  y==0 || pDest->e
27ee0 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74 46 69  Dest!=SRT_DistFi
27ef0 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  fo );.  assert( 
27f00 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c  p->pOrderBy==0 |
27f10 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d  | pDest->eDest!=
27f20 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 61 73  SRT_Fifo );.  as
27f30 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
27f40 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65  y==0 || pDest->e
27f50 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74 51 75  Dest!=SRT_DistQu
27f60 65 75 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  eue );.  assert(
27f70 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
27f80 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  || pDest->eDest!
27f90 3d 53 52 54 5f 51 75 65 75 65 20 29 3b 0a 20 20  =SRT_Queue );.  
27fa0 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64  if( IgnorableOrd
27fb0 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20  erby(pDest) ){. 
27fc0 20 20 20 61 73 73 65 72 74 28 70 44 65 73 74 2d     assert(pDest-
27fd0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73  >eDest==SRT_Exis
27fe0 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  ts || pDest->eDe
27ff0 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c  st==SRT_Union ||
28000 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65   .           pDe
28010 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
28020 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e  xcept || pDest->
28030 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61  eDest==SRT_Disca
28040 72 64 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  rd ||.          
28050 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
28060 52 54 5f 51 75 65 75 65 20 20 7c 7c 20 70 44 65  RT_Queue  || pDe
28070 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44  st->eDest==SRT_D
28080 69 73 74 46 69 66 6f 20 7c 7c 0a 20 20 20 20 20  istFifo ||.     
28090 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65        pDest->eDe
280a0 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75  st==SRT_DistQueu
280b0 65 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  e || pDest->eDes
280c0 74 3d 3d 53 52 54 5f 46 69 66 6f 29 3b 0a 20 20  t==SRT_Fifo);.  
280d0 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20 42 59    /* If ORDER BY
280e0 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72   makes no differ
280f0 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75 74 70  ence in the outp
28100 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65 72 20  ut then neither 
28110 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49 53 54  does.    ** DIST
28120 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e 20 62  INCT so it can b
28130 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a  e removed too. *
28140 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  /.    sqlite3Exp
28150 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
28160 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
28170 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
28180 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61  0;.    p->selFla
28190 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e  gs &= ~SF_Distin
281a0 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ct;.  }.  sqlite
281b0 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72  3SelectPrep(pPar
281c0 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 6d 65 6d  se, p, 0);.  mem
281d0 73 65 74 28 26 73 53 6f 72 74 2c 20 30 2c 20 73  set(&sSort, 0, s
281e0 69 7a 65 6f 66 28 73 53 6f 72 74 29 29 3b 0a 20  izeof(sSort));. 
281f0 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
28200 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
28210 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
28220 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  Src;.  pEList = 
28230 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
28240 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
28250 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
28260 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  d ){.    goto se
28270 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  lect_end;.  }.  
28280 69 73 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46  isAgg = (p->selF
28290 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
282a0 61 74 65 29 21 3d 30 3b 0a 20 20 61 73 73 65 72  ate)!=0;.  asser
282b0 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
282c0 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65  .  /* Begin gene
282d0 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a  rating code..  *
282e0 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
282f0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
28300 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
28310 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
28320 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74   /* If writing t
28330 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65  o memory or gene
28340 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a  rating a set.  *
28350 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  * only a single 
28360 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75  column may be ou
28370 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  tput..  */.#ifnd
28380 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
28390 55 42 51 55 45 52 59 0a 20 20 69 66 28 20 63 68  UBQUERY.  if( ch
283a0 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d  eckForMultiColum
283b0 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61  nSelectError(pPa
283c0 72 73 65 2c 20 70 44 65 73 74 2c 20 70 45 4c 69  rse, pDest, pELi
283d0 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20  st->nExpr) ){.  
283e0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
283f0 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  d;.  }.#endif.. 
28400 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
28410 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75  e for all sub-qu
28420 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  eries in the FRO
28430 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69  M clause.  */.#i
28440 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
28450 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
28460 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
28470 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20  ITE_OMIT_VIEW). 
28480 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50   for(i=0; !p->pP
28490 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69  rior && i<pTabLi
284a0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
284b0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
284c0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
284d0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d   &pTabList->a[i]
284e0 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73 74  ;.    SelectDest
284f0 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63   dest;.    Selec
28500 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d  t *pSub = pItem-
28510 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e  >pSelect;.    in
28520 74 20 69 73 41 67 67 53 75 62 3b 0a 0a 20 20 20  t isAggSub;..   
28530 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63   if( pSub==0 ) c
28540 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
28550 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 65 20 63   Sometimes the c
28560 6f 64 65 20 66 6f 72 20 61 20 73 75 62 71 75 65  ode for a subque
28570 72 79 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72  ry will be gener
28580 61 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ated more than. 
28590 20 20 20 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74     ** once, if t
285a0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70  he subquery is p
285b0 61 72 74 20 6f 66 20 74 68 65 20 57 48 45 52 45  art of the WHERE
285c0 20 63 6c 61 75 73 65 20 69 6e 20 61 20 4c 45 46   clause in a LEF
285d0 54 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66  T JOIN,.    ** f
285e0 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20  or example.  In 
285f0 74 68 61 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f  that case, do no
28600 74 20 72 65 67 65 6e 65 72 61 74 65 20 74 68 65  t regenerate the
28610 20 63 6f 64 65 20 74 6f 20 6d 61 6e 69 66 65 73   code to manifes
28620 74 0a 20 20 20 20 2a 2a 20 61 20 76 69 65 77 20  t.    ** a view 
28630 6f 72 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  or the co-routin
28640 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  e to implement a
28650 20 76 69 65 77 2e 20 20 54 68 65 20 66 69 72 73   view.  The firs
28660 74 20 69 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a  t instance.    *
28670 2a 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 2c  * is sufficient,
28680 20 74 68 6f 75 67 68 20 74 68 65 20 73 75 62 72   though the subr
28690 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65  outine to manife
286a0 73 74 20 74 68 65 20 76 69 65 77 20 64 6f 65 73  st the view does
286b0 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20   need.    ** to 
286c0 62 65 20 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e  be invoked again
286d0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74  . */.    if( pIt
286e0 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
286f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
28700 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65  em->viaCoroutine
28710 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
28720 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
28730 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49  (v, OP_Gosub, pI
28740 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  tem->regReturn, 
28750 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
28760 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ub);.      }.   
28770 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
28780 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65   }..    /* Incre
28790 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67  ment Parse.nHeig
287a0 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74  ht by the height
287b0 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20   of the largest 
287c0 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
287d0 2a 20 74 72 65 65 20 72 65 66 65 72 72 65 64 20  * tree referred 
287e0 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20  to by this, the 
287f0 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54  parent select. T
28800 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a  he child select.
28810 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61      ** may conta
28820 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  in expression tr
28830 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20  ees of at most. 
28840 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41     ** (SQLITE_MA
28850 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72  X_EXPR_DEPTH-Par
28860 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67  se.nHeight) heig
28870 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69  ht. This is a bi
28880 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f  t.    ** more co
28890 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20  nservative than 
288a0 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d  necessary, but m
288b0 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20  uch easier than 
288c0 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a  enforcing.    **
288d0 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e   an exact limit.
288e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72  .    */.    pPar
288f0 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73  se->nHeight += s
28900 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
28910 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20  Height(p);..    
28920 69 73 41 67 67 53 75 62 20 3d 20 28 70 53 75 62  isAggSub = (pSub
28930 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
28940 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20  Aggregate)!=0;. 
28950 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53 75     if( flattenSu
28960 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 70  bquery(pParse, p
28970 2c 20 69 2c 20 69 73 41 67 67 2c 20 69 73 41 67  , i, isAgg, isAg
28980 67 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20 2f  gSub) ){.      /
28990 2a 20 54 68 69 73 20 73 75 62 71 75 65 72 79 20  * This subquery 
289a0 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20  can be absorbed 
289b0 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e  into its parent.
289c0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73   */.      if( is
289d0 41 67 67 53 75 62 20 29 7b 0a 20 20 20 20 20 20  AggSub ){.      
289e0 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20    isAgg = 1;.   
289f0 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73       p->selFlags
28a00 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65   |= SF_Aggregate
28a10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28a20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  i = -1;.    }els
28a30 65 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e  e if( pTabList->
28a40 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20  nSrc==1.        
28a50 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
28a60 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
28a70 4c 49 54 45 5f 53 75 62 71 43 6f 72 6f 75 74 69  LITE_SubqCorouti
28a80 6e 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ne).    ){.     
28a90 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20   /* Implement a 
28aa0 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20  co-routine that 
28ab0 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 73 69  will return a si
28ac0 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20  ngle row of the 
28ad0 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20  result.      ** 
28ae0 73 65 74 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f  set on each invo
28af0 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  cation..      */
28b00 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
28b10 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
28b20 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31  CurrentAddr(v)+1
28b30 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  ;.      pItem->r
28b40 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
28b50 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
28b60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
28b70 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
28b80 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72  outine, pItem->r
28b90 65 67 52 65 74 75 72 6e 2c 20 30 2c 20 61 64 64  egReturn, 0, add
28ba0 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 56 64 62  rTop);.      Vdb
28bb0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
28bc0 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
28bd0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 70  zName));.      p
28be0 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
28bf0 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20 20  b = addrTop;.   
28c00 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
28c10 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
28c20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70  SRT_Coroutine, p
28c30 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
28c40 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
28c50 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d  etInteger(pItem-
28c60 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29  >iSelectId, (u8)
28c70 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
28c80 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71  ectId);.      sq
28c90 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
28ca0 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
28cb0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70  ;.      pItem->p
28cc0 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
28cd0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
28ce0 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  pSub->nSelectRow
28cf0 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
28d00 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31  viaCoroutine = 1
28d10 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  ;.      pItem->r
28d20 65 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74 2e  egResult = dest.
28d30 69 53 64 73 74 3b 0a 20 20 20 20 20 20 73 71 6c  iSdst;.      sql
28d40 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
28d50 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e  , OP_EndCoroutin
28d60 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  e, pItem->regRet
28d70 75 72 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  urn);.      sqli
28d80 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
28d90 76 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20  v, addrTop-1);. 
28da0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61       sqlite3Clea
28db0 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50  rTempRegCache(pP
28dc0 61 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  arse);.    }else
28dd0 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  {.      /* Gener
28de0 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
28df0 20 74 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20   that will fill 
28e00 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
28e10 6c 65 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a  le with.      **
28e20 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
28e30 74 68 69 73 20 73 75 62 71 75 65 72 79 2e 20 20  this subquery.  
28e40 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
28e50 75 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20  ub will point.  
28e60 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 61 64      ** to the ad
28e70 64 72 65 73 73 20 6f 66 20 74 68 65 20 67 65 6e  dress of the gen
28e80 65 72 61 74 65 64 20 73 75 62 72 6f 75 74 69 6e  erated subroutin
28e90 65 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  e.  pItem->regRe
28ea0 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73  turn.      ** is
28eb0 20 61 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f   a register allo
28ec0 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  cated to hold th
28ed0 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74  e subroutine ret
28ee0 75 72 6e 20 61 64 64 72 65 73 73 0a 20 20 20 20  urn address.    
28ef0 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74    */.      int t
28f00 6f 70 41 64 64 72 3b 0a 20 20 20 20 20 20 69 6e  opAddr;.      in
28f10 74 20 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a  t onceAddr = 0;.
28f20 20 20 20 20 20 20 69 6e 74 20 72 65 74 41 64 64        int retAdd
28f30 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
28f40 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
28f50 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Sub==0 );.      
28f60 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
28f70 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
28f80 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41 64 64 72  m;.      topAddr
28f90 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
28fa0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
28fb0 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65  er, 0, pItem->re
28fc0 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
28fd0 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
28fe0 75 62 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a  ub = topAddr+1;.
28ff0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
29000 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30  >isCorrelated==0
29010 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
29020 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
29030 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64  s not correlated
29040 20 61 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e   and if we are n
29050 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20  ot inside of.   
29060 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65       ** a trigge
29070 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20  r, then we only 
29080 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  need to compute 
29090 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
290a0 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 20 20   subquery.      
290b0 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20    ** once. */.  
290c0 20 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d        onceAddr =
290d0 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65   sqlite3CodeOnce
290e0 28 70 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f  (pParse); VdbeCo
290f0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
29100 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
29110 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20  v, "materialize 
29120 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e  \"%s\"", pItem->
29130 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
29140 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
29150 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
29160 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61  ent((v, "materia
29170 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49  lize \"%s\"", pI
29180 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
29190 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
291a0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
291b0 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
291c0 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74  RT_EphemTab, pIt
291d0 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
291e0 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
291f0 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65  teger(pItem->iSe
29200 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61 72  lectId, (u8)pPar
29210 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
29220 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
29230 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
29240 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20  pSub, &dest);.  
29250 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d      pItem->pTab-
29260 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73 71  >nRowLogEst = sq
29270 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 53 75 62  lite3LogEst(pSub
29280 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20  ->nSelectRow);. 
29290 20 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64 64       if( onceAdd
292a0 72 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  r ) sqlite3VdbeJ
292b0 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65 41  umpHere(v, onceA
292c0 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74 41  ddr);.      retA
292d0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
292e0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
292f0 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67  turn, pItem->reg
29300 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 56  Return);.      V
29310 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
29320 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e  end %s", pItem->
29330 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
29340 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
29350 43 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70 41  ChangeP1(v, topA
29360 64 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a 20  ddr, retAddr);. 
29370 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61       sqlite3Clea
29380 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50  rTempRegCache(pP
29390 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  arse);.    }.   
293a0 20 69 66 28 20 2f 2a 70 50 61 72 73 65 2d 3e 6e   if( /*pParse->n
293b0 45 72 72 20 7c 7c 2a 2f 20 64 62 2d 3e 6d 61 6c  Err ||*/ db->mal
293c0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
293d0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
293e0 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  nd;.    }.    pP
293f0 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d  arse->nHeight -=
29400 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
29410 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20 20  prHeight(p);.   
29420 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
29430 53 72 63 3b 0a 20 20 20 20 69 66 28 20 21 49 67  Src;.    if( !Ig
29440 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70  norableOrderby(p
29450 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 73  Dest) ){.      s
29460 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
29470 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
29480 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20   }.  }.  pEList 
29490 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 23 65 6e  = p->pEList;.#en
294a0 64 69 66 0a 20 20 70 57 68 65 72 65 20 3d 20 70  dif.  pWhere = p
294b0 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f  ->pWhere;.  pGro
294c0 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
294d0 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20  By;.  pHaving = 
294e0 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44  p->pHaving;.  sD
294f0 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d  istinct.isTnct =
29500 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
29510 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b  SF_Distinct)!=0;
29520 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
29530 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
29540 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20 74 68  ELECT.  /* If th
29550 65 72 65 20 69 73 20 61 72 65 20 61 20 73 65 71  ere is are a seq
29560 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73  uence of queries
29570 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72  , do the earlier
29580 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a   ones first..  *
29590 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
295a0 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75  r ){.    rc = mu
295b0 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65  ltiSelect(pParse
295c0 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20  , p, pDest);.   
295d0 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
295e0 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  er(pParse->iSele
295f0 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65  ctId, iRestoreSe
29600 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 72 65 74  lectId);.    ret
29610 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64  urn rc;.  }.#end
29620 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  if..  /* If the 
29630 71 75 65 72 79 20 69 73 20 44 49 53 54 49 4e 43  query is DISTINC
29640 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20  T with an ORDER 
29650 42 59 20 62 75 74 20 69 73 20 6e 6f 74 20 61 6e  BY but is not an
29660 20 61 67 67 72 65 67 61 74 65 2c 20 61 6e 64 20   aggregate, and 
29670 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 73 65 6c  .  ** if the sel
29680 65 63 74 2d 6c 69 73 74 20 69 73 20 74 68 65 20  ect-list is the 
29690 73 61 6d 65 20 61 73 20 74 68 65 20 4f 52 44 45  same as the ORDE
296a0 52 20 42 59 20 6c 69 73 74 2c 20 74 68 65 6e 20  R BY list, then 
296b0 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2a 20  this query.  ** 
296c0 63 61 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e  can be rewritten
296d0 20 61 73 20 61 20 47 52 4f 55 50 20 42 59 2e 20   as a GROUP BY. 
296e0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
296f0 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this:.  **.  ** 
29700 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49      SELECT DISTI
29710 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e  NCT xyz FROM ...
29720 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20   ORDER BY xyz.  
29730 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e 73  **.  ** is trans
29740 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a  formed to:.  **.
29750 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
29760 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f  xyz FROM ... GRO
29770 55 50 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20  UP BY xyz.  **. 
29780 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66   ** The second f
29790 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72 65 64  orm is preferred
297a0 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64   as a single ind
297b0 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c  ex (or temp-tabl
297c0 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20  e) may be .  ** 
297d0 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68  used for both th
297e0 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 44  e ORDER BY and D
297f0 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69  ISTINCT processi
29800 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c  ng. As originall
29810 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20  y .  ** written 
29820 74 68 65 20 71 75 65 72 79 20 6d 75 73 74 20 75  the query must u
29830 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20  se a temp-table 
29840 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  for at least one
29850 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a 20   of the ORDER . 
29860 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54 49   ** BY and DISTI
29870 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65  NCT, and an inde
29880 78 20 6f 72 20 73 65 70 61 72 61 74 65 20 74 65  x or separate te
29890 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68 65  mp-table for the
298a0 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69   other..  */.  i
298b0 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
298c0 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
298d0 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
298e0 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20 26  F_Distinct .   &
298f0 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  & sqlite3ExprLis
29900 74 43 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e 70  tCompare(sSort.p
29910 4f 72 64 65 72 42 79 2c 20 70 2d 3e 70 45 4c 69  OrderBy, p->pELi
29920 73 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a  st, -1)==0.  ){.
29930 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
29940 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b  &= ~SF_Distinct;
29950 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79  .    p->pGroupBy
29960 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
29970 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c  stDup(db, p->pEL
29980 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 70 47 72  ist, 0);.    pGr
29990 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
299a0 70 42 79 3b 0a 20 20 20 20 73 53 6f 72 74 2e 70  pBy;.    sSort.p
299b0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
299c0 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20   /* Notice that 
299d0 65 76 65 6e 20 74 68 6f 75 67 68 74 20 53 46 5f  even thought SF_
299e0 44 69 73 74 69 6e 63 74 20 68 61 73 20 62 65 65  Distinct has bee
299f0 6e 20 63 6c 65 61 72 65 64 20 66 72 6f 6d 20 70  n cleared from p
29a00 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20  ->selFlags,.    
29a10 2a 2a 20 74 68 65 20 73 44 69 73 74 69 6e 63 74  ** the sDistinct
29a20 2e 69 73 54 6e 63 74 20 69 73 20 73 74 69 6c 6c  .isTnct is still
29a30 20 73 65 74 2e 20 20 48 65 6e 63 65 2c 20 69 73   set.  Hence, is
29a40 54 6e 63 74 20 72 65 70 72 65 73 65 6e 74 73 20  Tnct represents 
29a50 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67 69  the.    ** origi
29a60 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f 66 20 74  nal setting of t
29a70 68 65 20 53 46 5f 44 69 73 74 69 6e 63 74 20 66  he SF_Distinct f
29a80 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20 63 75 72  lag, not the cur
29a90 72 65 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f 0a  rent setting */.
29aa0 20 20 20 20 61 73 73 65 72 74 28 20 73 44 69 73      assert( sDis
29ab0 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b 0a  tinct.isTnct );.
29ac0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
29ad0 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
29ae0 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74  Y clause, then t
29af0 68 69 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a 2a  his sorting.  **
29b00 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64   index might end
29b10 20 75 70 20 62 65 69 6e 67 20 75 6e 75 73 65 64   up being unused
29b20 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e   if the data can
29b30 20 62 65 20 0a 20 20 2a 2a 20 65 78 74 72 61 63   be .  ** extrac
29b40 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65  ted in pre-sorte
29b50 64 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68 61  d order.  If tha
29b60 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  t is the case, t
29b70 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f  hen the.  ** OP_
29b80 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
29b90 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62  struction will b
29ba0 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20  e changed to an 
29bb0 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a  OP_Noop once.  *
29bc0 2a 20 77 65 20 66 69 67 75 72 65 20 6f 75 74 20  * we figure out 
29bd0 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67  that the sorting
29be0 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e 65   index is not ne
29bf0 65 64 65 64 2e 20 20 54 68 65 20 61 64 64 72 53  eded.  The addrS
29c00 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61  ortIndex.  ** va
29c10 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
29c20 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 68 61  o facilitate tha
29c30 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20  t change..  */. 
29c40 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65   if( sSort.pOrde
29c50 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  rBy ){.    KeyIn
29c60 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
29c70 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
29c80 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
29c90 28 70 50 61 72 73 65 2c 20 73 53 6f 72 74 2e 70  (pParse, sSort.p
29ca0 4f 72 64 65 72 42 79 2c 20 30 2c 20 30 29 3b 0a  OrderBy, 0, 0);.
29cb0 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73      sSort.iECurs
29cc0 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
29cd0 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e 61  b++;.    sSort.a
29ce0 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20  ddrSortIndex =. 
29cf0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
29d00 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
29d10 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20  nEphemeral,.    
29d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d30 20 20 20 20 20 20 20 73 53 6f 72 74 2e 69 45 43         sSort.iEC
29d40 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72  ursor, sSort.pOr
29d50 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20  derBy->nExpr+2, 
29d60 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
29d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
29d80 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
29d90 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 7d 65  4_KEYINFO);.  }e
29da0 6c 73 65 7b 0a 20 20 20 20 73 53 6f 72 74 2e 61  lse{.    sSort.a
29db0 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d  ddrSortIndex = -
29dc0 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
29dd0 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64 65  the output is de
29de0 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d  stined for a tem
29df0 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70  porary table, op
29e00 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20  en that table.. 
29e10 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d   */.  if( pDest-
29e20 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65  >eDest==SRT_Ephe
29e30 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  mTab ){.    sqli
29e40 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
29e50 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
29e60 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  l, pDest->iSDPar
29e70 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  m, pEList->nExpr
29e80 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  );.  }..  /* Set
29e90 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20   the limiter..  
29ea0 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c 69  */.  iEnd = sqli
29eb0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
29ec0 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63  (v);.  p->nSelec
29ed0 74 52 6f 77 20 3d 20 4c 41 52 47 45 53 54 5f 49  tRow = LARGEST_I
29ee0 4e 54 36 34 3b 0a 20 20 63 6f 6d 70 75 74 65 4c  NT64;.  computeL
29ef0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
29f00 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a  arse, p, iEnd);.
29f10 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d    if( p->iLimit=
29f20 3d 30 20 26 26 20 73 53 6f 72 74 2e 61 64 64 72  =0 && sSort.addr
29f30 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a  SortIndex>=0 ){.
29f40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
29f50 65 74 4f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64  etOp(v, sSort.ad
29f60 64 72 53 6f 72 74 49 6e 64 65 78 29 2d 3e 6f 70  drSortIndex)->op
29f70 63 6f 64 65 20 3d 20 4f 50 5f 53 6f 72 74 65 72  code = OP_Sorter
29f80 4f 70 65 6e 3b 0a 20 20 20 20 73 53 6f 72 74 2e  Open;.    sSort.
29f90 73 6f 72 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52  sortFlags |= SOR
29fa0 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 3b  TFLAG_UseSorter;
29fb0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
29fc0 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20  a virtual index 
29fd0 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64  to use for the d
29fe0 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a  istinct set..  *
29ff0 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
2a000 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
2a010 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69 6e  t ){.    sDistin
2a020 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50 61  ct.tabTnct = pPa
2a030 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
2a040 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72 54   sDistinct.addrT
2a050 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nct = sqlite3Vdb
2a060 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
2a070 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20  enEphemeral,.   
2a080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a090 20 20 20 20 20 20 20 20 20 20 20 20 20 73 44 69               sDi
2a0a0 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20  stinct.tabTnct, 
2a0b0 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  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 28 63 68 61 72 2a 29 6b 65 79        (char*)key
2a0e0 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
2a0f0 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
2a100 73 74 2c 30 2c 30 29 2c 0a 20 20 20 20 20 20 20  st,0,0),.       
2a110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a120 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49           P4_KEYI
2a130 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  NFO);.    sqlite
2a140 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
2a150 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
2a160 29 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  );.    sDistinct
2a170 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45  .eTnctType = WHE
2a180 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52  RE_DISTINCT_UNOR
2a190 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DERED;.  }else{.
2a1a0 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54      sDistinct.eT
2a1b0 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f  nctType = WHERE_
2a1c0 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20  DISTINCT_NOOP;. 
2a1d0 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 41 67 67   }..  if( !isAgg
2a1e0 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20   && pGroupBy==0 
2a1f0 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61 67 67  ){.    /* No agg
2a200 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
2a210 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59   and no GROUP BY
2a220 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 75   clause */.    u
2a230 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20  16 wctrlFlags = 
2a240 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63  (sDistinct.isTnc
2a250 74 20 3f 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  t ? WHERE_WANT_D
2a260 49 53 54 49 4e 43 54 20 3a 20 30 29 3b 0a 0a 20  ISTINCT : 0);.. 
2a270 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20     /* Begin the 
2a280 64 61 74 61 62 61 73 65 20 73 63 61 6e 2e 20 2a  database scan. *
2a290 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73  /.    pWInfo = s
2a2a0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2a2b0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
2a2c0 74 2c 20 70 57 68 65 72 65 2c 20 73 53 6f 72 74  t, pWhere, sSort
2a2d0 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20  .pOrderBy,.     
2a2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a2f0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45 4c            p->pEL
2a300 69 73 74 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c  ist, wctrlFlags,
2a310 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49   0);.    if( pWI
2a320 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  nfo==0 ) goto se
2a330 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66  lect_end;.    if
2a340 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75  ( sqlite3WhereOu
2a350 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49  tputRowCount(pWI
2a360 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63  nfo) < p->nSelec
2a370 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 2d  tRow ){.      p-
2a380 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71  >nSelectRow = sq
2a390 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74  lite3WhereOutput
2a3a0 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29  RowCount(pWInfo)
2a3b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2a3c0 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
2a3d0 20 26 26 20 73 71 6c 69 74 65 33 57 68 65 72 65   && sqlite3Where
2a3e0 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66  IsDistinct(pWInf
2a3f0 6f 29 20 29 7b 0a 20 20 20 20 20 20 73 44 69 73  o) ){.      sDis
2a400 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20  tinct.eTnctType 
2a410 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  = sqlite3WhereIs
2a420 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29  Distinct(pWInfo)
2a430 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2a440 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29  sSort.pOrderBy )
2a450 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f  {.      sSort.nO
2a460 42 53 61 74 20 3d 20 73 71 6c 69 74 65 33 57 68  BSat = sqlite3Wh
2a470 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49  ereIsOrdered(pWI
2a480 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nfo);.      if( 
2a490 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d 73 53  sSort.nOBSat==sS
2a4a0 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ort.pOrderBy->nE
2a4b0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  xpr ){.        s
2a4c0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
2a4d0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
2a4e0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74  ..    /* If sort
2a4f0 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77  ing index that w
2a500 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20  as created by a 
2a510 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68  prior OP_OpenEph
2a520 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69  emeral .    ** i
2a530 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64  nstruction ended
2a540 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65   up not being ne
2a550 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67  eded, then chang
2a560 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  e the OP_OpenEph
2a570 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e  emeral.    ** in
2a580 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20  to an OP_Noop.. 
2a590 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 53     */.    if( sS
2a5a0 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
2a5b0 78 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e 70 4f  x>=0 && sSort.pO
2a5c0 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
2a5d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2a5e0 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53  angeToNoop(v, sS
2a5f0 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
2a600 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  x);.    }..    /
2a610 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61  * Use the standa
2a620 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a  rd inner loop. *
2a630 2f 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65  /.    selectInne
2a640 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
2a650 20 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26 73 53   pEList, -1, &sS
2a660 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63 74 2c  ort, &sDistinct,
2a670 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   pDest,.        
2a680 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2a690 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75 65  te3WhereContinue
2a6a0 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20  Label(pWInfo),. 
2a6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6c0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42     sqlite3WhereB
2a6d0 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f  reakLabel(pWInfo
2a6e0 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20  ));..    /* End 
2a6f0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
2a700 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
2a710 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
2a720 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65  nd(pWInfo);.  }e
2a730 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  lse{.    /* This
2a740 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 72 65   case when there
2a750 20 65 78 69 73 74 20 61 67 67 72 65 67 61 74 65   exist aggregate
2a760 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20   functions or a 
2a770 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a  GROUP BY clause.
2a780 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a      ** or both *
2a790 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78  /.    NameContex
2a7a0 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d  t sNC;    /* Nam
2a7b0 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72  e context for pr
2a7c0 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61  ocessing aggrega
2a7d0 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  te information *
2a7e0 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b  /.    int iAMem;
2a7f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
2a800 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66  st Mem address f
2a810 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65  or storing curre
2a820 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20  nt GROUP BY */. 
2a830 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20     int iBMem;   
2a840 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
2a850 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20  Mem address for 
2a860 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42  previous GROUP B
2a870 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73  Y */.    int iUs
2a880 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20  eFlag;       /* 
2a890 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64  Mem address hold
2a8a0 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74  ing flag indicat
2a8b0 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61 73  ing that at leas
2a8c0 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
2a8d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65            ** one
2a8e0 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75   row of the inpu
2a8f0 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61  t to the aggrega
2a900 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20  tor has been.   
2a910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a920 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
2a930 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62  d */.    int iAb
2a940 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20  ortFlag;     /* 
2a950 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69 63  Mem address whic
2a960 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20 61  h causes query a
2a970 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76 65  bort if positive
2a980 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75   */.    int grou
2a990 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52  pBySort;    /* R
2a9a0 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f  ows come from so
2a9b0 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59  urce in GROUP BY
2a9c0 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e   order */.    in
2a9d0 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20  t addrEnd;      
2a9e0 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63    /* End of proc
2a9f0 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20  essing for this 
2aa00 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e  SELECT */.    in
2aa10 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20  t sortPTab = 0; 
2aa20 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65    /* Pseudotable
2aa30 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20   used to decode 
2aa40 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20  sorting results 
2aa50 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f  */.    int sortO
2aa60 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75  ut = 0;    /* Ou
2aa70 74 70 75 74 20 72 65 67 69 73 74 65 72 20 66 72  tput register fr
2aa80 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f  om the sorter */
2aa90 0a 20 20 20 20 69 6e 74 20 6f 72 64 65 72 42 79  .    int orderBy
2aaa0 47 72 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65  Grp = 0; /* True
2aab0 20 69 66 20 74 68 65 20 47 52 4f 55 50 20 42 59   if the GROUP BY
2aac0 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 61 72   and ORDER BY ar
2aad0 65 20 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a 20  e the same */.. 
2aae0 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79     /* Remove any
2aaf0 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73   and all aliases
2ab00 20 62 65 74 77 65 65 6e 20 74 68 65 20 72 65 73   between the res
2ab10 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a  ult set and the.
2ab20 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20      ** GROUP BY 
2ab30 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  clause..    */. 
2ab40 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
2ab50 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20  ){.      int k; 
2ab60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab70 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2ab80 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
2ab90 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
2aba0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a  item *pItem;  /*
2abb0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
2abc0 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  r expression in 
2abd0 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20  a list */..     
2abe0 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74   for(k=p->pEList
2abf0 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
2ac00 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30  ->pEList->a; k>0
2ac10 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; k--, pItem++){
2ac20 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  .        pItem->
2ac30 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a  u.x.iAlias = 0;.
2ac40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
2ac50 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45  r(k=pGroupBy->nE
2ac60 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75  xpr, pItem=pGrou
2ac70 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d  pBy->a; k>0; k--
2ac80 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
2ac90 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69      pItem->u.x.i
2aca0 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20  Alias = 0;.     
2acb0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
2acc0 6e 53 65 6c 65 63 74 52 6f 77 3e 31 30 30 20 29  nSelectRow>100 )
2acd0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
2ace0 20 31 30 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   100;.    }else{
2acf0 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  .      p->nSelec
2ad00 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  tRow = 1;.    }.
2ad10 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
2ad20 65 20 69 73 20 62 6f 74 68 20 61 20 47 52 4f 55  e is both a GROU
2ad30 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52 44 45  P BY and an ORDE
2ad40 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20  R BY clause and 
2ad50 74 68 65 79 20 61 72 65 0a 20 20 20 20 2a 2a 20  they are.    ** 
2ad60 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e 20  identical, then 
2ad70 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73 69 62  it may be possib
2ad80 6c 65 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68  le to disable th
2ad90 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2ada0 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  e .    ** on the
2adb0 20 67 72 6f 75 6e 64 73 20 74 68 61 74 20 74 68   grounds that th
2adc0 65 20 47 52 4f 55 50 20 42 59 20 77 69 6c 6c 20  e GROUP BY will 
2add0 63 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 20 74  cause elements t
2ade0 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20 20 20 20  o come out .    
2adf0 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63  ** in the correc
2ae00 74 20 6f 72 64 65 72 2e 20 49 74 20 61 6c 73 6f  t order. It also
2ae10 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68 65 20 47   may not - the G
2ae20 52 4f 55 50 20 42 59 20 6d 61 79 20 75 73 65 20  ROUP BY may use 
2ae30 61 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  a.    ** databas
2ae40 65 20 69 6e 64 65 78 20 74 68 61 74 20 63 61 75  e index that cau
2ae50 73 65 73 20 72 6f 77 73 20 74 6f 20 62 65 20 67  ses rows to be g
2ae60 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 20  rouped together 
2ae70 61 73 20 72 65 71 75 69 72 65 64 0a 20 20 20 20  as required.    
2ae80 2a 2a 20 62 75 74 20 6e 6f 74 20 61 63 74 75 61  ** but not actua
2ae90 6c 6c 79 20 73 6f 72 74 65 64 2e 20 45 69 74 68  lly sorted. Eith
2aea0 65 72 20 77 61 79 2c 20 72 65 63 6f 72 64 20 74  er way, record t
2aeb0 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65  he fact that the
2aec0 0a 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59  .    ** ORDER BY
2aed0 20 61 6e 64 20 47 52 4f 55 50 20 42 59 20 63 6c   and GROUP BY cl
2aee0 61 75 73 65 73 20 61 72 65 20 74 68 65 20 73 61  auses are the sa
2aef0 6d 65 20 62 79 20 73 65 74 74 69 6e 67 20 74 68  me by setting th
2af00 65 20 6f 72 64 65 72 42 79 47 72 70 0a 20 20 20  e orderByGrp.   
2af10 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20 20 2a   ** variable.  *
2af20 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
2af30 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
2af40 28 70 47 72 6f 75 70 42 79 2c 20 73 53 6f 72 74  (pGroupBy, sSort
2af50 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29 3d 3d  .pOrderBy, -1)==
2af60 30 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72  0 ){.      order
2af70 42 79 47 72 70 20 3d 20 31 3b 0a 20 20 20 20 7d  ByGrp = 1;.    }
2af80 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  . .    /* Create
2af90 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70   a label to jump
2afa0 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e 74   to when we want
2afb0 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71 75   to abort the qu
2afc0 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72 45  ery */.    addrE
2afd0 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
2afe0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
2aff0 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b     /* Convert TK
2b000 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e  _COLUMN nodes in
2b010 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  to TK_AGG_COLUMN
2b020 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65   and make entrie
2b030 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67  s in.    ** sAgg
2b040 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f  Info for all TK_
2b050 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64  AGG_FUNCTION nod
2b060 65 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  es in expression
2b070 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  s of the.    ** 
2b080 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2b090 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d  ..    */.    mem
2b0a0 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
2b0b0 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73  eof(sNC));.    s
2b0c0 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  NC.pParse = pPar
2b0d0 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63  se;.    sNC.pSrc
2b0e0 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
2b0f0 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66  .    sNC.pAggInf
2b100 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20  o = &sAggInfo;. 
2b110 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e 52 65     sAggInfo.mnRe
2b120 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  g = pParse->nMem
2b130 2b 31 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f  +1;.    sAggInfo
2b140 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20  .nSortingColumn 
2b150 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72  = pGroupBy ? pGr
2b160 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31 20 3a  oupBy->nExpr+1 :
2b170 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f   0;.    sAggInfo
2b180 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  .pGroupBy = pGro
2b190 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65  upBy;.    sqlite
2b1a0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
2b1b0 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74  ist(&sNC, pEList
2b1c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2b1d0 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
2b1e0 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f 72  (&sNC, sSort.pOr
2b1f0 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20  derBy);.    if( 
2b200 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
2b210 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2b220 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73  yzeAggregates(&s
2b230 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20  NC, pHaving);.  
2b240 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f    }.    sAggInfo
2b250 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20  .nAccumulator = 
2b260 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
2b270 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2b280 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b  <sAggInfo.nFunc;
2b290 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   i++){.      ass
2b2a0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2b2b0 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61  perty(sAggInfo.a
2b2c0 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45  Func[i].pExpr, E
2b2d0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
2b2e0 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67        sNC.ncFlag
2b2f0 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e  s |= NC_InAggFun
2b300 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
2b310 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
2b320 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66  st(&sNC, sAggInf
2b330 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72  o.aFunc[i].pExpr
2b340 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
2b350 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d    sNC.ncFlags &=
2b360 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a   ~NC_InAggFunc;.
2b370 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e      }.    sAggIn
2b380 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72 73  fo.mxReg = pPars
2b390 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28  e->nMem;.    if(
2b3a0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2b3b0 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  d ) goto select_
2b3c0 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f  end;..    /* Pro
2b3d0 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72  cessing for aggr
2b3e0 65 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55  egates with GROU
2b3f0 50 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66  P BY is very dif
2b400 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a  ferent and.    *
2b410 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70  * much more comp
2b420 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65 67 61  lex than aggrega
2b430 74 65 73 20 77 69 74 68 6f 75 74 20 61 20 47 52  tes without a GR
2b440 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20  OUP BY..    */. 
2b450 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
2b460 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  ){.      KeyInfo
2b470 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20   *pKeyInfo;  /* 
2b480 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  Keying informati
2b490 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70  on for the group
2b4a0 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   by clause */.  
2b4b0 20 20 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20      int j1;     
2b4c0 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d          /* A-vs-
2b4d0 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75  B comparision ju
2b4e0 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  mp */.      int 
2b4f0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20  addrOutputRow;  
2b500 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62 72  /* Start of subr
2b510 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
2b520 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77  uts a result row
2b530 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
2b540 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a  gOutputRow;   /*
2b550 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   Return address 
2b560 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74  register for out
2b570 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  put subroutine *
2b580 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
2b590 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53  SetAbort;   /* S
2b5a0 65 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61  et the abort fla
2b5b0 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  g and return */.
2b5c0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f        int addrTo
2b5d0 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70  pOfLoop;  /* Top
2b5e0 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f   of the input lo
2b5f0 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  op */.      int 
2b600 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20  addrSortingIdx; 
2b610 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70  /* The OP_OpenEp
2b620 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20  hemeral for the 
2b630 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f  sorting index */
2b640 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 52  .      int addrR
2b650 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75  eset;      /* Su
2b660 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73  broutine for res
2b670 65 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  etting the accum
2b680 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  ulator */.      
2b690 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20 20  int regReset;   
2b6a0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64      /* Return ad
2b6b0 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
2b6c0 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f 75 74  or reset subrout
2b6d0 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ine */..      /*
2b6e0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 47   If there is a G
2b6f0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 77  ROUP BY clause w
2b700 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73  e might need a s
2b710 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a  orting index to.
2b720 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65        ** impleme
2b730 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65  nt it.  Allocate
2b740 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e   that sorting in
2b750 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20  dex now.  If it 
2b760 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20  turns out.      
2b770 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
2b780 74 20 6e 65 65 64 20 69 74 20 61 66 74 65 72 20  t need it after 
2b790 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74  all, the OP_Sort
2b7a0 65 72 4f 70 65 6e 20 69 6e 73 74 72 75 63 74 69  erOpen instructi
2b7b0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  on.      ** will
2b7c0 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
2b7d0 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20  to a Noop.  .   
2b7e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67     */.      sAgg
2b7f0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20  Info.sortingIdx 
2b800 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
2b810 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
2b820 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
2b830 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
2b840 47 72 6f 75 70 42 79 2c 20 30 2c 20 30 29 3b 0a  GroupBy, 0, 0);.
2b850 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e        addrSortin
2b860 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64  gIdx = sqlite3Vd
2b870 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
2b880 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20  orterOpen, .    
2b890 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
2b8a0 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49  ortingIdx, sAggI
2b8b0 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
2b8c0 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30  mn, .          0
2b8d0 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66  , (char*)pKeyInf
2b8e0 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
2b8f0 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  .      /* Initia
2b900 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  lize memory loca
2b910 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52  tions used by GR
2b920 4f 55 50 20 42 59 20 61 67 67 72 65 67 61 74 65  OUP BY aggregate
2b930 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20   processing.    
2b940 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46    */.      iUseF
2b950 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lag = ++pParse->
2b960 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f  nMem;.      iAbo
2b970 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73  rtFlag = ++pPars
2b980 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72  e->nMem;.      r
2b990 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b  egOutputRow = ++
2b9a0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2b9b0 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
2b9c0 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  w = sqlite3VdbeM
2b9d0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
2b9e0 20 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b     regReset = ++
2b9f0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2ba00 20 20 20 20 61 64 64 72 52 65 73 65 74 20 3d 20      addrReset = 
2ba10 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
2ba20 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
2ba30 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  AMem = pParse->n
2ba40 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  Mem + 1;.      p
2ba50 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
2ba60 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
2ba70 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50        iBMem = pP
2ba80 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
2ba90 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
2baa0 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e  em += pGroupBy->
2bab0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  nExpr;.      sql
2bac0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2bad0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
2bae0 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20   iAbortFlag);.  
2baf0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2bb00 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74  (v, "clear abort
2bb10 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
2bb20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2bb30 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
2bb40 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20   0, iUseFlag);. 
2bb50 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2bb60 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 61  ((v, "indicate a
2bb70 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79  ccumulator empty
2bb80 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
2bb90 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2bba0 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65  OP_Null, 0, iAMe
2bbb0 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42  m, iAMem+pGroupB
2bbc0 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20  y->nExpr-1);..  
2bbd0 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c      /* Begin a l
2bbe0 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78  oop that will ex
2bbf0 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65  tract all source
2bc00 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42   rows in GROUP B
2bc10 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a  Y order..      *
2bc20 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76  * This might inv
2bc30 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74  olve two separat
2bc40 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20  e loops with an 
2bc50 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65  OP_Sort in betwe
2bc60 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20  en, or.      ** 
2bc70 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69  it might be a si
2bc80 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75  ngle loop that u
2bc90 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ses an index to 
2bca0 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74  extract informat
2bcb0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ion.      ** in 
2bcc0 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20  the right order 
2bcd0 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20  to begin with.. 
2bce0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
2bcf0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2bd00 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
2bd10 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74  Reset, addrReset
2bd20 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20  );.      pWInfo 
2bd30 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
2bd40 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
2bd50 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 47  List, pWhere, pG
2bd60 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20 20 20  roupBy, 0,.     
2bd70 20 20 20 20 20 57 48 45 52 45 5f 47 52 4f 55 50       WHERE_GROUP
2bd80 42 59 20 7c 20 28 6f 72 64 65 72 42 79 47 72 70  BY | (orderByGrp
2bd90 20 3f 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47   ? WHERE_SORTBYG
2bda0 52 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20 20 20  ROUP : 0), 0.   
2bdb0 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20     );.      if( 
2bdc0 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
2bdd0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
2bde0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
2bdf0 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49  ereIsOrdered(pWI
2be00 6e 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79 2d 3e  nfo)==pGroupBy->
2be10 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
2be20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65   /* The optimize
2be30 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c  r is able to del
2be40 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f  iver rows in gro
2be50 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20  up by order so. 
2be60 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20         ** we do 
2be70 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74  not have to sort
2be80 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70  .  The OP_OpenEp
2be90 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69  hemeral table wi
2bea0 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  ll be.        **
2beb0 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72   cancelled later
2bec0 20 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c   because we stil
2bed0 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68  l need to use th
2bee0 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20  e pKeyInfo.     
2bef0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72     */.        gr
2bf00 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20  oupBySort = 0;. 
2bf10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2bf20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20      /* Rows are 
2bf30 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e  coming out in un
2bf40 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72  determined order
2bf50 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75  .  We have to pu
2bf60 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61  sh.        ** ea
2bf70 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f  ch row into a so
2bf80 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72  rting index, ter
2bf90 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74  minate the first
2bfa0 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a   loop,.        *
2bfb0 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72  * then loop over
2bfc0 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
2bfd0 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ex in order to g
2bfe0 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20  et the output.  
2bff0 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74        ** in sort
2c000 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20  ed order.       
2c010 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
2c020 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20  regBase;.       
2c030 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a   int regRecord;.
2c040 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c          int nCol
2c050 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47  ;.        int nG
2c060 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20  roupBy;..       
2c070 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
2c080 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
2c090 20 20 20 20 20 20 20 28 73 44 69 73 74 69 6e 63         (sDistinc
2c0a0 74 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d 3e  t.isTnct && (p->
2c0b0 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73 74  selFlags&SF_Dist
2c0c0 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20  inct)==0) ?.    
2c0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c0e0 22 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47 52  "DISTINCT" : "GR
2c0f0 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20 20  OUP BY");..     
2c100 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d     groupBySort =
2c110 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f   1;.        nGro
2c120 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d  upBy = pGroupBy-
2c130 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
2c140 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 20  nCol = nGroupBy 
2c150 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d  + 1;.        j =
2c160 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20   nGroupBy+1;.   
2c170 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2c180 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
2c190 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2c1a0 20 20 69 66 28 20 73 41 67 67 49 6e 66 6f 2e 61    if( sAggInfo.a
2c1b0 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f  Col[i].iSorterCo
2c1c0 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20  lumn>=j ){.     
2c1d0 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20         nCol++;. 
2c1e0 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a             j++;.
2c1f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c200 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
2c210 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47  gBase = sqlite3G
2c220 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
2c230 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  se, nCol);.     
2c240 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
2c250 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
2c260 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2c270 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
2c280 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  t(pParse, pGroup
2c290 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30 29 3b  By, regBase, 0);
2c2a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2c2b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2c2c0 5f 53 65 71 75 65 6e 63 65 2c 20 73 41 67 67 49  _Sequence, sAggI
2c2d0 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 72  nfo.sortingIdx,r
2c2e0 65 67 42 61 73 65 2b 6e 47 72 6f 75 70 42 79 29  egBase+nGroupBy)
2c2f0 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47  ;.        j = nG
2c300 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20  roupBy+1;.      
2c310 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
2c320 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
2c330 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
2c340 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
2c350 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49  l *pCol = &sAggI
2c360 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20  nfo.aCol[i];.   
2c370 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
2c380 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d  >iSorterColumn>=
2c390 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  j ){.           
2c3a0 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65   int r1 = j + re
2c3b0 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20  gBase;.         
2c3c0 20 20 20 69 6e 74 20 72 32 3b 0a 0a 20 20 20 20     int r2;..    
2c3d0 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c          r2 = sql
2c3e0 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
2c3f0 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 0a 20  olumn(pParse, . 
2c400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2c420 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e  ol->pTab, pCol->
2c430 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69  iColumn, pCol->i
2c440 54 61 62 6c 65 2c 20 72 31 2c 20 30 29 3b 0a 20  Table, r1, 0);. 
2c450 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
2c460 31 21 3d 72 32 20 29 7b 0a 20 20 20 20 20 20 20  1!=r2 ){.       
2c470 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2c480 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
2c490 43 6f 70 79 2c 20 72 32 2c 20 72 31 29 3b 0a 20  Copy, r2, r1);. 
2c4a0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2c4b0 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20           j++;.  
2c4c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c4d0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52    }.        regR
2c4e0 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
2c4f0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
2c500 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2c510 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2c520 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
2c530 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65  egBase, nCol, re
2c540 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
2c550 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2c560 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
2c570 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f  Insert, sAggInfo
2c580 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72 65 67  .sortingIdx, reg
2c590 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  Record);.       
2c5a0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
2c5b0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
2c5c0 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
2c5d0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
2c5e0 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
2c5f0 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c  e, regBase, nCol
2c600 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2c610 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
2c620 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67  o);.        sAgg
2c630 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 50  Info.sortingIdxP
2c640 54 61 62 20 3d 20 73 6f 72 74 50 54 61 62 20 3d  Tab = sortPTab =
2c650 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
2c660 0a 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74  .        sortOut
2c670 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
2c680 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
2c690 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2c6a0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
2c6b0 65 6e 50 73 65 75 64 6f 2c 20 73 6f 72 74 50 54  enPseudo, sortPT
2c6c0 61 62 2c 20 73 6f 72 74 4f 75 74 2c 20 6e 43 6f  ab, sortOut, nCo
2c6d0 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
2c6e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2c6f0 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20   OP_SorterSort, 
2c700 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
2c710 49 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  Idx, addrEnd);. 
2c720 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
2c730 6e 74 28 28 76 2c 20 22 47 52 4f 55 50 20 42 59  nt((v, "GROUP BY
2c740 20 73 6f 72 74 22 29 29 3b 20 56 64 62 65 43 6f   sort")); VdbeCo
2c750 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
2c760 20 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53     sAggInfo.useS
2c770 6f 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20  ortingIdx = 1;. 
2c780 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
2c790 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
2c7a0 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 7d 0a 0a  rse);..      }..
2c7b0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
2c7c0 69 6e 64 65 78 20 6f 72 20 74 65 6d 70 6f 72 61  index or tempora
2c7d0 72 79 20 74 61 62 6c 65 20 75 73 65 64 20 62 79  ry table used by
2c7e0 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 73 6f   the GROUP BY so
2c7f0 72 74 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  rt.      ** will
2c800 20 6e 61 74 75 72 61 6c 6c 79 20 64 65 6c 69 76   naturally deliv
2c810 65 72 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6f  er rows in the o
2c820 72 64 65 72 20 72 65 71 75 69 72 65 64 20 62 79  rder required by
2c830 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20   the ORDER BY.  
2c840 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 2c 20 63      ** clause, c
2c850 61 6e 63 65 6c 20 74 68 65 20 65 70 68 65 6d 65  ancel the epheme
2c860 72 61 6c 20 74 61 62 6c 65 20 6f 70 65 6e 20 63  ral table open c
2c870 6f 64 65 64 20 65 61 72 6c 69 65 72 2e 0a 20 20  oded earlier..  
2c880 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2c890 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
2c8a0 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f  ization - the co
2c8b0 72 72 65 63 74 20 61 6e 73 77 65 72 20 73 68 6f  rrect answer sho
2c8c0 75 6c 64 20 72 65 73 75 6c 74 20 72 65 67 61 72  uld result regar
2c8d0 64 6c 65 73 73 2e 0a 20 20 20 20 20 20 2a 2a 20  dless..      ** 
2c8e0 55 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f 47  Use the SQLITE_G
2c8f0 72 6f 75 70 42 79 4f 72 64 65 72 20 66 6c 61 67  roupByOrder flag
2c900 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53   with SQLITE_TES
2c910 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 45 52 20  TCTRL_OPTIMIZER 
2c920 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 64 69 73  to .      ** dis
2c930 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6d 69  able this optimi
2c940 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65 73 74 69  zation for testi
2c950 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 2a 2f  ng purposes.  */
2c960 0a 20 20 20 20 20 20 69 66 28 20 6f 72 64 65 72  .      if( order
2c970 42 79 47 72 70 20 26 26 20 4f 70 74 69 6d 69 7a  ByGrp && Optimiz
2c980 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
2c990 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f   SQLITE_GroupByO
2c9a0 72 64 65 72 29 20 0a 20 20 20 20 20 20 20 26 26  rder) .       &&
2c9b0 20 28 67 72 6f 75 70 42 79 53 6f 72 74 20 7c 7c   (groupBySort ||
2c9c0 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 53   sqlite3WhereIsS
2c9d0 6f 72 74 65 64 28 70 57 49 6e 66 6f 29 29 0a 20  orted(pWInfo)). 
2c9e0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2c9f0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
2ca00 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
2ca10 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
2ca20 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64  oop(v, sSort.add
2ca30 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20  rSortIndex);.   
2ca40 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45     }..      /* E
2ca50 76 61 6c 75 61 74 65 20 74 68 65 20 63 75 72 72  valuate the curr
2ca60 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72  ent GROUP BY ter
2ca70 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20  ms and store in 
2ca80 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20  b0, b1, b2....  
2ca90 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65      ** (b0 is me
2caa0 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42  mory location iB
2cab0 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d  Mem+0, b1 is iBM
2cac0 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72  em+1, and so for
2cad0 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  th).      ** The
2cae0 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75  n compare the cu
2caf0 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74  rrent GROUP BY t
2cb00 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65  erms against the
2cb10 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a   GROUP BY terms.
2cb20 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
2cb30 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63  e previous row c
2cb40 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
2cb50 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e  in a0, a1, a2...
2cb60 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2cb70 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20  addrTopOfLoop = 
2cb80 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2cb90 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
2cba0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
2cbb0 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
2cbc0 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42        if( groupB
2cbd0 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  ySort ){.       
2cbe0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2cbf0 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44  p2(v, OP_SorterD
2cc00 61 74 61 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ata, sAggInfo.so
2cc10 72 74 69 6e 67 49 64 78 2c 20 73 6f 72 74 4f 75  rtingIdx, sortOu
2cc20 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
2cc30 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72    for(j=0; j<pGr
2cc40 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b  oupBy->nExpr; j+
2cc50 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
2cc60 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20  groupBySort ){. 
2cc70 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2cc80 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2cc90 5f 43 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50 54 61  _Column, sortPTa
2cca0 62 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a  b, j, iBMem+j);.
2ccb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d            if( j=
2ccc0 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  =0 ) sqlite3Vdbe
2ccd0 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
2cce0 41 47 5f 43 4c 45 41 52 43 41 43 48 45 29 3b 0a  AG_CLEARCACHE);.
2ccf0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2cd00 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66           sAggInf
2cd10 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31  o.directMode = 1
2cd20 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
2cd30 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
2cd40 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  se, pGroupBy->a[
2cd50 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b  j].pExpr, iBMem+
2cd60 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  j);.        }.  
2cd70 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
2cd80 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
2cd90 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d   OP_Compare, iAM
2cda0 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75  em, iBMem, pGrou
2cdb0 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20  pBy->nExpr,.    
2cdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cdd0 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c        (char*)sql
2cde0 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70  ite3KeyInfoRef(p
2cdf0 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59  KeyInfo), P4_KEY
2ce00 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20  INFO);.      j1 
2ce10 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
2ce20 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
2ce30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2ce40 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
2ce50 20 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b   j1+1, 0, j1+1);
2ce60 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2ce70 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
2ce80 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 72  rate code that r
2ce90 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68 65  uns whenever the
2cea0 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65   GROUP BY change
2ceb0 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e  s..      ** Chan
2cec0 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50  ges in the GROUP
2ced0 20 42 59 20 61 72 65 20 64 65 74 65 63 74 65 64   BY are detected
2cee0 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
2cef0 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62   code.      ** b
2cf00 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20  lock.  If there 
2cf10 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c  were no changes,
2cf20 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73   this block is s
2cf30 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a  kipped..      **
2cf40 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63  .      ** This c
2cf50 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72 72 65  ode copies curre
2cf60 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d  nt group by term
2cf70 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e  s in b0,b1,b2,..
2cf80 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20  ..      ** over 
2cf90 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74  to a0,a1,a2.  It
2cfa0 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20   then calls the 
2cfb0 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
2cfc0 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72  e.      ** and r
2cfd0 65 73 65 74 73 20 74 68 65 20 61 67 67 72 65 67  esets the aggreg
2cfe0 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
2cff0 72 65 67 69 73 74 65 72 73 20 69 6e 20 70 72 65  registers in pre
2d000 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  paration.      *
2d010 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47  * for the next G
2d020 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20  ROUP BY batch.. 
2d030 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
2d040 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
2d050 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c  e(pParse, iBMem,
2d060 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79   iAMem, pGroupBy
2d070 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
2d080 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2d090 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
2d0a0 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64  egOutputRow, add
2d0b0 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
2d0c0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2d0d0 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72  v, "output one r
2d0e0 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ow"));.      sql
2d0f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2d100 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f  , OP_IfPos, iAbo
2d110 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29  rtFlag, addrEnd)
2d120 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
2d130 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2d140 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20  ment((v, "check 
2d150 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
2d160 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2d170 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
2d180 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64  ub, regReset, ad
2d190 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
2d1a0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2d1b0 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74  "reset accumulat
2d1c0 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
2d1d0 20 55 70 64 61 74 65 20 74 68 65 20 61 67 67 72   Update the aggr
2d1e0 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
2d1f0 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  rs based on the 
2d200 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20  content of.     
2d210 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
2d220 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  row.      */.   
2d230 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
2d240 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20  mpHere(v, j1);. 
2d250 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d       updateAccum
2d260 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
2d270 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
2d280 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2d290 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
2d2a0 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a  , 1, iUseFlag);.
2d2b0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2d2c0 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20  t((v, "indicate 
2d2d0 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61  data in accumula
2d2e0 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
2d2f0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  * End of the loo
2d300 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  p.      */.     
2d310 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
2d320 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2d330 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2d340 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20   OP_SorterNext, 
2d350 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
2d360 49 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f  Idx, addrTopOfLo
2d370 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  op);.        Vdb
2d380 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
2d390 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d3a0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
2d3b0 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
2d3c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2d3d0 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61  hangeToNoop(v, a
2d3e0 64 64 72 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a  ddrSortingIdx);.
2d3f0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
2d400 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e  * Output the fin
2d410 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74  al row of result
2d420 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2d430 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2d440 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
2d450 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64  egOutputRow, add
2d460 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
2d470 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2d480 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c  v, "output final
2d490 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20 20   row"));..      
2d4a0 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68 65  /* Jump over the
2d4b0 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20 20   subroutines.   
2d4c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
2d4d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2d4e0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
2d4f0 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  rEnd);..      /*
2d500 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
2d510 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
2d520 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  uts a single row
2d530 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20   of the result. 
2d540 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68       ** set.  Th
2d550 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69  is subroutine fi
2d560 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65  rst looks at the
2d570 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69   iUseFlag.  If i
2d580 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a  UseFlag.      **
2d590 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
2d5a0 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20   equal to zero, 
2d5b0 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69  the subroutine i
2d5c0 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20  s a no-op.  If. 
2d5d0 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63       ** the proc
2d5e0 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72  essing calls for
2d5f0 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 61 62   the query to ab
2d600 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75  ort, this subrou
2d610 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e  tine.      ** in
2d620 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62  crements the iAb
2d630 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c  ortFlag memory l
2d640 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72  ocation before r
2d650 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20  eturning in.    
2d660 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69    ** order to si
2d670 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20  gnal the caller 
2d680 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20  to abort..      
2d690 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65 74  */.      addrSet
2d6a0 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Abort = sqlite3V
2d6b0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2d6c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2d6d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2d6e0 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41 62  _Integer, 1, iAb
2d6f0 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  ortFlag);.      
2d700 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2d710 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22  "set abort flag"
2d720 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
2d730 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2d740 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74  P_Return, regOut
2d750 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 73  putRow);.      s
2d760 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
2d770 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f 75  eLabel(v, addrOu
2d780 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
2d790 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20  addrOutputRow = 
2d7a0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2d7b0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
2d7c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2d7d0 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p2(v, OP_IfPos, 
2d7e0 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75  iUseFlag, addrOu
2d7f0 74 70 75 74 52 6f 77 2b 32 29 3b 20 56 64 62 65  tputRow+2); Vdbe
2d800 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
2d810 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2d820 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73 75  v, "Groupby resu
2d830 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74  lt generator ent
2d840 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20  ry point"));.   
2d850 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2d860 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
2d870 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29  n, regOutputRow)
2d880 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65  ;.      finalize
2d890 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61  AggFunctions(pPa
2d8a0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
2d8b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2d8c0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
2d8d0 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f  , pHaving, addrO
2d8e0 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49  utputRow+1, SQLI
2d8f0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
2d900 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
2d910 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
2d920 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 2c 20   p->pEList, -1, 
2d930 26 73 53 6f 72 74 2c 0a 20 20 20 20 20 20 20 20  &sSort,.        
2d940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73                &s
2d950 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c  Distinct, pDest,
2d960 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d970 20 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75         addrOutpu
2d980 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41  tRow+1, addrSetA
2d990 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  bort);.      sql
2d9a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
2d9b0 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
2d9c0 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
2d9d0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2d9e0 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72  , "end groupby r
2d9f0 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22  esult generator"
2da00 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  ));..      /* Ge
2da10 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
2da20 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ine that will re
2da30 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79  set the group-by
2da40 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20   accumulator.   
2da50 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
2da60 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
2da70 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73 65 74  bel(v, addrReset
2da80 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41 63  );.      resetAc
2da90 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
2daa0 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
2dab0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2dac0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
2dad0 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a 20  rn, regReset);. 
2dae0 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e      .    } /* en
2daf0 64 69 66 20 70 47 72 6f 75 70 42 79 2e 20 20 42  dif pGroupBy.  B
2db00 65 67 69 6e 20 61 67 67 72 65 67 61 74 65 20 71  egin aggregate q
2db10 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 20 47  ueries without G
2db20 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20  ROUP BY: */.    
2db30 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 45 78 70  else {.      Exp
2db40 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b  rList *pDel = 0;
2db50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2db60 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a  OMIT_BTREECOUNT.
2db70 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
2db80 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  b;.      if( (pT
2db90 61 62 20 3d 20 69 73 53 69 6d 70 6c 65 43 6f 75  ab = isSimpleCou
2dba0 6e 74 28 70 2c 20 26 73 41 67 67 49 6e 66 6f 29  nt(p, &sAggInfo)
2dbb0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
2dbc0 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c 65 43 6f  /* If isSimpleCo
2dbd0 75 6e 74 28 29 20 72 65 74 75 72 6e 73 20 61 20  unt() returns a 
2dbe0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 61 62  pointer to a Tab
2dbf0 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 74 68  le structure, th
2dc00 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  en.        ** th
2dc10 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
2dc20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
2dc30 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2dc40 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 63     **   SELECT c
2dc50 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62  ount(*) FROM <tb
2dc60 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  l>.        **.  
2dc70 20 20 20 20 20 20 2a 2a 20 77 68 65 72 65 20 74        ** where t
2dc80 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
2dc90 72 65 20 72 65 74 75 72 6e 65 64 20 72 65 70 72  re returned repr
2dca0 65 73 65 6e 74 73 20 74 61 62 6c 65 20 3c 74 62  esents table <tb
2dcb0 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  l>..        **. 
2dcc0 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 73         ** This s
2dcd0 74 61 74 65 6d 65 6e 74 20 69 73 20 73 6f 20 63  tatement is so c
2dce0 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20 69 73  ommon that it is
2dcf0 20 6f 70 74 69 6d 69 7a 65 64 20 73 70 65 63 69   optimized speci
2dd00 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20 20 20  ally. The.      
2dd10 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20 69 6e    ** OP_Count in
2dd20 73 74 72 75 63 74 69 6f 6e 20 69 73 20 65 78 65  struction is exe
2dd30 63 75 74 65 64 20 65 69 74 68 65 72 20 6f 6e 20  cuted either on 
2dd40 74 68 65 20 69 6e 74 6b 65 79 20 74 61 62 6c 65  the intkey table
2dd50 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
2dd60 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
2dd70 74 61 20 66 6f 72 20 74 61 62 6c 65 20 3c 74 62  ta for table <tb
2dd80 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66 20  l> or on one of 
2dd90 69 74 73 20 69 6e 64 65 78 65 73 2e 20 49 74 0a  its indexes. It.
2dda0 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 62 65          ** is be
2ddb0 74 74 65 72 20 74 6f 20 65 78 65 63 75 74 65 20  tter to execute 
2ddc0 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64  the op on an ind
2ddd0 65 78 2c 20 61 73 20 69 6e 64 65 78 65 73 20 61  ex, as indexes a
2dde0 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20 20 20  re almost.      
2ddf0 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 70 72 65    ** always spre
2de00 61 64 20 61 63 72 6f 73 73 20 6c 65 73 73 20 70  ad across less p
2de10 61 67 65 73 20 74 68 61 6e 20 74 68 65 69 72 20  ages than their 
2de20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
2de30 62 6c 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bles..        */
2de40 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69  .        const i
2de50 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
2de60 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
2de70 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
2de80 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
2de90 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 73 72    const int iCsr
2dea0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
2deb0 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  +;     /* Cursor
2dec0 20 74 6f 20 73 63 61 6e 20 62 2d 74 72 65 65 20   to scan b-tree 
2ded0 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  */.        Index
2dee0 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
2def0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df00 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
2df10 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
2df20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
2df30 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  o = 0;          
2df40 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20       /* Keyinfo 
2df50 66 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e 64 65  for scanned inde
2df60 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64  x */.        Ind
2df70 65 78 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 20  ex *pBest = 0;  
2df80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df90 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65 78 20    /* Best index 
2dfa0 66 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a  found so far */.
2dfb0 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 6f          int iRoo
2dfc0 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 20  t = pTab->tnum; 
2dfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2dfe0 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 73 63 61  Root page of sca
2dff0 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f 0a 0a  nned b-tree */..
2e000 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
2e010 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
2e020 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
2e030 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62        sqlite3Tab
2e040 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
2e050 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
2e060 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  0, pTab->zName);
2e070 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61  ..        /* Sea
2e080 72 63 68 20 66 6f 72 20 74 68 65 20 69 6e 64 65  rch for the inde
2e090 78 20 74 68 61 74 20 68 61 73 20 74 68 65 20 6c  x that has the l
2e0a0 6f 77 65 73 74 20 73 63 61 6e 20 63 6f 73 74 2e  owest scan cost.
2e0b0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2e0c0 20 20 20 20 2a 2a 20 28 32 30 31 31 2d 30 34 2d      ** (2011-04-
2e0d0 31 35 29 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20  15) Do not do a 
2e0e0 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20 61 6e 20  full scan of an 
2e0f0 75 6e 6f 72 64 65 72 65 64 20 69 6e 64 65 78 2e  unordered index.
2e100 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2e110 20 20 20 20 2a 2a 20 28 32 30 31 33 2d 31 30 2d      ** (2013-10-
2e120 30 33 29 20 44 6f 20 6e 6f 74 20 63 6f 75 6e 74  03) Do not count
2e130 20 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e 20   the entries in 
2e140 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2e  a partial index.
2e150 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2e160 20 20 20 20 2a 2a 20 49 6e 20 70 72 61 63 74 69      ** In practi
2e170 63 65 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ce the KeyInfo s
2e180 74 72 75 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f  tructure will no
2e190 74 20 62 65 20 75 73 65 64 2e 20 49 74 20 69 73  t be used. It is
2e1a0 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20 20 20 2a   only .        *
2e1b0 2a 20 70 61 73 73 65 64 20 74 6f 20 6b 65 65 70  * passed to keep
2e1c0 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 68 61 70   OP_OpenRead hap
2e1d0 70 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  py..        */. 
2e1e0 20 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52         if( !HasR
2e1f0 6f 77 69 64 28 70 54 61 62 29 20 29 20 70 42 65  owid(pTab) ) pBe
2e200 73 74 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  st = sqlite3Prim
2e210 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
2e220 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  );.        for(p
2e230 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
2e240 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
2e250 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
2e260 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 62       if( pIdx->b
2e270 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20  Unordered==0.   
2e280 20 20 20 20 20 20 20 20 26 26 20 70 49 64 78 2d          && pIdx-
2e290 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e  >szIdxRow<pTab->
2e2a0 73 7a 54 61 62 52 6f 77 0a 20 20 20 20 20 20 20  szTabRow.       
2e2b0 20 20 20 20 26 26 20 70 49 64 78 2d 3e 70 50 61      && pIdx->pPa
2e2c0 72 74 49 64 78 57 68 65 72 65 3d 3d 30 0a 20 20  rtIdxWhere==0.  
2e2d0 20 20 20 20 20 20 20 20 20 26 26 20 28 21 70 42           && (!pB
2e2e0 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e 73 7a 49  est || pIdx->szI
2e2f0 64 78 52 6f 77 3c 70 42 65 73 74 2d 3e 73 7a 49  dxRow<pBest->szI
2e300 64 78 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20  dxRow).         
2e310 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2e320 70 42 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20  pBest = pIdx;.  
2e330 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e340 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2e350 70 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20  pBest ){.       
2e360 20 20 20 69 52 6f 6f 74 20 3d 20 70 42 65 73 74     iRoot = pBest
2e370 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20  ->tnum;.        
2e380 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
2e390 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64  ite3KeyInfoOfInd
2e3a0 65 78 28 70 50 61 72 73 65 2c 20 70 42 65 73 74  ex(pParse, pBest
2e3b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
2e3c0 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20        /* Open a 
2e3d0 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
2e3e0 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 4f 50  , execute the OP
2e3f0 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68  _Count, close th
2e400 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20  e cursor. */.   
2e410 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2e420 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
2e430 4f 70 65 6e 52 65 61 64 2c 20 69 43 73 72 2c 20  OpenRead, iCsr, 
2e440 69 52 6f 6f 74 2c 20 69 44 62 2c 20 31 29 3b 0a  iRoot, iDb, 1);.
2e450 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79          if( pKey
2e460 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
2e470 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2e480 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68  ngeP4(v, -1, (ch
2e490 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  ar *)pKeyInfo, P
2e4a0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
2e4b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
2e4c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2e4d0 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73  v, OP_Count, iCs
2e4e0 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  r, sAggInfo.aFun
2e4f0 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20  c[0].iMem);.    
2e500 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2e510 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
2e520 65 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20  e, iCsr);.      
2e530 20 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43    explainSimpleC
2e540 6f 75 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61  ount(pParse, pTa
2e550 62 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20  b, pBest);.     
2e560 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
2e570 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52   SQLITE_OMIT_BTR
2e580 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20  EECOUNT */.     
2e590 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68   {.        /* Ch
2e5a0 65 63 6b 20 69 66 20 74 68 65 20 71 75 65 72 79  eck if the query
2e5b0 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68   is of one of th
2e5c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d  e following form
2e5d0 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  s:.        **.  
2e5e0 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
2e5f0 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e  T min(x) FROM ..
2e600 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  ..        **   S
2e610 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f  ELECT max(x) FRO
2e620 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  M ....        **
2e630 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 69  .        ** If i
2e640 74 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74  t is, then ask t
2e650 68 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65  he code in where
2e660 2e 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  .c to attempt to
2e670 20 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20   sort results.  
2e680 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74        ** as if t
2e690 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44  here was an "ORD
2e6a0 45 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44  ER ON x" or "ORD
2e6b0 45 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c  ER ON x DESC" cl
2e6c0 61 75 73 65 2e 20 0a 20 20 20 20 20 20 20 20 2a  ause. .        *
2e6d0 2a 20 49 66 20 77 68 65 72 65 2e 63 20 69 73 20  * If where.c is 
2e6e0 61 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20  able to produce 
2e6f0 72 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69  results sorted i
2e700 6e 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68  n this order, th
2e710 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64  en.        ** ad
2e720 64 20 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62  d vdbe code to b
2e730 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
2e740 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20  processing loop 
2e750 61 66 74 65 72 20 74 68 65 20 0a 20 20 20 20 20  after the .     
2e760 20 20 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72     ** first iter
2e770 61 74 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65  ation (since the
2e780 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
2e790 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20   of the loop is 
2e7a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72  .        ** guar
2e7b0 61 6e 74 65 65 64 20 74 6f 20 6f 70 65 72 61 74  anteed to operat
2e7c0 65 20 6f 6e 20 74 68 65 20 72 6f 77 20 77 69 74  e on the row wit
2e7d0 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72  h the minimum or
2e7e0 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20 20 20   maximum .      
2e7f0 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c    ** value of x,
2e800 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65   the only row re
2e810 71 75 69 72 65 64 29 2e 0a 20 20 20 20 20 20 20  quired)..       
2e820 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41   **.        ** A
2e830 20 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75   special flag mu
2e840 73 74 20 62 65 20 70 61 73 73 65 64 20 74 6f 20  st be passed to 
2e850 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2e860 6e 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a  n() to slightly.
2e870 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66          ** modif
2e880 79 20 62 65 68 61 76 69 6f 72 20 61 73 20 66 6f  y behavior as fo
2e890 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20 20 2a  llows:.        *
2e8a0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b  *.        **   +
2e8b0 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73   If the query is
2e8c0 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78   a "SELECT min(x
2e8d0 29 22 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f  )", then the loo
2e8e0 70 20 63 6f 64 65 64 20 62 79 0a 20 20 20 20 20  p coded by.     
2e8f0 20 20 20 2a 2a 20 20 20 20 20 77 68 65 72 65 2e     **     where.
2e900 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65  c should not ite
2e910 72 61 74 65 20 6f 76 65 72 20 61 6e 79 20 76 61  rate over any va
2e920 6c 75 65 73 20 77 69 74 68 20 61 20 4e 55 4c 4c  lues with a NULL
2e930 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a   value.        *
2e940 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a 20 20 20  *     for x..   
2e950 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2e960 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70 74 69 6d  **   + The optim
2e970 69 7a 65 72 20 63 6f 64 65 20 69 6e 20 77 68 65  izer code in whe
2e980 72 65 2e 63 20 28 74 68 65 20 74 68 69 6e 67 20  re.c (the thing 
2e990 74 68 61 74 20 64 65 63 69 64 65 73 20 77 68 69  that decides whi
2e9a0 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ch.        **   
2e9b0 20 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69 63    index or indic
2e9c0 65 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c  es to use) shoul
2e9d0 64 20 70 6c 61 63 65 20 61 20 64 69 66 66 65 72  d place a differ
2e9e0 65 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e 20  ent priority on 
2e9f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
2ea00 73 61 74 69 73 66 79 69 6e 67 20 74 68 65 20 27  satisfying the '
2ea10 4f 52 44 45 52 20 42 59 27 20 63 6c 61 75 73 65  ORDER BY' clause
2ea20 20 74 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e   than it does in
2ea30 20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20   other cases..  
2ea40 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65 66        **     Ref
2ea50 65 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63  er to code and c
2ea60 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72 65  omments in where
2ea70 2e 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  .c for details..
2ea80 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2ea90 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69     ExprList *pMi
2eaa0 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  nMax = 0;.      
2eab0 20 20 75 38 20 66 6c 61 67 20 3d 20 57 48 45 52    u8 flag = WHER
2eac0 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
2ead0 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  ;.        .     
2eae0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47     assert( p->pG
2eaf0 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20  roupBy==0 );.   
2eb00 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61       assert( fla
2eb10 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  g==0 );.        
2eb20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d  if( p->pHaving==
2eb30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  0 ){.          f
2eb40 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72  lag = minMaxQuer
2eb50 79 28 26 73 41 67 67 49 6e 66 6f 2c 20 26 70 4d  y(&sAggInfo, &pM
2eb60 69 6e 4d 61 78 29 3b 0a 20 20 20 20 20 20 20 20  inMax);.        
2eb70 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
2eb80 28 20 66 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 4d  ( flag==0 || (pM
2eb90 69 6e 4d 61 78 21 3d 30 20 26 26 20 70 4d 69 6e  inMax!=0 && pMin
2eba0 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 29 20 29  Max->nExpr==1) )
2ebb0 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  ;..        if( f
2ebc0 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lag ){.         
2ebd0 20 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74   pMinMax = sqlit
2ebe0 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
2ebf0 2c 20 70 4d 69 6e 4d 61 78 2c 20 30 29 3b 0a 20  , pMinMax, 0);. 
2ec00 20 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20           pDel = 
2ec10 70 4d 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20  pMinMax;.       
2ec20 20 20 20 69 66 28 20 70 4d 69 6e 4d 61 78 20 26     if( pMinMax &
2ec30 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
2ec40 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  led ){.         
2ec50 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d     pMinMax->a[0]
2ec60 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61  .sortOrder = fla
2ec70 67 21 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59  g!=WHERE_ORDERBY
2ec80 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20  _MIN ?1:0;.     
2ec90 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e         pMinMax->
2eca0 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d  a[0].pExpr->op =
2ecb0 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20   TK_COLUMN;.    
2ecc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ecd0 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  }.  .        /* 
2ece0 54 68 69 73 20 63 61 73 65 20 72 75 6e 73 20 69  This case runs i
2ecf0 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
2ed00 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  has no GROUP BY 
2ed10 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20  clause.  The.   
2ed20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69       ** processi
2ed30 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c  ng is much simpl
2ed40 65 72 20 73 69 6e 63 65 20 74 68 65 72 65 20 69  er since there i
2ed50 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  s only a single 
2ed60 72 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  row.        ** o
2ed70 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20  f output..      
2ed80 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73    */.        res
2ed90 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  etAccumulator(pP
2eda0 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
2edb0 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  ;.        pWInfo
2edc0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
2edd0 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
2ede0 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70  bList, pWhere, p
2edf0 4d 69 6e 4d 61 78 2c 30 2c 66 6c 61 67 2c 30 29  MinMax,0,flag,0)
2ee00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57  ;.        if( pW
2ee10 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Info==0 ){.     
2ee20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2ee30 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
2ee40 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Del);.          
2ee50 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
2ee60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ee70 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c     updateAccumul
2ee80 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
2ee90 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ggInfo);.       
2eea0 20 61 73 73 65 72 74 28 20 70 4d 69 6e 4d 61 78   assert( pMinMax
2eeb0 3d 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e  ==0 || pMinMax->
2eec0 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20  nExpr==1 );.    
2eed0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
2eee0 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
2eef0 49 6e 66 6f 29 3e 30 20 29 7b 0a 20 20 20 20 20  Info)>0 ){.     
2ef00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ef10 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
2ef20 6f 2c 20 30 2c 20 73 71 6c 69 74 65 33 57 68 65  o, 0, sqlite3Whe
2ef30 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49  reBreakLabel(pWI
2ef40 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 20  nfo));.         
2ef50 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2ef60 20 22 25 73 28 29 20 62 79 20 69 6e 64 65 78 22   "%s() by index"
2ef70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2ef80 20 20 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f 4f    (flag==WHERE_O
2ef90 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22  RDERBY_MIN?"min"
2efa0 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20 20 20 20  :"max")));.     
2efb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
2efc0 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
2efd0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 66 69  nfo);.        fi
2efe0 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f  nalizeAggFunctio
2eff0 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  ns(pParse, &sAgg
2f000 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  Info);.      }..
2f010 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64        sSort.pOrd
2f020 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
2f030 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
2f040 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  se(pParse, pHavi
2f050 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 53 51 4c  ng, addrEnd, SQL
2f060 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
2f070 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
2f080 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
2f090 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 2c  , p->pEList, -1,
2f0a0 20 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20   0, 0, .        
2f0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44                pD
2f0c0 65 73 74 2c 20 61 64 64 72 45 6e 64 2c 20 61 64  est, addrEnd, ad
2f0d0 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 73 71  drEnd);.      sq
2f0e0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
2f0f0 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20  ete(db, pDel);. 
2f100 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2f110 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
2f120 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  (v, addrEnd);.  
2f130 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20    .  } /* endif 
2f140 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20  aggregate query 
2f150 2a 2f 0a 0a 20 20 69 66 28 20 73 44 69 73 74 69  */..  if( sDisti
2f160 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 3d 3d 57  nct.eTnctType==W
2f170 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
2f180 4f 52 44 45 52 45 44 20 29 7b 0a 20 20 20 20 65  ORDERED ){.    e
2f190 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
2f1a0 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43  pParse, "DISTINC
2f1b0 54 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  T");.  }..  /* I
2f1c0 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
2f1d0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
2f1e0 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73  hen we need to s
2f1f0 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ort the results.
2f200 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68    ** and send th
2f210 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  em to the callba
2f220 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  ck one by one.. 
2f230 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e   */.  if( sSort.
2f240 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
2f250 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
2f260 28 70 50 61 72 73 65 2c 20 73 53 6f 72 74 2e 6e  (pParse, sSort.n
2f270 4f 42 53 61 74 3e 30 20 3f 20 22 52 49 47 48 54  OBSat>0 ? "RIGHT
2f280 20 50 41 52 54 20 4f 46 20 4f 52 44 45 52 20 42   PART OF ORDER B
2f290 59 22 3a 22 4f 52 44 45 52 20 42 59 22 29 3b 0a  Y":"ORDER BY");.
2f2a0 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74      generateSort
2f2b0 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20  Tail(pParse, p, 
2f2c0 26 73 53 6f 72 74 2c 20 70 45 4c 69 73 74 2d 3e  &sSort, pEList->
2f2d0 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b 0a 20  nExpr, pDest);. 
2f2e0 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65   }..  /* Jump he
2f2f0 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20  re to skip this 
2f300 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c  query.  */.  sql
2f310 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
2f320 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a  abel(v, iEnd);..
2f330 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
2f340 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
2f350 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68   coded.   Set th
2f360 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f  e return code to
2f370 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63   0.  ** to indic
2f380 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20  ate no errors.. 
2f390 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20   */.  rc = 0;.. 
2f3a0 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70   /* Control jump
2f3b0 73 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20  s to here if an 
2f3c0 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
2f3d0 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75  ered above, or u
2f3e0 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  pon.  ** success
2f3f0 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68  ful coding of th
2f400 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73  e SELECT..  */.s
2f410 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65 78 70  elect_end:.  exp
2f420 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70  lainSetInteger(p
2f430 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
2f440 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74  , iRestoreSelect
2f450 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74  Id);..  /* Ident
2f460 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ify column names
2f470 20 69 66 20 72 65 73 75 6c 74 73 20 6f 66 20 74   if results of t
2f480 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 74 6f  he SELECT are to
2f490 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f   be output..  */
2f4a0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2f4b0 45 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e 65  E_OK && pDest->e
2f4c0 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
2f4d0 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65   ){.    generate
2f4e0 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
2f4f0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
2f500 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  List);.  }..  sq
2f510 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2f520 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a  sAggInfo.aCol);.
2f530 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2f540 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  db, sAggInfo.aFu
2f550 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  nc);.  return rc
2f560 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
2f570 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54  (SQLITE_ENABLE_T
2f580 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a 0a  REE_EXPLAIN)./*.
2f590 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68 75  ** Generate a hu
2f5a0 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 64 65 73  man-readable des
2f5b0 63 72 69 70 74 69 6f 6e 20 6f 66 20 61 20 74 68  cription of a th
2f5c0 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 2e  e Select object.
2f5d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2f5e0 65 78 70 6c 61 69 6e 4f 6e 65 53 65 6c 65 63 74  explainOneSelect
2f5f0 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53 65  (Vdbe *pVdbe, Se
2f600 6c 65 63 74 20 2a 70 29 7b 0a 20 20 73 71 6c 69  lect *p){.  sqli
2f610 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2f620 28 70 56 64 62 65 2c 20 22 53 45 4c 45 43 54 20  (pVdbe, "SELECT 
2f630 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c  ");.  if( p->sel
2f640 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
2f650 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
2f660 65 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  e) ){.    if( p-
2f670 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
2f680 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
2f690 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2f6a0 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 44 49  rintf(pVdbe, "DI
2f6b0 53 54 49 4e 43 54 20 22 29 3b 0a 20 20 20 20 7d  STINCT ");.    }
2f6c0 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  .    if( p->selF
2f6d0 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
2f6e0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ate ){.      sql
2f6f0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
2f700 66 28 70 56 64 62 65 2c 20 22 61 67 67 5f 66 6c  f(pVdbe, "agg_fl
2f710 61 67 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ag ");.    }.   
2f720 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
2f730 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20 73 71  L(pVdbe);.    sq
2f740 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2f750 74 66 28 70 56 64 62 65 2c 20 22 20 20 20 22 29  tf(pVdbe, "   ")
2f760 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
2f770 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70  xplainExprList(p
2f780 56 64 62 65 2c 20 70 2d 3e 70 45 4c 69 73 74 29  Vdbe, p->pEList)
2f790 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61  ;.  sqlite3Expla
2f7a0 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 69  inNL(pVdbe);.  i
2f7b0 66 28 20 70 2d 3e 70 53 72 63 20 26 26 20 70 2d  f( p->pSrc && p-
2f7c0 3e 70 53 72 63 2d 3e 6e 53 72 63 20 29 7b 0a 20  >pSrc->nSrc ){. 
2f7d0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 71     int i;.    sq
2f7e0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2f7f0 74 66 28 70 56 64 62 65 2c 20 22 46 52 4f 4d 20  tf(pVdbe, "FROM 
2f800 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ");.    sqlite3E
2f810 78 70 6c 61 69 6e 50 75 73 68 28 70 56 64 62 65  xplainPush(pVdbe
2f820 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
2f830 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b  i<p->pSrc->nSrc;
2f840 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
2f850 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2f860 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53   *pItem = &p->pS
2f870 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
2f880 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2f890 69 6e 74 66 28 70 56 64 62 65 2c 20 22 7b 25 64  intf(pVdbe, "{%d
2f8a0 2c 2a 7d 20 3d 20 22 2c 20 70 49 74 65 6d 2d 3e  ,*} = ", pItem->
2f8b0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
2f8c0 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  if( pItem->pSele
2f8d0 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
2f8e0 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65 6c 65  lite3ExplainSele
2f8f0 63 74 28 70 56 64 62 65 2c 20 70 49 74 65 6d 2d  ct(pVdbe, pItem-
2f900 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
2f910 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 54     if( pItem->pT
2f920 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ab ){.          
2f930 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2f940 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 28 74  intf(pVdbe, " (t
2f950 61 62 6e 61 6d 65 3d 25 73 29 22 2c 20 70 49 74  abname=%s)", pIt
2f960 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
2f970 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2f980 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65    }else if( pIte
2f990 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  m->zName ){.    
2f9a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2f9b0 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
2f9c0 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61  "%s", pItem->zNa
2f9d0 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
2f9e0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41     if( pItem->zA
2f9f0 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20  lias ){.        
2fa00 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2fa10 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 28 41  intf(pVdbe, " (A
2fa20 53 20 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e 7a  S %s)", pItem->z
2fa30 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a  Alias);.      }.
2fa40 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
2fa50 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  >jointype & JT_L
2fa60 45 46 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73  EFT ){.        s
2fa70 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2fa80 6e 74 66 28 70 56 64 62 65 2c 20 22 20 4c 45 46  ntf(pVdbe, " LEF
2fa90 54 2d 4a 4f 49 4e 22 29 3b 0a 20 20 20 20 20 20  T-JOIN");.      
2faa0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
2fab0 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b  xplainNL(pVdbe);
2fac0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2fad0 65 33 45 78 70 6c 61 69 6e 50 6f 70 28 70 56 64  e3ExplainPop(pVd
2fae0 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  be);.  }.  if( p
2faf0 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20  ->pWhere ){.    
2fb00 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2fb10 69 6e 74 66 28 70 56 64 62 65 2c 20 22 57 48 45  intf(pVdbe, "WHE
2fb20 52 45 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  RE ");.    sqlit
2fb30 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56  e3ExplainExpr(pV
2fb40 64 62 65 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b  dbe, p->pWhere);
2fb50 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2fb60 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20  ainNL(pVdbe);.  
2fb70 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75  }.  if( p->pGrou
2fb80 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pBy ){.    sqlit
2fb90 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2fba0 70 56 64 62 65 2c 20 22 47 52 4f 55 50 42 59 20  pVdbe, "GROUPBY 
2fbb0 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ");.    sqlite3E
2fbc0 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70  xplainExprList(p
2fbd0 56 64 62 65 2c 20 70 2d 3e 70 47 72 6f 75 70 42  Vdbe, p->pGroupB
2fbe0 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  y);.    sqlite3E
2fbf0 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b  xplainNL(pVdbe);
2fc00 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 48  .  }.  if( p->pH
2fc10 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 73 71 6c  aving ){.    sql
2fc20 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
2fc30 66 28 70 56 64 62 65 2c 20 22 48 41 56 49 4e 47  f(pVdbe, "HAVING
2fc40 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
2fc50 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62  ExplainExpr(pVdb
2fc60 65 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  e, p->pHaving);.
2fc70 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2fc80 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d  inNL(pVdbe);.  }
2fc90 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
2fca0 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
2fcb0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
2fcc0 56 64 62 65 2c 20 22 4f 52 44 45 52 42 59 20 22  Vdbe, "ORDERBY "
2fcd0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2fce0 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70 56  plainExprList(pV
2fcf0 64 62 65 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  dbe, p->pOrderBy
2fd00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2fd10 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a  plainNL(pVdbe);.
2fd20 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69    }.  if( p->pLi
2fd30 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
2fd40 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2fd50 70 56 64 62 65 2c 20 22 4c 49 4d 49 54 20 22 29  pVdbe, "LIMIT ")
2fd60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2fd70 6c 61 69 6e 45 78 70 72 28 70 56 64 62 65 2c 20  lainExpr(pVdbe, 
2fd80 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->pLimit);.    
2fd90 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c  sqlite3ExplainNL
2fda0 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69  (pVdbe);.  }.  i
2fdb0 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b  f( p->pOffset ){
2fdc0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2fdd0 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2fde0 20 22 4f 46 46 53 45 54 20 22 29 3b 0a 20 20 20   "OFFSET ");.   
2fdf0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
2fe00 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70 4f  xpr(pVdbe, p->pO
2fe10 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69  ffset);.    sqli
2fe20 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64  te3ExplainNL(pVd
2fe30 62 65 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20  be);.  }.}.void 
2fe40 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65  sqlite3ExplainSe
2fe50 6c 65 63 74 28 56 64 62 65 20 2a 70 56 64 62 65  lect(Vdbe *pVdbe
2fe60 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
2fe70 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
2fe80 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2fe90 69 6e 74 66 28 70 56 64 62 65 2c 20 22 28 6e 75  intf(pVdbe, "(nu
2fea0 6c 6c 2d 73 65 6c 65 63 74 29 22 29 3b 0a 20 20  ll-select)");.  
2feb0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
2fec0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75  sqlite3ExplainPu
2fed0 73 68 28 70 56 64 62 65 29 3b 0a 20 20 77 68 69  sh(pVdbe);.  whi
2fee0 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 65 78 70  le( p ){.    exp
2fef0 6c 61 69 6e 4f 6e 65 53 65 6c 65 63 74 28 70 56  lainOneSelect(pV
2ff00 64 62 65 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d  dbe, p);.    p =
2ff10 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69   p->pNext;.    i
2ff20 66 28 20 70 3d 3d 30 20 29 20 62 72 65 61 6b 3b  f( p==0 ) break;
2ff30 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2ff40 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20  ainNL(pVdbe);.  
2ff50 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2ff60 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 25  Printf(pVdbe, "%
2ff70 73 5c 6e 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61  s\n", selectOpNa
2ff80 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a  me(p->op));.  }.
2ff90 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2ffa0 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 45  Printf(pVdbe, "E
2ffb0 4e 44 22 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ND");.  sqlite3E
2ffc0 78 70 6c 61 69 6e 50 6f 70 28 70 56 64 62 65 29  xplainPop(pVdbe)
2ffd0 3b 0a 7d 0a 0a 2f 2a 20 45 6e 64 20 6f 66 20 74  ;.}../* End of t
2ffe0 68 65 20 73 74 72 75 63 74 75 72 65 20 64 65 62  he structure deb
2fff0 75 67 20 70 72 69 6e 74 69 6e 67 20 63 6f 64 65  ug printing code
30000 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
30010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2f 0a  **************/.
30050 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
30060 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
30070 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 20 2a 2f  TREE_EXPLAIN) */
30080 0a                                               .