/ Hex Artifact Content
Login

Artifact 633c56adeb382173d01016bea9e04e4dac54dfbc:


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 0a 20 20 20 20 72 65 67  ence */..    reg
4240: 50 72 65 76 4b 65 79 20 3d 20 70 50 61 72 73 65  PrevKey = pParse
4250: 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50  ->nMem+1;.    pP
4260: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 53  arse->nMem += pS
4270: 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20  ort->nOBSat;.   
4280: 20 6e 4b 65 79 20 3d 20 6e 45 78 70 72 20 2d 20   nKey = nExpr - 
4290: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 20 2b 20  pSort->nOBSat + 
42a0: 31 3b 0a 20 20 20 20 61 64 64 72 46 69 72 73 74  1;.    addrFirst
42b0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
42c0: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
42d0: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29  , regBase+nExpr)
42e0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
42f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4300: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
4310: 6f 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76 4b  ompare, regPrevK
4320: 65 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53 6f  ey, regBase, pSo
4330: 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20  rt->nOBSat);.   
4340: 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
4350: 62 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74  beGetOp(v, pSort
4360: 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  ->addrSortIndex)
4370: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20  ;.    pOp->p2 = 
4380: 6e 4b 65 79 20 2b 20 31 3b 0a 20 20 20 20 73 71  nKey + 1;.    sq
4390: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
43a0: 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29  4(v, -1, (char*)
43b0: 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
43c0: 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
43d0: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49     pOp->p4.pKeyI
43e0: 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
43f0: 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
4400: 2c 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42  , pSort->pOrderB
4410: 79 2c 20 6e 4f 42 53 61 74 2c 20 31 29 3b 0a 20  y, nOBSat, 1);. 
4420: 20 20 20 61 64 64 72 4a 6d 70 20 3d 20 73 71 6c     addrJmp = sql
4430: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
4440: 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  ddr(v);.    sqli
4450: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
4460: 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 4a 6d   OP_Jump, addrJm
4470: 70 2b 31 2c 20 30 2c 20 61 64 64 72 4a 6d 70 2b  p+1, 0, addrJmp+
4480: 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
4490: 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e  (v);.    pSort->
44a0: 6c 61 62 65 6c 42 6b 4f 75 74 20 3d 20 73 71 6c  labelBkOut = sql
44b0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
44c0: 6c 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d  l(v);.    pSort-
44d0: 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70  >regReturn = ++p
44e0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
44f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4500: 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
4510: 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e  pSort->regReturn
4520: 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  , pSort->labelBk
4530: 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Out);.    sqlite
4540: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
4550: 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70  P_ResetSorter, p
4560: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b  Sort->iECursor);
4570: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4580: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
4590: 46 69 72 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  First);.    sqli
45a0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
45b0: 20 4f 50 5f 4d 6f 76 65 2c 20 72 65 67 42 61 73   OP_Move, regBas
45c0: 65 2c 20 72 65 67 50 72 65 76 4b 65 79 2c 20 70  e, regPrevKey, p
45d0: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20  Sort->nOBSat);. 
45e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
45f0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4a 6d  mpHere(v, addrJm
4600: 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  p);.  }.  if( pS
4610: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
4620: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
4630: 74 65 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20  ter ){.    op = 
4640: 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 3b  OP_SorterInsert;
4650: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
4660: 20 3d 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 3b   = OP_IdxInsert;
4670: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
4680: 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
4690: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c  pSort->iECursor,
46a0: 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 69   regRecord);.  i
46b0: 66 28 20 6e 4f 42 53 61 74 3d 3d 30 20 29 7b 0a  f( nOBSat==0 ){.
46c0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
46d0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
46e0: 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
46f0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
4700: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
4710: 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70 72  , regBase, nExpr
4720: 2b 32 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  +2);.  }.  if( p
4730: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 29  Select->iLimit )
4740: 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c  {.    int addr1,
4750: 20 61 64 64 72 32 3b 0a 20 20 20 20 69 6e 74 20   addr2;.    int 
4760: 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69 66 28 20  iLimit;.    if( 
4770: 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74  pSelect->iOffset
4780: 20 29 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74   ){.      iLimit
4790: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66   = pSelect->iOff
47a0: 73 65 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  set+1;.    }else
47b0: 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d  {.      iLimit =
47c0: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
47d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72  ;.    }.    addr
47e0: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
47f0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65  ddOp1(v, OP_IfZe
4800: 72 6f 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64 62  ro, iLimit); Vdb
4810: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
4820: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4830: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
4840: 2c 20 69 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20  , iLimit, -1);. 
4850: 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74     addr2 = sqlit
4860: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
4870: 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 73 71  OP_Goto);.    sq
4880: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
4890: 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20  e(v, addr1);.   
48a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
48b0: 70 31 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70  p1(v, OP_Last, p
48c0: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b  Sort->iECursor);
48d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
48e0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c  AddOp1(v, OP_Del
48f0: 65 74 65 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75  ete, pSort->iECu
4900: 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  rsor);.    sqlit
4910: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
4920: 2c 20 61 64 64 72 32 29 3b 0a 20 20 7d 0a 7d 0a  , addr2);.  }.}.
4930: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20  ./*.** Add code 
4940: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
4950: 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69   OFFSET.*/.stati
4960: 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65  c void codeOffse
4970: 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  t(.  Vdbe *v,   
4980: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
4990: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
49a0: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  s VM */.  int iO
49b0: 66 66 73 65 74 2c 20 20 20 20 20 20 2f 2a 20 52  ffset,      /* R
49c0: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
49d0: 74 68 65 20 6f 66 66 73 65 74 20 63 6f 75 6e 74  the offset count
49e0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e  er */.  int iCon
49f0: 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d  tinue     /* Jum
4a00: 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74  p here to skip t
4a10: 68 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72  he current recor
4a20: 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 4f  d */.){.  if( iO
4a30: 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 69  ffset>0 ){.    i
4a40: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 73 71 6c  nt addr;.    sql
4a50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
4a60: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 69 4f 66  , OP_AddImm, iOf
4a70: 66 73 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61  fset, -1);.    a
4a80: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
4a90: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
4aa0: 4e 65 67 2c 20 69 4f 66 66 73 65 74 29 3b 20 56  Neg, iOffset); V
4ab0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
4ac0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4ad0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
4ae0: 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  , 0, iContinue);
4af0: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
4b00: 28 28 76 2c 20 22 73 6b 69 70 20 4f 46 46 53 45  ((v, "skip OFFSE
4b10: 54 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20  T records"));.  
4b20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
4b30: 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
4b40: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
4b50: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
4b60: 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  check to make su
4b70: 72 65 20 74 68 65 20 4e 20 72 65 67 69 73 74 65  re the N registe
4b80: 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 69  rs starting at i
4b90: 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69  Mem.** form a di
4ba0: 73 74 69 6e 63 74 20 65 6e 74 72 79 2e 20 20 69  stinct entry.  i
4bb0: 54 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67  Tab is a sorting
4bc0: 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64   index that hold
4bd0: 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  s previously.** 
4be0: 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  seen combination
4bf0: 73 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65  s of the N value
4c00: 73 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20  s.  A new entry 
4c10: 69 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a  is made in iTab.
4c20: 2a 2a 20 69 66 20 74 68 65 20 63 75 72 72 65 6e  ** if the curren
4c30: 74 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e  t N values are n
4c40: 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70  ew..**.** A jump
4c50: 20 74 6f 20 61 64 64 72 52 65 70 65 61 74 20 69   to addrRepeat i
4c60: 73 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4e  s made and the N
4c70: 2b 31 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f  +1 values are po
4c80: 70 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  pped from the.**
4c90: 20 73 74 61 63 6b 20 69 66 20 74 68 65 20 74 6f   stack if the to
4ca0: 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65  p N elements are
4cb0: 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a   not distinct..*
4cc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
4cd0: 64 65 44 69 73 74 69 6e 63 74 28 0a 20 20 50 61  deDistinct(.  Pa
4ce0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4cf0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
4d00: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
4d10: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
4d20: 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20   iTab,          
4d30: 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64  /* A sorting ind
4d40: 65 78 20 75 73 65 64 20 74 6f 20 74 65 73 74 20  ex used to test 
4d50: 66 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73  for distinctness
4d60: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65   */.  int addrRe
4d70: 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70  peat,    /* Jump
4d80: 20 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20   to here if not 
4d90: 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e  distinct */.  in
4da0: 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t N,            
4db0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c   /* Number of el
4dc0: 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  ements */.  int 
4dd0: 69 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 2f  iMem           /
4de0: 2a 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74 20  * First element 
4df0: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  */.){.  Vdbe *v;
4e00: 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20  .  int r1;..  v 
4e10: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
4e20: 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  .  r1 = sqlite3G
4e30: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
4e40: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
4e50: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
4e60: 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61 64 64  Found, iTab, add
4e70: 72 52 65 70 65 61 74 2c 20 69 4d 65 6d 2c 20 4e  rRepeat, iMem, N
4e80: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
4e90: 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
4ea0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
4eb0: 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20  keRecord, iMem, 
4ec0: 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  N, r1);.  sqlite
4ed0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4ee0: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61  P_IdxInsert, iTa
4ef0: 62 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  b, r1);.  sqlite
4f00: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
4f10: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a  pParse, r1);.}..
4f20: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4f30: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
4f40: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 65  ** Generate an e
4f50: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65  rror message whe
4f60: 6e 20 61 20 53 45 4c 45 43 54 20 69 73 20 75 73  n a SELECT is us
4f70: 65 64 20 77 69 74 68 69 6e 20 61 20 73 75 62 65  ed within a sube
4f80: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 28 65 78  xpression.** (ex
4f90: 61 6d 70 6c 65 3a 20 20 22 61 20 49 4e 20 28 53  ample:  "a IN (S
4fa0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62  ELECT * FROM tab
4fb0: 6c 65 29 22 29 20 62 75 74 20 69 74 20 68 61 73  le)") but it has
4fc0: 20 6d 6f 72 65 20 74 68 61 6e 20 31 20 72 65 73   more than 1 res
4fd0: 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20  ult.** column.  
4fe0: 57 65 20 64 6f 20 74 68 69 73 20 69 6e 20 61 20  We do this in a 
4ff0: 73 75 62 72 6f 75 74 69 6e 65 20 62 65 63 61 75  subroutine becau
5000: 73 65 20 74 68 65 20 65 72 72 6f 72 20 75 73 65  se the error use
5010: 64 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 69 6e  d to occur.** in
5020: 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73   multiple places
5030: 2e 20 20 28 54 68 65 20 65 72 72 6f 72 20 6f 6e  .  (The error on
5040: 6c 79 20 6f 63 63 75 72 73 20 69 6e 20 6f 6e 65  ly occurs in one
5050: 20 70 6c 61 63 65 20 6e 6f 77 2c 20 62 75 74 20   place now, but 
5060: 77 65 0a 2a 2a 20 72 65 74 61 69 6e 20 74 68 65  we.** retain the
5070: 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d   subroutine to m
5080: 69 6e 69 6d 69 7a 65 20 63 6f 64 65 20 64 69 73  inimize code dis
5090: 72 75 70 74 69 6f 6e 2e 29 0a 2a 2f 0a 73 74 61  ruption.).*/.sta
50a0: 74 69 63 20 69 6e 74 20 63 68 65 63 6b 46 6f 72  tic int checkFor
50b0: 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63  MultiColumnSelec
50c0: 74 45 72 72 6f 72 28 0a 20 20 50 61 72 73 65 20  tError(.  Parse 
50d0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
50e0: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 2e  * Parse context.
50f0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
5100: 20 2a 70 44 65 73 74 2c 20 20 20 2f 2a 20 44 65   *pDest,   /* De
5110: 73 74 69 6e 61 74 69 6f 6e 20 6f 66 20 53 45 4c  stination of SEL
5120: 45 43 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ECT results */. 
5130: 20 69 6e 74 20 6e 45 78 70 72 20 20 20 20 20 20   int nExpr      
5140: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
5150: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
5160: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 45  s returned by SE
5170: 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  LECT */.){.  int
5180: 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e   eDest = pDest->
5190: 65 44 65 73 74 3b 0a 20 20 69 66 28 20 6e 45 78  eDest;.  if( nEx
51a0: 70 72 3e 31 20 26 26 20 28 65 44 65 73 74 3d 3d  pr>1 && (eDest==
51b0: 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74  SRT_Mem || eDest
51c0: 3d 3d 53 52 54 5f 53 65 74 29 20 29 7b 0a 20 20  ==SRT_Set) ){.  
51d0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
51e0: 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20  g(pParse, "only 
51f0: 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20  a single result 
5200: 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20  allowed for ".  
5210: 20 20 20 20 20 22 61 20 53 45 4c 45 43 54 20 74       "a SELECT t
5220: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
5230: 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a  n expression");.
5240: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
5250: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
5260: 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  n 0;.  }.}.#endi
5270: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
5280: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
5290: 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  the code for the
52a0: 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69   inside of the i
52b0: 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20  nner loop.** of 
52c0: 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20  a SELECT..**.** 
52d0: 49 66 20 73 72 63 54 61 62 20 69 73 20 6e 65 67  If srcTab is neg
52e0: 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20  ative, then the 
52f0: 70 45 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f  pEList expressio
5300: 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61  ns.** are evalua
5310: 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ted in order to 
5320: 67 65 74 20 74 68 65 20 64 61 74 61 20 66 6f 72  get the data for
5330: 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20 73   this row.  If s
5340: 72 63 54 61 62 20 69 73 0a 2a 2a 20 7a 65 72 6f  rcTab is.** zero
5350: 20 6f 72 20 6d 6f 72 65 2c 20 74 68 65 6e 20 64   or more, then d
5360: 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72  ata is pulled fr
5370: 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70 45  om srcTab and pE
5380: 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c  List is used onl
5390: 79 20 0a 2a 2a 20 74 6f 20 67 65 74 20 6e 75 6d  y .** to get num
53a0: 62 65 72 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20  ber columns and 
53b0: 74 68 65 20 64 61 74 61 74 79 70 65 20 66 6f 72  the datatype for
53c0: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f   each column..*/
53d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
53e0: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20  ectInnerLoop(.  
53f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
5400: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
5410: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
5420: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
5430: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
5440: 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63  e complete selec
5450: 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  t statement bein
5460: 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70  g coded */.  Exp
5470: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
5480: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
5490: 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74  values being ext
54a0: 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  racted */.  int 
54b0: 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20  srcTab,         
54c0: 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61      /* Pull data
54d0: 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65   from this table
54e0: 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70   */.  SortCtx *p
54f0: 53 6f 72 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  Sort,         /*
5500: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e   If not NULL, in
5510: 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f  fo on how to pro
5520: 63 65 73 73 20 4f 52 44 45 52 20 42 59 20 2a 2f  cess ORDER BY */
5530: 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 2a  .  DistinctCtx *
5540: 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20 49 66  pDistinct, /* If
5550: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20   not NULL, info 
5560: 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73  on how to proces
5570: 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  s DISTINCT */.  
5580: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
5590: 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74  t,      /* How t
55a0: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
55b0: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
55c0: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
55d0: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
55e0: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
55f0: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
5600: 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20    int iBreak    
5610: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
5620: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
5630: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
5640: 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64   loop */.){.  Vd
5650: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
5660: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
5670: 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63    int hasDistinc
5680: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  t;        /* Tru
5690: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
56a0: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
56b0: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65  sent */.  int re
56c0: 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  gResult;        
56d0: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
56e0: 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67  f memory holding
56f0: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
5700: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
5710: 73 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20  st->eDest;   /* 
5720: 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f  How to dispose o
5730: 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  f results */.  i
5740: 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74  nt iParm = pDest
5750: 2d 3e 69 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69  ->iSDParm; /* Fi
5760: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
5770: 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20  disposal method 
5780: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74  */.  int nResult
5790: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
57a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
57b0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  sult columns */.
57c0: 0a 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a  .  assert( v );.
57d0: 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
57e0: 21 3d 30 20 29 3b 0a 20 20 68 61 73 44 69 73 74  !=0 );.  hasDist
57f0: 69 6e 63 74 20 3d 20 70 44 69 73 74 69 6e 63 74  inct = pDistinct
5800: 20 3f 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54   ? pDistinct->eT
5810: 6e 63 74 54 79 70 65 20 3a 20 57 48 45 52 45 5f  nctType : WHERE_
5820: 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20  DISTINCT_NOOP;. 
5830: 20 69 66 28 20 70 53 6f 72 74 20 26 26 20 70 53   if( pSort && pS
5840: 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ort->pOrderBy==0
5850: 20 29 20 70 53 6f 72 74 20 3d 20 30 3b 0a 20 20   ) pSort = 0;.  
5860: 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 26 26 20  if( pSort==0 && 
5870: 21 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a  !hasDistinct ){.
5880: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6e      assert( iCon
5890: 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20 20 20  tinue!=0 );.    
58a0: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d  codeOffset(v, p-
58b0: 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69  >iOffset, iConti
58c0: 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nue);.  }..  /* 
58d0: 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74  Pull the request
58e0: 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f  ed columns..  */
58f0: 0a 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20  .  nResultCol = 
5900: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a  pEList->nExpr;..
5910: 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64    if( pDest->iSd
5920: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 65  st==0 ){.    pDe
5930: 73 74 2d 3e 69 53 64 73 74 20 3d 20 70 50 61 72  st->iSdst = pPar
5940: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
5950: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
5960: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65  nResultCol;.  }e
5970: 6c 73 65 20 69 66 28 20 70 44 65 73 74 2d 3e 69  lse if( pDest->i
5980: 53 64 73 74 2b 6e 52 65 73 75 6c 74 43 6f 6c 20  Sdst+nResultCol 
5990: 3e 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  > pParse->nMem )
59a0: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
59b0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74   an error condit
59c0: 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 72 65 73  ion that can res
59d0: 75 6c 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ult, for example
59e0: 2c 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 0a  , when a SELECT.
59f0: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 72 69      ** on the ri
5a00: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
5a10: 20 61 6e 20 49 4e 53 45 52 54 20 63 6f 6e 74 61   an INSERT conta
5a20: 69 6e 73 20 6d 6f 72 65 20 72 65 73 75 6c 74 20  ins more result 
5a30: 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a 20 20 20  columns than.   
5a40: 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 63 6f   ** there are co
5a50: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
5a60: 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 2e 20  le on the left. 
5a70: 20 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20   The error will 
5a80: 62 65 20 63 61 75 67 68 74 0a 20 20 20 20 2a 2a  be caught.    **
5a90: 20 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c 61   and reported la
5aa0: 74 65 72 2e 20 20 42 75 74 20 77 65 20 6e 65 65  ter.  But we nee
5ab0: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 65  d to make sure e
5ac0: 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 69 73 20  nough memory is 
5ad0: 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a  allocated.    **
5ae0: 20 74 6f 20 61 76 6f 69 64 20 6f 74 68 65 72 20   to avoid other 
5af0: 73 70 75 72 69 6f 75 73 20 65 72 72 6f 72 73 20  spurious errors 
5b00: 69 6e 20 74 68 65 20 6d 65 61 6e 74 69 6d 65 2e  in the meantime.
5b10: 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   */.    pParse->
5b20: 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43  nMem += nResultC
5b30: 6f 6c 3b 0a 20 20 7d 0a 20 20 70 44 65 73 74 2d  ol;.  }.  pDest-
5b40: 3e 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c 74  >nSdst = nResult
5b50: 43 6f 6c 3b 0a 20 20 72 65 67 52 65 73 75 6c 74  Col;.  regResult
5b60: 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b   = pDest->iSdst;
5b70: 0a 20 20 69 66 28 20 73 72 63 54 61 62 3e 3d 30  .  if( srcTab>=0
5b80: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
5b90: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69   i<nResultCol; i
5ba0: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
5bb0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5bc0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61  OP_Column, srcTa
5bd0: 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b  b, i, regResult+
5be0: 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  i);.      VdbeCo
5bf0: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
5c00: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
5c10: 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  me));.    }.  }e
5c20: 6c 73 65 20 69 66 28 20 65 44 65 73 74 21 3d 53  lse if( eDest!=S
5c30: 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20 20  RT_Exists ){.   
5c40: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
5c50: 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49  nation is an EXI
5c60: 53 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73  STS(...) express
5c70: 69 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a  ion, the actual.
5c80: 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65      ** values re
5c90: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45  turned by the SE
5ca0: 4c 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71  LECT are not req
5cb0: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
5cc0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
5cd0: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
5ce0: 2c 20 70 45 4c 69 73 74 2c 20 72 65 67 52 65 73  , pEList, regRes
5cf0: 75 6c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ult,.           
5d00: 20 20 20 20 20 20 20 28 65 44 65 73 74 3d 3d 53         (eDest==S
5d10: 52 54 5f 4f 75 74 70 75 74 7c 7c 65 44 65 73 74  RT_Output||eDest
5d20: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 29  ==SRT_Coroutine)
5d30: 3f 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50  ?SQLITE_ECEL_DUP
5d40: 3a 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  :0);.  }..  /* I
5d50: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
5d60: 65 79 77 6f 72 64 20 77 61 73 20 70 72 65 73 65  eyword was prese
5d70: 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54  nt on the SELECT
5d80: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
5d90: 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61 73  and this row has
5da0: 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72   been seen befor
5db0: 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d  e, then do not m
5dc0: 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a  ake this row.  *
5dd0: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 65  * part of the re
5de0: 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sult..  */.  if(
5df0: 20 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a   hasDistinct ){.
5e00: 20 20 20 20 73 77 69 74 63 68 28 20 70 44 69 73      switch( pDis
5e10: 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65  tinct->eTnctType
5e20: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57   ){.      case W
5e30: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
5e40: 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20  DERED: {.       
5e50: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20   VdbeOp *pOp;   
5e60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c           /* No l
5e70: 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 20 4f  onger required O
5e80: 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
5e90: 74 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  tr. */.        i
5ea0: 6e 74 20 69 4a 75 6d 70 3b 20 20 20 20 20 20 20  nt iJump;       
5eb0: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64         /* Jump d
5ec0: 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20  estination */.  
5ed0: 20 20 20 20 20 20 69 6e 74 20 72 65 67 50 72 65        int regPre
5ee0: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v;            /*
5ef0: 20 50 72 65 76 69 6f 75 73 20 72 6f 77 20 63 6f   Previous row co
5f00: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20  ntent */..      
5f10: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
5f20: 61 63 65 20 66 6f 72 20 74 68 65 20 70 72 65 76  ace for the prev
5f30: 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20  ious row */.    
5f40: 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50      regPrev = pP
5f50: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
5f60: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
5f70: 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  em += nResultCol
5f80: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  ;..        /* Ch
5f90: 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e  ange the OP_Open
5fa0: 45 70 68 65 6d 65 72 61 6c 20 63 6f 64 65 64 20  Ephemeral coded 
5fb0: 65 61 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50  earlier to an OP
5fc0: 5f 4e 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a  _Null.        **
5fd0: 20 73 65 74 73 20 74 68 65 20 4d 45 4d 5f 43 6c   sets the MEM_Cl
5fe0: 65 61 72 65 64 20 62 69 74 20 6f 6e 20 74 68 65  eared bit on the
5ff0: 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
6000: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
6010: 2a 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65  * previous value
6020: 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75  .  This will cau
6030: 73 65 20 74 68 65 20 4f 50 5f 4e 65 20 62 65 6c  se the OP_Ne bel
6040: 6f 77 20 74 6f 20 61 6c 77 61 79 73 0a 20 20 20  ow to always.   
6050: 20 20 20 20 20 2a 2a 20 66 61 69 6c 20 6f 6e 20       ** fail on 
6060: 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74  the first iterat
6070: 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  ion of the loop 
6080: 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 72 73  even if the firs
6090: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77  t.        ** row
60a0: 20 69 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20   is all NULLs.. 
60b0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
60c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
60d0: 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69  ngeToNoop(v, pDi
60e0: 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74  stinct->addrTnct
60f0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 20 3d  );.        pOp =
6100: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
6110: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
6120: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
6130: 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
6140: 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20   OP_Null;.      
6150: 20 20 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20    pOp->p1 = 1;. 
6160: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d         pOp->p2 =
6170: 20 72 65 67 50 72 65 76 3b 0a 0a 20 20 20 20 20   regPrev;..     
6180: 20 20 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74     iJump = sqlit
6190: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
61a0: 72 28 76 29 20 2b 20 6e 52 65 73 75 6c 74 43 6f  r(v) + nResultCo
61b0: 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  l;.        for(i
61c0: 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c  =0; i<nResultCol
61d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
61e0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
61f0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
6200: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
6210: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
6220: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
6230: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 20   i<nResultCol-1 
6240: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
6250: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6260: 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65  (v, OP_Ne, regRe
6270: 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72  sult+i, iJump, r
6280: 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20  egPrev+i);.     
6290: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
62a0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
62b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
62c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
62d0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c  AddOp3(v, OP_Eq,
62e0: 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 43   regResult+i, iC
62f0: 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72 65 76  ontinue, regPrev
6300: 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +i);.           
6310: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
6320: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ;.           }. 
6330: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6340: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
6350: 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20  -1, (const char 
6360: 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
6370: 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20  SEQ);.          
6380: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
6390: 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55  eP5(v, SQLITE_NU
63a0: 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20 7d  LLEQ);.        }
63b0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
63c0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
63d0: 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d  entAddr(v)==iJum
63e0: 70 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  p );.        sql
63f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6400: 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 52 65  , OP_Copy, regRe
6410: 73 75 6c 74 2c 20 72 65 67 50 72 65 76 2c 20 6e  sult, regPrev, n
6420: 52 65 73 75 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20  ResultCol-1);.  
6430: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6440: 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65     }..      case
6450: 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
6460: 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20  UNIQUE: {.      
6470: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
6480: 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69  ngeToNoop(v, pDi
6490: 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74  stinct->addrTnct
64a0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
64b0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
64c0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
64d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 44 69 73      assert( pDis
64e0: 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65  tinct->eTnctType
64f0: 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  ==WHERE_DISTINCT
6500: 5f 55 4e 4f 52 44 45 52 45 44 20 29 3b 0a 20 20  _UNORDERED );.  
6510: 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e        codeDistin
6520: 63 74 28 70 50 61 72 73 65 2c 20 70 44 69 73 74  ct(pParse, pDist
6530: 69 6e 63 74 2d 3e 74 61 62 54 6e 63 74 2c 20 69  inct->tabTnct, i
6540: 43 6f 6e 74 69 6e 75 65 2c 20 6e 52 65 73 75 6c  Continue, nResul
6550: 74 43 6f 6c 2c 20 72 65 67 52 65 73 75 6c 74 29  tCol, regResult)
6560: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
6570: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6580: 20 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20     if( pSort==0 
6590: 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66 66  ){.      codeOff
65a0: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
65b0: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  t, iContinue);. 
65c0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74     }.  }..  swit
65d0: 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20  ch( eDest ){.   
65e0: 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64 65   /* In this mode
65f0: 2c 20 77 72 69 74 65 20 65 61 63 68 20 71 75 65  , write each que
6600: 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65  ry result to the
6610: 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d 70   key of the temp
6620: 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62  orary.    ** tab
6630: 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f  le iParm..    */
6640: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6650: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
6660: 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20 53 52  LECT.    case SR
6670: 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20  T_Union: {.     
6680: 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 72   int r1;.      r
6690: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
66a0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
66b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
66c0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
66d0: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
66e0: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20  lt, nResultCol, 
66f0: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
6700: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6710: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
6720: 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  arm, r1);.      
6730: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
6740: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
6750: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6760: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
6770: 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f 72 64  nstruct a record
6780: 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20   from the query 
6790: 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74  result, but inst
67a0: 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61  ead of.    ** sa
67b0: 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64  ving that record
67c0: 2c 20 75 73 65 20 69 74 20 61 73 20 61 20 6b 65  , use it as a ke
67d0: 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d  y to delete elem
67e0: 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ents from.    **
67f0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
6800: 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20  able iParm..    
6810: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
6820: 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20  Except: {.      
6830: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6840: 33 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c 65 74  3(v, OP_IdxDelet
6850: 65 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 65 73  e, iParm, regRes
6860: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  ult, nResultCol)
6870: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6880: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
6890: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
68a0: 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 20  UND_SELECT */.. 
68b0: 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
68c0: 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75  result as data u
68d0: 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65  sing a unique ke
68e0: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  y..    */.    ca
68f0: 73 65 20 53 52 54 5f 46 69 66 6f 3a 0a 20 20 20  se SRT_Fifo:.   
6900: 20 63 61 73 65 20 53 52 54 5f 44 69 73 74 46 69   case SRT_DistFi
6910: 66 6f 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  fo:.    case SRT
6920: 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65  _Table:.    case
6930: 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b   SRT_EphemTab: {
6940: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20  .      int r1 = 
6950: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
6960: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
6970: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
6980: 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20  ==SRT_Table );. 
6990: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
69a0: 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
69b0: 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ab );.      sqli
69c0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
69d0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
69e0: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
69f0: 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a 23 69 66 6e  ltCol, r1);.#ifn
6a00: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6a10: 43 54 45 0a 20 20 20 20 20 20 69 66 28 20 65 44  CTE.      if( eD
6a20: 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66  est==SRT_DistFif
6a30: 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  o ){.        /* 
6a40: 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  If the destinati
6a50: 6f 6e 20 69 73 20 44 69 73 74 46 69 66 6f 2c 20  on is DistFifo, 
6a60: 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50 61  then cursor (iPa
6a70: 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20 20  rm+1) is open.  
6a80: 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 6e 20 65        ** on an e
6a90: 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 2e 20  phemeral index. 
6aa0: 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  If the current r
6ab0: 6f 77 20 69 73 20 61 6c 72 65 61 64 79 20 70 72  ow is already pr
6ac0: 65 73 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a  esent.        **
6ad0: 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20 64   in the index, d
6ae0: 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74 20 74  o not write it t
6af0: 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 49 66  o the output. If
6b00: 20 6e 6f 74 2c 20 61 64 64 20 74 68 65 0a 20 20   not, add the.  
6b10: 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74        ** current
6b20: 20 72 6f 77 20 74 6f 20 74 68 65 20 69 6e 64 65   row to the inde
6b30: 78 20 61 6e 64 20 70 72 6f 63 65 65 64 20 77 69  x and proceed wi
6b40: 74 68 20 77 72 69 74 69 6e 67 20 69 74 20 74 6f  th writing it to
6b50: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
6b60: 6f 75 74 70 75 74 20 74 61 62 6c 65 20 61 73 20  output table as 
6b70: 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20  well.  */.      
6b80: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
6b90: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
6ba0: 64 64 72 28 76 29 20 2b 20 34 3b 0a 20 20 20 20  ddr(v) + 4;.    
6bb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6bc0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
6bd0: 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 61  ound, iParm+1, a
6be0: 64 64 72 2c 20 72 31 2c 20 30 29 3b 20 56 64 62  ddr, r1, 0); Vdb
6bf0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
6c00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6c10: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
6c20: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31  xInsert, iParm+1
6c30: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 61  , r1);.        a
6c40: 73 73 65 72 74 28 20 70 53 6f 72 74 3d 3d 30 20  ssert( pSort==0 
6c50: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
6c60: 66 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72  f.      if( pSor
6c70: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  t ){.        pus
6c80: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
6c90: 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 31  se, pSort, p, r1
6ca0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
6cb0: 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d          int r2 =
6cc0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
6cd0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
6ce0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6cf0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
6d00: 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 32 29  owid, iParm, r2)
6d10: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6d20: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6d30: 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  P_Insert, iParm,
6d40: 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20   r1, r2);.      
6d50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
6d60: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
6d70: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 20  APPEND);.       
6d80: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
6d90: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
6da0: 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
6db0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
6dc0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
6dd0: 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r1);.      break
6de0: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
6df0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
6e00: 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20  QUERY.    /* If 
6e10: 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20  we are creating 
6e20: 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78  a set for an "ex
6e30: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
6e40: 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20  .)" construct,. 
6e50: 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
6e60: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e   should be a sin
6e70: 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  gle item on the 
6e80: 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68  stack.  Write th
6e90: 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69  is.    ** item i
6ea0: 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c  nto the set tabl
6eb0: 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74  e with bogus dat
6ec0: 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  a..    */.    ca
6ed0: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
6ee0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
6ef0: 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20  ultCol==1 );.   
6f00: 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73     pDest->affSds
6f10: 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t =.            
6f20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d        sqlite3Com
6f30: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c  pareAffinity(pEL
6f40: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
6f50: 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29   pDest->affSdst)
6f60: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72  ;.      if( pSor
6f70: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
6f80: 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20  At first glance 
6f90: 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20  you would think 
6fa0: 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a  we could optimiz
6fb0: 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20  e out the.      
6fc0: 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e    ** ORDER BY in
6fd0: 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63 65   this case since
6fe0: 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e   the order of en
6ff0: 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65 74  tries in the set
7000: 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73  .        ** does
7010: 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75   not matter.  Bu
7020: 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65  t there might be
7030: 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c   a LIMIT clause,
7040: 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20   in which.      
7050: 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72    ** case the or
7060: 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20  der does matter 
7070: 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  */.        pushO
7080: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
7090: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
70a0: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65  esult);.      }e
70b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
70c0: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
70d0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
70e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
70f0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
7100: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
7110: 52 65 73 75 6c 74 2c 31 2c 72 31 2c 20 26 70 44  Result,1,r1, &pD
7120: 65 73 74 2d 3e 61 66 66 53 64 73 74 2c 20 31 29  est->affSdst, 1)
7130: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7140: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
7150: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
7160: 20 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a   regResult, 1);.
7170: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7180: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7190: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
71a0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
71b0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
71c0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
71d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
71e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
71f0: 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20    /* If any row 
7200: 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73  exist in the res
7210: 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20  ult set, record 
7220: 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62  that fact and ab
7230: 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ort..    */.    
7240: 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a  case SRT_Exists:
7250: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
7260: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7270: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61  _Integer, 1, iPa
7280: 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  rm);.      /* Th
7290: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
72a0: 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
72b0: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
72c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
72d0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
72e0: 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20  his is a scalar 
72f0: 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70  select that is p
7300: 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
7310: 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  sion, then.    *
7320: 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
7330: 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f  lts in the appro
7340: 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65  priate memory ce
7350: 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74  ll and break out
7360: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
7370: 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
7380: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
7390: 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
73a0: 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d 31  t( nResultCol==1
73b0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53   );.      if( pS
73c0: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ort ){.        p
73d0: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
73e0: 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20  arse, pSort, p, 
73f0: 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  regResult);.    
7400: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7410: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
7420: 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67  Move(pParse, reg
7430: 52 65 73 75 6c 74 2c 20 69 50 61 72 6d 2c 20 31  Result, iParm, 1
7440: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  );.        /* Th
7450: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
7460: 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20  ill jump out of 
7470: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
7480: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
7490: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
74a0: 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
74b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
74c0: 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 63 61 73  UERY */..    cas
74d0: 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a  e SRT_Coroutine:
74e0: 20 20 20 20 20 20 20 2f 2a 20 53 65 6e 64 20 64         /* Send d
74f0: 61 74 61 20 74 6f 20 61 20 63 6f 2d 72 6f 75 74  ata to a co-rout
7500: 69 6e 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ine */.    case 
7510: 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b 20 20 20  SRT_Output: {   
7520: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
7530: 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  he results */.  
7540: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
7550: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
7560: 6e 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ne );.      test
7570: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
7580: 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20  _Output );.     
7590: 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20   if( pSort ){.  
75a0: 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
75b0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
75c0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
75d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
75e0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
75f0: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
7600: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29   nResultCol, r1)
7610: 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  ;.        pushOn
7620: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
7630: 20 70 53 6f 72 74 2c 20 70 2c 20 72 31 29 3b 0a   pSort, p, r1);.
7640: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
7650: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
7660: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
7670: 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74   }else if( eDest
7680: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
7690: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
76a0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
76b0: 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d  OP_Yield, pDest-
76c0: 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  >iSDParm);.     
76d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
76e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
76f0: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
7700: 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  w, regResult, nR
7710: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
7720: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
7730: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
7740: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73  e(pParse, regRes
7750: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  ult, nResultCol)
7760: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7770: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
7780: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7790: 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20 57 72 69  T_CTE.    /* Wri
77a0: 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  te the results i
77b0: 6e 74 6f 20 61 20 70 72 69 6f 72 69 74 79 20 71  nto a priority q
77c0: 75 65 75 65 20 74 68 61 74 20 69 73 20 6f 72 64  ueue that is ord
77d0: 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 0a  er according to.
77e0: 20 20 20 20 2a 2a 20 70 44 65 73 74 2d 3e 70 4f      ** pDest->pO
77f0: 72 64 65 72 42 79 20 28 69 6e 20 70 53 4f 29 2e  rderBy (in pSO).
7800: 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d    pDest->iSDParm
7810: 20 28 69 6e 20 69 50 61 72 6d 29 20 69 73 20 74   (in iParm) is t
7820: 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20 61 6e  he cursor for an
7830: 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 77 69  .    ** index wi
7840: 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72 2b 32 20  th pSO->nExpr+2 
7850: 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69 6c 64 20  columns.  Build 
7860: 61 20 6b 65 79 20 75 73 69 6e 67 20 70 53 4f 20  a key using pSO 
7870: 66 6f 72 20 74 68 65 20 66 69 72 73 74 0a 20 20  for the first.  
7880: 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78 70 72 20    ** pSO->nExpr 
7890: 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6d 61  columns, then ma
78a0: 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b 65 79 73  ke sure all keys
78b0: 20 61 72 65 20 75 6e 69 71 75 65 20 62 79 20 61   are unique by a
78c0: 64 64 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66  dding a.    ** f
78d0: 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65 6e 63 65  inal OP_Sequence
78e0: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 6c 61   column.  The la
78f0: 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65  st column is the
7900: 20 72 65 63 6f 72 64 20 61 73 20 61 20 62 6c 6f   record as a blo
7910: 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  b..    */.    ca
7920: 73 65 20 53 52 54 5f 44 69 73 74 51 75 65 75 65  se SRT_DistQueue
7930: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 51  :.    case SRT_Q
7940: 75 65 75 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e  ueue: {.      in
7950: 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20 69 6e  t nKey;.      in
7960: 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 20 20  t r1, r2, r3;.  
7970: 20 20 20 20 69 6e 74 20 61 64 64 72 54 65 73 74      int addrTest
7980: 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78 70 72   = 0;.      Expr
7990: 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20 20 20 20  List *pSO;.     
79a0: 20 70 53 4f 20 3d 20 70 44 65 73 74 2d 3e 70 4f   pSO = pDest->pO
79b0: 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 61 73  rderBy;.      as
79c0: 73 65 72 74 28 20 70 53 4f 20 29 3b 0a 20 20 20  sert( pSO );.   
79d0: 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f 2d 3e 6e     nKey = pSO->n
79e0: 45 78 70 72 3b 0a 20 20 20 20 20 20 72 31 20 3d  Expr;.      r1 =
79f0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
7a00: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
7a10: 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65    r2 = sqlite3Ge
7a20: 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
7a30: 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20  e, nKey+2);.    
7a40: 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65 79 2b 31    r3 = r2+nKey+1
7a50: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  ;.      if( eDes
7a60: 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65  t==SRT_DistQueue
7a70: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
7a80: 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  f the destinatio
7a90: 6e 20 69 73 20 44 69 73 74 51 75 65 75 65 2c 20  n is DistQueue, 
7aa0: 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50 61  then cursor (iPa
7ab0: 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20 20  rm+1) is open.  
7ac0: 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 20 73 65        ** on a se
7ad0: 63 6f 6e 64 20 65 70 68 65 6d 65 72 61 6c 20 69  cond ephemeral i
7ae0: 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20  ndex that holds 
7af0: 61 6c 6c 20 76 61 6c 75 65 73 20 65 76 65 72 79  all values every
7b00: 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20 20 20   previously.    
7b10: 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74 6f 20      ** added to 
7b20: 74 68 65 20 71 75 65 75 65 2e 20 2a 2f 0a 20 20  the queue. */.  
7b30: 20 20 20 20 20 20 61 64 64 72 54 65 73 74 20 3d        addrTest =
7b40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7b50: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e  p4Int(v, OP_Foun
7b60: 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30 2c 20 0a  d, iParm+1, 0, .
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b90: 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75 6c          regResul
7ba0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
7bb0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
7bc0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
7bd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7be0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
7bf0: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
7c00: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
7c10: 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 69 66 28  , r3);.      if(
7c20: 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74   eDest==SRT_Dist
7c30: 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20  Queue ){.       
7c40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7c50: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
7c60: 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 33 29  rt, iParm+1, r3)
7c70: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7c80: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
7c90: 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
7ca0: 45 53 55 4c 54 29 3b 0a 20 20 20 20 20 20 7d 0a  ESULT);.      }.
7cb0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
7cc0: 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nKey; i++){.   
7cd0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7ce0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
7cf0: 70 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  py,.            
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
7d10: 67 52 65 73 75 6c 74 20 2b 20 70 53 4f 2d 3e 61  gResult + pSO->a
7d20: 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
7d30: 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20 20 20 20  Col - 1,.       
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d50: 20 20 20 72 32 2b 69 29 3b 0a 20 20 20 20 20 20     r2+i);.      
7d60: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
7d70: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7d80: 53 65 71 75 65 6e 63 65 2c 20 69 50 61 72 6d 2c  Sequence, iParm,
7d90: 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20 20 20 20   r2+nKey);.     
7da0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7db0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
7dc0: 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 2c  ord, r2, nKey+2,
7dd0: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
7de0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
7df0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
7e00: 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20  Parm, r1);.     
7e10: 20 69 66 28 20 61 64 64 72 54 65 73 74 20 29 20   if( addrTest ) 
7e20: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
7e30: 65 72 65 28 76 2c 20 61 64 64 72 54 65 73 74 29  ere(v, addrTest)
7e40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
7e50: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
7e60: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
7e70: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
7e80: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
7e90: 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20   r2, nKey+2);.  
7ea0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7eb0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
7ec0: 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 0a  E_OMIT_CTE */...
7ed0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
7ee0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
7ef0: 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72  R).    /* Discar
7f00: 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20  d the results.  
7f10: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
7f20: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
7f30: 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a  ts inside.    **
7f40: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54   the body of a T
7f50: 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75 72  RIGGER.  The pur
7f60: 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c  pose of such sel
7f70: 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a  ects is to call.
7f80: 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69      ** user-defi
7f90: 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  ned functions th
7fa0: 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66 66  at have side eff
7fb0: 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74  ects.  We do not
7fc0: 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f   care.    ** abo
7fd0: 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65  ut the actual re
7fe0: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
7ff0: 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ect..    */.    
8000: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
8010: 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d   assert( eDest==
8020: 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20  SRT_Discard );. 
8030: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8040: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  }.#endif.  }..  
8050: 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65  /* Jump to the e
8060: 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  nd of the loop i
8070: 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72  f the LIMIT is r
8080: 65 61 63 68 65 64 2e 20 20 45 78 63 65 70 74 2c  eached.  Except,
8090: 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65 20 69   if.  ** there i
80a0: 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e 20 77  s a sorter, in w
80b0: 68 69 63 68 20 63 61 73 65 20 74 68 65 20 73 6f  hich case the so
80c0: 72 74 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  rter has already
80d0: 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20 74 68   limited.  ** th
80e0: 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75 73 2e  e output for us.
80f0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 6f 72  .  */.  if( pSor
8100: 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69 6d 69  t==0 && p->iLimi
8110: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
8120: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
8130: 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d  _IfZero, p->iLim
8140: 69 74 2c 20 69 42 72 65 61 6b 2c 20 2d 31 29 3b  it, iBreak, -1);
8150: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
8160: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
8170: 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66  llocate a KeyInf
8180: 6f 20 6f 62 6a 65 63 74 20 73 75 66 66 69 63 69  o object suffici
8190: 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e 64 65 78  ent for an index
81a0: 20 6f 66 20 4e 20 6b 65 79 20 63 6f 6c 75 6d 6e   of N key column
81b0: 73 20 61 6e 64 0a 2a 2a 20 58 20 65 78 74 72 61  s and.** X extra
81c0: 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79   columns..*/.Key
81d0: 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79  Info *sqlite3Key
81e0: 49 6e 66 6f 41 6c 6c 6f 63 28 73 71 6c 69 74 65  InfoAlloc(sqlite
81f0: 33 20 2a 64 62 2c 20 69 6e 74 20 4e 2c 20 69 6e  3 *db, int N, in
8200: 74 20 58 29 7b 0a 20 20 4b 65 79 49 6e 66 6f 20  t X){.  KeyInfo 
8210: 2a 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  *p = sqlite3DbMa
8220: 6c 6c 6f 63 5a 65 72 6f 28 30 2c 20 0a 20 20 20  llocZero(0, .   
8230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8240: 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20  sizeof(KeyInfo) 
8250: 2b 20 28 4e 2b 58 29 2a 28 73 69 7a 65 6f 66 28  + (N+X)*(sizeof(
8260: 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 29 3b 0a 20  CollSeq*)+1));. 
8270: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d   if( p ){.    p-
8280: 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
8290: 38 2a 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58  8*)&p->aColl[N+X
82a0: 5d 3b 0a 20 20 20 20 70 2d 3e 6e 46 69 65 6c 64  ];.    p->nField
82b0: 20 3d 20 28 75 31 36 29 4e 3b 0a 20 20 20 20 70   = (u16)N;.    p
82c0: 2d 3e 6e 58 46 69 65 6c 64 20 3d 20 28 75 31 36  ->nXField = (u16
82d0: 29 58 3b 0a 20 20 20 20 70 2d 3e 65 6e 63 20 3d  )X;.    p->enc =
82e0: 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 2d   ENC(db);.    p-
82f0: 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d  >db = db;.    p-
8300: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 7d 65 6c  >nRef = 1;.  }el
8310: 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c  se{.    db->mall
8320: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
8330: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
8340: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
8350: 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  e a KeyInfo obje
8360: 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  ct.*/.void sqlit
8370: 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 4b  e3KeyInfoUnref(K
8380: 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66  eyInfo *p){.  if
8390: 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ( p ){.    asser
83a0: 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  t( p->nRef>0 );.
83b0: 20 20 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a 20      p->nRef--;. 
83c0: 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d     if( p->nRef==
83d0: 30 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  0 ) sqlite3DbFre
83e0: 65 28 30 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  e(0, p);.  }.}..
83f0: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 6e 65 77  /*.** Make a new
8400: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65   pointer to a Ke
8410: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a  yInfo object.*/.
8420: 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  KeyInfo *sqlite3
8430: 4b 65 79 49 6e 66 6f 52 65 66 28 4b 65 79 49 6e  KeyInfoRef(KeyIn
8440: 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  fo *p){.  if( p 
8450: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
8460: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
8470: 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20  p->nRef++;.  }. 
8480: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23 69   return p;.}..#i
8490: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
84a0: 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  G./*.** Return T
84b0: 52 55 45 20 69 66 20 61 20 4b 65 79 49 6e 66 6f  RUE if a KeyInfo
84c0: 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 20 63   object can be c
84d0: 68 61 6e 67 65 2e 20 20 54 68 65 20 4b 65 79 49  hange.  The KeyI
84e0: 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 63 61  nfo object.** ca
84f0: 6e 20 6f 6e 6c 79 20 62 65 20 63 68 61 6e 67 65  n only be change
8500: 64 20 69 66 20 74 68 69 73 20 69 73 20 6a 75 73  d if this is jus
8510: 74 20 61 20 73 69 6e 67 6c 65 20 72 65 66 65 72  t a single refer
8520: 65 6e 63 65 20 74 6f 20 74 68 65 20 6f 62 6a 65  ence to the obje
8530: 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ct..**.** This r
8540: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f  outine is used o
8550: 6e 6c 79 20 69 6e 73 69 64 65 20 6f 66 20 61 73  nly inside of as
8560: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
8570: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
8580: 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
8590: 62 6c 65 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b  ble(KeyInfo *p){
85a0: 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 66 3d   return p->nRef=
85b0: 3d 31 3b 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  =1; }.#endif /* 
85c0: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
85d0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20  ./*.** Given an 
85e0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c  expression list,
85f0: 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79 49   generate a KeyI
8600: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
8610: 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68  at records.** th
8620: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
8630: 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65 78  ence for each ex
8640: 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61 74  pression in that
8650: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
8660: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45  ..**.** If the E
8670: 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f 52  xprList is an OR
8680: 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
8690: 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74  BY clause then t
86a0: 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20  he resulting.** 
86b0: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
86c0: 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  e is appropriate
86d0: 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e   for initializin
86e0: 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65  g a virtual inde
86f0: 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  x to.** implemen
8700: 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20 20  t that clause.  
8710: 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20  If the ExprList 
8720: 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  is the result se
8730: 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a  t of a SELECT.**
8740: 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e 66   then the KeyInf
8750: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
8760: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
8770: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
8780: 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74  rtual.** index t
8790: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49  o implement a DI
87a0: 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a  STINCT test..**.
87b0: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
87c0: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
87d0: 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e  ucture is obtain
87e0: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54   from malloc.  T
87f0: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
8800: 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e  nction is respon
8810: 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67  sible for seeing
8820: 20 74 68 61 74 20 74 68 69 73 20 73 74 72 75 63   that this struc
8830: 74 75 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c  ture is eventual
8840: 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a  ly.** freed..*/.
8850: 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a  static KeyInfo *
8860: 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
8870: 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ist(.  Parse *pP
8880: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
8890: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
88a0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
88b0: 69 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d  ist,     /* Form
88c0: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a   the KeyInfo obj
88d0: 65 63 74 20 66 72 6f 6d 20 74 68 69 73 20 45 78  ect from this Ex
88e0: 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  prList */.  int 
88f0: 69 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20  iStart,         
8900: 20 2f 2a 20 42 65 67 69 6e 20 77 69 74 68 20 74   /* Begin with t
8910: 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c  his column of pL
8920: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ist */.  int nEx
8930: 74 72 61 20 20 20 20 20 20 20 20 20 20 20 2f 2a  tra           /*
8940: 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 65   Add this many e
8950: 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  xtra columns to 
8960: 74 68 65 20 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20  the end */.){.  
8970: 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79  int nExpr;.  Key
8980: 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73  Info *pInfo;.  s
8990: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
89a0: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71  tem *pItem;.  sq
89b0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
89c0: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b  se->db;.  int i;
89d0: 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c 69 73  ..  nExpr = pLis
89e0: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66  t->nExpr;.  pInf
89f0: 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
8a00: 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70  foAlloc(db, nExp
8a10: 72 2b 6e 45 78 74 72 61 2d 69 53 74 61 72 74 2c  r+nExtra-iStart,
8a20: 20 31 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f   1);.  if( pInfo
8a30: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
8a40: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
8a50: 57 72 69 74 65 61 62 6c 65 28 70 49 6e 66 6f 29  Writeable(pInfo)
8a60: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 69 53   );.    for(i=iS
8a70: 74 61 72 74 2c 20 70 49 74 65 6d 3d 70 4c 69 73  tart, pItem=pLis
8a80: 74 2d 3e 61 2b 69 53 74 61 72 74 3b 20 69 3c 6e  t->a+iStart; i<n
8a90: 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
8aa0: 2b 2b 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  ++){.      CollS
8ab0: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  eq *pColl;.     
8ac0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
8ad0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
8ae0: 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
8af0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 43  );.      if( !pC
8b00: 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  oll ) pColl = db
8b10: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
8b20: 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b     pInfo->aColl[
8b30: 69 2d 69 53 74 61 72 74 5d 20 3d 20 70 43 6f 6c  i-iStart] = pCol
8b40: 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  l;.      pInfo->
8b50: 61 53 6f 72 74 4f 72 64 65 72 5b 69 2d 69 53 74  aSortOrder[i-iSt
8b60: 61 72 74 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f  art] = pItem->so
8b70: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20  rtOrder;.    }. 
8b80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66   }.  return pInf
8b90: 6f 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  o;.}..#ifndef SQ
8ba0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
8bb0: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
8bc0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e  Name of the conn
8bd0: 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c  ection operator,
8be0: 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20   used for error 
8bf0: 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61  messages..*/.sta
8c00: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
8c10: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74  selectOpName(int
8c20: 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b   id){.  char *z;
8c30: 0a 20 20 73 77 69 74 63 68 28 20 69 64 20 29 7b  .  switch( id ){
8c40: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c  .    case TK_ALL
8c50: 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49  :       z = "UNI
8c60: 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b  ON ALL";   break
8c70: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  ;.    case TK_IN
8c80: 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e  TERSECT: z = "IN
8c90: 54 45 52 53 45 43 54 22 3b 20 20 20 62 72 65 61  TERSECT";   brea
8ca0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  k;.    case TK_E
8cb0: 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45  XCEPT:    z = "E
8cc0: 58 43 45 50 54 22 3b 20 20 20 20 20 20 62 72 65  XCEPT";      bre
8cd0: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
8ce0: 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22             z = "
8cf0: 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72  UNION";       br
8d00: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
8d10: 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n z;.}.#endif /*
8d20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
8d30: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a  POUND_SELECT */.
8d40: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8d50: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a  OMIT_EXPLAIN./*.
8d60: 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58  ** Unless an "EX
8d70: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
8d80: 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69  " command is bei
8d90: 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68  ng processed, th
8da0: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
8db0: 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72  s a no-op. Other
8dc0: 77 69 73 65 2c 20 69 74 20 61 64 64 73 20 61 20  wise, it adds a 
8dd0: 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75  single row of ou
8de0: 74 70 75 74 20 74 6f 20 74 68 65 20 45 51 50 20  tput to the EQP 
8df0: 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65  result,.** where
8e00: 20 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20   the caption is 
8e10: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
8e20: 2a 2a 20 20 20 22 55 53 45 20 54 45 4d 50 20 42  **   "USE TEMP B
8e30: 2d 54 52 45 45 20 46 4f 52 20 78 78 78 22 0a 2a  -TREE FOR xxx".*
8e40: 2a 0a 2a 2a 20 77 68 65 72 65 20 78 78 78 20 69  *.** where xxx i
8e50: 73 20 6f 6e 65 20 6f 66 20 22 44 49 53 54 49 4e  s one of "DISTIN
8e60: 43 54 22 2c 20 22 4f 52 44 45 52 20 42 59 22 20  CT", "ORDER BY" 
8e70: 6f 72 20 22 47 52 4f 55 50 20 42 59 22 2e 20 45  or "GROUP BY". E
8e80: 78 61 63 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20  xactly which.** 
8e90: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
8ea0: 20 74 68 65 20 7a 55 73 61 67 65 20 61 72 67 75   the zUsage argu
8eb0: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
8ec0: 76 6f 69 64 20 65 78 70 6c 61 69 6e 54 65 6d 70  void explainTemp
8ed0: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
8ee0: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
8ef0: 2a 7a 55 73 61 67 65 29 7b 0a 20 20 69 66 28 20  *zUsage){.  if( 
8f00: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
8f10: 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  =2 ){.    Vdbe *
8f20: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
8f30: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  e;.    char *zMs
8f40: 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
8f50: 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22  tf(pParse->db, "
8f60: 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20  USE TEMP B-TREE 
8f70: 46 4f 52 20 25 73 22 2c 20 7a 55 73 61 67 65 29  FOR %s", zUsage)
8f80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8f90: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78  eAddOp4(v, OP_Ex
8fa0: 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69  plain, pParse->i
8fb0: 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20  SelectId, 0, 0, 
8fc0: 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zMsg, P4_DYNAMIC
8fd0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
8fe0: 41 73 73 69 67 6e 20 65 78 70 72 65 73 73 69 6f  Assign expressio
8ff0: 6e 20 62 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e  n b to lvalue a.
9000: 20 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70   A second, no-op
9010: 2c 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69  , version of thi
9020: 73 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72  s macro.** is pr
9030: 6f 76 69 64 65 64 20 77 68 65 6e 20 53 51 4c 49  ovided when SQLI
9040: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
9050: 69 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73  is defined. This
9060: 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64 65   allows the code
9070: 0a 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33 53 65  .** in sqlite3Se
9080: 6c 65 63 74 28 29 20 74 6f 20 61 73 73 69 67 6e  lect() to assign
9090: 20 76 61 6c 75 65 73 20 74 6f 20 73 74 72 75 63   values to struc
90a0: 74 75 72 65 20 6d 65 6d 62 65 72 20 76 61 72 69  ture member vari
90b0: 61 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e  ables that.** on
90c0: 6c 79 20 65 78 69 73 74 20 69 66 20 53 51 4c 49  ly exist if SQLI
90d0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
90e0: 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 77  is not defined w
90f0: 69 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67  ithout polluting
9100: 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74   the.** code wit
9110: 68 20 23 69 66 6e 64 65 66 20 64 69 72 65 63 74  h #ifndef direct
9120: 69 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e  ives..*/.# defin
9130: 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65  e explainSetInte
9140: 67 65 72 28 61 2c 20 62 29 20 61 20 3d 20 62 0a  ger(a, b) a = b.
9150: 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20  .#else./* No-op 
9160: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
9170: 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e  explainXXX() fun
9180: 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f  ctions and macro
9190: 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65  s. */.# define e
91a0: 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
91b0: 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20 65 78  y,z).# define ex
91c0: 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
91d0: 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  y,z).#endif..#if
91e0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
91f0: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 26  _OMIT_EXPLAIN) &
9200: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
9210: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
9220: 53 45 4c 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e  SELECT)./*.** Un
9230: 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e  less an "EXPLAIN
9240: 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d   QUERY PLAN" com
9250: 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72  mand is being pr
9260: 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20 66 75  ocessed, this fu
9270: 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e  nction.** is a n
9280: 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  o-op. Otherwise,
9290: 20 69 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c   it adds a singl
92a0: 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20  e row of output 
92b0: 74 6f 20 74 68 65 20 45 51 50 20 72 65 73 75 6c  to the EQP resul
92c0: 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20  t,.** where the 
92d0: 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 6f 6e  caption is of on
92e0: 65 20 6f 66 20 74 68 65 20 74 77 6f 20 66 6f 72  e of the two for
92f0: 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d  ms:.**.**   "COM
9300: 50 4f 53 49 54 45 20 53 55 42 51 55 45 52 49 45  POSITE SUBQUERIE
9310: 53 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62  S iSub1 and iSub
9320: 32 20 28 6f 70 29 22 0a 2a 2a 20 20 20 22 43 4f  2 (op)".**   "CO
9330: 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45 52 49  MPOSITE SUBQUERI
9340: 45 53 20 69 53 75 62 31 20 61 6e 64 20 69 53 75  ES iSub1 and iSu
9350: 62 32 20 55 53 49 4e 47 20 54 45 4d 50 20 42 2d  b2 USING TEMP B-
9360: 54 52 45 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a  TREE (op)".**.**
9370: 20 77 68 65 72 65 20 69 53 75 62 31 20 61 6e 64   where iSub1 and
9380: 20 69 53 75 62 32 20 61 72 65 20 74 68 65 20 69   iSub2 are the i
9390: 6e 74 65 67 65 72 73 20 70 61 73 73 65 64 20 61  ntegers passed a
93a0: 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  s the correspond
93b0: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ing.** function 
93c0: 70 61 72 61 6d 65 74 65 72 73 2c 20 61 6e 64 20  parameters, and 
93d0: 6f 70 20 69 73 20 74 68 65 20 74 65 78 74 20 72  op is the text r
93e0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
93f0: 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 0a 2a   the parameter.*
9400: 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61  * of the same na
9410: 6d 65 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65  me. The paramete
9420: 72 20 22 6f 70 22 20 6d 75 73 74 20 62 65 20 6f  r "op" must be o
9430: 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20  ne of TK_UNION, 
9440: 54 4b 5f 45 58 43 45 50 54 2c 0a 2a 2a 20 54 4b  TK_EXCEPT,.** TK
9450: 5f 49 4e 54 45 52 53 45 43 54 20 6f 72 20 54 4b  _INTERSECT or TK
9460: 5f 41 4c 4c 2e 20 54 68 65 20 66 69 72 73 74 20  _ALL. The first 
9470: 66 6f 72 6d 20 69 73 20 75 73 65 64 20 69 66 20  form is used if 
9480: 61 72 67 75 6d 65 6e 74 20 62 55 73 65 54 6d 70  argument bUseTmp
9490: 20 69 73 20 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f   is .** false, o
94a0: 72 20 74 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  r the second for
94b0: 6d 20 69 66 20 69 74 20 69 73 20 74 72 75 65 2e  m if it is true.
94c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
94d0: 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65  explainComposite
94e0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
94f0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
9500: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
9510: 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  text */.  int op
9520: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9530: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
9540: 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b   of TK_UNION, TK
9550: 5f 45 58 43 45 50 54 20 65 74 63 2e 20 2a 2f 0a  _EXCEPT etc. */.
9560: 20 20 69 6e 74 20 69 53 75 62 31 2c 20 20 20 20    int iSub1,    
9570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9580: 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64    /* Subquery id
9590: 20 31 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62   1 */.  int iSub
95a0: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2,              
95b0: 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75          /* Subqu
95c0: 65 72 79 20 69 64 20 32 20 2a 2f 0a 20 20 69 6e  ery id 2 */.  in
95d0: 74 20 62 55 73 65 54 6d 70 20 20 20 20 20 20 20  t bUseTmp       
95e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
95f0: 20 54 72 75 65 20 69 66 20 61 20 74 65 6d 70 20   True if a temp 
9600: 74 61 62 6c 65 20 77 61 73 20 75 73 65 64 20 2a  table was used *
9610: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6f  /.){.  assert( o
9620: 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f  p==TK_UNION || o
9630: 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20  p==TK_EXCEPT || 
9640: 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
9650: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29   || op==TK_ALL )
9660: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
9670: 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
9680: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
9690: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63  se->pVdbe;.    c
96a0: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69  har *zMsg = sqli
96b0: 74 65 33 4d 50 72 69 6e 74 66 28 0a 20 20 20 20  te3MPrintf(.    
96c0: 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20      pParse->db, 
96d0: 22 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51 55 45  "COMPOUND SUBQUE
96e0: 52 49 45 53 20 25 64 20 41 4e 44 20 25 64 20 25  RIES %d AND %d %
96f0: 73 28 25 73 29 22 2c 20 69 53 75 62 31 2c 20 69  s(%s)", iSub1, i
9700: 53 75 62 32 2c 0a 20 20 20 20 20 20 20 20 62 55  Sub2,.        bU
9710: 73 65 54 6d 70 3f 22 55 53 49 4e 47 20 54 45 4d  seTmp?"USING TEM
9720: 50 20 42 2d 54 52 45 45 20 22 3a 22 22 2c 20 73  P B-TREE ":"", s
9730: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 6f 70 29 0a  electOpName(op).
9740: 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
9750: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
9760: 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72  OP_Explain, pPar
9770: 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30  se->iSelectId, 0
9780: 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59  , 0, zMsg, P4_DY
9790: 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  NAMIC);.  }.}.#e
97a0: 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72  lse./* No-op ver
97b0: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70  sions of the exp
97c0: 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69  lainXXX() functi
97d0: 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20  ons and macros. 
97e0: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  */.# define expl
97f0: 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 76 2c 77  ainComposite(v,w
9800: 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a  ,x,y,z).#endif..
9810: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e  /*.** If the inn
9820: 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65  er loop was gene
9830: 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f  rated using a no
9840: 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20  n-null pOrderBy 
9850: 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65  argument,.** the
9860: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65  n the results we
9870: 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73  re placed in a s
9880: 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68  orter.  After th
9890: 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e  e loop is termin
98a0: 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20  ated.** we need 
98b0: 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65  to run the sorte
98c0: 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65  r and output the
98d0: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66   results.  The f
98e0: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74  ollowing.** rout
98f0: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
9900: 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f  e code needed to
9910: 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61   do that..*/.sta
9920: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
9930: 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72  eSortTail(.  Par
9940: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
9950: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
9960: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
9970: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
9980: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
9990: 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70   */.  SortCtx *p
99a0: 53 6f 72 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72  Sort,   /* Infor
99b0: 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52  mation on the OR
99c0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
99d0: 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20  .  int nColumn, 
99e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
99f0: 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74  f columns of dat
9a00: 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  a */.  SelectDes
9a10: 74 20 2a 70 44 65 73 74 20 2f 2a 20 57 72 69 74  t *pDest /* Writ
9a20: 65 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 73  e the sorted res
9a30: 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
9a40: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
9a50: 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
9a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9a70: 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
9a80: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
9a90: 74 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71  t addrBreak = sq
9aa0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
9ab0: 65 6c 28 76 29 3b 20 20 20 20 20 2f 2a 20 4a 75  el(v);     /* Ju
9ac0: 6d 70 20 68 65 72 65 20 74 6f 20 65 78 69 74 20  mp here to exit 
9ad0: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
9ae0: 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c  drContinue = sql
9af0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
9b00: 6c 28 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68  l(v);  /* Jump h
9b10: 65 72 65 20 66 6f 72 20 6e 65 78 74 20 63 79 63  ere for next cyc
9b20: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  le */.  int addr
9b30: 3b 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e 63 65  ;.  int addrOnce
9b40: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62   = 0;.  int iTab
9b50: 3b 0a 20 20 69 6e 74 20 70 73 65 75 64 6f 54 61  ;.  int pseudoTa
9b60: 62 20 3d 20 30 3b 0a 20 20 45 78 70 72 4c 69 73  b = 0;.  ExprLis
9b70: 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53  t *pOrderBy = pS
9b80: 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  ort->pOrderBy;. 
9b90: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
9ba0: 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74  st->eDest;.  int
9bb0: 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e   iParm = pDest->
9bc0: 69 53 44 50 61 72 6d 3b 0a 20 20 69 6e 74 20 72  iSDParm;.  int r
9bd0: 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67  egRow;.  int reg
9be0: 52 6f 77 69 64 3b 0a 20 20 69 6e 74 20 6e 4b 65  Rowid;.  int nKe
9bf0: 79 3b 0a 0a 20 20 69 66 28 20 70 53 6f 72 74 2d  y;..  if( pSort-
9c00: 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20  >labelBkOut ){. 
9c10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9c20: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
9c30: 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75  , pSort->regRetu
9c40: 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  rn, pSort->label
9c50: 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69  BkOut);.    sqli
9c60: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
9c70: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
9c80: 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 73 71 6c  rBreak);.    sql
9c90: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
9ca0: 61 62 65 6c 28 76 2c 20 70 53 6f 72 74 2d 3e 6c  abel(v, pSort->l
9cb0: 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20  abelBkOut);.    
9cc0: 61 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74  addrOnce = sqlit
9cd0: 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73  e3CodeOnce(pPars
9ce0: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
9cf0: 28 76 29 3b 0a 20 20 7d 0a 20 20 69 54 61 62 20  (v);.  }.  iTab 
9d00: 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  = pSort->iECurso
9d10: 72 3b 0a 20 20 72 65 67 52 6f 77 20 3d 20 73 71  r;.  regRow = sq
9d20: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
9d30: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 65  pParse);.  if( e
9d40: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
9d50: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
9d60: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
9d70: 70 73 65 75 64 6f 54 61 62 20 3d 20 70 50 61 72  pseudoTab = pPar
9d80: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
9d90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9da0: 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75  3(v, OP_OpenPseu
9db0: 64 6f 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 72  do, pseudoTab, r
9dc0: 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  egRow, nColumn);
9dd0: 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20  .    regRowid = 
9de0: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
9df0: 72 65 67 52 6f 77 69 64 20 3d 20 73 71 6c 69 74  regRowid = sqlit
9e00: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
9e10: 72 73 65 29 3b 0a 20 20 7d 0a 20 20 6e 4b 65 79  rse);.  }.  nKey
9e20: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
9e30: 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53  pr - pSort->nOBS
9e40: 61 74 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d  at;.  if( pSort-
9e50: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
9e60: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20  TFLAG_UseSorter 
9e70: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 53 6f  ){.    int regSo
9e80: 72 74 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73 65  rtOut = ++pParse
9e90: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 74 20  ->nMem;.    int 
9ea0: 70 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e  ptab2 = pParse->
9eb0: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69  nTab++;.    sqli
9ec0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
9ed0: 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20   OP_OpenPseudo, 
9ee0: 70 74 61 62 32 2c 20 72 65 67 53 6f 72 74 4f 75  ptab2, regSortOu
9ef0: 74 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20  t, nKey+2);.    
9f00: 69 66 28 20 61 64 64 72 4f 6e 63 65 20 29 20 73  if( addrOnce ) s
9f10: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
9f20: 72 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b  re(v, addrOnce);
9f30: 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20  .    addr = 1 + 
9f40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9f50: 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f  2(v, OP_SorterSo
9f60: 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72  rt, iTab, addrBr
9f70: 65 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  eak);.    VdbeCo
9f80: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63  verage(v);.    c
9f90: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e  odeOffset(v, p->
9fa0: 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e  iOffset, addrCon
9fb0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69  tinue);.    sqli
9fc0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
9fd0: 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20   OP_SorterData, 
9fe0: 69 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74  iTab, regSortOut
9ff0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a000: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
a010: 6f 6c 75 6d 6e 2c 20 70 74 61 62 32 2c 20 6e 4b  olumn, ptab2, nK
a020: 65 79 2b 31 2c 20 72 65 67 52 6f 77 29 3b 0a 20  ey+1, regRow);. 
a030: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
a040: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
a050: 5f 43 4c 45 41 52 43 41 43 48 45 29 3b 0a 20 20  _CLEARCACHE);.  
a060: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 61  }else{.    if( a
a070: 64 64 72 4f 6e 63 65 20 29 20 73 71 6c 69 74 65  ddrOnce ) sqlite
a080: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
a090: 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20   addrOnce);.    
a0a0: 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74  addr = 1 + sqlit
a0b0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a0c0: 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20 61  OP_Sort, iTab, a
a0d0: 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43  ddrBreak); VdbeC
a0e0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
a0f0: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d  codeOffset(v, p-
a100: 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f  >iOffset, addrCo
a110: 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c  ntinue);.    sql
a120: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
a130: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61  , OP_Column, iTa
a140: 62 2c 20 6e 4b 65 79 2b 31 2c 20 72 65 67 52 6f  b, nKey+1, regRo
a150: 77 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68  w);.  }.  switch
a160: 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63  ( eDest ){.    c
a170: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
a180: 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
a190: 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 74 65  mTab: {.      te
a1a0: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
a1b0: 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  RT_Table );.    
a1c0: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
a1d0: 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
a1e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
a1f0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
a200: 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d  _NewRowid, iParm
a210: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
a220: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a230: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
a240: 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77  t, iParm, regRow
a250: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
a260: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
a270: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
a280: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20  _APPEND);.      
a290: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
a2a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a2b0: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
a2c0: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
a2d0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
a2e0: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
a2f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a300: 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
a310: 72 64 2c 20 72 65 67 52 6f 77 2c 20 31 2c 20 72  rd, regRow, 1, r
a320: 65 67 52 6f 77 69 64 2c 0a 20 20 20 20 20 20 20  egRowid,.       
a330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a340: 20 26 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74   &pDest->affSdst
a350: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
a360: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
a370: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
a380: 65 2c 20 72 65 67 52 6f 77 2c 20 31 29 3b 0a 20  e, regRow, 1);. 
a390: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a3a0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
a3b0: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
a3c0: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
a3d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
a3e0: 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b   case SRT_Mem: {
a3f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
a400: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
a410: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
a420: 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72  deMove(pParse, r
a430: 65 67 52 6f 77 2c 20 69 50 61 72 6d 2c 20 31 29  egRow, iParm, 1)
a440: 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;.      /* The L
a450: 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c  IMIT clause will
a460: 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
a470: 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
a480: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
a490: 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61  .#endif.    defa
a4a0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ult: {.      int
a4b0: 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   i;.      assert
a4c0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
a4d0: 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  put || eDest==SR
a4e0: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a  T_Coroutine ); .
a4f0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
a500: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
a510: 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
a520: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
a530: 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20  Coroutine );.   
a540: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
a550: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
a560: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 65 67       assert( reg
a570: 52 6f 77 21 3d 70 44 65 73 74 2d 3e 69 53 64 73  Row!=pDest->iSds
a580: 74 2b 69 20 29 3b 0a 20 20 20 20 20 20 20 20 73  t+i );.        s
a590: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
a5a0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70  (v, OP_Column, p
a5b0: 73 65 75 64 6f 54 61 62 2c 20 69 2c 20 70 44 65  seudoTab, i, pDe
a5c0: 73 74 2d 3e 69 53 64 73 74 2b 69 29 3b 0a 20 20  st->iSdst+i);.  
a5d0: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29        if( i==0 )
a5e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
a5f0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
a600: 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43  v, OPFLAG_CLEARC
a610: 41 43 48 45 29 3b 0a 20 20 20 20 20 20 20 20 7d  ACHE);.        }
a620: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
a630: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  f( eDest==SRT_Ou
a640: 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tput ){.        
a650: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a660: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
a670: 77 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c  w, pDest->iSdst,
a680: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
a690: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
a6a0: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
a6b0: 65 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2d  e(pParse, pDest-
a6c0: 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29  >iSdst, nColumn)
a6d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
a6e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a6f0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
a700: 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44  ield, pDest->iSD
a710: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Parm);.      }. 
a720: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a730: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
a740: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
a750: 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20  arse, regRow);. 
a760: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
a770: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
a780: 65 67 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20  egRowid);..  /* 
a790: 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68  The bottom of th
a7a0: 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71  e loop.  */.  sq
a7b0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
a7c0: 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e  Label(v, addrCon
a7d0: 74 69 6e 75 65 29 3b 0a 20 20 69 66 28 20 70 53  tinue);.  if( pS
a7e0: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
a7f0: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
a800: 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ter ){.    sqlit
a810: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a820: 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69  OP_SorterNext, i
a830: 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62 65  Tab, addr); Vdbe
a840: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
a850: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
a860: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a870: 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  P_Next, iTab, ad
a880: 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  dr); VdbeCoverag
a890: 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  e(v);.  }.  if( 
a8a0: 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e  pSort->regReturn
a8b0: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   ) sqlite3VdbeAd
a8c0: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
a8d0: 6e 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74  n, pSort->regRet
a8e0: 75 72 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  urn);.  sqlite3V
a8f0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
a900: 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  v, addrBreak);. 
a910: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
a920: 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d  Output || eDest=
a930: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
a940: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
a950: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
a960: 6f 73 65 2c 20 70 73 65 75 64 6f 54 61 62 2c 20  ose, pseudoTab, 
a970: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
a980: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
a990: 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f  r to a string co
a9a0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65  ntaining the 'de
a9b0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20  claration type' 
a9c0: 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  of the.** expres
a9d0: 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20  sion pExpr. The 
a9e0: 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72  string may be tr
a9f0: 65 61 74 65 64 20 61 73 20 73 74 61 74 69 63 20  eated as static 
aa00: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  by the caller..*
aa10: 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74 6f  *.** Also try to
aa20: 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 73 69   estimate the si
aa30: 7a 65 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e  ze of the return
aa40: 65 64 20 76 61 6c 75 65 20 61 6e 64 20 72 65 74  ed value and ret
aa50: 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73 75  urn that.** resu
aa60: 6c 74 20 69 6e 20 2a 70 45 73 74 57 69 64 74 68  lt in *pEstWidth
aa70: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c  ..**.** The decl
aa80: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20  aration type is 
aa90: 74 68 65 20 65 78 61 63 74 20 64 61 74 61 74 79  the exact dataty
aaa0: 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78  pe definition ex
aab0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
aac0: 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45  .** original CRE
aad0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
aae0: 65 6e 74 20 69 66 20 74 68 65 20 65 78 70 72 65  ent if the expre
aaf0: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
ab00: 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72  n. The.** declar
ab10: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
ab20: 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20   ROWID field is 
ab30: 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79  INTEGER. Exactly
ab40: 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73   when an express
ab50: 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  ion.** is consid
ab60: 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61  ered a column ca
ab70: 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20  n be complex in 
ab80: 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20  the presence of 
ab90: 73 75 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a  subqueries. The.
aba0: 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78  ** result-set ex
abb0: 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20  pression in all 
abc0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
abd0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
abe0: 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64  ts is .** consid
abf0: 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79  ered a column by
ac00: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
ac10: 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63  **.**   SELECT c
ac20: 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20  ol FROM tbl;.** 
ac30: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
ac40: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a   col FROM tbl;.*
ac50: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
ac60: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29  CT col FROM tbl)
ac70: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62  ;.**   SELECT ab
ac80: 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63  c FROM (SELECT c
ac90: 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74  ol AS abc FROM t
aca0: 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  bl);.** .** The 
acb0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
acc0: 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73   for any express
acd0: 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ion other than a
ace0: 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e   column is NULL.
acf0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
ad00: 69 6e 65 20 68 61 73 20 65 69 74 68 65 72 20 33  ine has either 3
ad10: 20 6f 72 20 36 20 70 61 72 61 6d 65 74 65 72 73   or 6 parameters
ad20: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
ad30: 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20  ether or not.** 
ad40: 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  the SQLITE_ENABL
ad50: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
ad60: 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  A compile-time o
ad70: 70 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a  ption is used..*
ad80: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
ad90: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
ada0: 54 41 44 41 54 41 0a 23 20 64 65 66 69 6e 65 20  TADATA.# define 
adb0: 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43  columnType(A,B,C
adc0: 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54 79  ,D,E,F) columnTy
add0: 70 65 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c 45  peImpl(A,B,C,D,E
ade0: 2c 46 29 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  ,F).static const
adf0: 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70   char *columnTyp
ae00: 65 49 6d 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e  eImpl(.  NameCon
ae10: 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78  text *pNC, .  Ex
ae20: 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e  pr *pExpr,.  con
ae30: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67  st char **pzOrig
ae40: 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db,.  const char
ae50: 20 2a 2a 70 7a 4f 72 69 67 54 61 62 2c 0a 20 20   **pzOrigTab,.  
ae60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
ae70: 72 69 67 43 6f 6c 2c 0a 20 20 75 38 20 2a 70 45  rigCol,.  u8 *pE
ae80: 73 74 57 69 64 74 68 0a 29 7b 0a 20 20 63 68 61  stWidth.){.  cha
ae90: 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 44 62  r const *zOrigDb
aea0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e   = 0;.  char con
aeb0: 73 74 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30  st *zOrigTab = 0
aec0: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
aed0: 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 23 65  zOrigCol = 0;.#e
aee0: 6c 73 65 20 2f 2a 20 69 66 20 21 64 65 66 69 6e  lse /* if !defin
aef0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
af00: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
af10: 29 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 63 6f  ) */.# define co
af20: 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44  lumnType(A,B,C,D
af30: 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70 65  ,E,F) columnType
af40: 49 6d 70 6c 28 41 2c 42 2c 46 29 0a 73 74 61 74  Impl(A,B,F).stat
af50: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  ic const char *c
af60: 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20  olumnTypeImpl(. 
af70: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
af80: 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70  C, .  Expr *pExp
af90: 72 2c 0a 20 20 75 38 20 2a 70 45 73 74 57 69 64  r,.  u8 *pEstWid
afa0: 74 68 0a 29 7b 0a 23 65 6e 64 69 66 20 2f 2a 20  th.){.#endif /* 
afb0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
afc0: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
afd0: 54 41 44 41 54 41 29 20 2a 2f 0a 20 20 63 68 61  TADATA) */.  cha
afe0: 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d  r const *zType =
aff0: 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 75   0;.  int j;.  u
b000: 38 20 65 73 74 57 69 64 74 68 20 3d 20 31 3b 0a  8 estWidth = 1;.
b010: 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 45 78  .  if( NEVER(pEx
b020: 70 72 3d 3d 30 29 20 7c 7c 20 70 4e 43 2d 3e 70  pr==0) || pNC->p
b030: 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  SrcList==0 ) ret
b040: 75 72 6e 20 30 3b 0a 20 20 73 77 69 74 63 68 28  urn 0;.  switch(
b050: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
b060: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
b070: 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
b080: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
b090: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
b0a0: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  ion is a column.
b0b0: 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c   Locate the tabl
b0c0: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  e the column is 
b0d0: 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65  being.      ** e
b0e0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e  xtracted from in
b0f0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72   NameContext.pSr
b100: 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c  cList. This tabl
b110: 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20  e may be real.  
b120: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
b130: 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75  table or a subqu
b140: 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ery..      */.  
b150: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
b160: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
b170: 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  /* Table structu
b180: 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74  re column is ext
b190: 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20  racted from */. 
b1a0: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20       Select *pS 
b1b0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
b1c0: 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63   /* Select the c
b1d0: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
b1e0: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
b1f0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70   int iCol = pExp
b200: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20  r->iColumn;  /* 
b210: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
b220: 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20  in pTab */.     
b230: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
b240: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
b250: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  UMN );.      tes
b260: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
b270: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
b280: 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20       while( pNC 
b290: 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20  && !pTab ){.    
b2a0: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61      SrcList *pTa
b2b0: 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  bList = pNC->pSr
b2c0: 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66  cList;.        f
b2d0: 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73  or(j=0;j<pTabLis
b2e0: 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c  t->nSrc && pTabL
b2f0: 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f  ist->a[j].iCurso
b300: 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  r!=pExpr->iTable
b310: 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69  ;j++);.        i
b320: 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  f( j<pTabList->n
b330: 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Src ){.         
b340: 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
b350: 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[j].pTab;.   
b360: 20 20 20 20 20 20 20 70 53 20 3d 20 70 54 61 62         pS = pTab
b370: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65  List->a[j].pSele
b380: 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ct;.        }els
b390: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43  e{.          pNC
b3a0: 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20   = pNC->pNext;. 
b3b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
b3c0: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ..      if( pTab
b3d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
b3e0: 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63  * At one time, c
b3f0: 6f 64 65 20 73 75 63 68 20 61 73 20 22 53 45 4c  ode such as "SEL
b400: 45 43 54 20 6e 65 77 2e 78 22 20 77 69 74 68 69  ECT new.x" withi
b410: 6e 20 61 20 74 72 69 67 67 65 72 20 77 6f 75 6c  n a trigger woul
b420: 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75  d.        ** cau
b430: 73 65 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f  se this conditio
b440: 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65  n to run.  Since
b450: 20 74 68 65 6e 2c 20 77 65 20 68 61 76 65 20 72   then, we have r
b460: 65 73 74 72 75 63 74 75 72 65 64 20 68 6f 77 0a  estructured how.
b470: 20 20 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67          ** trigg
b480: 65 72 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72  er code is gener
b490: 61 74 65 64 20 61 6e 64 20 73 6f 20 74 68 69 73  ated and so this
b4a0: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f   condition is no
b4b0: 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20 20 20   longer .       
b4c0: 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f   ** possible. Ho
b4d0: 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20 73 74  wever, it can st
b4e0: 69 6c 6c 20 62 65 20 74 72 75 65 20 66 6f 72 20  ill be true for 
b4f0: 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a  statements like.
b500: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66          ** the f
b510: 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20  ollowing:.      
b520: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
b530: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
b540: 31 28 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a  1(col INTEGER);.
b550: 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
b560: 45 43 54 20 28 53 45 4c 45 43 54 20 74 31 2e 63  ECT (SELECT t1.c
b570: 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31  ol) FROM FROM t1
b580: 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ;.        **.   
b590: 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c       ** when col
b5a0: 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c  umnType() is cal
b5b0: 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65  led on the expre
b5c0: 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69  ssion "t1.col" i
b5d0: 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  n the .        *
b5e0: 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e  * sub-select. In
b5f0: 20 74 68 69 73 20 63 61 73 65 2c 20 73 65 74 20   this case, set 
b600: 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20  the column type 
b610: 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20  to NULL, even.  
b620: 20 20 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20        ** though 
b630: 69 74 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79  it should really
b640: 20 62 65 20 22 49 4e 54 45 47 45 52 22 2e 0a 20   be "INTEGER".. 
b650: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
b660: 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74    ** This is not
b670: 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74   a problem, as t
b680: 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f  he column type o
b690: 66 20 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65  f "t1.col" is ne
b6a0: 76 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 75  ver.        ** u
b6b0: 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e  sed. When column
b6c0: 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64  Type() is called
b6d0: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
b6e0: 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22  on .        ** "
b6f0: 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22  (SELECT t1.col)"
b700: 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 74 79  , the correct ty
b710: 70 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 28  pe is returned (
b720: 73 65 65 20 74 68 65 20 54 4b 5f 53 45 4c 45 43  see the TK_SELEC
b730: 54 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 72 61  T.        ** bra
b740: 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20  nch below.  */. 
b750: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b760: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
b770: 65 72 74 28 20 70 54 61 62 20 26 26 20 70 45 78  ert( pTab && pEx
b780: 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20 29  pr->pTab==pTab )
b790: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 20 29  ;.      if( pS )
b7a0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
b7b0: 20 22 74 61 62 6c 65 22 20 69 73 20 61 63 74 75   "table" is actu
b7c0: 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63  ally a sub-selec
b7d0: 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74  t or a view in t
b7e0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
b7f0: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
b800: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
b810: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  t. Return the de
b820: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61  claration type a
b830: 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20  nd origin.      
b840: 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68    ** data for th
b850: 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c  e result-set col
b860: 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73  umn of the sub-s
b870: 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a  elect..        *
b880: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  /.        if( iC
b890: 6f 6c 3e 3d 30 20 26 26 20 41 4c 57 41 59 53 28  ol>=0 && ALWAYS(
b8a0: 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d  iCol<pS->pEList-
b8b0: 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  >nExpr) ){.     
b8c0: 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20       /* If iCol 
b8d0: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
b8e0: 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72  o, then the expr
b8f0: 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74 73 20  ession requests 
b900: 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
b910: 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 73 75   rowid of the su
b920: 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77  b-select or view
b930: 2e 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f  . This expressio
b940: 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65 65 20  n is legal (see 
b950: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65  .          ** te
b960: 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e 32 2e  st case misc2.2.
b970: 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73 20 65  2) - it always e
b980: 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
b990: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
b9a0: 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e           NameCon
b9b0: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20  text sNC;.      
b9c0: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53      Expr *p = pS
b9d0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c  ->pEList->a[iCol
b9e0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
b9f0: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
ba00: 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20  = pS->pSrc;.    
ba10: 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20        sNC.pNext 
ba20: 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 20 20 20  = pNC;.         
ba30: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e   sNC.pParse = pN
ba40: 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20  C->pParse;.     
ba50: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c       zType = col
ba60: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
ba70: 26 7a 4f 72 69 67 44 62 2c 26 7a 4f 72 69 67 54  &zOrigDb,&zOrigT
ba80: 61 62 2c 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65  ab,&zOrigCol, &e
ba90: 73 74 57 69 64 74 68 29 3b 20 0a 20 20 20 20 20  stWidth); .     
baa0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
bab0: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 63 68 65   if( pTab->pSche
bac0: 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ma ){.        /*
bad0: 20 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f   A real table */
bae0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
baf0: 20 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20   !pS );.        
bb00: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
bb10: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
bb20: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
bb30: 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43   iCol==-1 || (iC
bb40: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
bb50: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 23 69 66  ab->nCol) );.#if
bb60: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
bb70: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
bb80: 41 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  A.        if( iC
bb90: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
bba0: 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47    zType = "INTEG
bbb0: 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ER";.          z
bbc0: 4f 72 69 67 43 6f 6c 20 3d 20 22 72 6f 77 69 64  OrigCol = "rowid
bbd0: 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ";.        }else
bbe0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
bbf0: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  e = pTab->aCol[i
bc00: 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20  Col].zType;.    
bc10: 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d        zOrigCol =
bc20: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
bc30: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
bc40: 20 20 20 65 73 74 57 69 64 74 68 20 3d 20 70 54     estWidth = pT
bc50: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73  ab->aCol[iCol].s
bc60: 7a 45 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  zEst;.        }.
bc70: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 54 61 62          zOrigTab
bc80: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
bc90: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d          if( pNC-
bca0: 3e 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20 20  >pParse ){.     
bcb0: 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73       int iDb = s
bcc0: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
bcd0: 64 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d  dex(pNC->pParse-
bce0: 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
bcf0: 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ma);.          z
bd00: 4f 72 69 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50  OrigDb = pNC->pP
bd10: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
bd20: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b].zName;.      
bd30: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20    }.#else.      
bd40: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
bd50: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
bd60: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
bd70: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
bd80: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54        zType = pT
bd90: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
bda0: 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Type;.          
bdb0: 65 73 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d  estWidth = pTab-
bdc0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73  >aCol[iCol].szEs
bdd0: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  t;.        }.#en
bde0: 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
bdf0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
be00: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
be10: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
be20: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
be30: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
be40: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73  xpression is a s
be50: 75 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72  ub-select. Retur
be60: 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  n the declaratio
be70: 6e 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20  n type and.     
be80: 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20   ** origin info 
be90: 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63  for the single c
bea0: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73  olumn in the res
beb0: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
bec0: 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73  ELECT.      ** s
bed0: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
bee0: 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e  */.      NameCon
bef0: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20  text sNC;.      
bf00: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78  Select *pS = pEx
bf10: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20  pr->x.pSelect;. 
bf20: 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70       Expr *p = p
bf30: 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  S->pEList->a[0].
bf40: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
bf50: 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
bf60: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
bf70: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
bf80: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
bf90: 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20  = pS->pSrc;.    
bfa0: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e    sNC.pNext = pN
bfb0: 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61  C;.      sNC.pPa
bfc0: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
bfd0: 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  e;.      zType =
bfe0: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
bff0: 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26  , p, &zOrigDb, &
c000: 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67  zOrigTab, &zOrig
c010: 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68 29 3b  Col, &estWidth);
c020: 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
c030: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
c040: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
c050: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
c060: 41 44 41 54 41 20 20 0a 20 20 69 66 28 20 70 7a  ADATA  .  if( pz
c070: 4f 72 69 67 44 62 20 29 7b 0a 20 20 20 20 61 73  OrigDb ){.    as
c080: 73 65 72 74 28 20 70 7a 4f 72 69 67 54 61 62 20  sert( pzOrigTab 
c090: 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a  && pzOrigCol );.
c0a0: 20 20 20 20 2a 70 7a 4f 72 69 67 44 62 20 3d 20      *pzOrigDb = 
c0b0: 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20 2a 70 7a  zOrigDb;.    *pz
c0c0: 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72 69 67 54  OrigTab = zOrigT
c0d0: 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 43  ab;.    *pzOrigC
c0e0: 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20  ol = zOrigCol;. 
c0f0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
c100: 70 45 73 74 57 69 64 74 68 20 29 20 2a 70 45 73  pEstWidth ) *pEs
c110: 74 57 69 64 74 68 20 3d 20 65 73 74 57 69 64 74  tWidth = estWidt
c120: 68 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70  h;.  return zTyp
c130: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  e;.}../*.** Gene
c140: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
c150: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
c160: 45 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  E the declaratio
c170: 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d  n types of colum
c180: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
c190: 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  ult set..*/.stat
c1a0: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
c1b0: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50  ColumnTypes(.  P
c1c0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
c1d0: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
c1e0: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
c1f0: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
c200: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
c210: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
c220: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
c230: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
c240: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
c250: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
c260: 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
c270: 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  PE.  Vdbe *v = p
c280: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
c290: 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
c2a0: 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e  text sNC;.  sNC.
c2b0: 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
c2c0: 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73  ist;.  sNC.pPars
c2d0: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66 6f  e = pParse;.  fo
c2e0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
c2f0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
c300: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69    Expr *p = pELi
c310: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
c320: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
c330: 7a 54 79 70 65 3b 0a 23 69 66 64 65 66 20 53 51  zType;.#ifdef SQ
c340: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
c350: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20  MN_METADATA.    
c360: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
c370: 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  gDb = 0;.    con
c380: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54 61  st char *zOrigTa
c390: 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  b = 0;.    const
c3a0: 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20   char *zOrigCol 
c3b0: 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d  = 0;.    zType =
c3c0: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
c3d0: 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26  , p, &zOrigDb, &
c3e0: 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67  zOrigTab, &zOrig
c3f0: 43 6f 6c 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  Col, 0);..    /*
c400: 20 54 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d   The vdbe must m
c410: 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79  ake its own copy
c420: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74   of the column-t
c430: 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20  ype and other . 
c440: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65     ** column spe
c450: 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69  cific strings, i
c460: 6e 20 63 61 73 65 20 74 68 65 20 73 63 68 65 6d  n case the schem
c470: 61 20 69 73 20 72 65 73 65 74 20 62 65 66 6f 72  a is reset befor
c480: 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69  e this.    ** vi
c490: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73  rtual machine is
c4a0: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
c4b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
c4c0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
c4d0: 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53   COLNAME_DATABAS
c4e0: 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49  E, zOrigDb, SQLI
c4f0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
c500: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
c510: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
c520: 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f  OLNAME_TABLE, zO
c530: 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45 5f 54  rigTab, SQLITE_T
c540: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
c550: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
c560: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
c570: 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67  ME_COLUMN, zOrig
c580: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Col, SQLITE_TRAN
c590: 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20  SIENT);.#else.  
c5a0: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
c5b0: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c  Type(&sNC, p, 0,
c5c0: 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69   0, 0, 0);.#endi
c5d0: 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  f.    sqlite3Vdb
c5e0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
c5f0: 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59  , COLNAME_DECLTY
c600: 50 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49 54  PE, zType, SQLIT
c610: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
c620: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
c630: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
c640: 5f 44 45 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a  _DECLTYPE) */.}.
c650: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
c660: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74  code that will t
c670: 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65  ell the VDBE the
c680: 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e   names of column
c690: 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75  s.** in the resu
c6a0: 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20 69 6e  lt set.  This in
c6b0: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
c6c0: 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65  d to provide the
c6d0: 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75  .** azCol[] valu
c6e0: 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61  es in the callba
c6f0: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
c700: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
c710: 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20  nNames(.  Parse 
c720: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
c730: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
c740: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
c750: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
c760: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
c770: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
c780: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
c790: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
c7a0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
c7b0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
c7c0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
c7d0: 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65  t i, j;.  sqlite
c7e0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
c7f0: 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61  db;.  int fullNa
c800: 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b  mes, shortNames;
c810: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
c820: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
c830: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
c840: 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74   EXPLAIN, skip t
c850: 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69 66  his step */.  if
c860: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
c870: 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  n ){.    return;
c880: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
c890: 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61  f( pParse->colNa
c8a0: 6d 65 73 53 65 74 20 7c 7c 20 4e 45 56 45 52 28  mesSet || NEVER(
c8b0: 76 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c  v==0) || db->mal
c8c0: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
c8d0: 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f  rn;.  pParse->co
c8e0: 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20  lNamesSet = 1;. 
c8f0: 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62   fullNames = (db
c900: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
c910: 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
c920: 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20  0;.  shortNames 
c930: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
c940: 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
c950: 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74  mes)!=0;.  sqlit
c960: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
c970: 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  (v, pEList->nExp
c980: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
c990: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
c9a0: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
c9b0: 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73  p;.    p = pELis
c9c0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
c9d0: 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d     if( NEVER(p==
c9e0: 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  0) ) continue;. 
c9f0: 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61     if( pEList->a
ca00: 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  [i].zName ){.   
ca10: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
ca20: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
ca30: 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ame;.      sqlit
ca40: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
ca50: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
ca60: 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49  AME, zName, SQLI
ca70: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
ca80: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d     }else if( (p-
ca90: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op==TK_COLUMN |
caa0: 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  | p->op==TK_AGG_
cab0: 43 4f 4c 55 4d 4e 29 20 26 26 20 70 54 61 62 4c  COLUMN) && pTabL
cac0: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62  ist ){.      Tab
cad0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
cae0: 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20  char *zCol;.    
caf0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
cb00: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66  iColumn;.      f
cb10: 6f 72 28 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a  or(j=0; ALWAYS(j
cb20: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 29  <pTabList->nSrc)
cb30: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
cb40: 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  if( pTabList->a[
cb50: 6a 5d 2e 69 43 75 72 73 6f 72 3d 3d 70 2d 3e 69  j].iCursor==p->i
cb60: 54 61 62 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20  Table ) break;. 
cb70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
cb80: 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d  ert( j<pTabList-
cb90: 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70  >nSrc );.      p
cba0: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
cbb0: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
cbc0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
cbd0: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
cbe0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
cbf0: 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f  iCol==-1 || (iCo
cc00: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
cc10: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20  b->nCol) );.    
cc20: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
cc30: 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22          zCol = "
cc40: 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65  rowid";.      }e
cc50: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  lse{.        zCo
cc60: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
cc70: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
cc80: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73    }.      if( !s
cc90: 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75  hortNames && !fu
cca0: 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20  llNames ){.     
ccb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
ccc0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
ccd0: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20  OLNAME_NAME, .  
cce0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ccf0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 45  3DbStrDup(db, pE
cd00: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
cd10: 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  ), SQLITE_DYNAMI
cd20: 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  C);.      }else 
cd30: 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 29 7b  if( fullNames ){
cd40: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
cd50: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
cd60: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
cd70: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
cd80: 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  .%s", pTab->zNam
cd90: 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, zCol);.      
cda0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
cdb0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
cdc0: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d  LNAME_NAME, zNam
cdd0: 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  e, SQLITE_DYNAMI
cde0: 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  C);.      }else{
cdf0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ce00: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
ce10: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
ce20: 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f  E, zCol, SQLITE_
ce30: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
ce40: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
ce50: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
ce60: 2a 7a 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  *z = pEList->a[i
ce70: 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7a  ].zSpan;.      z
ce80: 20 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c 69 74 65   = z==0 ? sqlite
ce90: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 63 6f  3MPrintf(db, "co
cea0: 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 20 3a 20  lumn%d", i+1) : 
ceb0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
cec0: 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71  db, z);.      sq
ced0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
cee0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
cef0: 45 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c 49 54  E_NAME, z, SQLIT
cf00: 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  E_DYNAMIC);.    
cf10: 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65  }.  }.  generate
cf20: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72  ColumnTypes(pPar
cf30: 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
cf40: 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
cf50: 47 69 76 65 6e 20 61 20 61 6e 20 65 78 70 72 65  Given a an expre
cf60: 73 73 69 6f 6e 20 6c 69 73 74 20 28 77 68 69 63  ssion list (whic
cf70: 68 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20  h is really the 
cf80: 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  list of expressi
cf90: 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d  ons.** that form
cfa0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
cfb0: 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
cfc0: 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65 20 61  ement) compute a
cfd0: 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f  ppropriate.** co
cfe0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61  lumn names for a
cff0: 20 74 61 62 6c 65 20 74 68 61 74 20 77 6f 75 6c   table that woul
d000: 64 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65  d hold the expre
d010: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
d020: 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d  * All column nam
d030: 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 69 71 75  es will be uniqu
d040: 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68  e..**.** Only th
d050: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
d060: 72 65 20 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f  re computed.  Co
d070: 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75  lumn.zType, Colu
d080: 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64  mn.zColl,.** and
d090: 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66   other fields of
d0a0: 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f   Column are zero
d0b0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
d0c0: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
d0d0: 63 63 65 73 73 2e 20 20 49 66 20 61 20 6d 65 6d  ccess.  If a mem
d0e0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
d0f0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  rror occurs,.** 
d100: 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70  store NULL in *p
d110: 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70  aCol and 0 in *p
d120: 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e 20  nCol and return 
d130: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f  SQLITE_NOMEM..*/
d140: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65  .static int sele
d150: 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  ctColumnsFromExp
d160: 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
d170: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
d180: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
d190: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
d1a0: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20  t *pEList,      
d1b0: 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66 72   /* Expr list fr
d1c0: 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72 69  om which to deri
d1d0: 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ve column names 
d1e0: 2a 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c 2c  */.  i16 *pnCol,
d1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d200: 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
d210: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65   of columns here
d220: 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70   */.  Column **p
d230: 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a  aCol          /*
d240: 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20 63   Write the new c
d250: 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65 20  olumn list here 
d260: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
d270: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
d280: 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ;   /* Database 
d290: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
d2a0: 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
d2c0: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
d2d0: 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d2f0: 20 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f 20   Index added to 
d300: 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75 6e  make the name un
d310: 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e  ique */.  Column
d320: 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20   *aCol, *pCol;  
d330: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
d340: 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c 74  ping over result
d350: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
d360: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
d370: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
d380: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
d390: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
d3a0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 3b 20 20   */.  Expr *p;  
d3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3c0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
d3d0: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 72 65 73  for a single res
d3e0: 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ult column */.  
d3f0: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
d400: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
d410: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
d420: 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
d430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
d440: 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a  ize of name in z
d450: 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a 20 20 69 66 28  Name[] */..  if(
d460: 20 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e   pEList ){.    n
d470: 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  Col = pEList->nE
d480: 78 70 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20  xpr;.    aCol = 
d490: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
d4a0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61  ero(db, sizeof(a
d4b0: 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20  Col[0])*nCol);. 
d4c0: 20 20 20 74 65 73 74 63 61 73 65 28 20 61 43 6f     testcase( aCo
d4d0: 6c 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  l==0 );.  }else{
d4e0: 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20  .    nCol = 0;. 
d4f0: 20 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d     aCol = 0;.  }
d500: 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c  .  *pnCol = nCol
d510: 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43 6f  ;.  *paCol = aCo
d520: 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  l;..  for(i=0, p
d530: 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c  Col=aCol; i<nCol
d540: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
d550: 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70      /* Get an ap
d560: 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66  propriate name f
d570: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20  or the column.  
d580: 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c    */.    p = sql
d590: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
d5a0: 61 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  ate(pEList->a[i]
d5b0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
d5c0: 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74   (zName = pEList
d5d0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30  ->a[i].zName)!=0
d5e0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
d5f0: 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61  the column conta
d600: 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65  ins an "AS <name
d610: 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c  >" phrase, use <
d620: 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d  name> as the nam
d630: 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65  e */.      zName
d640: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
d650: 75 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  up(db, zName);. 
d660: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d670: 45 78 70 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d  Expr *pColExpr =
d680: 20 70 3b 20 20 2f 2a 20 54 68 65 20 65 78 70 72   p;  /* The expr
d690: 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 74  ession that is t
d6a0: 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  he result column
d6b0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 54   name */.      T
d6c0: 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
d6d0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 61 73 73      /* Table ass
d6e0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
d6f0: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  s expression */.
d700: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 43 6f        while( pCo
d710: 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  lExpr->op==TK_DO
d720: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  T ){.        pCo
d730: 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45 78 70 72  lExpr = pColExpr
d740: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
d750: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45 78    assert( pColEx
d760: 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  pr!=0 );.      }
d770: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 45  .      if( pColE
d780: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
d790: 4d 4e 20 26 26 20 41 4c 57 41 59 53 28 70 43 6f  MN && ALWAYS(pCo
d7a0: 6c 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 29 20  lExpr->pTab!=0) 
d7b0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ){.        /* Fo
d7c0: 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68  r columns use th
d7d0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61  e column name na
d7e0: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  me */.        in
d7f0: 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70  t iCol = pColExp
d800: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
d810: 20 20 20 20 70 54 61 62 20 3d 20 70 43 6f 6c 45      pTab = pColE
d820: 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
d830: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
d840: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
d850: 65 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  ey;.        zNam
d860: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
d870: 74 66 28 64 62 2c 20 22 25 73 22 2c 0a 20 20 20  tf(db, "%s",.   
d880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43                iC
d890: 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43  ol>=0 ? pTab->aC
d8a0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a  ol[iCol].zName :
d8b0: 20 22 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 20   "rowid");.     
d8c0: 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c 45   }else if( pColE
d8d0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  xpr->op==TK_ID )
d8e0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
d8f0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
d900: 74 79 28 70 43 6f 6c 45 78 70 72 2c 20 45 50 5f  ty(pColExpr, EP_
d910: 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
d920: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
d930: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
d940: 22 25 73 22 2c 20 70 43 6f 6c 45 78 70 72 2d 3e  "%s", pColExpr->
d950: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
d960: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d970: 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67 69  /* Use the origi
d980: 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20  nal text of the 
d990: 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f  column expressio
d9a0: 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f  n as its name */
d9b0: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
d9c0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
d9d0: 64 62 2c 20 22 25 73 22 2c 20 70 45 4c 69 73 74  db, "%s", pEList
d9e0: 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20  ->a[i].zSpan);. 
d9f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
da00: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
da10: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 73  ailed ){.      s
da20: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
da30: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62   zName);.      b
da40: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
da50: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
da60: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73  e column name is
da70: 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65   unique.  If the
da80: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69   name is not uni
da90: 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65  que,.    ** appe
daa0: 6e 64 20 61 20 69 6e 74 65 67 65 72 20 74 6f 20  nd a integer to 
dab0: 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74  the name so that
dac0: 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71   it becomes uniq
dad0: 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  ue..    */.    n
dae0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
daf0: 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
db00: 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20     for(j=cnt=0; 
db10: 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<i; j++){.     
db20: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
db30: 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  Cmp(aCol[j].zNam
db40: 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  e, zName)==0 ){.
db50: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
db60: 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  ewName;.        
db70: 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 66  int k;.        f
db80: 6f 72 28 6b 3d 6e 4e 61 6d 65 2d 31 3b 20 6b 3e  or(k=nName-1; k>
db90: 31 20 26 26 20 73 71 6c 69 74 65 33 49 73 64 69  1 && sqlite3Isdi
dba0: 67 69 74 28 7a 4e 61 6d 65 5b 6b 5d 29 3b 20 6b  git(zName[k]); k
dbb0: 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66  --){}.        if
dbc0: 28 20 6b 3e 3d 30 20 26 26 20 7a 4e 61 6d 65 5b  ( k>=0 && zName[
dbd0: 6b 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d 65 20  k]==':' ) nName 
dbe0: 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  = k;.        zNa
dbf0: 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20  me[nName] = 0;. 
dc00: 20 20 20 20 20 20 20 7a 4e 65 77 4e 61 6d 65 20         zNewName 
dc10: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
dc20: 28 64 62 2c 20 22 25 73 3a 25 64 22 2c 20 7a 4e  (db, "%s:%d", zN
dc30: 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20  ame, ++cnt);.   
dc40: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
dc50: 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ee(db, zName);. 
dc60: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a         zName = z
dc70: 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  NewName;.       
dc80: 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20   j = -1;.       
dc90: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
dca0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
dcb0: 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a     }.    pCol->z
dcc0: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
dcd0: 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  }.  if( db->mall
dce0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
dcf0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b  for(j=0; j<i; j+
dd00: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
dd10: 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c  3DbFree(db, aCol
dd20: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [j].zName);.    
dd30: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
dd40: 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20  ree(db, aCol);. 
dd50: 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20     *paCol = 0;. 
dd60: 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20     *pnCol = 0;. 
dd70: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
dd80: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65  _NOMEM;.  }.  re
dd90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
dda0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70  }../*.** Add typ
ddb0: 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  e and collation 
ddc0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61  information to a
ddd0: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73   column list bas
dde0: 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43  ed on.** a SELEC
ddf0: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
de00: 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c  .** The column l
de10: 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63  ist presumably c
de20: 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43  ame from selectC
de30: 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78  olumnNamesFromEx
de40: 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65  prList()..** The
de50: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73   column list has
de60: 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74   only names, not
de70: 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74   types or collat
de80: 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72  ions.  This.** r
de90: 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f  outine goes thro
dea0: 75 67 68 20 61 6e 64 20 61 64 64 73 20 74 68 65  ugh and adds the
deb0: 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61   types and colla
dec0: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tions..**.** Thi
ded0: 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72  s routine requir
dee0: 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64 65 6e  es that all iden
def0: 74 69 66 69 65 72 73 20 69 6e 20 74 68 65 20 53  tifiers in the S
df00: 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65  ELECT.** stateme
df10: 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  nt be resolved..
df20: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
df30: 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
df40: 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a  peAndCollation(.
df50: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
df60: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
df70: 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20  ng contexts */. 
df80: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
df90: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 63 6f         /* Add co
dfa0: 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d  lumn type inform
dfb0: 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 74 61  ation to this ta
dfc0: 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ble */.  Select 
dfd0: 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f  *pSelect       /
dfe0: 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f  * SELECT used to
dff0: 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73   determine types
e000: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20   and collations 
e010: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
e020: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
e030: 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
e040: 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  sNC;.  Column *p
e050: 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  Col;.  CollSeq *
e060: 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  pColl;.  int i;.
e070: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72    Expr *p;.  str
e080: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
e090: 6d 20 2a 61 3b 0a 20 20 75 36 34 20 73 7a 41 6c  m *a;.  u64 szAl
e0a0: 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  l = 0;..  assert
e0b0: 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a  ( pSelect!=0 );.
e0c0: 20 20 61 73 73 65 72 74 28 20 28 70 53 65 6c 65    assert( (pSele
e0d0: 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ct->selFlags & S
e0e0: 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20 29  F_Resolved)!=0 )
e0f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
e100: 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d  ->nCol==pSelect-
e110: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c  >pEList->nExpr |
e120: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
e130: 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ed );.  if( db->
e140: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
e150: 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28  eturn;.  memset(
e160: 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
e170: 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72  sNC));.  sNC.pSr
e180: 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  cList = pSelect-
e190: 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65  >pSrc;.  a = pSe
e1a0: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b  lect->pEList->a;
e1b0: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c  .  for(i=0, pCol
e1c0: 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70  =pTab->aCol; i<p
e1d0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  Tab->nCol; i++, 
e1e0: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  pCol++){.    p =
e1f0: 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20   a[i].pExpr;.   
e200: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73   pCol->zType = s
e210: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
e220: 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73  b, columnType(&s
e230: 4e 43 2c 20 70 2c 30 2c 30 2c 30 2c 20 26 70 43  NC, p,0,0,0, &pC
e240: 6f 6c 2d 3e 73 7a 45 73 74 29 29 3b 0a 20 20 20  ol->szEst));.   
e250: 20 73 7a 41 6c 6c 20 2b 3d 20 70 43 6f 6c 2d 3e   szAll += pCol->
e260: 73 7a 45 73 74 3b 0a 20 20 20 20 70 43 6f 6c 2d  szEst;.    pCol-
e270: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
e280: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
e290: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  p);.    if( pCol
e2a0: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20 29 20  ->affinity==0 ) 
e2b0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
e2c0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
e2d0: 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  ;.    pColl = sq
e2e0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
e2f0: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
e300: 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20   if( pColl ){.  
e310: 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20      pCol->zColl 
e320: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
e330: 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  p(db, pColl->zNa
e340: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
e350: 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20   pTab->szTabRow 
e360: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
e370: 73 7a 41 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a  szAll*4);.}../*.
e380: 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43  ** Given a SELEC
e390: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e  T statement, gen
e3a0: 65 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74  erate a Table st
e3b0: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
e3c0: 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65  cribes.** the re
e3d0: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74  sult set of that
e3e0: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c   SELECT..*/.Tabl
e3f0: 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74  e *sqlite3Result
e400: 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73  SetOfSelect(Pars
e410: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
e420: 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54  t *pSelect){.  T
e430: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71  able *pTab;.  sq
e440: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
e450: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61  se->db;.  int sa
e460: 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76  vedFlags;..  sav
e470: 65 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c  edFlags = db->fl
e480: 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  ags;.  db->flags
e490: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c   &= ~SQLITE_Full
e4a0: 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e  ColNames;.  db->
e4b0: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
e4c0: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20  ShortColNames;. 
e4d0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72   sqlite3SelectPr
e4e0: 65 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ep(pParse, pSele
e4f0: 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50  ct, 0);.  if( pP
e500: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
e510: 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  urn 0;.  while( 
e520: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20  pSelect->pPrior 
e530: 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  ) pSelect = pSel
e540: 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64  ect->pPrior;.  d
e550: 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64  b->flags = saved
e560: 46 6c 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20  Flags;.  pTab = 
e570: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
e580: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
e590: 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70  able) );.  if( p
e5a0: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Tab==0 ){.    re
e5b0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a  turn 0;.  }.  /*
e5c0: 20 54 68 65 20 73 71 6c 69 74 65 33 52 65 73 75   The sqlite3Resu
e5d0: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20  ltSetOfSelect() 
e5e0: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63  is only used n c
e5f0: 6f 6e 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f  ontexts where lo
e600: 6f 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20  okaside.  ** is 
e610: 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73  disabled */.  as
e620: 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73  sert( db->lookas
e630: 69 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20  ide.bEnabled==0 
e640: 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20  );.  pTab->nRef 
e650: 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61  = 1;.  pTab->zNa
e660: 6d 65 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e  me = 0;.  pTab->
e670: 6e 52 6f 77 45 73 74 20 3d 20 31 30 34 38 35 37  nRowEst = 104857
e680: 36 3b 0a 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d  6;.  selectColum
e690: 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  nsFromExprList(p
e6a0: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e  Parse, pSelect->
e6b0: 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e  pEList, &pTab->n
e6c0: 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c  Col, &pTab->aCol
e6d0: 29 3b 0a 20 20 73 65 6c 65 63 74 41 64 64 43 6f  );.  selectAddCo
e6e0: 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
e6f0: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61  tion(pParse, pTa
e700: 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 70  b, pSelect);.  p
e710: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  Tab->iPKey = -1;
e720: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
e730: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
e740: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
e750: 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  e(db, pTab);.   
e760: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
e770: 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
e780: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42  ./*.** Get a VDB
e790: 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  E for the given 
e7a0: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20  parser context. 
e7b0: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   Create a new on
e7c0: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
e7d0: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
e7e0: 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55  ccurs, return NU
e7f0: 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d  LL and leave a m
e800: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
e810: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
e820: 65 33 47 65 74 56 64 62 65 28 50 61 72 73 65 20  e3GetVdbe(Parse 
e830: 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65  *pParse){.  Vdbe
e840: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
e850: 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  dbe;.  if( v==0 
e860: 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73  ){.    v = pPars
e870: 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74  e->pVdbe = sqlit
e880: 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50 61  e3VdbeCreate(pPa
e890: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 20  rse);.    if( v 
e8a0: 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  ) sqlite3VdbeAdd
e8b0: 4f 70 30 28 76 2c 20 4f 50 5f 49 6e 69 74 29 3b  Op0(v, OP_Init);
e8c0: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
e8d0: 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 0a 20 20  >pToplevel==0.  
e8e0: 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
e8f0: 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61 72 73 65  onEnabled(pParse
e900: 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 46 61 63 74  ->db,SQLITE_Fact
e910: 6f 72 4f 75 74 43 6f 6e 73 74 29 0a 20 20 20 20  orOutConst).    
e920: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
e930: 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d  >okConstFactor =
e940: 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a 20   1;.    }..  }. 
e950: 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f   return v;.}.../
e960: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
e970: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
e980: 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  set fields of th
e990: 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f  e SELECT based o
e9a0: 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20  n the.** pLimit 
e9b0: 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70 72  and pOffset expr
e9c0: 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74  essions.  pLimit
e9d0: 20 61 6e 64 20 70 4f 66 66 73 65 74 20 68 6f 6c   and pOffset hol
e9e0: 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  d the expression
e9f0: 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72  s.** that appear
ea00: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
ea10: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61   SQL statement a
ea20: 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61  fter the LIMIT a
ea30: 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79  nd OFFSET.** key
ea40: 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20  words.  Or NULL 
ea50: 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64  if those keyword
ea60: 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69  s are omitted. i
ea70: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
ea80: 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e  t .** are the in
ea90: 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67  teger memory reg
eaa0: 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f  ister numbers fo
eab0: 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20  r counters used 
eac0: 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74  to compute .** t
ead0: 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66  he limit and off
eae0: 73 65 74 2e 20 20 49 66 20 74 68 65 72 65 20 69  set.  If there i
eaf0: 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f  s no limit and/o
eb00: 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a  r offset, then .
eb10: 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  ** iLimit and iO
eb20: 66 66 73 65 74 20 61 72 65 20 6e 65 67 61 74 69  ffset are negati
eb30: 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ve..**.** This r
eb40: 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74  outine changes t
eb50: 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c 69  he values of iLi
eb60: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
eb70: 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d  only if.** a lim
eb80: 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20  it or offset is 
eb90: 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d 69  defined by pLimi
eba0: 74 20 61 6e 64 20 70 4f 66 66 73 65 74 2e 20 20  t and pOffset.  
ebb0: 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f  iLimit and.** iO
ebc0: 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76  ffset should hav
ebd0: 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f  e been preset to
ebe0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65 66   appropriate def
ebf0: 61 75 6c 74 20 76 61 6c 75 65 73 20 28 7a 65 72  ault values (zer
ec00: 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63  o).** prior to c
ec10: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
ec20: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ine..**.** The i
ec30: 4f 66 66 73 65 74 20 72 65 67 69 73 74 65 72 20  Offset register 
ec40: 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69  (if it exists) i
ec50: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
ec60: 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66   the value.** of
ec70: 20 74 68 65 20 4f 46 46 53 45 54 2e 20 20 54 68   the OFFSET.  Th
ec80: 65 20 69 4c 69 6d 69 74 20 72 65 67 69 73 74 65  e iLimit registe
ec90: 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  r is initialized
eca0: 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67 69   to LIMIT.  Regi
ecb0: 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74 2b  ster.** iOffset+
ecc0: 31 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  1 is initialized
ecd0: 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54   to LIMIT+OFFSET
ece0: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20  ..**.** Only if 
ecf0: 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66  pLimit!=0 or pOf
ed00: 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c  fset!=0 do the l
ed10: 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67  imit registers g
ed20: 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e  et.** redefined.
ed30: 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20    The UNION ALL 
ed40: 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68  operator uses th
ed50: 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66  is property to f
ed60: 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73  orce.** the reus
ed70: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69  e of the same li
ed80: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72  mit and offset r
ed90: 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20  egisters across 
eda0: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45  multiple.** SELE
edb0: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CT statements..*
edc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
edd0: 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
ede0: 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ers(Parse *pPars
edf0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
ee00: 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62  t iBreak){.  Vdb
ee10: 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20  e *v = 0;.  int 
ee20: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e  iLimit = 0;.  in
ee30: 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74  t iOffset;.  int
ee40: 20 61 64 64 72 31 2c 20 6e 3b 0a 20 20 69 66 28   addr1, n;.  if(
ee50: 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65 74   p->iLimit ) ret
ee60: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  urn;..  /* .  **
ee70: 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61   "LIMIT -1" alwa
ee80: 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77  ys shows all row
ee90: 73 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d  s.  There is som
eea0: 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65 72  e.  ** controver
eeb0: 73 79 20 61 62 6f 75 74 20 77 68 61 74 20 74 68  sy about what th
eec0: 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69  e correct behavi
eed0: 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20  or should be..  
eee0: 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 69  ** The current i
eef0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
ef00: 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20  terprets "LIMIT 
ef10: 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20  0" to mean.  ** 
ef20: 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20  no rows..  */.  
ef30: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
ef40: 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
ef50: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66   assert( p->pOff
ef60: 73 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69  set==0 || p->pLi
ef70: 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  mit!=0 );.  if( 
ef80: 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->pLimit ){.   
ef90: 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69   p->iLimit = iLi
efa0: 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  mit = ++pParse->
efb0: 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71  nMem;.    v = sq
efc0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
efd0: 72 73 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  rse);.    assert
efe0: 28 20 76 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  ( v!=0 );.    if
eff0: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
f000: 6e 74 65 67 65 72 28 70 2d 3e 70 4c 69 6d 69 74  nteger(p->pLimit
f010: 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 73  , &n) ){.      s
f020: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f030: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
f040: 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  n, iLimit);.    
f050: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
f060: 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72  , "LIMIT counter
f070: 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  "));.      if( n
f080: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
f090: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f0a0: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
f0b0: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d  iBreak);.      }
f0c0: 65 6c 73 65 20 69 66 28 20 6e 3e 3d 30 20 26 26  else if( n>=0 &&
f0d0: 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 28   p->nSelectRow>(
f0e0: 75 36 34 29 6e 20 29 7b 0a 20 20 20 20 20 20 20  u64)n ){.       
f0f0: 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
f100: 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   n;.      }.    
f110: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
f120: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
f130: 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20  rse, p->pLimit, 
f140: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73  iLimit);.      s
f150: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
f160: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
f170: 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43  , iLimit); VdbeC
f180: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
f190: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
f1a0: 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72  , "LIMIT counter
f1b0: 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
f1c0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f1d0: 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69  OP_IfZero, iLimi
f1e0: 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65  t, iBreak); Vdbe
f1f0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
f200: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f   }.    if( p->pO
f210: 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 70  ffset ){.      p
f220: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  ->iOffset = iOff
f230: 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  set = ++pParse->
f240: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72  nMem;.      pPar
f250: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a  se->nMem++;   /*
f260: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74   Allocate an ext
f270: 72 61 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ra register for 
f280: 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a  limit+offset */.
f290: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f2a0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d  rCode(pParse, p-
f2b0: 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65  >pOffset, iOffse
f2c0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
f2d0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
f2e0: 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66  P_MustBeInt, iOf
f2f0: 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65 72  fset); VdbeCover
f300: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64  age(v);.      Vd
f310: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  beComment((v, "O
f320: 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29  FFSET counter"))
f330: 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d 20  ;.      addr1 = 
f340: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f350: 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  1(v, OP_IfPos, i
f360: 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76  Offset); VdbeCov
f370: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
f380: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f390: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
f3a0: 20 30 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20   0, iOffset);.  
f3b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
f3c0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
f3d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f3e0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
f3f0: 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c 20 69 4f  _Add, iLimit, iO
f400: 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 2b 31  ffset, iOffset+1
f410: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
f420: 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b  ment((v, "LIMIT+
f430: 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20 20  OFFSET"));.     
f440: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
f450: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
f460: 5f 49 66 50 6f 73 2c 20 69 4c 69 6d 69 74 29 3b  _IfPos, iLimit);
f470: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
f480: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f490: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f4a0: 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 69 4f 66  Integer, -1, iOf
f4b0: 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 73  fset+1);.      s
f4c0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
f4d0: 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
f4e0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64    }.  }.}..#ifnd
f4f0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
f500: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f  OMPOUND_SELECT./
f510: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
f520: 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c  appropriate coll
f530: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
f540: 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63  or the iCol-th c
f550: 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20  olumn of.** the 
f560: 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20 74  result set for t
f570: 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65  he compound-sele
f580: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70 22  ct statement "p"
f590: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
f5a0: 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20  f.** the column 
f5b0: 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63  has no default c
f5c0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
f5d0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  e..**.** The col
f5e0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
f5f0: 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  for the compound
f600: 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65 6e   select is taken
f610: 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66   from the.** lef
f620: 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74  t-most term of t
f630: 68 65 20 73 65 6c 65 63 74 20 74 68 61 74 20 68  he select that h
f640: 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  as a collating s
f650: 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74  equence..*/.stat
f660: 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74  ic CollSeq *mult
f670: 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50  iSelectCollSeq(P
f680: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
f690: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f  lect *p, int iCo
f6a0: 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  l){.  CollSeq *p
f6b0: 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  Ret;.  if( p->pP
f6c0: 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65 74  rior ){.    pRet
f6d0: 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
f6e0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
f6f0: 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a  >pPrior, iCol);.
f700: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65    }else{.    pRe
f710: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  t = 0;.  }.  ass
f720: 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a  ert( iCol>=0 );.
f730: 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 26 26    if( pRet==0 &&
f740: 20 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d   iCol<p->pEList-
f750: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 70 52  >nExpr ){.    pR
f760: 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
f770: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
f780: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  p->pEList->a[iCo
f790: 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20  l].pExpr);.  }. 
f7a0: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
f7b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63  ./*.** The selec
f7c0: 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  t statement pass
f7d0: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
f7e0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
f7f0: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a  compound SELECT.
f800: 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52  ** with an ORDER
f810: 20 42 59 20 63 6c 61 75 73 65 2e 20 54 68 69 73   BY clause. This
f820: 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
f830: 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20  tes and returns 
f840: 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73 74 72  a KeyInfo.** str
f850: 75 63 74 75 72 65 20 73 75 69 74 61 62 6c 65 20  ucture suitable 
f860: 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67  for implementing
f870: 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a   the ORDER BY..*
f880: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
f890: 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ld the KeyInfo s
f8a0: 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61  tructure is obta
f8b0: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
f8c0: 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  . The calling.**
f8d0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73   function is res
f8e0: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73  ponsible for ens
f8f0: 75 72 69 6e 67 20 74 68 61 74 20 74 68 69 73 20  uring that this 
f900: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65  structure is eve
f910: 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64  ntually.** freed
f920: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49  ..*/.static KeyI
f930: 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74  nfo *multiSelect
f940: 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 50  OrderByKeyInfo(P
f950: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
f960: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 6e 45 78  lect *p, int nEx
f970: 74 72 61 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  tra){.  ExprList
f980: 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e   *pOrderBy = p->
f990: 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20  pOrderBy;.  int 
f9a0: 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  nOrderBy = p->pO
f9b0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
f9c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
f9d0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79  Parse->db;.  Key
f9e0: 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20 73 71 6c  Info *pRet = sql
f9f0: 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
fa00: 28 64 62 2c 20 6e 4f 72 64 65 72 42 79 2b 6e 45  (db, nOrderBy+nE
fa10: 78 74 72 61 2c 20 31 29 3b 0a 20 20 69 66 28 20  xtra, 1);.  if( 
fa20: 70 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  pRet ){.    int 
fa30: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
fa40: 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
fa50: 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  {.      struct E
fa60: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
fa70: 74 65 6d 20 3d 20 26 70 4f 72 64 65 72 42 79 2d  tem = &pOrderBy-
fa80: 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 45 78 70  >a[i];.      Exp
fa90: 72 20 2a 70 54 65 72 6d 20 3d 20 70 49 74 65 6d  r *pTerm = pItem
faa0: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 43  ->pExpr;.      C
fab0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a  ollSeq *pColl;..
fac0: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
fad0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
fae0: 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ate ){.        p
faf0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
fb00: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
fb10: 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
fb20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
fb30: 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
fb40: 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
fb50: 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  , p, pItem->u.x.
fb60: 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 29 3b 0a  iOrderByCol-1);.
fb70: 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
fb80: 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64  l==0 ) pColl = d
fb90: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
fba0: 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
fbb0: 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20  a[i].pExpr =.   
fbc0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
fbd0: 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69  prAddCollateStri
fbe0: 6e 67 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  ng(pParse, pTerm
fbf0: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
fc00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
fc10: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
fc20: 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
fc30: 28 70 52 65 74 29 20 29 3b 0a 20 20 20 20 20 20  (pRet) );.      
fc40: 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  pRet->aColl[i] =
fc50: 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 52   pColl;.      pR
fc60: 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  et->aSortOrder[i
fc70: 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ] = pOrderBy->a[
fc80: 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
fc90: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
fca0: 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64  n pRet;.}..#ifnd
fcb0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
fcc0: 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  TE./*.** This ro
fcd0: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
fce0: 56 44 42 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d  VDBE code to com
fcf0: 70 75 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  pute the content
fd00: 20 6f 66 20 61 20 57 49 54 48 20 52 45 43 55 52   of a WITH RECUR
fd10: 53 49 56 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66  SIVE.** query of
fd20: 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
fd30: 20 20 20 3c 72 65 63 75 72 73 69 76 65 2d 74 61     <recursive-ta
fd40: 62 6c 65 3e 20 41 53 20 28 3c 73 65 74 75 70 2d  ble> AS (<setup-
fd50: 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c  query> UNION [AL
fd60: 4c 5d 20 3c 72 65 63 75 72 73 69 76 65 2d 71 75  L] <recursive-qu
fd70: 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20 20 20 20  ery>).**        
fd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd90: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20   \___________/  
fda0: 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
fdb0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20  ___________/.** 
fdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdd0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
fde0: 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ior             
fdf0: 20 20 20 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a           p.**.**
fe00: 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 65 78 61  .** There is exa
fe10: 63 74 6c 79 20 6f 6e 65 20 72 65 66 65 72 65 6e  ctly one referen
fe20: 63 65 20 74 6f 20 74 68 65 20 72 65 63 75 72 73  ce to the recurs
fe30: 69 76 65 2d 74 61 62 6c 65 20 69 6e 20 74 68 65  ive-table in the
fe40: 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20   FROM clause.** 
fe50: 6f 66 20 72 65 63 75 72 73 69 76 65 2d 71 75 65  of recursive-que
fe60: 72 79 2c 20 6d 61 72 6b 65 64 20 77 69 74 68 20  ry, marked with 
fe70: 74 68 65 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d  the SrcList->a[]
fe80: 2e 69 73 52 65 63 75 72 73 69 76 65 20 66 6c 61  .isRecursive fla
fe90: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 74  g..**.** The set
fea0: 75 70 2d 71 75 65 72 79 20 72 75 6e 73 20 6f 6e  up-query runs on
feb0: 63 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ce to generate a
fec0: 6e 20 69 6e 69 74 69 61 6c 20 73 65 74 20 6f 66  n initial set of
fed0: 20 72 6f 77 73 20 74 68 61 74 20 67 6f 0a 2a 2a   rows that go.**
fee0: 20 69 6e 74 6f 20 61 20 51 75 65 75 65 20 74 61   into a Queue ta
fef0: 62 6c 65 2e 20 20 52 6f 77 73 20 61 72 65 20 65  ble.  Rows are e
ff00: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
ff10: 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 6f 6e  e Queue table on
ff20: 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45 61  e by.** one.  Ea
ff30: 63 68 20 72 6f 77 20 65 78 74 72 61 63 74 65 64  ch row extracted
ff40: 20 66 72 6f 6d 20 51 75 65 75 65 20 69 73 20 6f   from Queue is o
ff50: 75 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20  utput to pDest. 
ff60: 20 54 68 65 6e 20 74 68 65 20 73 69 6e 67 6c 65   Then the single
ff70: 0a 2a 2a 20 65 78 74 72 61 63 74 65 64 20 72 6f  .** extracted ro
ff80: 77 20 28 6e 6f 77 20 69 6e 20 74 68 65 20 69 43  w (now in the iC
ff90: 75 72 72 65 6e 74 20 74 61 62 6c 65 29 20 62 65  urrent table) be
ffa0: 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e 74 65 6e  comes the conten
ffb0: 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63 75  t of the.** recu
ffc0: 72 73 69 76 65 2d 74 61 62 6c 65 20 66 6f 72 20  rsive-table for 
ffd0: 61 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72  a recursive-quer
ffe0: 79 20 72 75 6e 2e 20 20 54 68 65 20 6f 75 74 70  y run.  The outp
fff0: 75 74 20 6f 66 20 74 68 65 20 72 65 63 75 72 73  ut of the recurs
10000 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20 69 73 20  ive-query.** is 
10010 61 64 64 65 64 20 62 61 63 6b 20 69 6e 74 6f 20  added back into 
10020 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e  the Queue table.
10030 20 20 54 68 65 6e 20 61 6e 6f 74 68 65 72 20 72    Then another r
10040 6f 77 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ow is extracted 
10050 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a 20 61 6e  from Queue.** an
10060 64 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20  d the iteration 
10070 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74 69 6c 20  continues until 
10080 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
10090 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20  is empty..**.** 
100a0 49 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  If the compound 
100b0 71 75 65 72 79 20 6f 70 65 72 61 74 6f 72 20 69  query operator i
100c0 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f 20  s UNION then no 
100d0 64 75 70 6c 69 63 61 74 65 20 72 6f 77 73 20 61  duplicate rows a
100e0 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e 73 65 72  re ever.** inser
100f0 74 65 64 20 69 6e 74 6f 20 74 68 65 20 51 75 65  ted into the Que
10100 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 69  ue table.  The i
10110 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6b  Distinct table k
10120 65 65 70 73 20 61 20 63 6f 70 79 20 6f 66 20 61  eeps a copy of a
10130 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68 61 74 20  ll rows.** that 
10140 68 61 76 65 20 65 76 65 72 20 62 65 65 6e 20 69  have ever been i
10150 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 51 75 65  nserted into Que
10160 75 65 20 61 6e 64 20 63 61 75 73 65 73 20 64 75  ue and causes du
10170 70 6c 69 63 61 74 65 73 20 74 6f 20 62 65 0a 2a  plicates to be.*
10180 2a 20 64 69 73 63 61 72 64 65 64 2e 20 20 49 66  * discarded.  If
10190 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73   the operator is
101a0 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74 68 65 6e   UNION ALL, then
101b0 20 64 75 70 6c 69 63 61 74 65 73 20 61 72 65 20   duplicates are 
101c0 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a 20  allowed..** .** 
101d0 49 66 20 74 68 65 20 71 75 65 72 79 20 68 61 73  If the query has
101e0 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68   an ORDER BY, th
101f0 65 6e 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  en entries in th
10200 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 61 72  e Queue table ar
10210 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20 4f 52 44  e kept in.** ORD
10220 45 52 20 42 59 20 6f 72 64 65 72 20 61 6e 64 20  ER BY order and 
10230 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
10240 69 73 20 65 78 74 72 61 63 74 65 64 20 66 6f 72  is extracted for
10250 20 65 61 63 68 20 63 79 63 6c 65 2e 20 20 57 69   each cycle.  Wi
10260 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f 52 44 45  thout.** an ORDE
10270 52 20 42 59 2c 20 74 68 65 20 51 75 65 75 65 20  R BY, the Queue 
10280 74 61 62 6c 65 20 69 73 20 6a 75 73 74 20 61 20  table is just a 
10290 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  FIFO..**.** If a
102a0 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 69 73   LIMIT clause is
102b0 20 70 72 6f 76 69 64 65 64 2c 20 74 68 65 6e 20   provided, then 
102c0 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20 73 74  the iteration st
102d0 6f 70 73 20 61 66 74 65 72 20 4c 49 4d 49 54 20  ops after LIMIT 
102e0 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20 62 65 65  rows.** have bee
102f0 6e 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73  n output to pDes
10300 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f 66 20 7a  t.  A LIMIT of z
10310 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74  ero means to out
10320 70 75 74 20 6e 6f 20 72 6f 77 73 20 61 6e 64 20  put no rows and 
10330 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 4c 49  a.** negative LI
10340 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74  MIT means to out
10350 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49  put all rows.  I
10360 66 20 74 68 65 72 65 20 69 73 20 61 6c 73 6f 20  f there is also 
10370 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  an OFFSET clause
10380 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f 73 69 74  .** with a posit
10390 69 76 65 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  ive value, then 
103a0 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54  the first OFFSET
103b0 20 6f 75 74 70 75 74 73 20 61 72 65 20 64 69 73   outputs are dis
103c0 63 61 72 64 65 64 20 72 61 74 68 65 72 0a 2a 2a  carded rather.**
103d0 20 74 68 61 6e 20 62 65 69 6e 67 20 73 65 6e 74   than being sent
103e0 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65 20   to pDest.  The 
103f0 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64 6f 65 73  LIMIT count does
10400 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e 74 69 6c   not begin until
10410 20 61 66 74 65 72 20 4f 46 46 53 45 54 0a 2a 2a   after OFFSET.**
10420 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20   rows have been 
10430 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74  skipped..*/.stat
10440 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
10450 57 69 74 68 52 65 63 75 72 73 69 76 65 51 75 65  WithRecursiveQue
10460 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ry(.  Parse *pPa
10470 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
10480 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
10490 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
104a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
104b0 20 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43   recursive SELEC
104c0 54 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  T to be coded */
104d0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
104e0 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
104f0 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
10500 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
10510 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20    SrcList *pSrc 
10520 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20 20 20 20  = p->pSrc;      
10530 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
10540 73 65 20 6f 66 20 74 68 65 20 72 65 63 75 72 73  se of the recurs
10550 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ive query */.  i
10560 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c  nt nCol = p->pEL
10570 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a 20  ist->nExpr;  /* 
10580 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
10590 73 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69  s in the recursi
105a0 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 56 64  ve table */.  Vd
105b0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
105c0 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54  pVdbe;      /* T
105d0 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
105e0 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73  ement under cons
105f0 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65  truction */.  Se
10600 6c 65 63 74 20 2a 70 53 65 74 75 70 20 3d 20 70  lect *pSetup = p
10610 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f 2a 20 54  ->pPrior;   /* T
10620 68 65 20 73 65 74 75 70 20 71 75 65 72 79 20 2a  he setup query *
10630 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b  /.  int addrTop;
10640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10650 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
10660 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
10670 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61  drCont, addrBrea
10680 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f 4e 54 49  k;      /* CONTI
10690 4e 55 45 20 61 6e 64 20 42 52 45 41 4b 20 61 64  NUE and BREAK ad
106a0 64 72 65 73 73 65 73 20 2a 2f 0a 20 20 69 6e 74  dresses */.  int
106b0 20 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 20 20   iCurrent = 0;  
106c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
106d0 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e Current table 
106e0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43 75 72 72  */.  int regCurr
106f0 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ent;            
10700 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
10710 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e 74 20 74  olding Current t
10720 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 51  able */.  int iQ
10730 75 65 75 65 3b 20 20 20 20 20 20 20 20 20 20 20  ueue;           
10740 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 51          /* The Q
10750 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ueue table */.  
10760 69 6e 74 20 69 44 69 73 74 69 6e 63 74 20 3d 20  int iDistinct = 
10770 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
10780 20 54 6f 20 65 6e 73 75 72 65 20 75 6e 69 71 75   To ensure uniqu
10790 65 20 72 65 73 75 6c 74 73 20 69 66 20 55 4e 49  e results if UNI
107a0 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  ON */.  int eDes
107b0 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b 20 20 20  t = SRT_Fifo;   
107c0 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
107d0 77 72 69 74 65 20 74 6f 20 51 75 65 75 65 20 2a  write to Queue *
107e0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
107f0 65 73 74 51 75 65 75 65 3b 20 20 20 20 20 20 20  estQueue;       
10800 20 20 2f 2a 20 53 65 6c 65 63 74 44 65 73 74 20    /* SelectDest 
10810 74 61 72 67 65 74 74 69 6e 67 20 74 68 65 20 51  targetting the Q
10820 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ueue table */.  
10830 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
10840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10850 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
10860 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
10870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10880 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
10890 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
108a0 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
108b0 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
108c0 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  BY clause */.  E
108d0 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
108e0 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20  ffset;       /* 
108f0 53 61 76 65 64 20 4c 49 4d 49 54 20 61 6e 64 20  Saved LIMIT and 
10900 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 6e 74 20  OFFSET */.  int 
10910 72 65 67 4c 69 6d 69 74 2c 20 72 65 67 4f 66 66  regLimit, regOff
10920 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 52 65 67  set;      /* Reg
10930 69 73 74 65 72 73 20 75 73 65 64 20 62 79 20 4c  isters used by L
10940 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
10950 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20  */..  /* Obtain 
10960 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f  authorization to
10970 20 64 6f 20 61 20 72 65 63 75 72 73 69 76 65 20   do a recursive 
10980 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 73  query */.  if( s
10990 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
109a0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52  pParse, SQLITE_R
109b0 45 43 55 52 53 49 56 45 2c 20 30 2c 20 30 2c 20  ECURSIVE, 0, 0, 
109c0 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  0) ) return;..  
109d0 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20 4c  /* Process the L
109e0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
109f0 63 6c 61 75 73 65 73 2c 20 69 66 20 74 68 65 79  clauses, if they
10a00 20 65 78 69 73 74 20 2a 2f 0a 20 20 61 64 64 72   exist */.  addr
10a10 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
10a20 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
10a30 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
10a40 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
10a50 20 70 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a   p, addrBreak);.
10a60 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
10a70 69 6d 69 74 3b 0a 20 20 70 4f 66 66 73 65 74 20  imit;.  pOffset 
10a80 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
10a90 72 65 67 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c  regLimit = p->iL
10aa0 69 6d 69 74 3b 0a 20 20 72 65 67 4f 66 66 73 65  imit;.  regOffse
10ab0 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a  t = p->iOffset;.
10ac0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d    p->pLimit = p-
10ad0 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
10ae0 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69  p->iLimit = p->i
10af0 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4f  Offset = 0;.  pO
10b00 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
10b10 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61  erBy;..  /* Loca
10b20 74 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  te the cursor nu
10b30 6d 62 65 72 20 6f 66 20 74 68 65 20 43 75 72 72  mber of the Curr
10b40 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66  ent table */.  f
10b50 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59 53 28 69  or(i=0; ALWAYS(i
10b60 3c 70 53 72 63 2d 3e 6e 53 72 63 29 3b 20 69 2b  <pSrc->nSrc); i+
10b70 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 53 72 63  +){.    if( pSrc
10b80 2d 3e 61 5b 69 5d 2e 69 73 52 65 63 75 72 73 69  ->a[i].isRecursi
10b90 76 65 20 29 7b 0a 20 20 20 20 20 20 69 43 75 72  ve ){.      iCur
10ba0 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69  rent = pSrc->a[i
10bb0 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ].iCursor;.     
10bc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
10bd0 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
10be0 20 63 75 72 73 6f 72 73 20 6e 75 6d 62 65 72 73   cursors numbers
10bf0 20 66 6f 72 20 51 75 65 75 65 20 61 6e 64 20 44   for Queue and D
10c00 69 73 74 69 6e 63 74 2e 20 20 54 68 65 20 63 75  istinct.  The cu
10c10 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a  rsor number for.
10c20 20 20 2a 2a 20 74 68 65 20 44 69 73 74 69 6e 63    ** the Distinc
10c30 74 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20  t table must be 
10c40 65 78 61 63 74 6c 79 20 6f 6e 65 20 67 72 65 61  exactly one grea
10c50 74 65 72 20 74 68 61 6e 20 51 75 65 75 65 20 69  ter than Queue i
10c60 6e 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72  n order.  ** for
10c70 20 74 68 65 20 53 52 54 5f 44 69 73 74 46 69 66   the SRT_DistFif
10c80 6f 20 61 6e 64 20 53 52 54 5f 44 69 73 74 51 75  o and SRT_DistQu
10c90 65 75 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73  eue destinations
10ca0 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69   to work. */.  i
10cb0 51 75 65 75 65 20 3d 20 70 50 61 72 73 65 2d 3e  Queue = pParse->
10cc0 6e 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d  nTab++;.  if( p-
10cd0 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b  >op==TK_UNION ){
10ce0 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72  .    eDest = pOr
10cf0 64 65 72 42 79 20 3f 20 53 52 54 5f 44 69 73 74  derBy ? SRT_Dist
10d00 51 75 65 75 65 20 3a 20 53 52 54 5f 44 69 73 74  Queue : SRT_Dist
10d10 46 69 66 6f 3b 0a 20 20 20 20 69 44 69 73 74 69  Fifo;.    iDisti
10d20 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
10d30 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ab++;.  }else{. 
10d40 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65     eDest = pOrde
10d50 72 42 79 20 3f 20 53 52 54 5f 51 75 65 75 65 20  rBy ? SRT_Queue 
10d60 3a 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a  : SRT_Fifo;.  }.
10d70 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
10d80 65 73 74 49 6e 69 74 28 26 64 65 73 74 51 75 65  estInit(&destQue
10d90 75 65 2c 20 65 44 65 73 74 2c 20 69 51 75 65 75  ue, eDest, iQueu
10da0 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  e);..  /* Alloca
10db0 74 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20 43  te cursors for C
10dc0 75 72 72 65 6e 74 2c 20 51 75 65 75 65 2c 20 61  urrent, Queue, a
10dd0 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a  nd Distinct. */.
10de0 20 20 72 65 67 43 75 72 72 65 6e 74 20 3d 20 2b    regCurrent = +
10df0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
10e00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10e10 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65  p3(v, OP_OpenPse
10e20 75 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20 72  udo, iCurrent, r
10e30 65 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29  egCurrent, nCol)
10e40 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
10e50 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   ){.    KeyInfo 
10e60 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74  *pKeyInfo = mult
10e70 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65  iSelectOrderByKe
10e80 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c  yInfo(pParse, p,
10e90 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
10ea0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
10eb0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
10ec0 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79  iQueue, pOrderBy
10ed0 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20  ->nExpr+2, 0,.  
10ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ef0 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
10f00 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
10f10 3b 0a 20 20 20 20 64 65 73 74 51 75 65 75 65 2e  ;.    destQueue.
10f20 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
10f30 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rBy;.  }else{.  
10f40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10f50 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
10f60 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c  hemeral, iQueue,
10f70 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64   nCol);.  }.  Vd
10f80 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51  beComment((v, "Q
10f90 75 65 75 65 20 74 61 62 6c 65 22 29 29 3b 0a 20  ueue table"));. 
10fa0 20 69 66 28 20 69 44 69 73 74 69 6e 63 74 20 29   if( iDistinct )
10fb0 7b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65  {.    p->addrOpe
10fc0 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74  nEphm[0] = sqlit
10fd0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10fe0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
10ff0 2c 20 69 44 69 73 74 69 6e 63 74 2c 20 30 29 3b  , iDistinct, 0);
11000 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
11010 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
11020 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  eral;.  }..  /* 
11030 44 65 74 61 63 68 20 74 68 65 20 4f 52 44 45 52  Detach the ORDER
11040 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20   BY clause from 
11050 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  the compound SEL
11060 45 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64  ECT */.  p->pOrd
11070 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  erBy = 0;..  /* 
11080 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
11090 73 20 6f 66 20 74 68 65 20 73 65 74 75 70 2d 71  s of the setup-q
110a0 75 65 72 79 20 69 6e 20 51 75 65 75 65 2e 20 2a  uery in Queue. *
110b0 2f 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78  /.  pSetup->pNex
110c0 74 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71  t = 0;.  rc = sq
110d0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
110e0 73 65 2c 20 70 53 65 74 75 70 2c 20 26 64 65 73  se, pSetup, &des
110f0 74 51 75 65 75 65 29 3b 0a 20 20 70 53 65 74 75  tQueue);.  pSetu
11100 70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  p->pNext = p;.  
11110 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
11120 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71  d_of_recursive_q
11130 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64  uery;..  /* Find
11140 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e   the next row in
11150 20 74 68 65 20 51 75 65 75 65 20 61 6e 64 20 6f   the Queue and o
11160 75 74 70 75 74 20 74 68 61 74 20 72 6f 77 20 2a  utput that row *
11170 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71  /.  addrTop = sq
11180 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11190 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 51  v, OP_Rewind, iQ
111a0 75 65 75 65 2c 20 61 64 64 72 42 72 65 61 6b 29  ueue, addrBreak)
111b0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
111c0 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65  );..  /* Transfe
111d0 72 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69  r the next row i
111e0 6e 20 51 75 65 75 65 20 6f 76 65 72 20 74 6f 20  n Queue over to 
111f0 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 73 71 6c  Current */.  sql
11200 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
11210 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43  , OP_NullRow, iC
11220 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54 6f 20 72  urrent); /* To r
11230 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68  eset column cach
11240 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65  e */.  if( pOrde
11250 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
11260 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
11270 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75 65 75  OP_Column, iQueu
11280 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  e, pOrderBy->nEx
11290 70 72 2b 31 2c 20 72 65 67 43 75 72 72 65 6e 74  pr+1, regCurrent
112a0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
112b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
112c0 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c  2(v, OP_RowData,
112d0 20 69 51 75 65 75 65 2c 20 72 65 67 43 75 72 72   iQueue, regCurr
112e0 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ent);.  }.  sqli
112f0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
11300 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 51 75 65   OP_Delete, iQue
11310 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75  ue);..  /* Outpu
11320 74 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77  t the single row
11330 20 69 6e 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20   in Current */. 
11340 20 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69   addrCont = sqli
11350 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
11360 28 76 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65  (v);.  codeOffse
11370 74 28 76 2c 20 72 65 67 4f 66 66 73 65 74 2c 20  t(v, regOffset, 
11380 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c  addrCont);.  sel
11390 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
113a0 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
113b0 74 2c 20 69 43 75 72 72 65 6e 74 2c 0a 20 20 20  t, iCurrent,.   
113c0 20 20 20 30 2c 20 30 2c 20 70 44 65 73 74 2c 20     0, 0, pDest, 
113d0 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72  addrCont, addrBr
113e0 65 61 6b 29 3b 0a 20 20 69 66 28 20 72 65 67 4c  eak);.  if( regL
113f0 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
11400 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
11410 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 72 65 67 4c   OP_IfZero, regL
11420 69 6d 69 74 2c 20 61 64 64 72 42 72 65 61 6b 2c  imit, addrBreak,
11430 20 2d 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f   -1);.    VdbeCo
11440 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20  verage(v);.  }. 
11450 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
11460 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
11470 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20 45 78 65  Cont);..  /* Exe
11480 63 75 74 65 20 74 68 65 20 72 65 63 75 72 73 69  cute the recursi
11490 76 65 20 53 45 4c 45 43 54 20 74 61 6b 69 6e 67  ve SELECT taking
114a0 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20   the single row 
114b0 69 6e 20 43 75 72 72 65 6e 74 20 61 73 0a 20 20  in Current as.  
114c0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  ** the value for
114d0 20 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 74   the recursive-t
114e0 61 62 6c 65 2e 20 53 74 6f 72 65 20 74 68 65 20  able. Store the 
114f0 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 51  results in the Q
11500 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  ueue..  */.  p->
11510 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 73 71  pPrior = 0;.  sq
11520 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
11530 73 65 2c 20 70 2c 20 26 64 65 73 74 51 75 65 75  se, p, &destQueu
11540 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  e);.  assert( p-
11550 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20  >pPrior==0 );.  
11560 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 53 65 74  p->pPrior = pSet
11570 75 70 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 72  up;..  /* Keep r
11580 75 6e 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 70 20  unning the loop 
11590 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65 20  until the Queue 
115a0 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 73 71  is empty */.  sq
115b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
115c0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
115d0 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74  ddrTop);.  sqlit
115e0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
115f0 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29  el(v, addrBreak)
11600 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73  ;..end_of_recurs
11610 69 76 65 5f 71 75 65 72 79 3a 0a 20 20 73 71 6c  ive_query:.  sql
11620 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
11630 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
11640 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70  ->pOrderBy);.  p
11650 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
11660 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d  derBy;.  p->pLim
11670 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70  it = pLimit;.  p
11680 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
11690 73 65 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  set;.  return;.}
116a0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
116b0 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 2f  E_OMIT_CTE */../
116c0 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
116d0 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  nces */.static i
116e0 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  nt multiSelectOr
116f0 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a  derBy(.  Parse *
11700 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
11710 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
11720 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
11730 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
11740 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
11750 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
11760 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
11770 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
11780 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
11790 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
117a0 73 20 2a 2f 0a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20  s */.);.../*.** 
117b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
117c0 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73  called to proces
117d0 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  s a compound que
117e0 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20  ry form from.** 
117f0 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  two or more sepa
11800 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73 69  rate queries usi
11810 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20  ng UNION, UNION 
11820 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a  ALL, EXCEPT, or.
11830 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a  ** INTERSECT.**.
11840 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f  ** "p" points to
11850 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
11860 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69  of the two queri
11870 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f  es.  the query o
11880 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73  n the.** left is
11890 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65   p->pPrior.  The
118a0 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c   left query coul
118b0 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70  d also be a comp
118c0 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e  ound query.** in
118d0 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73   which case this
118e0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
118f0 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
11900 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ely. .**.** The 
11910 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74  results of the t
11920 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74  otal query are t
11930 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
11940 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  o a destination.
11950 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74  ** of type eDest
11960 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20   with parameter 
11970 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  iParm..**.** Exa
11980 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65  mple 1:  Conside
11990 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f  r a three-way co
119a0 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65  mpound SQL state
119b0 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment..**.**     
119c0 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
119d0 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20   UNION SELECT b 
119e0 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45  FROM t2 UNION SE
119f0 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
11a00 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d  *.** This statem
11a10 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70  ent is parsed up
11a20 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
11a30 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20  **     SELECT c 
11a40 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20  FROM t3.**      
11a50 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d  |.**      `-----
11a60 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  >  SELECT b FROM
11a70 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   t2.**          
11a80 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
11a90 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d            `-----
11aa0 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f  ->  SELECT a FRO
11ab0 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  M t1.**.** The a
11ac0 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61  rrows in the dia
11ad0 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65  gram above repre
11ae0 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e  sent the Select.
11af0 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a  pPrior pointer..
11b00 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  ** So if this ro
11b10 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
11b20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20  with p equal to 
11b30 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68  the t3 query, th
11b40 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c  en.** pPrior wil
11b50 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72  l be the t2 quer
11b60 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62  y.  p->op will b
11b70 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68  e TK_UNION in th
11b80 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e  is case..**.** N
11b90 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75  otice that becau
11ba0 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51  se of the way SQ
11bb0 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70  Lite parses comp
11bc0 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68  ound SELECTs, th
11bd0 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
11be0 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67  selects always g
11bf0 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74  roup from left t
11c00 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74  o right..*/.stat
11c10 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
11c20 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
11c30 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
11c40 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
11c50 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
11c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11c70 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
11c80 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
11c90 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
11ca0 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
11cb0 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
11cc0 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
11cd0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
11ce0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20  SQLITE_OK;   /* 
11cf0 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f  Success code fro
11d00 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  m a subroutine *
11d10 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
11d20 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
11d30 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
11d40 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
11d50 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
11d60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
11d70 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
11d80 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
11d90 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
11da0 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72  t;      /* Alter
11db0 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73 74  native data dest
11dc0 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  ination */.  Sel
11dd0 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30  ect *pDelete = 0
11de0 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73  ;  /* Chain of s
11df0 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f  imple selects to
11e00 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c   delete */.  sql
11e10 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
11e20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
11e30 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66  onnection */.#if
11e40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11e50 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69  _EXPLAIN.  int i
11e60 53 75 62 31 20 3d 20 30 3b 20 20 20 20 20 20 20  Sub1 = 0;       
11e70 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65   /* EQP id of le
11e80 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f  ft-hand query */
11e90 0a 20 20 69 6e 74 20 69 53 75 62 32 20 3d 20 30  .  int iSub2 = 0
11ea0 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20  ;        /* EQP 
11eb0 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64  id of right-hand
11ec0 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66   query */.#endif
11ed0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
11ee0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
11ef0 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63  ER BY or LIMIT c
11f00 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53  lause on prior S
11f10 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20  ELECTs.  Only.  
11f20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69 67  ** the last (rig
11f30 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20  ht-most) SELECT 
11f40 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61  in the series ma
11f50 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  y have an ORDER 
11f60 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a  BY or LIMIT..  *
11f70 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26 26  /.  assert( p &&
11f80 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f   p->pPrior );  /
11f90 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * Calling functi
11fa0 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  on guarantees th
11fb0 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73  is much */.  ass
11fc0 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
11fd0 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
11fe0 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  )==0 || p->op==T
11ff0 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  K_ALL || p->op==
12000 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62  TK_UNION );.  db
12010 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
12020 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
12030 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70  ior;.  dest = *p
12040 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50 72 69  Dest;.  if( pPri
12050 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  or->pOrderBy ){.
12060 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
12070 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45  Msg(pParse,"ORDE
12080 52 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75  R BY clause shou
12090 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
120a0 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
120b0 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
120c0 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
120d0 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
120e0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
120f0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69 6f  .  }.  if( pPrio
12100 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  r->pLimit ){.   
12110 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
12120 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20 63  (pParse,"LIMIT c
12130 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d  lause should com
12140 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62  e after %s not b
12150 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65  efore",.      se
12160 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
12170 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
12180 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
12190 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
121a0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
121b0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
121c0 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20  assert( v!=0 ); 
121d0 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61 6c 72   /* The VDBE alr
121e0 65 61 64 79 20 63 72 65 61 74 65 64 20 62 79 20  eady created by 
121f0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
12200 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65   */..  /* Create
12210 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
12220 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
12230 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20   if necessary.  
12240 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44  */.  if( dest.eD
12250 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
12260 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
12270 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
12280 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12290 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
122a0 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69 53  hemeral, dest.iS
122b0 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74  DParm, p->pEList
122c0 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 73 71  ->nExpr);.    sq
122d0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
122e0 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44  5(v, BTREE_UNORD
122f0 45 52 45 44 29 3b 0a 20 20 20 20 64 65 73 74 2e  ERED);.    dest.
12300 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c  eDest = SRT_Tabl
12310 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  e;.  }..  /* Mak
12320 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43  e sure all SELEC
12330 54 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  Ts in the statem
12340 65 6e 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  ent have the sam
12350 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
12360 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ents.  ** in the
12370 69 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a  ir result sets..
12380 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
12390 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72 69  ->pEList && pPri
123a0 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20  or->pEList );.  
123b0 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  if( p->pEList->n
123c0 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45  Expr!=pPrior->pE
123d0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
123e0 20 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61     if( p->selFla
123f0 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29  gs & SF_Values )
12400 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
12410 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
12420 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d 75 73 74  "all VALUES must
12430 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
12440 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 22 29  umber of terms")
12450 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12460 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
12470 73 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45  sg(pParse, "SELE
12480 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  CTs to the left 
12490 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 22  and right of %s"
124a0 0a 20 20 20 20 20 20 20 20 22 20 64 6f 20 6e 6f  .        " do no
124b0 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
124c0 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
124d0 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63   columns", selec
124e0 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
124f0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
12500 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
12510 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
12520 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
12530 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 69 66 28  E_OMIT_CTE.  if(
12540 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
12550 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  F_Recursive ){. 
12560 20 20 20 67 65 6e 65 72 61 74 65 57 69 74 68 52     generateWithR
12570 65 63 75 72 73 69 76 65 51 75 65 72 79 28 70 50  ecursiveQuery(pP
12580 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b  arse, p, &dest);
12590 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
125a0 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53  .  /* Compound S
125b0 45 4c 45 43 54 73 20 74 68 61 74 20 68 61 76 65  ELECTs that have
125c0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
125d0 75 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20  use are handled 
125e0 73 65 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f  separately..  */
125f0 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
12600 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  By ){.    return
12610 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
12620 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70  rBy(pParse, p, p
12630 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  Dest);.  }else..
12640 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
12650 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20  de for the left 
12660 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54  and right SELECT
12670 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
12680 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  /.  switch( p->o
12690 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
126a0 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _ALL: {.      in
126b0 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  t addr = 0;.    
126c0 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20    int nLimit;.  
126d0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72      assert( !pPr
126e0 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20  ior->pLimit );. 
126f0 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69       pPrior->iLi
12700 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b  mit = p->iLimit;
12710 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69  .      pPrior->i
12720 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66  Offset = p->iOff
12730 73 65 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  set;.      pPrio
12740 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  r->pLimit = p->p
12750 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72  Limit;.      pPr
12760 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70  ior->pOffset = p
12770 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->pOffset;.     
12780 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
12790 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65  er(iSub1, pParse
127a0 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
127b0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
127c0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
127d0 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74  e, pPrior, &dest
127e0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  );.      p->pLim
127f0 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  it = 0;.      p-
12800 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
12810 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
12820 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
12830 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
12840 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50     }.      p->pP
12850 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
12860 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69  p->iLimit = pPri
12870 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20  or->iLimit;.    
12880 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70    p->iOffset = p
12890 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a  Prior->iOffset;.
128a0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69        if( p->iLi
128b0 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  mit ){.        a
128c0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
128d0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
128e0 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 29  Zero, p->iLimit)
128f0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
12900 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
12910 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70  omment((v, "Jump
12920 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20   ahead if LIMIT 
12930 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20  reached"));.    
12940 20 20 7d 0a 20 20 20 20 20 20 65 78 70 6c 61 69    }.      explai
12950 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
12960 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  2, pParse->iNext
12970 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
12980 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
12990 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
129a0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
129b0 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
129c0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44  E_OK );.      pD
129d0 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
129e0 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
129f0 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
12a00 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
12a10 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c   += pPrior->nSel
12a20 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 69 66  ectRow;.      if
12a30 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  ( pPrior->pLimit
12a40 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
12a50 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
12a60 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c 20  pPrior->pLimit, 
12a70 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20 20 20  &nLimit).       
12a80 26 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70  && nLimit>0 && p
12a90 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 28  ->nSelectRow > (
12aa0 75 36 34 29 6e 4c 69 6d 69 74 20 0a 20 20 20 20  u64)nLimit .    
12ab0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e    ){.        p->
12ac0 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 4c 69  nSelectRow = nLi
12ad0 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  mit;.      }.   
12ae0 20 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20     if( addr ){. 
12af0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
12b00 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
12b10 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dr);.      }.   
12b20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
12b30 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
12b40 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  PT:.    case TK_
12b50 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69  UNION: {.      i
12b60 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20  nt unionTab;    
12b70 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
12b80 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
12b90 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20  y table holding 
12ba0 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20  result */.      
12bb0 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20  u8 op = 0;      
12bc0 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53   /* One of the S
12bd0 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74  RT_ operations t
12be0 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20  o apply to self 
12bf0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69  */.      int pri
12c00 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  orOp;     /* The
12c10 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20   SRT_ operation 
12c20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f  to apply to prio
12c30 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20  r selects */.   
12c40 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c     Expr *pLimit,
12c50 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61   *pOffset; /* Sa
12c60 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d  ved values of p-
12c70 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e  >nLimit and p->n
12c80 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20  Offset */.      
12c90 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
12ca0 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69 6f 6e  SelectDest union
12cb0 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 74 65 73  dest;..      tes
12cc0 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
12cd0 5f 45 58 43 45 50 54 20 29 3b 0a 20 20 20 20 20  _EXCEPT );.     
12ce0 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70   testcase( p->op
12cf0 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
12d00 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53 52      priorOp = SR
12d10 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69  T_Union;.      i
12d20 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70  f( dest.eDest==p
12d30 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20  riorOp ){.      
12d40 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73    /* We can reus
12d50 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  e a temporary ta
12d60 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ble generated by
12d70 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72   a SELECT to our
12d80 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68  .        ** righ
12d90 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
12da0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
12db0 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20  >pLimit==0 );   
12dc0 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65     /* Not allowe
12dd0 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c  d on leftward el
12de0 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  ements */.      
12df0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66    assert( p->pOf
12e00 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 2f  fset==0 );     /
12e10 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e  * Not allowed on
12e20 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e   leftward elemen
12e30 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e  ts */.        un
12e40 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 53  ionTab = dest.iS
12e50 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  DParm;.      }el
12e60 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57  se{.        /* W
12e70 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  e will need to c
12e80 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65  reate our own te
12e90 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f  mporary table to
12ea0 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20   hold the.      
12eb0 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74    ** intermediat
12ec0 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20  e results..     
12ed0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e     */.        un
12ee0 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d  ionTab = pParse-
12ef0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
12f00 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
12f10 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  erBy==0 );.     
12f20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
12f30 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12f40 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
12f50 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
12f60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
12f70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
12f80 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
12f90 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
12fa0 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[0] = addr;.  
12fb0 20 20 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d        findRightm
12fc0 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73  ost(p)->selFlags
12fd0 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
12fe0 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61 73  eral;.        as
12ff0 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
13000 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
13010 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
13020 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
13030 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20  to our left.    
13040 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
13050 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64  t( !pPrior->pOrd
13060 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20 73 71  erBy );.      sq
13070 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
13080 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20  nit(&uniondest, 
13090 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61  priorOp, unionTa
130a0 62 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  b);.      explai
130b0 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
130c0 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  1, pParse->iNext
130d0 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
130e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
130f0 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
13100 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b  or, &uniondest);
13110 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
13120 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
13130 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
13140 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
13150 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
13160 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nt SELECT statem
13170 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ent.      */.   
13180 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
13190 5f 45 58 43 45 50 54 20 29 7b 0a 20 20 20 20 20  _EXCEPT ){.     
131a0 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65     op = SRT_Exce
131b0 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  pt;.      }else{
131c0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
131d0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
131e0 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d   );.        op =
131f0 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20   SRT_Union;.    
13200 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72    }.      p->pPr
13210 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
13220 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
13230 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  t;.      p->pLim
13240 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  it = 0;.      pO
13250 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
13260 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  et;.      p->pOf
13270 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
13280 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74 20  uniondest.eDest 
13290 3d 20 6f 70 3b 0a 20 20 20 20 20 20 65 78 70 6c  = op;.      expl
132a0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
132b0 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub2, pParse->iNe
132c0 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
132d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
132e0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
132f0 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20   &uniondest);.  
13300 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
13310 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
13320 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6c       /* Query fl
13330 61 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69  attening in sqli
13340 74 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67 68  te3Select() migh
13350 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64  t refill p->pOrd
13360 65 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42  erBy..      ** B
13370 65 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74 65  e sure to delete
13380 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74 68   p->pOrderBy, th
13390 65 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69  erefore, to avoi
133a0 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e  d a memory leak.
133b0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
133c0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
133d0 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  db, p->pOrderBy)
133e0 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20  ;.      pDelete 
133f0 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
13400 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
13410 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
13420 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
13430 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
13440 4b 5f 55 4e 49 4f 4e 20 29 20 70 2d 3e 6e 53 65  K_UNION ) p->nSe
13450 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f  lectRow += pPrio
13460 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  r->nSelectRow;. 
13470 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
13480 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
13490 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  imit);.      p->
134a0 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
134b0 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
134c0 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20  t = pOffset;.   
134d0 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30     p->iLimit = 0
134e0 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73  ;.      p->iOffs
134f0 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f  et = 0;..      /
13500 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61  * Convert the da
13510 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72  ta in the tempor
13520 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77  ary table into w
13530 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20  hatever form.   
13540 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74     ** it is that
13550 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65   we currently ne
13560 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
13570 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 6f 6e     assert( union
13580 54 61 62 3d 3d 64 65 73 74 2e 69 53 44 50 61 72  Tab==dest.iSDPar
13590 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65 73 74 21  m || dest.eDest!
135a0 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20  =priorOp );.    
135b0 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
135c0 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20  !=priorOp ){.   
135d0 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
135e0 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a  iBreak, iStart;.
135f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13600 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
13610 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
13620 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
13630 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c  ){.          Sel
13640 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b  ect *pFirst = p;
13650 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
13660 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  ( pFirst->pPrior
13670 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72   ) pFirst = pFir
13680 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  st->pPrior;.    
13690 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f        generateCo
136a0 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
136b0 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c  , 0, pFirst->pEL
136c0 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ist);.        }.
136d0 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d          iBreak =
136e0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
136f0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
13700 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65    iCont = sqlite
13710 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
13720 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75  );.        compu
13730 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
13740 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65  (pParse, p, iBre
13750 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
13760 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13770 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69  , OP_Rewind, uni
13780 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 20  onTab, iBreak); 
13790 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
137a0 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20  .        iStart 
137b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
137c0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
137d0 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
137e0 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
137f0 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e  p->pEList, union
13800 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Tab,.           
13810 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
13820 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c  0, &dest, iCont,
13830 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
13840 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
13850 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
13860 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nt);.        sql
13870 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13880 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e  , OP_Next, union
13890 54 61 62 2c 20 69 53 74 61 72 74 29 3b 20 56 64  Tab, iStart); Vd
138a0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
138b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
138c0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
138d0 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
138e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
138f0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
13900 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
13910 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
13920 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
13930 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20  efault: assert( 
13940 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  p->op==TK_INTERS
13950 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20 69  ECT ); {.      i
13960 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20  nt tab1, tab2;. 
13970 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
13980 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a  iBreak, iStart;.
13990 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d        Expr *pLim
139a0 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20  it, *pOffset;.  
139b0 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
139c0 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 69      SelectDest i
139d0 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a 20 20  ntersectdest;.  
139e0 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 20      int r1;..   
139f0 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20     /* INTERSECT 
13a00 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  is different fro
13a10 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e  m the others sin
13a20 63 65 20 69 74 20 72 65 71 75 69 72 65 73 0a 20  ce it requires. 
13a30 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70       ** two temp
13a40 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48  orary tables.  H
13a50 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73 20  ence it has its 
13a60 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e  own case.  Begin
13a70 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c  .      ** by all
13a80 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c  ocating the tabl
13a90 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e  es we will need.
13aa0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13ab0 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab1 = pParse->n
13ac0 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62  Tab++;.      tab
13ad0 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  2 = pParse->nTab
13ae0 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ++;.      assert
13af0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
13b00 20 29 3b 0a 0a 20 20 20 20 20 20 61 64 64 72 20   );..      addr 
13b10 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
13b20 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
13b30 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20 30  hemeral, tab1, 0
13b40 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
13b50 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
13b60 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [0] == -1 );.   
13b70 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
13b80 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[0] = addr;.  
13b90 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f 73      findRightmos
13ba0 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  t(p)->selFlags |
13bb0 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72  = SF_UsesEphemer
13bc0 61 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  al;.      assert
13bd0 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a  ( p->pEList );..
13be0 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
13bf0 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72  e SELECTs to our
13c00 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f   left into tempo
13c10 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31  rary table "tab1
13c20 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
13c30 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
13c40 65 73 74 49 6e 69 74 28 26 69 6e 74 65 72 73 65  estInit(&interse
13c50 63 74 64 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f  ctdest, SRT_Unio
13c60 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20 20  n, tab1);.      
13c70 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
13c80 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d  r(iSub1, pParse-
13c90 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
13ca0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
13cb0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
13cc0 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74 65 72  , pPrior, &inter
13cd0 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20  sectdest);.     
13ce0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
13cf0 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
13d00 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
13d10 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
13d20 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
13d30 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61  ECT into tempora
13d40 72 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a  ry table "tab2".
13d50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
13d60 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
13d70 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
13d80 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62  enEphemeral, tab
13d90 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  2, 0);.      ass
13da0 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
13db0 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b  Ephm[1] == -1 );
13dc0 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  .      p->addrOp
13dd0 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72  enEphm[1] = addr
13de0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
13df0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69  r = 0;.      pLi
13e00 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
13e10 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
13e20 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66   = 0;.      pOff
13e30 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
13e40 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
13e50 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  et = 0;.      in
13e60 74 65 72 73 65 63 74 64 65 73 74 2e 69 53 44 50  tersectdest.iSDP
13e70 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20 20  arm = tab2;.    
13e80 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
13e90 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73  ger(iSub2, pPars
13ea0 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
13eb0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
13ec0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
13ed0 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73 65 63  se, p, &intersec
13ee0 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65  tdest);.      te
13ef0 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
13f00 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70  TE_OK );.      p
13f10 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69  Delete = p->pPri
13f20 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  or;.      p->pPr
13f30 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
13f40 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65      if( p->nSele
13f50 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e 53  ctRow>pPrior->nS
13f60 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53  electRow ) p->nS
13f70 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f  electRow = pPrio
13f80 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  r->nSelectRow;. 
13f90 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
13fa0 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
13fb0 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  imit);.      p->
13fc0 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
13fd0 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
13fe0 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 0a 20 20  t = pOffset;..  
13ff0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
14000 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65  code to take the
14010 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66   intersection of
14020 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61   the two tempora
14030 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  ry.      ** tabl
14040 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  es..      */.   
14050 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
14060 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66  List );.      if
14070 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52  ( dest.eDest==SR
14080 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
14090 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72      Select *pFir
140a0 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  st = p;.        
140b0 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70  while( pFirst->p
140c0 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d  Prior ) pFirst =
140d0 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b   pFirst->pPrior;
140e0 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74  .        generat
140f0 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
14100 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e  rse, 0, pFirst->
14110 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d  pEList);.      }
14120 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20  .      iBreak = 
14130 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
14140 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
14150 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
14160 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
14170 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
14180 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
14190 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
141a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
141b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
141c0 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65  wind, tab1, iBre
141d0 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
141e0 65 28 76 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  e(v);.      r1 =
141f0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
14200 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
14210 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
14220 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14230 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c  OP_RowKey, tab1,
14240 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
14250 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
14260 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
14270 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31   tab2, iCont, r1
14280 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 0); VdbeCovera
14290 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
142a0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
142b0 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
142c0 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
142d0 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
142e0 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31   p->pEList, tab1
142f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14300 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64          0, 0, &d
14310 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65  est, iCont, iBre
14320 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
14330 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
14340 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
14350 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14360 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
14370 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b  , tab1, iStart);
14380 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
14390 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
143a0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
143b0 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
143c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
143d0 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
143e0 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20   tab2, 0);.     
143f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14400 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
14410 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
14420 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
14430 0a 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f  ..  explainCompo
14440 73 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  site(pParse, p->
14450 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32  op, iSub1, iSub2
14460 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29  , p->op!=TK_ALL)
14470 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  ;..  /* Compute 
14480 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
14490 63 65 73 20 75 73 65 64 20 62 79 20 0a 20 20 2a  ces used by .  *
144a0 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  * temporary tabl
144b0 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70  es needed to imp
144c0 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f  lement the compo
144d0 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a  und select..  **
144e0 20 41 74 74 61 63 68 20 74 68 65 20 4b 65 79 49   Attach the KeyI
144f0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f  nfo structure to
14500 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74   all temporary t
14510 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ables..  **.  **
14520 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73   This section is
14530 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67 68   run by the righ
14540 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
14550 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20  atement only..  
14560 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
14570 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ents to the left
14580 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69   always skip thi
14590 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69 67  s part.  The rig
145a0 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c  ht-most.  ** SEL
145b0 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73  ECT might also s
145c0 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69 66  kip this part if
145d0 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52   it has no ORDER
145e0 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20   BY clause and. 
145f0 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c   ** no temp tabl
14600 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64 2e  es are required.
14610 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
14620 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65  elFlags & SF_Use
14630 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20  sEphemeral ){.  
14640 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
14650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14660 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
14670 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  */.    KeyInfo *
14680 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20  pKeyInfo;       
14690 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e       /* Collatin
146a0 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
146b0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
146c0 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f  .    Select *pLo
146d0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
146e0 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
146f0 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54  g through SELECT
14700 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20   statements */. 
14710 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43     CollSeq **apC
14720 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
14730 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
14740 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f  through pKeyInfo
14750 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20  ->aColl[] */.   
14760 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
14770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14780 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
14790 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65  mns in result se
147a0 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  t */..    assert
147b0 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b  ( p->pNext==0 );
147c0 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70  .    nCol = p->p
147d0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
147e0 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
147f0 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
14800 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20  (db, nCol, 1);. 
14810 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f     if( !pKeyInfo
14820 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
14830 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
14840 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
14850 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
14860 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43      for(i=0, apC
14870 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  oll=pKeyInfo->aC
14880 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  oll; i<nCol; i++
14890 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20  , apColl++){.   
148a0 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c     *apColl = mul
148b0 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
148c0 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
148d0 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43       if( 0==*apC
148e0 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  oll ){.        *
148f0 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66  apColl = db->pDf
14900 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
14910 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70      }..    for(p
14920 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
14930 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
14940 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  or){.      for(i
14950 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
14960 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
14970 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  = pLoop->addrOpe
14980 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20  nEphm[i];.      
14990 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
149a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
149b0 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68  [0] is unused th
149c0 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75  en [1] is also u
149d0 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61  nused.  So we ca
149e0 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  n.          ** a
149f0 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f  lways safely abo
14a00 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  rt as soon as th
14a10 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73  e first unused s
14a20 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a  lot is found */.
14a30 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
14a40 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  ( pLoop->addrOpe
14a50 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20  nEphm[1]<0 );.  
14a60 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
14a70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14a80 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
14a90 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43  geP2(v, addr, nC
14aa0 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
14ab0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
14ac0 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a  (v, addr, (char*
14ad0 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  )sqlite3KeyInfoR
14ae0 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 0a 20 20  ef(pKeyInfo),.  
14af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b00 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59            P4_KEY
14b10 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70  INFO);.        p
14b20 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
14b30 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20  hm[i] = -1;.    
14b40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
14b50 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
14b60 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d  f(pKeyInfo);.  }
14b70 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  ..multi_select_e
14b80 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53 64  nd:.  pDest->iSd
14b90 73 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b  st = dest.iSdst;
14ba0 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20  .  pDest->nSdst 
14bb0 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20  = dest.nSdst;.  
14bc0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
14bd0 65 74 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29  ete(db, pDelete)
14be0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14bf0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
14c00 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
14c10 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SELECT */../*.**
14c20 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74 20   Code an output 
14c30 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 61  subroutine for a
14c40 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65   coroutine imple
14c50 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a  mentation of a.*
14c60 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65 6e  * SELECT statmen
14c70 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74  t..**.** The dat
14c80 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20 69  a to be output i
14c90 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70  s contained in p
14ca0 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 72  In->iSdst.  Ther
14cb0 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53  e are.** pIn->nS
14cc0 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62  dst columns to b
14cd0 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73 74  e output.  pDest
14ce0 20 69 73 20 77 68 65 72 65 20 74 68 65 20 6f 75   is where the ou
14cf0 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  tput should.** b
14d00 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65  e sent..**.** re
14d10 67 52 65 74 75 72 6e 20 69 73 20 74 68 65 20 6e  gReturn is the n
14d20 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65 67  umber of the reg
14d30 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68  ister holding th
14d40 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20  e subroutine.** 
14d50 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e 0a  return address..
14d60 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65 76  **.** If regPrev
14d70 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  >0 then it is th
14d80 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72  e first register
14d90 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68 61   in a vector tha
14da0 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68 65  t.** records the
14db0 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
14dc0 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20  .  mem[regPrev] 
14dd0 69 73 20 61 20 66 6c 61 67 20 74 68 61 74 20 69  is a flag that i
14de0 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68  s false.** if th
14df0 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f 20  ere has been no 
14e00 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e  previous output.
14e10 20 20 49 66 20 72 65 67 50 72 65 76 3e 30 20 74    If regPrev>0 t
14e20 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67  hen code is.** g
14e30 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70 70  enerated to supp
14e40 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 2e  ress duplicates.
14e50 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75 73    pKeyInfo is us
14e60 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67  ed for comparing
14e70 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20  .** keys..**.** 
14e80 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f 75  If the LIMIT fou
14e90 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20  nd in p->iLimit 
14ea0 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d 70  is reached, jump
14eb0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a   immediately to.
14ec0 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74  ** iBreak..*/.st
14ed0 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61 74  atic int generat
14ee0 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
14ef0 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
14f00 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
14f10 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
14f20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
14f30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14f40 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
14f50 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ment */.  Select
14f60 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20 20  Dest *pIn,      
14f70 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73    /* Coroutine s
14f80 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f  upplying data */
14f90 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
14fa0 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57 68  Dest,      /* Wh
14fb0 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65 20  ere to send the 
14fc0 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65  data */.  int re
14fd0 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20 20  gReturn,        
14fe0 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20    /* The return 
14ff0 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  address register
15000 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65   */.  int regPre
15010 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v,            /*
15020 20 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c 74   Previous result
15030 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20 75   register.  No u
15040 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30 20 2a  niqueness if 0 *
15050 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
15060 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46  yInfo,      /* F
15070 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69 74  or comparing wit
15080 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  h previous entry
15090 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
150a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
150b0 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77 65   Jump here if we
150c0 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20 2a   hit the LIMIT *
150d0 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
150e0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
150f0 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b    int iContinue;
15100 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20  .  int addr;..  
15110 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
15120 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
15130 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20  ;.  iContinue = 
15140 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
15150 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53  abel(v);..  /* S
15160 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74  uppress duplicat
15170 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58  es for UNION, EX
15180 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53  CEPT, and INTERS
15190 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ECT .  */.  if( 
151a0 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20 69  regPrev ){.    i
151b0 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20 20 6a  nt j1, j2;.    j
151c0 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
151d0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
151e0 74 2c 20 72 65 67 50 72 65 76 29 3b 20 56 64 62  t, regPrev); Vdb
151f0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
15200 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64    j2 = sqlite3Vd
15210 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
15220 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 53 64  ompare, pIn->iSd
15230 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70  st, regPrev+1, p
15240 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20 20 20 20  In->nSdst,.     
15250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15260 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
15270 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65  sqlite3KeyInfoRe
15280 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f  f(pKeyInfo), P4_
15290 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71  KEYINFO);.    sq
152a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
152b0 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 32 2b 32  v, OP_Jump, j2+2
152c0 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6a 32 2b  , iContinue, j2+
152d0 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  2); VdbeCoverage
152e0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
152f0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
15300 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  j1);.    sqlite3
15310 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
15320 5f 43 6f 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73  _Copy, pIn->iSds
15330 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49  t, regPrev+1, pI
15340 6e 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20  n->nSdst-1);.   
15350 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15360 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
15370 2c 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20  , 1, regPrev);. 
15380 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d   }.  if( pParse-
15390 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
153a0 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  d ) return 0;.. 
153b0 20 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68 65   /* Suppress the
153c0 20 66 69 72 73 74 20 4f 46 46 53 45 54 20 65 6e   first OFFSET en
153d0 74 72 69 65 73 20 69 66 20 74 68 65 72 65 20 69  tries if there i
153e0 73 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75  s an OFFSET clau
153f0 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66  se.  */.  codeOf
15400 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73  fset(v, p->iOffs
15410 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a  et, iContinue);.
15420 0a 20 20 73 77 69 74 63 68 28 20 70 44 65 73 74  .  switch( pDest
15430 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f  ->eDest ){.    /
15440 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
15450 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67  lt as data using
15460 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20   a unique key.. 
15470 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
15480 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61  RT_Table:.    ca
15490 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a  se SRT_EphemTab:
154a0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20   {.      int r1 
154b0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
154c0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
154d0 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69     int r2 = sqli
154e0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
154f0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 74 65 73  arse);.      tes
15500 74 63 61 73 65 28 20 70 44 65 73 74 2d 3e 65 44  tcase( pDest->eD
15510 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29  est==SRT_Table )
15520 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
15530 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
15540 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a  SRT_EphemTab );.
15550 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15560 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
15570 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69  keRecord, pIn->i
15580 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
15590 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
155a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
155b0 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70  , OP_NewRowid, p
155c0 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
155d0 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
155e0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
155f0 50 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d  P_Insert, pDest-
15600 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c 20 72 32  >iSDParm, r1, r2
15610 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15620 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
15630 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
15640 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
15650 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
15660 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  se, r2);.      s
15670 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
15680 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
15690 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
156a0 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
156b0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
156c0 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  RY.    /* If we 
156d0 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73  are creating a s
156e0 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20  et for an "expr 
156f0 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
15700 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20   construct,.    
15710 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68  ** then there sh
15720 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65  ould be a single
15730 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61   item on the sta
15740 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a  ck.  Write this.
15750 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f      ** item into
15760 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77   the set table w
15770 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a  ith bogus data..
15780 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
15790 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
157a0 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 61   int r1;.      a
157b0 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73  ssert( pIn->nSds
157c0 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 44  t==1 );.      pD
157d0 65 73 74 2d 3e 61 66 66 53 64 73 74 20 3d 20 0a  est->affSdst = .
157e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
157f0 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
15800 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
15810 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61 66  pExpr, pDest->af
15820 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 72 31  fSdst);.      r1
15830 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
15840 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
15850 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15860 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
15870 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64  Record, pIn->iSd
15880 73 74 2c 20 31 2c 20 72 31 2c 20 26 70 44 65 73  st, 1, r1, &pDes
15890 74 2d 3e 61 66 66 53 64 73 74 2c 31 29 3b 0a 20  t->affSdst,1);. 
158a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
158b0 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
158c0 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  nge(pParse, pIn-
158d0 3e 69 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20  >iSdst, 1);.    
158e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
158f0 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
15900 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ert, pDest->iSDP
15910 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  arm, r1);.      
15920 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
15930 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
15940 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
15950 20 20 20 20 7d 0a 0a 23 69 66 20 30 20 20 2f 2a      }..#if 0  /*
15960 20 4e 65 76 65 72 20 6f 63 63 75 72 73 20 6f 6e   Never occurs on
15970 20 61 6e 20 4f 52 44 45 52 20 42 59 20 71 75 65   an ORDER BY que
15980 72 79 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20  ry */.    /* If 
15990 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e  any row exist in
159a0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
159b0 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63   record that fac
159c0 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20  t and abort..   
159d0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
159e0 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20  _Exists: {.     
159f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15a00 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
15a10 2c 20 31 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  , 1, pDest->iSDP
15a20 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  arm);.      /* T
15a30 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
15a40 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  will terminate t
15a50 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
15a60 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
15a70 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
15a80 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
15a90 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74   scalar select t
15aa0 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
15ab0 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  n expression, th
15ac0 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  en.    ** store 
15ad0 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
15ae0 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
15af0 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62  emory cell and b
15b00 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20  reak out.    ** 
15b10 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70  of the scan loop
15b20 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
15b30 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
15b40 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e     assert( pIn->
15b50 6e 53 64 73 74 3d 3d 31 20 29 3b 0a 20 20 20 20  nSdst==1 );.    
15b60 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
15b70 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49  eMove(pParse, pI
15b80 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d  n->iSdst, pDest-
15b90 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20  >iSDParm, 1);.  
15ba0 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
15bb0 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
15bc0 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
15bd0 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
15be0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
15bf0 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
15c00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
15c10 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a  QUERY */..    /*
15c20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
15c30 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71   stored in a seq
15c40 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
15c50 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69  rs.    ** starti
15c60 6e 67 20 61 74 20 70 44 65 73 74 2d 3e 69 53 64  ng at pDest->iSd
15c70 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f  st.  Then the co
15c80 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e  -routine yields.
15c90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
15ca0 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20   SRT_Coroutine: 
15cb0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 73  {.      if( pDes
15cc0 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20  t->iSdst==0 ){. 
15cd0 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69 53         pDest->iS
15ce0 64 73 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74  dst = sqlite3Get
15cf0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
15d00 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
15d10 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e 53         pDest->nS
15d20 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74  dst = pIn->nSdst
15d30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15d40 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
15d50 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  ove(pParse, pIn-
15d60 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69  >iSdst, pDest->i
15d70 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 6e 53 64  Sdst, pDest->nSd
15d80 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
15d90 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
15da0 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d  OP_Yield, pDest-
15db0 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  >iSDParm);.     
15dc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
15dd0 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66     /* If none of
15de0 20 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65 6e   the above, then
15df0 20 74 68 65 20 72 65 73 75 6c 74 20 64 65 73 74   the result dest
15e00 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a  ination must be.
15e10 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75      ** SRT_Outpu
15e20 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
15e30 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
15e40 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72 0a   with any other.
15e50 20 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69      ** destinati
15e60 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  on other than th
15e70 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20 61  e ones handled a
15e80 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74 70  bove or SRT_Outp
15e90 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ut..    **.    *
15ea0 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75 74  * For SRT_Output
15eb0 2c 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74  , results are st
15ec0 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e  ored in a sequen
15ed0 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e  ce of registers.
15ee0 20 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 74    .    ** Then t
15ef0 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20  he OP_ResultRow 
15f00 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20 74  opcode is used t
15f10 6f 20 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f  o cause sqlite3_
15f20 73 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a  step() to.    **
15f30 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74   return the next
15f40 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a   row of result..
15f50 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
15f60 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
15f70 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  rt( pDest->eDest
15f80 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a  ==SRT_Output );.
15f90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15fa0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
15fb0 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53  sultRow, pIn->iS
15fc0 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
15fd0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
15fe0 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
15ff0 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  Change(pParse, p
16000 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
16010 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 62 72  nSdst);.      br
16020 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
16030 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
16040 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
16050 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
16060 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20   reached..  */. 
16070 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29   if( p->iLimit )
16080 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
16090 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
160a0 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  Zero, p->iLimit,
160b0 20 69 42 72 65 61 6b 2c 20 2d 31 29 3b 20 56 64   iBreak, -1); Vd
160c0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
160d0 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
160e0 65 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  e the subroutine
160f0 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73   return.  */.  s
16100 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
16110 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69  eLabel(v, iConti
16120 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  nue);.  sqlite3V
16130 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
16140 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72  Return, regRetur
16150 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64  n);..  return ad
16160 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74  dr;.}../*.** Alt
16170 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e  ernative compoun
16180 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65  d select code ge
16190 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65  nerator for case
161a0 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20  s when there.** 
161b0 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
161c0 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  lause..**.** We 
161d0 61 73 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f  assume a query o
161e0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
161f0 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  form:.**.**     
16200 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65   <selectA>  <ope
16210 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42  rator>  <selectB
16220 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64  >  ORDER BY <ord
16230 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20  erbylist>.**.** 
16240 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e  <operator> is on
16250 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  e of UNION ALL, 
16260 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f  UNION, EXCEPT, o
16270 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68  r INTERSECT.  Th
16280 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20  e idea.** is to 
16290 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63  code both <selec
162a0 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42  tA> and <selectB
162b0 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52  > with the ORDER
162c0 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a   BY clause as.**
162d0 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54   co-routines.  T
162e0 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72  hen run the co-r
162f0 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c  outines in paral
16300 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68  lel and merge th
16310 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74  e results.** int
16320 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49  o the output.  I
16330 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68  n addition to th
16340 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73  e two coroutines
16350 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41   (called selectA
16360 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29   and.** selectB)
16370 20 74 68 65 72 65 20 61 72 65 20 37 20 73 75 62   there are 7 sub
16380 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20  routines:.**.** 
16390 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65     outA:    Move
163a0 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   the output of t
163b0 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75  he selectA corou
163c0 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75  tine into the ou
163d0 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  tput.**         
163e0 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f      of the compo
163f0 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a  und query..**.**
16400 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76      outB:    Mov
16410 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  e the output of 
16420 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f  the selectB coro
16430 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f  utine into the o
16440 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  utput.**        
16450 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70       of the comp
16460 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e  ound query.  (On
16470 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72  ly generated for
16480 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20   UNION and.**   
16490 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20            UNION 
164a0 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64  ALL.  EXCEPT and
164b0 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65   INSERTSECT neve
164c0 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74  r output a row t
164d0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
164e0 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20     appears only 
164f0 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20  in B.).**.**    
16500 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  AltB:    Called 
16510 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61  when there is da
16520 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72  ta from both cor
16530 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e  outines and A<B.
16540 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20  .**.**    AeqB: 
16550 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
16560 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
16570 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
16580 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a  s and A==B..**.*
16590 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20 43 61  *    AgtB:    Ca
165a0 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
165b0 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
165c0 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
165d0 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45   A>B..**.**    E
165e0 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ofA:    Called w
165f0 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61  hen data is exha
16600 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63  usted from selec
16610 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66  tA..**.**    Eof
16620 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
16630 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73  n data is exhaus
16640 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42  ted from selectB
16650 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ..**.** The impl
16660 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
16670 65 20 6c 61 74 74 65 72 20 66 69 76 65 20 73 75  e latter five su
16680 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64  broutines depend
16690 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f   on which .** <o
166a0 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64  perator> is used
166b0 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  :.**.**.**      
166c0 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
166d0 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20           UNION  
166e0 20 20 20 20 20 20 20 20 20 20 45 58 43 45 50 54            EXCEPT
166f0 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 53            INTERS
16700 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ECT.**          
16710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
16720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16730 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
16740 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
16750 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20  ---.**   AltB:  
16760 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
16770 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
16780 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
16790 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a          nextA.**
167a0 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75  .**   AeqB:   ou
167b0 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
167c0 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20    nextA         
167d0 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20      nextA       
167e0 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a    outA, nextA.**
167f0 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75  .**   AgtB:   ou
16800 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f  tB, nextB      o
16810 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
16820 20 20 20 20 6e 65 78 74 42 20 20 20 20 20 20 20      nextB       
16830 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a       nextB.**.**
16840 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c     EofA:   outB,
16850 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42   nextB      outB
16860 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20  , nextB         
16870 20 68 61 6c 74 20 20 20 20 20 20 20 20 20 20 20   halt           
16880 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45    halt.**.**   E
16890 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78  ofB:   outA, nex
168a0 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  tA      outA, ne
168b0 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20  xtA       outA, 
168c0 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 68 61  nextA         ha
168d0 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  lt.**.** In the 
168e0 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20  AltB, AeqB, and 
168f0 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73  AgtB subroutines
16900 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f  , an EOF on A fo
16910 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a  llowing nextA.**
16920 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64   causes an immed
16930 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66  iate jump to Eof
16940 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20  A and an EOF on 
16950 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  B following next
16960 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69  B causes.** an i
16970 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f  mmediate jump to
16980 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45   EofB.  Within E
16990 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e  ofA and EofB, an
169a0 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f  d EOF on entry o
169b0 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e  r.** following n
169c0 65 78 74 58 20 63 61 75 73 65 73 20 61 20 6a 75  extX causes a ju
169d0 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
169e0 20 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63   the select proc
169f0 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75  essing..**.** Du
16a00 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20  plicate removal 
16a10 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58  in the UNION, EX
16a20 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53  CEPT, and INTERS
16a30 45 43 54 20 63 61 73 65 73 20 69 73 20 68 61 6e  ECT cases is han
16a40 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74  dled.** within t
16a50 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  he output subrou
16a60 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72  tine.  The regPr
16a70 65 76 20 72 65 67 69 73 74 65 72 20 73 65 74 20  ev register set 
16a80 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f  holds the previo
16a90 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76  usly.** output v
16aa0 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69  alue.  A compari
16ab0 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69  son is made agai
16ac0 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65 20 61  nst this value a
16ad0 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  nd the output.**
16ae0 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74   is skipped if t
16af0 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20  he next results 
16b00 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d  would be the sam
16b10 65 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75  e as the previou
16b20 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  s..**.** The imp
16b30 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e  lementation plan
16b40 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74   is to implement
16b50 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69   the two corouti
16b60 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a  nes and seven.**
16b70 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72   subroutines fir
16b80 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65  st, then put the
16b90 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61   control logic a
16ba0 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c  t the bottom.  L
16bb0 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
16bc0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e           goto In
16bd0 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63  it.**     coA: c
16be0 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66  oroutine for lef
16bf0 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20  t query (A).**  
16c00 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e     coB: coroutin
16c10 65 20 66 6f 72 20 72 69 67 68 74 20 71 75 65 72  e for right quer
16c20 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41  y (B).**    outA
16c30 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77  : output one row
16c40 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42   of A.**    outB
16c50 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77  : output one row
16c60 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64   of B (UNION and
16c70 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29   UNION ALL only)
16c80 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e  .**    EofA: ...
16c90 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e  .**    EofB: ...
16ca0 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e  .**    AltB: ...
16cb0 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e  .**    AeqB: ...
16cc0 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e  .**    AgtB: ...
16cd0 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69  .**    Init: ini
16ce0 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e  tialize coroutin
16cf0 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20  e registers.**  
16d00 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f          yield co
16d10 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66  A.**          if
16d20 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66   eof(A) goto Eof
16d30 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69  A.**          yi
16d40 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20  eld coB.**      
16d50 20 20 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f      if eof(B) go
16d60 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d  to EofB.**    Cm
16d70 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42  pr: Compare A, B
16d80 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d  .**          Jum
16d90 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67  p AltB, AeqB, Ag
16da0 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e  tB.**     End: .
16db0 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c  ...**.** We call
16dc0 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74   AltB, AeqB, Agt
16dd0 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66  B, EofA, and Eof
16de0 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20  B "subroutines" 
16df0 62 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74  but they are not
16e00 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c  .** actually cal
16e10 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20  led using Gosub 
16e20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  and they do not 
16e30 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e  Return.  EofA an
16e40 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75  d EofB loop.** u
16e50 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73  ntil all data is
16e60 20 65 78 68 61 75 73 74 65 64 20 74 68 65 6e 20   exhausted then 
16e70 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64  jump to the "end
16e80 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41  " labe.  AltB, A
16e90 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42  eqB,.** and AgtB
16ea0 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20   jump to either 
16eb0 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20  L2 or to one of 
16ec0 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f  EofA or EofB..*/
16ed0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16ee0 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
16ef0 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20  LECT.static int 
16f00 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
16f10 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  By(.  Parse *pPa
16f20 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
16f30 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
16f40 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
16f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16f60 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
16f70 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
16f80 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
16f90 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
16fa0 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
16fb0 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
16fc0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
16fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16fe0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
16ff0 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
17000 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  r;       /* Anot
17010 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64  her SELECT immed
17020 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65  iately to our le
17030 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ft */.  Vdbe *v;
17040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17050 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
17060 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
17070 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
17080 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e  A;     /* Destin
17090 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74  ation for corout
170a0 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63  ine A */.  Selec
170b0 74 44 65 73 74 20 64 65 73 74 42 3b 20 20 20 20  tDest destB;    
170c0 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20   /* Destination 
170d0 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20  for coroutine B 
170e0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72  */.  int regAddr
170f0 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  A;         /* Ad
17100 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
17110 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f  or select-A coro
17120 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
17130 65 67 41 64 64 72 42 3b 20 20 20 20 20 20 20 20  egAddrB;        
17140 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
17150 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
17160 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  B coroutine */. 
17170 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41   int addrSelectA
17180 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
17190 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
171a0 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  A coroutine */. 
171b0 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42   int addrSelectB
171c0 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  ;      /* Addres
171d0 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
171e0 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  B coroutine */. 
171f0 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20   int regOutA;   
17200 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
17210 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74  s register for t
17220 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72  he output-A subr
17230 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
17240 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20  regOutB;        
17250 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
17260 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75  ister for the ou
17270 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  tput-B subroutin
17280 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f  e */.  int addrO
17290 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  utA;         /* 
172a0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f  Address of the o
172b0 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69  utput-A subrouti
172c0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
172d0 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a  OutB = 0;     /*
172e0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
172f0 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74  output-B subrout
17300 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
17310 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f  rEofA;         /
17320 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
17330 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73   select-A-exhaus
17340 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ted subroutine *
17350 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41  /.  int addrEofA
17360 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41 6c 74  _noB;     /* Alt
17370 65 72 6e 61 74 65 20 61 64 64 72 45 6f 66 41 20  ernate addrEofA 
17380 69 66 20 42 20 69 73 20 75 6e 69 6e 69 74 69 61  if B is uninitia
17390 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61  lized */.  int a
173a0 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20  ddrEofB;        
173b0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
173c0 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61  he select-B-exha
173d0 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  usted subroutine
173e0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c   */.  int addrAl
173f0 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tB;         /* A
17400 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c  ddress of the A<
17410 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
17420 20 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20    int addrAeqB; 
17430 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
17440 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73  ss of the A==B s
17450 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
17460 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20 20 20  nt addrAgtB;    
17470 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
17480 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62 72 6f  of the A>B subro
17490 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
174a0 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20  egLimitA;       
174b0 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74   /* Limit regist
174c0 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20  er for select-A 
174d0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69  */.  int regLimi
174e0 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  tB;        /* Li
174f0 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72  mit register for
17500 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69   select-A */.  i
17510 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20  nt regPrev;     
17520 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20       /* A range 
17530 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  of registers to 
17540 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75  hold previous ou
17550 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61  tput */.  int sa
17560 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  vedLimit;       
17570 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f  /* Saved value o
17580 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20  f p->iLimit */. 
17590 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74   int savedOffset
175a0 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20  ;      /* Saved 
175b0 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66  value of p->iOff
175c0 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  set */.  int lab
175d0 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f  elCmpr;        /
175e0 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20  * Label for the 
175f0 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72  start of the mer
17600 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a  ge algorithm */.
17610 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20    int labelEnd; 
17620 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c          /* Label
17630 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20   for the end of 
17640 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45  the overall SELE
17650 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74  CT stmt */.  int
17660 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   j1;            
17670 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72     /* Jump instr
17680 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74  uctions that get
17690 20 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a   retargetted */.
176a0 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
176b0 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
176c0 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49  f TK_ALL, TK_UNI
176d0 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54  ON, TK_EXCEPT, T
176e0 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20  K_INTERSECT */. 
176f0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75   KeyInfo *pKeyDu
17700 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72  p = 0; /* Compar
17710 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ison information
17720 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72   for duplicate r
17730 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49  emoval */.  KeyI
17740 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20  nfo *pKeyMerge; 
17750 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20    /* Comparison 
17760 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
17770 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a  merging rows */.
17780 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
17790 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
177a0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
177b0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
177c0 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65  rderBy;   /* The
177d0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
177e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72   */.  int nOrder
177f0 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  By;         /* N
17800 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
17810 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
17820 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  lause */.  int *
17830 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20  aPermute;       
17840 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
17850 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
17860 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f  to result set co
17870 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66  lumns */.#ifndef
17880 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
17890 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31  LAIN.  int iSub1
178a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
178b0 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68  EQP id of left-h
178c0 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  and query */.  i
178d0 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20 20 20  nt iSub2;       
178e0 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f       /* EQP id o
178f0 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65  f right-hand que
17900 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ry */.#endif..  
17910 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
17920 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rBy!=0 );.  asse
17930 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29  rt( pKeyDup==0 )
17940 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63  ; /* "Managed" c
17950 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20  ode needs this. 
17960 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a   Ticket #3382. *
17970 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
17980 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73  >db;.  v = pPars
17990 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
179a0 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20  rt( v!=0 );     
179b0 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72    /* Already thr
179c0 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66  own the error if
179d0 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c   VDBE alloc fail
179e0 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64  ed */.  labelEnd
179f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
17a00 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61  keLabel(v);.  la
17a10 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65  belCmpr = sqlite
17a20 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
17a30 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20  );...  /* Patch 
17a40 75 70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  up the ORDER BY 
17a50 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70  clause.  */.  op
17a60 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50   = p->op;  .  pP
17a70 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
17a80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69  ;.  assert( pPri
17a90 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  or->pOrderBy==0 
17aa0 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  );.  pOrderBy = 
17ab0 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61  p->pOrderBy;.  a
17ac0 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20  ssert( pOrderBy 
17ad0 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  );.  nOrderBy = 
17ae0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
17af0 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61  ..  /* For opera
17b00 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20  tors other than 
17b10 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76  UNION ALL we hav
17b20 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
17b30 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44  hat.  ** the ORD
17b40 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76  ER BY clause cov
17b50 65 72 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f  ers every term o
17b60 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
17b70 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d  .  Add.  ** term
17b80 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42  s to the ORDER B
17b90 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65  Y clause as nece
17ba0 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ssary..  */.  if
17bb0 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op!=TK_ALL ){.
17bc0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d      for(i=1; db-
17bd0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
17be0 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74   && i<=p->pEList
17bf0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
17c00 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
17c10 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
17c20 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c  ;.      for(j=0,
17c30 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d   pItem=pOrderBy-
17c40 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20  >a; j<nOrderBy; 
17c50 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  j++, pItem++){. 
17c60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
17c70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
17c80 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20  ByCol>0 );.     
17c90 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e     if( pItem->u.
17ca0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 69  x.iOrderByCol==i
17cb0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
17cc0 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e  }.      if( j==n
17cd0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
17ce0 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20     Expr *pNew = 
17cf0 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
17d00 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a  TK_INTEGER, 0);.
17d10 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
17d20 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
17d30 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
17d40 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
17d50 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20  = EP_IntValue;. 
17d60 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69         pNew->u.i
17d70 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20 20  Value = i;.     
17d80 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71     pOrderBy = sq
17d90 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
17da0 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72 64  end(pParse, pOrd
17db0 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20  erBy, pNew);.   
17dc0 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
17dd0 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  y ) pOrderBy->a[
17de0 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e  nOrderBy++].u.x.
17df0 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75  iOrderByCol = (u
17e00 31 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  16)i;.      }.  
17e10 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f    }.  }..  /* Co
17e20 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72  mpute the compar
17e30 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e  ison permutation
17e40 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61   and keyinfo tha
17e50 74 20 69 73 20 75 73 65 64 20 77 69 74 68 0a 20  t is used with. 
17e60 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74   ** the permutat
17e70 69 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65  ion used to dete
17e80 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78  rmine if the nex
17e90 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65  t.  ** row of re
17ea0 73 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d  sults comes from
17eb0 20 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65   selectA or sele
17ec0 63 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65  ctB.  Also add e
17ed0 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c  xplicit.  ** col
17ee0 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f  lations to the O
17ef0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
17f00 65 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65  erms so that whe
17f10 6e 20 74 68 65 20 73 75 62 71 75 65 72 69 65 73  n the subqueries
17f20 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67  .  ** to the rig
17f30 68 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20  ht and the left 
17f40 61 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74  are evaluated, t
17f50 68 65 79 20 75 73 65 20 74 68 65 20 63 6f 72 72  hey use the corr
17f60 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69  ect.  ** collati
17f70 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d  on..  */.  aPerm
17f80 75 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ute = sqlite3DbM
17f90 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a  allocRaw(db, siz
17fa0 65 6f 66 28 69 6e 74 29 2a 6e 4f 72 64 65 72 42  eof(int)*nOrderB
17fb0 79 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75  y);.  if( aPermu
17fc0 74 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  te ){.    struct
17fd0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
17fe0 70 49 74 65 6d 3b 0a 20 20 20 20 66 6f 72 28 69  pItem;.    for(i
17ff0 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72  =0, pItem=pOrder
18000 42 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65 72 42  By->a; i<nOrderB
18010 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  y; i++, pItem++)
18020 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
18030 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
18040 72 42 79 43 6f 6c 3e 30 0a 20 20 20 20 20 20 20  rByCol>0.       
18050 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 75 2e 78     && pItem->u.x
18060 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d  .iOrderByCol<=p-
18070 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
18080 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74 65  ;.      aPermute
18090 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78  [i] = pItem->u.x
180a0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31  .iOrderByCol - 1
180b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79  ;.    }.    pKey
180c0 4d 65 72 67 65 20 3d 20 6d 75 6c 74 69 53 65 6c  Merge = multiSel
180d0 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66  ectOrderByKeyInf
180e0 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b  o(pParse, p, 1);
180f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b  .  }else{.    pK
18100 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d  eyMerge = 0;.  }
18110 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68 20  ..  /* Reattach 
18120 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
18130 75 73 65 20 74 6f 20 74 68 65 20 71 75 65 72 79  use to the query
18140 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64  ..  */.  p->pOrd
18150 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
18160 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  .  pPrior->pOrde
18170 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
18180 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65 2d  rListDup(pParse-
18190 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20 30  >db, pOrderBy, 0
181a0 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
181b0 65 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65 6d  e a range of tem
181c0 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73  porary registers
181d0 20 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66 6f   and the KeyInfo
181e0 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72   needed.  ** for
181f0 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20   the logic that 
18200 72 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61 74  removes duplicat
18210 65 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77 68  e result rows wh
18220 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72  en the.  ** oper
18230 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45  ator is UNION, E
18240 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53  XCEPT, or INTERS
18250 45 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e 49  ECT (but not UNI
18260 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20  ON ALL)..  */.  
18270 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  if( op==TK_ALL )
18280 7b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20  {.    regPrev = 
18290 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
182a0 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70  int nExpr = p->p
182b0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
182c0 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72    assert( nOrder
182d0 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d  By>=nExpr || db-
182e0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
182f0 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70  .    regPrev = p
18300 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
18310 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
18320 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20  += nExpr+1;.    
18330 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18340 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
18350 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20   0, regPrev);.  
18360 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69    pKeyDup = sqli
18370 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
18380 64 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20  db, nExpr, 1);. 
18390 20 20 20 69 66 28 20 70 4b 65 79 44 75 70 20 29     if( pKeyDup )
183a0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
183b0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
183c0 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 44 75  Writeable(pKeyDu
183d0 70 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  p) );.      for(
183e0 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b  i=0; i<nExpr; i+
183f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79  +){.        pKey
18400 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Dup->aColl[i] = 
18410 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
18420 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29  eq(pParse, p, i)
18430 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75  ;.        pKeyDu
18440 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  p->aSortOrder[i]
18450 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
18460 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53    }.  }. .  /* S
18470 65 70 61 72 61 74 65 20 74 68 65 20 6c 65 66 74  eparate the left
18480 20 61 6e 64 20 74 68 65 20 72 69 67 68 74 20 71   and the right q
18490 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e  uery from one an
184a0 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e  other.  */.  p->
184b0 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50  pPrior = 0;.  pP
184c0 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  rior->pNext = 0;
184d0 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  .  sqlite3Resolv
184e0 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50  eOrderGroupBy(pP
184f0 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64  arse, p, p->pOrd
18500 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a  erBy, "ORDER");.
18510 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50    if( pPrior->pP
18520 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73  rior==0 ){.    s
18530 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64  qlite3ResolveOrd
18540 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65  erGroupBy(pParse
18550 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72  , pPrior, pPrior
18560 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44  ->pOrderBy, "ORD
18570 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ER");.  }..  /* 
18580 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69  Compute the limi
18590 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20  t registers */. 
185a0 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
185b0 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
185c0 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69  , labelEnd);.  i
185d0 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20  f( p->iLimit && 
185e0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op==TK_ALL ){.  
185f0 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b    regLimitA = ++
18600 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
18610 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b    regLimitB = ++
18620 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
18630 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18640 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
18650 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e  p->iOffset ? p->
18660 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69  iOffset+1 : p->i
18670 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20  Limit,.         
18680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18690 20 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69           regLimi
186a0 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tA);.    sqlite3
186b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
186c0 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41  _Copy, regLimitA
186d0 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20  , regLimitB);.  
186e0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69  }else{.    regLi
186f0 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42  mitA = regLimitB
18700 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
18710 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
18720 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
18730 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
18740 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
18750 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65  te(db, p->pOffse
18760 74 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74  t);.  p->pOffset
18770 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64 72   = 0;..  regAddr
18780 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
18790 65 6d 3b 0a 20 20 72 65 67 41 64 64 72 42 20 3d  em;.  regAddrB =
187a0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
187b0 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70  .  regOutA = ++p
187c0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
187d0 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73  egOutB = ++pPars
187e0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74  e->nMem;.  sqlit
187f0 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
18800 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72  (&destA, SRT_Cor
18810 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41  outine, regAddrA
18820 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
18830 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
18840 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  B, SRT_Coroutine
18850 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20  , regAddrB);..  
18860 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f  /* Generate a co
18870 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75  routine to evalu
18880 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ate the SELECT s
18890 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a  tatement to the.
188a0 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68 65    ** left of the
188b0 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74   compound operat
188c0 6f 72 20 2d 20 74 68 65 20 22 41 22 20 73 65 6c  or - the "A" sel
188d0 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72  ect..  */.  addr
188e0 53 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74 65  SelectA = sqlite
188f0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
18900 28 76 29 20 2b 20 31 3b 0a 20 20 6a 31 20 3d 20  (v) + 1;.  j1 = 
18910 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18920 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
18930 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 2c  utine, regAddrA,
18940 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74 41 29   0, addrSelectA)
18950 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
18960 28 76 2c 20 22 6c 65 66 74 20 53 45 4c 45 43 54  (v, "left SELECT
18970 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69  "));.  pPrior->i
18980 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74  Limit = regLimit
18990 41 3b 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49  A;.  explainSetI
189a0 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
189b0 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
189c0 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  tId);.  sqlite3S
189d0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
189e0 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a 20  rior, &destA);. 
189f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18a00 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f  p1(v, OP_EndCoro
18a10 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29  utine, regAddrA)
18a20 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
18a30 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
18a40 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
18a50 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76   coroutine to ev
18a60 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43  aluate the SELEC
18a70 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a  T statement on .
18a80 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d    ** the right -
18a90 20 74 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a   the "B" select.
18aa0 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63    */.  addrSelec
18ab0 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
18ac0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
18ad0 20 31 3b 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74   1;.  j1 = sqlit
18ae0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
18af0 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
18b00 2c 20 72 65 67 41 64 64 72 42 2c 20 30 2c 20 61  , regAddrB, 0, a
18b10 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20 56  ddrSelectB);.  V
18b20 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
18b30 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b  right SELECT"));
18b40 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20  .  savedLimit = 
18b50 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76  p->iLimit;.  sav
18b60 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f  edOffset = p->iO
18b70 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d  ffset;.  p->iLim
18b80 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a  it = regLimitB;.
18b90 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30    p->iOffset = 0
18ba0 3b 20 20 0a 20 20 65 78 70 6c 61 69 6e 53 65 74  ;  .  explainSet
18bb0 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70  Integer(iSub2, p
18bc0 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
18bd0 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ctId);.  sqlite3
18be0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
18bf0 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e  , &destB);.  p->
18c00 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c 69  iLimit = savedLi
18c10 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65  mit;.  p->iOffse
18c20 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74 3b  t = savedOffset;
18c30 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
18c40 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f  dOp1(v, OP_EndCo
18c50 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
18c60 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  B);..  /* Genera
18c70 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
18c80 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65  that outputs the
18c90 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
18ca0 74 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63  the A.  ** selec
18cb0 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75  t as the next ou
18cc0 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20  tput row of the 
18cd0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
18ce0 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
18cf0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74  Comment((v, "Out
18d00 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  put routine for 
18d10 41 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41  A"));.  addrOutA
18d20 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75   = generateOutpu
18d30 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72  tSubroutine(pPar
18d40 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
18d50 20 20 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20       p, &destA, 
18d60 70 44 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a  pDest, regOutA,.
18d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d80 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75   regPrev, pKeyDu
18d90 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
18da0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
18db0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
18dc0 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72   outputs the cur
18dd0 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
18de0 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73  B.  ** select as
18df0 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74   the next output
18e00 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70   row of the comp
18e10 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
18e20 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
18e30 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49  LL || op==TK_UNI
18e40 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f  ON ){.    VdbeNo
18e50 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  opComment((v, "O
18e60 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f  utput routine fo
18e70 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72  r B"));.    addr
18e80 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f  OutB = generateO
18e90 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28  utputSubroutine(
18ea0 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
18eb0 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73           p, &des
18ec0 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75  tB, pDest, regOu
18ed0 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tB,.            
18ee0 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b       regPrev, pK
18ef0 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29  eyDup, labelEnd)
18f00 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b  ;.  }.  sqlite3K
18f10 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
18f20 44 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  Dup);..  /* Gene
18f30 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
18f40 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68  e to run when th
18f50 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73  e results from s
18f60 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65  elect A.  ** are
18f70 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f   exhausted and o
18f80 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65  nly data in sele
18f90 63 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20  ct B remains..  
18fa0 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
18fb0 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b  EXCEPT || op==TK
18fc0 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20  _INTERSECT ){.  
18fd0 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d    addrEofA_noB =
18fe0 20 61 64 64 72 45 6f 66 41 20 3d 20 6c 61 62 65   addrEofA = labe
18ff0 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 20 20  lEnd;.  }else{  
19000 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
19010 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20  ment((v, "eof-A 
19020 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
19030 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71     addrEofA = sq
19040 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19050 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
19060 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b  OutB, addrOutB);
19070 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f  .    addrEofA_no
19080 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
19090 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
190a0 64 2c 20 72 65 67 41 64 64 72 42 2c 20 6c 61 62  d, regAddrB, lab
190b0 65 6c 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  elEnd);.        
190c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190d0 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62               Vdb
190e0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
190f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19100 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
19110 30 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20  0, addrEofA);.  
19120 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
19130 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  += pPrior->nSele
19140 63 74 52 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ctRow;.  }..  /*
19150 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
19160 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68  outine to run wh
19170 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66  en the results f
19180 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a  rom select B.  *
19190 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20  * are exhausted 
191a0 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e  and only data in
191b0 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e   select A remain
191c0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  s..  */.  if( op
191d0 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
191e0 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d  {.    addrEofB =
191f0 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20 20 69   addrEofA;.    i
19200 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
19210 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65   > pPrior->nSele
19220 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65  ctRow ) p->nSele
19230 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e  ctRow = pPrior->
19240 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65  nSelectRow;.  }e
19250 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e  lse{  .    VdbeN
19260 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
19270 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  eof-B subroutine
19280 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66  "));.    addrEof
19290 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
192a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
192b0 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72  b, regOutA, addr
192c0 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74  OutA);.    sqlit
192d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
192e0 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
192f0 72 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56  rA, labelEnd); V
19300 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
19310 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19320 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
19330 2c 20 30 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a  , 0, addrEofB);.
19340 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
19350 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
19360 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c  e the case of A<
19370 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  B.  */.  VdbeNoo
19380 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d  pComment((v, "A-
19390 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  lt-B subroutine"
193a0 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d  ));.  addrAltB =
193b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
193c0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
193d0 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74  regOutA, addrOut
193e0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
193f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
19400 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61  eld, regAddrA, a
19410 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f  ddrEofA); VdbeCo
19420 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
19430 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19440 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61  , OP_Goto, 0, la
19450 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20  belCmpr);..  /* 
19460 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
19470 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65   handle the case
19480 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20   of A==B.  */.  
19490 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  if( op==TK_ALL )
194a0 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d  {.    addrAeqB =
194b0 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c   addrAltB;.  }el
194c0 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  se if( op==TK_IN
194d0 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
194e0 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c  ddrAeqB = addrAl
194f0 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74 42  tB;.    addrAltB
19500 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
19510 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
19520 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75 62  ((v, "A-eq-B sub
19530 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20  routine"));.    
19540 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20 73  addrAeqB =.    s
19550 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19560 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
19570 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41  gAddrA, addrEofA
19580 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
19590 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
195a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
195b0 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d  Goto, 0, labelCm
195c0 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  pr);.  }..  /* G
195d0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
195e0 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20  handle the case 
195f0 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64  of A>B.  */.  Vd
19600 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
19610 2c 20 22 41 2d 67 74 2d 42 20 73 75 62 72 6f 75  , "A-gt-B subrou
19620 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41  tine"));.  addrA
19630 67 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  gtB = sqlite3Vdb
19640 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
19650 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
19660 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  L || op==TK_UNIO
19670 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  N ){.    sqlite3
19680 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19690 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c  _Gosub, regOutB,
196a0 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a   addrOutB);.  }.
196b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
196c0 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
196d0 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45   regAddrB, addrE
196e0 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ofB); VdbeCovera
196f0 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
19700 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19710 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43  _Goto, 0, labelC
19720 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  mpr);..  /* This
19730 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65 20   code runs once 
19740 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65 76  to initialize ev
19750 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20  erything..  */. 
19760 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
19770 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 73  Here(v, j1);.  s
19780 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19790 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
197a0 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41  gAddrA, addrEofA
197b0 5f 6e 6f 42 29 3b 20 56 64 62 65 43 6f 76 65 72  _noB); VdbeCover
197c0 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
197d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
197e0 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
197f0 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64  B, addrEofB); Vd
19800 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
19810 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74    /* Implement t
19820 68 65 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f  he main merge lo
19830 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  op.  */.  sqlite
19840 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
19850 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b  l(v, labelCmpr);
19860 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
19870 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75  dOp4(v, OP_Permu
19880 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c  tation, 0, 0, 0,
19890 20 28 63 68 61 72 2a 29 61 50 65 72 6d 75 74 65   (char*)aPermute
198a0 2c 20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a  , P4_INTARRAY);.
198b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
198c0 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72  Op4(v, OP_Compar
198d0 65 2c 20 64 65 73 74 41 2e 69 53 64 73 74 2c 20  e, destA.iSdst, 
198e0 64 65 73 74 42 2e 69 53 64 73 74 2c 20 6e 4f 72  destB.iSdst, nOr
198f0 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20  derBy,.         
19900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19910 28 63 68 61 72 2a 29 70 4b 65 79 4d 65 72 67 65  (char*)pKeyMerge
19920 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
19930 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
19940 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50  geP5(v, OPFLAG_P
19950 45 52 4d 55 54 45 29 3b 0a 20 20 73 71 6c 69 74  ERMUTE);.  sqlit
19960 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
19970 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74  OP_Jump, addrAlt
19980 42 2c 20 61 64 64 72 41 65 71 42 2c 20 61 64 64  B, addrAeqB, add
19990 72 41 67 74 42 29 3b 20 56 64 62 65 43 6f 76 65  rAgtB); VdbeCove
199a0 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 4a  rage(v);..  /* J
199b0 75 6d 70 20 74 6f 20 74 68 65 20 74 68 69 73 20  ump to the this 
199c0 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74  point in order t
199d0 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
199e0 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71  query..  */.  sq
199f0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
19a00 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e  Label(v, labelEn
19a10 64 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  d);..  /* Set th
19a20 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  e number of outp
19a30 75 74 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a  ut columns.  */.
19a40 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65    if( pDest->eDe
19a50 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
19a60 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46  {.    Select *pF
19a70 69 72 73 74 20 3d 20 70 50 72 69 6f 72 3b 0a 20  irst = pPrior;. 
19a80 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74     while( pFirst
19a90 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73  ->pPrior ) pFirs
19aa0 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69  t = pFirst->pPri
19ab0 6f 72 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65  or;.    generate
19ac0 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
19ad0 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70  se, 0, pFirst->p
19ae0 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  EList);.  }..  /
19af0 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65  * Reassembly the
19b00 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
19b10 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20  so that it will 
19b20 62 65 20 66 72 65 65 64 20 63 6f 72 72 65 63 74  be freed correct
19b30 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63  ly.  ** by the c
19b40 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
19b50 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
19b60 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
19b70 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
19b80 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
19b90 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  }.  p->pPrior = 
19ba0 70 50 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f 72  pPrior;.  pPrior
19bb0 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20 20  ->pNext = p;..  
19bc0 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72  /*** TBD:  Inser
19bd0 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c  t subroutine cal
19be0 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73  ls to close curs
19bf0 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74  ors on incomplet
19c00 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72  e.  **** subquer
19c10 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c  ies ****/.  expl
19c20 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61  ainComposite(pPa
19c30 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62  rse, p->op, iSub
19c40 31 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a 20 20  1, iSub2, 0);.  
19c50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19c60 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
19c70 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
19c80 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
19c90 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
19ca0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 20  E_OMIT_VIEW)./* 
19cb0 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61 74  Forward Declarat
19cc0 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76  ions */.static v
19cd0 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73  oid substExprLis
19ce0 74 28 73 71 6c 69 74 65 33 2a 2c 20 45 78 70 72  t(sqlite3*, Expr
19cf0 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72  List*, int, Expr
19d00 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76  List*);.static v
19d10 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28  oid substSelect(
19d20 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63 74  sqlite3*, Select
19d30 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73   *, int, ExprLis
19d40 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61  t *);../*.** Sca
19d50 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78  n through the ex
19d60 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
19d70 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72   Replace every r
19d80 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61  eference to.** a
19d90 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65   column in table
19da0 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77   number iTable w
19db0 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
19dc0 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20  e iColumn-th.** 
19dd0 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e  entry in pEList.
19de0 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66    (But leave ref
19df0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52  erences to the R
19e00 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20  OWID column .** 
19e10 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a  unchanged.).**.*
19e20 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
19e30 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c  s part of the fl
19e40 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75  attening procedu
19e50 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a  re.  A subquery.
19e60 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20  ** whose result 
19e70 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
19e80 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73  y pEList appears
19e90 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65   as entry in the
19ea0 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  .** FROM clause 
19eb0 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68  of a SELECT such
19ec0 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63   that the VDBE c
19ed0 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74  ursor assigned t
19ee0 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63  o that.** FORM c
19ef0 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69  lause entry is i
19f00 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75  Table.  This rou
19f10 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65  tine make the ne
19f20 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e  cessary .** chan
19f30 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20  ges to pExpr so 
19f40 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64  that it refers d
19f50 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73  irectly to the s
19f60 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f  ource table.** o
19f70 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72  f the subquery r
19f80 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74  ather the result
19f90 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71   set of the subq
19fa0 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uery..*/.static 
19fb0 45 78 70 72 20 2a 73 75 62 73 74 45 78 70 72 28  Expr *substExpr(
19fc0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
19fd0 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74         /* Report
19fe0 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74   malloc errors t
19ff0 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  o this connectio
1a000 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  n */.  Expr *pEx
1a010 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78  pr,        /* Ex
1a020 70 72 20 69 6e 20 77 68 69 63 68 20 73 75 62 73  pr in which subs
1a030 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20  titution occurs 
1a040 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
1a050 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
1a060 65 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75  e to be substitu
1a070 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ted */.  ExprLis
1a080 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
1a090 53 75 62 73 74 69 74 75 74 65 20 65 78 70 72 65  Substitute expre
1a0a0 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69  ssions */.){.  i
1a0b0 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
1a0c0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
1a0d0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
1a0e0 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  MN && pExpr->iTa
1a0f0 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20  ble==iTable ){. 
1a100 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
1a110 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
1a120 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
1a130 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  NULL;.    }else{
1a140 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
1a150 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  w;.      assert(
1a160 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45   pEList!=0 && pE
1a170 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c  xpr->iColumn<pEL
1a180 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
1a190 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1a1a0 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70  r->pLeft==0 && p
1a1b0 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
1a1c0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  );.      pNew = 
1a1d0 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
1a1e0 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78  b, pEList->a[pEx
1a1f0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78  pr->iColumn].pEx
1a200 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  pr, 0);.      sq
1a210 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
1a220 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  db, pExpr);.    
1a230 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a    pExpr = pNew;.
1a240 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1a250 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20     pExpr->pLeft 
1a260 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
1a270 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54  pExpr->pLeft, iT
1a280 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1a290 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
1a2a0 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
1a2b0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1a2c0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1a2d0 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
1a2e0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1a2f0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
1a300 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65  .      substSele
1a310 63 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e  ct(db, pExpr->x.
1a320 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c  pSelect, iTable,
1a330 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 65   pEList);.    }e
1a340 6c 73 65 7b 0a 20 20 20 20 20 20 73 75 62 73 74  lse{.      subst
1a350 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 45 78  ExprList(db, pEx
1a360 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61  pr->x.pList, iTa
1a370 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1a380 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1a390 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63   pExpr;.}.static
1a3a0 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
1a3b0 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ist(.  sqlite3 *
1a3c0 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  db,         /* R
1a3d0 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72  eport malloc err
1a3e0 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45 78  ors here */.  Ex
1a3f0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
1a400 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63     /* List to sc
1a410 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20  an and in which 
1a420 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75  to make substitu
1a430 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  tes */.  int iTa
1a440 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ble,          /*
1a450 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62   Table to be sub
1a460 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78  stituted */.  Ex
1a470 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
1a480 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
1a490 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20   values */.){.  
1a4a0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
1a4b0 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
1a4c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
1a4d0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
1a4e0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  .    pList->a[i]
1a4f0 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74 45 78  .pExpr = substEx
1a500 70 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  pr(db, pList->a[
1a510 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65  i].pExpr, iTable
1a520 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d  , pEList);.  }.}
1a530 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
1a540 73 74 53 65 6c 65 63 74 28 0a 20 20 73 71 6c 69  stSelect(.  sqli
1a550 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
1a560 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f   /* Report mallo
1a570 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f  c errors here */
1a580 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
1a590 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43          /* SELEC
1a5a0 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77  T statement in w
1a5b0 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62  hich to make sub
1a5c0 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20  stitutions */.  
1a5d0 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
1a5e0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
1a5f0 20 62 65 20 72 65 70 6c 61 63 65 64 20 2a 2f 0a   be replaced */.
1a600 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
1a610 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69  st     /* Substi
1a620 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29  tute values */.)
1a630 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
1a640 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  c;.  struct SrcL
1a650 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
1a660 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1a670 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  !p ) return;.  s
1a680 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
1a690 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61 62   p->pEList, iTab
1a6a0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73  le, pEList);.  s
1a6b0 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
1a6c0 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 54   p->pGroupBy, iT
1a6d0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1a6e0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
1a6f0 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  b, p->pOrderBy, 
1a700 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1a710 0a 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20  .  p->pHaving = 
1a720 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d  substExpr(db, p-
1a730 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65  >pHaving, iTable
1a740 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e  , pEList);.  p->
1a750 70 57 68 65 72 65 20 3d 20 73 75 62 73 74 45 78  pWhere = substEx
1a760 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  pr(db, p->pWhere
1a770 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1a780 29 3b 0a 20 20 73 75 62 73 74 53 65 6c 65 63 74  );.  substSelect
1a790 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20  (db, p->pPrior, 
1a7a0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1a7b0 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
1a7c0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
1a7d0 63 20 29 3b 20 20 2f 2a 20 45 76 65 6e 20 66 6f  c );  /* Even fo
1a7e0 72 20 28 53 45 4c 45 43 54 20 31 29 20 77 65 20  r (SELECT 1) we 
1a7f0 68 61 76 65 3a 20 70 53 72 63 21 3d 30 20 62 75  have: pSrc!=0 bu
1a800 74 20 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20  t pSrc->nSrc==0 
1a810 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  */.  if( ALWAYS(
1a820 70 53 72 63 29 20 29 7b 0a 20 20 20 20 66 6f 72  pSrc) ){.    for
1a830 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70  (i=pSrc->nSrc, p
1a840 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e  Item=pSrc->a; i>
1a850 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; i--, pItem++)
1a860 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c  {.      substSel
1a870 65 63 74 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ect(db, pItem->p
1a880 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20  Select, iTable, 
1a890 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  pEList);.    }. 
1a8a0 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21   }.}.#endif /* !
1a8b0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1a8c0 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
1a8d0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1a8e0 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a  _OMIT_VIEW) */..
1a8f0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1a900 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1a910 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
1a920 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
1a930 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1a940 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
1a950 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69  flatten subqueri
1a960 65 73 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61  es as a performa
1a970 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  nce optimization
1a980 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
1a990 65 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69  e returns 1 if i
1a9a0 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20  t makes changes 
1a9b0 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74  and 0 if no flat
1a9c0 74 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a  tening occurs..*
1a9d0 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61  *.** To understa
1a9e0 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f  nd the concept o
1a9f0 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f  f flattening, co
1aa00 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
1aa10 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a  wing.** query:.*
1aa20 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
1aa30 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  a FROM (SELECT x
1aa40 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20  +y AS a FROM t1 
1aa50 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45  WHERE z<100) WHE
1aa60 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  RE a>5.**.** The
1aa70 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20   default way of 
1aa80 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69  implementing thi
1aa90 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78  s query is to ex
1aaa0 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62  ecute the.** sub
1aab0 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20  query first and 
1aac0 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
1aad0 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  s in a temporary
1aae0 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20   table, then.** 
1aaf0 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75  run the outer qu
1ab00 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70  ery on that temp
1ab10 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68  orary table.  Th
1ab20 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a  is requires two.
1ab30 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74  ** passes over t
1ab40 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65  he data.  Furthe
1ab50 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74  rmore, because t
1ab60 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
1ab70 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64  le.** has no ind
1ab80 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20  ices, the WHERE 
1ab90 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75  clause on the ou
1aba0 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74  ter query cannot
1abb0 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64   be.** optimized
1abc0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1abd0 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
1abe0 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73   rewrite queries
1abf0 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f   such as the abo
1ac00 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e  ve into.** a sin
1ac10 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c  gle flat select,
1ac20 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
1ac30 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79  *     SELECT x+y
1ac40 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
1ac50 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e  ERE z<100 AND a>
1ac60 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  5.**.** The code
1ac70 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74   generated for t
1ac80 68 69 73 20 73 69 6d 70 69 66 69 63 61 74 69 6f  his simpificatio
1ac90 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65  n gives the same
1aca0 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f   result.** but o
1acb0 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20  nly has to scan 
1acc0 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20  the data once.  
1acd0 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69  And because indi
1ace0 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78  ces might .** ex
1acf0 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ist on the table
1ad00 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20   t1, a complete 
1ad10 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61  scan of the data
1ad20 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f   might be.** avo
1ad30 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74  ided..**.** Flat
1ad40 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61  tening is only a
1ad50 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20  ttempted if all 
1ad60 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1ad70 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
1ad80 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71     (1)  The subq
1ad90 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74  uery and the out
1ada0 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
1adb0 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67 61  both use aggrega
1adc0 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29  tes..**.**   (2)
1add0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
1ade0 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
1adf0 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  te or the outer 
1ae00 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
1ae10 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29  oin..**.**   (3)
1ae20 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
1ae30 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20  s not the right 
1ae40 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
1ae50 74 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a 20  t outer join.** 
1ae60 20 20 20 20 20 20 20 28 4f 72 69 67 69 6e 61 6c         (Original
1ae70 6c 79 20 74 69 63 6b 65 74 20 23 33 30 36 2e 20  ly ticket #306. 
1ae80 20 53 74 72 65 6e 67 74 68 65 6e 65 64 20 62 79   Strengthened by
1ae90 20 74 69 63 6b 65 74 20 23 33 33 30 30 29 0a 2a   ticket #3300).*
1aea0 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20  *.**   (4)  The 
1aeb0 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
1aec0 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
1aed0 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f   (**)  At one po
1aee0 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73  int restrictions
1aef0 20 28 34 29 20 61 6e 64 20 28 35 29 20 64 65 66   (4) and (5) def
1af00 69 6e 65 64 20 61 20 73 75 62 73 65 74 20 6f 66  ined a subset of
1af10 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20   DISTINCT.**    
1af20 20 20 20 20 73 75 62 2d 71 75 65 72 69 65 73 20      sub-queries 
1af30 74 68 61 74 20 77 65 72 65 20 65 78 63 6c 75 64  that were exclud
1af40 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74  ed from this opt
1af50 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72  imization. Restr
1af60 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20  iction .**      
1af70 20 20 28 34 29 20 68 61 73 20 73 69 6e 63 65 20    (4) has since 
1af80 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f  been expanded to
1af90 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53   exclude all DIS
1afa0 54 49 4e 43 54 20 73 75 62 71 75 65 72 69 65 73  TINCT subqueries
1afb0 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54  ..**.**   (6)  T
1afc0 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1afd0 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61   not use aggrega
1afe0 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72  tes or the outer
1aff0 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a   query is not.**
1b000 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54          DISTINCT
1b010 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54  ..**.**   (7)  T
1b020 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
1b030 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  a FROM clause.  
1b040 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62 71 75  TODO:  For subqu
1b050 65 72 69 65 73 20 77 69 74 68 6f 75 74 0a 2a 2a  eries without.**
1b060 20 20 20 20 20 20 20 20 41 20 46 52 4f 4d 20 63          A FROM c
1b070 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64 65 72 20  lause, consider 
1b080 61 64 64 69 6e 67 20 61 20 46 52 4f 4d 20 63 6c  adding a FROM cl
1b090 6f 73 65 20 77 69 74 68 20 74 68 65 20 73 70 65  ose with the spe
1b0a0 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74  cial.**        t
1b0b0 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65  able sqlite_once
1b0c0 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f   that consists o
1b0d0 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 63  f a single row c
1b0e0 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20  ontaining a.**  
1b0f0 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c        single NUL
1b100 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20  L..**.**   (8)  
1b110 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1b120 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
1b130 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1b140 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
1b150 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54  ..**.**   (9)  T
1b160 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1b170 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
1b180 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
1b190 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a  y does not use.*
1b1a0 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61  *        aggrega
1b1b0 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29  tes..**.**  (10)
1b1c0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
1b1d0 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72  oes not use aggr
1b1e0 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75  egates or the ou
1b1f0 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
1b200 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65  ot.**        use
1b210 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28   LIMIT..**.**  (
1b220 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72  11)  The subquer
1b230 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  y and the outer 
1b240 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74  query do not bot
1b250 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59 20  h have ORDER BY 
1b260 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  clauses..**.**  
1b270 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d  (**)  Not implem
1b280 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64  ented.  Subsumed
1b290 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f   into restrictio
1b2a0 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72 65 76  n (3).  Was prev
1b2b0 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20  iously.**       
1b2c0 20 61 20 73 65 70 61 72 61 74 65 20 72 65 73 74   a separate rest
1b2d0 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67  riction deriving
1b2e0 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35   from ticket #35
1b2f0 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20  0..**.**  (13)  
1b300 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
1b310 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
1b320 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d  not both use LIM
1b330 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20  IT..**.**  (14) 
1b340 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
1b350 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45  es not use OFFSE
1b360 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20  T..**.**  (15)  
1b370 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
1b380 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  is not part of a
1b390 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1b3a0 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   or the.**      
1b3b0 20 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20    subquery does 
1b3c0 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49 54  not have a LIMIT
1b3d0 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20   clause..**     
1b3e0 20 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 23     (See ticket #
1b3f0 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65 74 20  2339 and ticket 
1b400 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e 0a 2a  [02a8e81d44])..*
1b410 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65 20  *.**  (16)  The 
1b420 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1b430 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
1b440 6f 72 20 74 68 65 20 73 75 62 71 75 65 72 79 20  or the subquery 
1b450 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e  does.**        n
1b460 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52  ot contain ORDER
1b470 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32   BY.  (Ticket #2
1b480 39 34 32 29 20 20 54 68 69 73 20 75 73 65 64 20  942)  This used 
1b490 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a  to not matter.**
1b4a0 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65          until we
1b4b0 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20   introduced the 
1b4c0 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66  group_concat() f
1b4d0 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a  unction.  .**.**
1b4e0 20 20 28 31 37 29 20 20 54 68 65 20 73 75 62 2d    (17)  The sub-
1b4f0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 63  query is not a c
1b500 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
1b510 6f 72 20 69 74 20 69 73 20 61 20 55 4e 49 4f 4e  or it is a UNION
1b520 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20 20   ALL .**        
1b530 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65 20  compound clause 
1b540 6d 61 64 65 20 75 70 20 65 6e 74 69 72 65 6c 79  made up entirely
1b550 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74   of non-aggregat
1b560 65 20 71 75 65 72 69 65 73 2c 20 61 6e 64 20 0a  e queries, and .
1b570 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 70 61  **        the pa
1b580 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a  rent query:.**.*
1b590 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20  *          * is 
1b5a0 6e 6f 74 20 69 74 73 65 6c 66 20 70 61 72 74 20  not itself part 
1b5b0 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
1b5c0 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20 20  lect,.**        
1b5d0 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61 67    * is not an ag
1b5e0 67 72 65 67 61 74 65 20 6f 72 20 44 49 53 54 49  gregate or DISTI
1b5f0 4e 43 54 20 71 75 65 72 79 2c 20 61 6e 64 0a 2a  NCT query, and.*
1b600 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20  *          * is 
1b610 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 0a 2a 2a  not a join.**.**
1b620 20 20 20 20 20 20 20 20 54 68 65 20 70 61 72 65          The pare
1b630 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79  nt and sub-query
1b640 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45   may contain WHE
1b650 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a  RE clauses. Subj
1b660 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ect to.**       
1b670 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33   rules (11), (13
1b680 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79  ) and (14), they
1b690 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69   may also contai
1b6a0 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20  n ORDER BY,.**  
1b6b0 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20        LIMIT and 
1b6c0 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20  OFFSET clauses. 
1b6d0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 63 61   The subquery ca
1b6e0 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f 6d  nnot use any com
1b6f0 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  pound.**        
1b700 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20 74  operator other t
1b710 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65  han UNION ALL be
1b720 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f 74  cause all the ot
1b730 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20  her compound.** 
1b740 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73         operators
1b750 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65 64   have an implied
1b760 20 44 49 53 54 49 4e 43 54 20 77 68 69 63 68 20   DISTINCT which 
1b770 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62 79  is disallowed by
1b780 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74 72  .**        restr
1b790 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a  iction (4)..**.*
1b7a0 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20 65  *        Also, e
1b7b0 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66  ach component of
1b7c0 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d   the sub-query m
1b7d0 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 73  ust return the s
1b7e0 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20  ame number.**   
1b7f0 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20 63       of result c
1b800 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73 20  olumns. This is 
1b810 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75 69  actually a requi
1b820 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20 63  rement for any c
1b830 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
1b840 20 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65    SELECT stateme
1b850 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20  nt, but all the 
1b860 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20 69  code here does i
1b870 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  s make sure that
1b880 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 75   no.**        su
1b890 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75 62  ch (illegal) sub
1b8a0 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74 74 65  -query is flatte
1b8b0 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ned. The caller 
1b8c0 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65 0a  will detect the.
1b8d0 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61 78  **        syntax
1b8e0 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72   error and retur
1b8f0 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65 73  n a detailed mes
1b900 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38  sage..**.**  (18
1b910 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  )  If the sub-qu
1b920 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
1b930 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61  d select, then a
1b940 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a  ll terms of the.
1b950 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20  **        ORDER 
1b960 62 79 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  by clause of the
1b970 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20   parent must be 
1b980 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65  simple reference
1b990 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20  s to .**        
1b9a0 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73  columns of the s
1b9b0 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  ub-query..**.** 
1b9c0 20 28 31 39 29 20 20 54 68 65 20 73 75 62 71 75   (19)  The subqu
1b9d0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
1b9e0 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75   LIMIT or the ou
1b9f0 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
1ba00 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76  ot.**        hav
1ba10 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  e a WHERE clause
1ba20 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49  ..**.**  (20)  I
1ba30 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
1ba40 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  is a compound se
1ba50 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75  lect, then it mu
1ba60 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20  st not use.**   
1ba70 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59       an ORDER BY
1ba80 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74   clause.  Ticket
1ba90 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c   #3773.  We coul
1baa0 64 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e  d relax this con
1bab0 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20  straint.**      
1bac0 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61    somewhat by sa
1bad0 79 69 6e 67 20 74 68 61 74 20 74 68 65 20 74 65  ying that the te
1bae0 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
1baf0 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a   BY clause must.
1bb00 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65 61 72  **        appear
1bb10 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72   as unmodified r
1bb20 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e  esult columns in
1bb30 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1bb40 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20 20 20 20  .  But we.**    
1bb50 20 20 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f      have other o
1bb60 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20  ptimizations in 
1bb70 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74  mind to deal wit
1bb80 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a  h that case..**.
1bb90 2a 2a 20 20 28 32 31 29 20 20 54 68 65 20 73 75  **  (21)  The su
1bba0 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
1bbb0 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
1bbc0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
1bbd0 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49  not.**        DI
1bbe0 53 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74 69  STINCT.  (See ti
1bbf0 63 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66 63  cket [752e1646fc
1bc00 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29 20  ])..**.**  (22) 
1bc10 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
1bc20 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65   not a recursive
1bc30 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 33   CTE..**.**  (23
1bc40 29 20 20 54 68 65 20 70 61 72 65 6e 74 20 69 73  )  The parent is
1bc50 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65   not a recursive
1bc60 20 43 54 45 2c 20 6f 72 20 74 68 65 20 73 75 62   CTE, or the sub
1bc70 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 0a  -query is not a.
1bc80 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75  **        compou
1bc90 6e 64 20 71 75 65 72 79 2e 20 54 68 69 73 20 72  nd query. This r
1bca0 65 73 74 72 69 63 74 69 6f 6e 20 69 73 20 62 65  estriction is be
1bcb0 63 61 75 73 65 20 74 72 61 6e 73 66 6f 72 6d 69  cause transformi
1bcc0 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  ng the.**       
1bcd0 20 70 61 72 65 6e 74 20 74 6f 20 61 20 63 6f 6d   parent to a com
1bce0 70 6f 75 6e 64 20 71 75 65 72 79 20 63 6f 6e 66  pound query conf
1bcf0 75 73 65 73 20 74 68 65 20 63 6f 64 65 20 74 68  uses the code th
1bd00 61 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 20 20  at handles.**   
1bd10 20 20 20 20 20 72 65 63 75 72 73 69 76 65 20 71       recursive q
1bd20 75 65 72 69 65 73 20 69 6e 20 6d 75 6c 74 69 53  ueries in multiS
1bd30 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 0a 2a  elect()..**.**.*
1bd40 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  * In this routin
1bd50 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d  e, the "p" param
1bd60 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65  eter is a pointe
1bd70 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71  r to the outer q
1bd80 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62  uery..** The sub
1bd90 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63  query is p->pSrc
1bda0 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41  ->a[iFrom].  isA
1bdb0 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  gg is true if th
1bdc0 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a  e outer query.**
1bdd0 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73   uses aggregates
1bde0 20 61 6e 64 20 73 75 62 71 75 65 72 79 49 73 41   and subqueryIsA
1bdf0 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  gg is true if th
1be00 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
1be10 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
1be20 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
1be30 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64  is not attempted
1be40 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1be50 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65  s a no-op and re
1be60 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66  turns 0..** If f
1be70 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74  lattening is att
1be80 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75 74  empted this rout
1be90 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a  ine returns 1..*
1bea0 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20  *.** All of the 
1beb0 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79  expression analy
1bec0 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f  sis must occur o
1bed0 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72  n both the outer
1bee0 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68   query and.** th
1bef0 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f 72  e subquery befor
1bf00 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  e this routine r
1bf10 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  uns..*/.static i
1bf20 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65  nt flattenSubque
1bf30 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ry(.  Parse *pPa
1bf40 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
1bf50 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1bf60 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
1bf70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
1bf80 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53  arent or outer S
1bf90 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1bfa0 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20  */.  int iFrom, 
1bfb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1bfc0 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61  ex in p->pSrc->a
1bfd0 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  [] of the inner 
1bfe0 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  subquery */.  in
1bff0 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20 20  t isAgg,        
1c000 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75     /* True if ou
1c010 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20  ter SELECT uses 
1c020 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
1c030 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62  ons */.  int sub
1c040 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a  queryIsAgg    /*
1c050 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75 62   True if the sub
1c060 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65  query uses aggre
1c070 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
1c080 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
1c090 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e  r *zSavedAuthCon
1c0a0 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a  text = pParse->z
1c0b0 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53  AuthContext;.  S
1c0c0 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b 0a  elect *pParent;.
1c0d0 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20    Select *pSub; 
1c0e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e        /* The inn
1c0f0 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62  er query or "sub
1c100 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65  query" */.  Sele
1c110 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20  ct *pSub1;      
1c120 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
1c130 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65  e rightmost sele
1c140 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20  ct in sub-query 
1c150 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
1c160 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  rc;      /* The 
1c170 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1c180 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
1c190 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75  /.  SrcList *pSu
1c1a0 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46  bSrc;   /* The F
1c1b0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
1c1c0 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
1c1d0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
1c1e0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c      /* The resul
1c1f0 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74  t set of the out
1c200 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  er query */.  in
1c210 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20  t iParent;      
1c220 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72    /* VDBE cursor
1c230 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
1c240 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20 74  Sub result set t
1c250 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  emp table */.  i
1c260 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
1c270 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1c280 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  er */.  Expr *pW
1c290 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 20  here;           
1c2a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1c2b0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
1c2c0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1c2d0 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b  _item *pSubitem;
1c2e0 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65     /* The subque
1c2f0 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ry */.  sqlite3 
1c300 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1c310 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
1c320 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69   see if flatteni
1c330 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ng is permitted.
1c340 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f    Return 0 if no
1c350 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
1c360 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
1c370 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30  rt( p->pPrior==0
1c380 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74   );  /* Unable t
1c390 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70 6f 75  o flatten compou
1c3a0 6e 64 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20  nd queries */.  
1c3b0 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
1c3c0 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  Disabled(db, SQL
1c3d0 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e  ITE_QueryFlatten
1c3e0 65 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  er) ) return 0;.
1c3f0 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
1c400 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
1c410 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20   && iFrom>=0 && 
1c420 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63  iFrom<pSrc->nSrc
1c430 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d   );.  pSubitem =
1c440 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d   &pSrc->a[iFrom]
1c450 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53  ;.  iParent = pS
1c460 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  ubitem->iCursor;
1c470 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74  .  pSub = pSubit
1c480 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61  em->pSelect;.  a
1c490 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29  ssert( pSub!=0 )
1c4a0 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26  ;.  if( isAgg &&
1c4b0 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
1c4c0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1c4d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1c4e0 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20 2a  striction (1)  *
1c4f0 2f 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79  /.  if( subquery
1c500 49 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e  IsAgg && pSrc->n
1c510 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30  Src>1 ) return 0
1c520 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
1c530 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20 20 2a  striction (2)  *
1c540 2f 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53  /.  pSubSrc = pS
1c550 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65  ub->pSrc;.  asse
1c560 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20  rt( pSubSrc );. 
1c570 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72   /* Prior to ver
1c580 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e  sion 3.1.2, when
1c590 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
1c5a0 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70  T had to be simp
1c5b0 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20  le constants,.  
1c5c0 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79  ** not arbitrary
1c5d0 20 65 78 70 72 65 73 73 73 69 6f 6e 73 2c 20 77   expresssions, w
1c5e0 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63  e allowed some c
1c5f0 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49  ombining of LIMI
1c600 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
1c610 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63  * because they c
1c620 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
1c630 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
1c640 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49  .  But when LIMI
1c650 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
1c660 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61  * became arbitra
1c670 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  ry expressions, 
1c680 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74  we were forced t
1c690 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f  o add restrictio
1c6a0 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64  ns (13).  ** and
1c6b0 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20   (14). */.  if( 
1c6c0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
1c6d0 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
1c6e0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1c6f0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1c700 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20  n (13) */.  if( 
1c710 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20  pSub->pOffset ) 
1c720 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1c730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c740 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1c750 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20  n (14) */.  if( 
1c760 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1c770 46 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d 30 20 26  F_Compound)!=0 &
1c780 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29  & pSub->pLimit )
1c790 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
1c7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1c7d0 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a  striction (15) *
1c7e0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  /.  }.  if( pSub
1c7f0 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72  Src->nSrc==0 ) r
1c800 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1c810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c820 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37  * Restriction (7
1c830 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
1c840 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1c850 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
1c860 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  n 0;           /
1c870 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 35  * Restriction (5
1c880 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
1c890 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72  ->pLimit && (pSr
1c8a0 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41  c->nSrc>1 || isA
1c8b0 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75  gg) ){.     retu
1c8c0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
1c8d0 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38   Restrictions (8
1c8e0 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  )(9) */.  }.  if
1c8f0 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
1c900 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
1c910 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67   && subqueryIsAg
1c920 67 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  g ){.     return
1c930 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52   0;         /* R
1c940 65 73 74 72 69 63 74 69 6f 6e 20 28 36 29 20 20  estriction (6)  
1c950 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  */.  }.  if( p->
1c960 70 4f 72 64 65 72 42 79 20 26 26 20 70 53 75 62  pOrderBy && pSub
1c970 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
1c980 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1c990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9b0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1c9c0 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20  ction (11) */.  
1c9d0 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26  }.  if( isAgg &&
1c9e0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1c9f0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1ca00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1ca10 73 74 72 69 63 74 69 6f 6e 20 28 31 36 29 20 2a  striction (16) *
1ca20 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
1ca30 69 6d 69 74 20 26 26 20 70 2d 3e 70 57 68 65 72  imit && p->pWher
1ca40 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
1ca50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1ca60 73 74 72 69 63 74 69 6f 6e 20 28 31 39 29 20 2a  striction (19) *
1ca70 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
1ca80 69 6d 69 74 20 26 26 20 28 70 2d 3e 73 65 6c 46  imit && (p->selF
1ca90 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
1caa0 63 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 72  ct)!=0 ){.     r
1cab0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1cac0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1cad0 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (21) */.  }.  if
1cae0 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  ( pSub->selFlags
1caf0 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20   & SF_Recursive 
1cb00 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1cb10 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1cb20 69 6f 6e 20 28 32 32 29 20 20 2a 2f 0a 20 20 69  ion (22)  */.  i
1cb30 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
1cb40 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 29 20  & SF_Recursive) 
1cb50 26 26 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20  && pSub->pPrior 
1cb60 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1cb70 20 20 2f 2a 20 28 32 33 29 20 20 2a 2f 0a 0a 20    /* (23)  */.. 
1cb80 20 2f 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d   /* OBSOLETE COM
1cb90 4d 45 4e 54 20 31 3a 0a 20 20 2a 2a 20 52 65 73  MENT 1:.  ** Res
1cba0 74 72 69 63 74 69 6f 6e 20 33 3a 20 20 49 66 20  triction 3:  If 
1cbb0 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
1cbc0 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72  a join, make sur
1cbd0 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  e the subquery i
1cbe0 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64  s .  ** not used
1cbf0 20 61 73 20 74 68 65 20 72 69 67 68 74 20 6f 70   as the right op
1cc00 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65  erand of an oute
1cc10 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65  r join.  Example
1cc20 73 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20  s of why this.  
1cc30 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  ** is not allowe
1cc40 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  d:.  **.  **    
1cc50 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54       t1 LEFT OUT
1cc60 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e  ER JOIN (t2 JOIN
1cc70 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49   t3).  **.  ** I
1cc80 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65  f we flatten the
1cc90 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64   above, we would
1cca0 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   get.  **.  **  
1ccb0 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20         (t1 LEFT 
1ccc0 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a  OUTER JOIN t2) J
1ccd0 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a  OIN t3.  **.  **
1cce0 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74   which is not at
1ccf0 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68   all the same th
1cd00 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f  ing..  **.  ** O
1cd10 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20  BSOLETE COMMENT 
1cd20 32 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74  2:.  ** Restrict
1cd30 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20  ion 12:  If the 
1cd40 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20  subquery is the 
1cd50 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
1cd60 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20   a left outer.  
1cd70 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75  ** join, make su
1cd80 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  re the subquery 
1cd90 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  has no WHERE cla
1cda0 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61  use..  ** An exa
1cdb0 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69  mples of why thi
1cdc0 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  s is not allowed
1cdd0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
1cde0 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45      t1 LEFT OUTE
1cdf0 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a  R JOIN (SELECT *
1ce00 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74   FROM t2 WHERE t
1ce10 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a  2.x>0).  **.  **
1ce20 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74   If we flatten t
1ce30 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75  he above, we wou
1ce40 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a  ld get.  **.  **
1ce50 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46           (t1 LEF
1ce60 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29  T OUTER JOIN t2)
1ce70 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20   WHERE t2.x>0.  
1ce80 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20  **.  ** But the 
1ce90 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c  t2.x>0 test will
1cea0 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20   always fail on 
1ceb0 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32  a NULL row of t2
1cec0 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66  , which.  ** eff
1ced0 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74  ectively convert
1cee0 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e  s the OUTER JOIN
1cef0 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a   into an INNER J
1cf00 4f 49 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  OIN..  **.  ** T
1cf10 48 49 53 20 4f 56 45 52 52 49 44 45 53 20 4f 42  HIS OVERRIDES OB
1cf20 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 53 20  SOLETE COMMENTS 
1cf30 31 20 41 4e 44 20 32 20 41 42 4f 56 45 3a 0a 20  1 AND 2 ABOVE:. 
1cf40 20 2a 2a 20 54 69 63 6b 65 74 20 23 33 33 30 30   ** Ticket #3300
1cf50 20 73 68 6f 77 73 20 74 68 61 74 20 66 6c 61 74   shows that flat
1cf60 74 65 6e 69 6e 67 20 74 68 65 20 72 69 67 68 74  tening the right
1cf70 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20   term of a LEFT 
1cf80 4a 4f 49 4e 0a 20 20 2a 2a 20 69 73 20 66 72 61  JOIN.  ** is fra
1cf90 75 67 68 74 20 77 69 74 68 20 64 61 6e 67 65 72  ught with danger
1cfa0 2e 20 20 42 65 73 74 20 74 6f 20 61 76 6f 69 64  .  Best to avoid
1cfb0 20 74 68 65 20 77 68 6f 6c 65 20 74 68 69 6e 67   the whole thing
1cfc0 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 73  .  If the.  ** s
1cfd0 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72  ubquery is the r
1cfe0 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c  ight term of a L
1cff0 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 64  EFT JOIN, then d
1d000 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e 2e 0a 20  o not flatten.. 
1d010 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62 69   */.  if( (pSubi
1d020 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  tem->jointype & 
1d030 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a  JT_OUTER)!=0 ){.
1d040 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1d050 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74  }..  /* Restrict
1d060 69 6f 6e 20 31 37 3a 20 49 66 20 74 68 65 20 73  ion 17: If the s
1d070 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
1d080 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20 74  mpound SELECT, t
1d090 68 65 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a  hen it must.  **
1d0a0 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e   use only the UN
1d0b0 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
1d0c0 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68  . And none of th
1d0d0 65 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 20  e simple select 
1d0e0 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 68 61  queries.  ** tha
1d0f0 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63 6f  t make up the co
1d100 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61 72  mpound SELECT ar
1d110 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20  e allowed to be 
1d120 61 67 67 72 65 67 61 74 65 20 6f 72 20 64 69 73  aggregate or dis
1d130 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72 69  tinct.  ** queri
1d140 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  es..  */.  if( p
1d150 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  Sub->pPrior ){. 
1d160 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72     if( pSub->pOr
1d170 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 72  derBy ){.      r
1d180 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65 73  eturn 0;  /* Res
1d190 74 72 69 63 74 69 6f 6e 20 32 30 20 2a 2f 0a 20  triction 20 */. 
1d1a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 41     }.    if( isA
1d1b0 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61  gg || (p->selFla
1d1c0 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
1d1d0 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53  )!=0 || pSrc->nS
1d1e0 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72  rc!=1 ){.      r
1d1f0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
1d200 20 20 20 66 6f 72 28 70 53 75 62 31 3d 70 53 75     for(pSub1=pSu
1d210 62 3b 20 70 53 75 62 31 3b 20 70 53 75 62 31 3d  b; pSub1; pSub1=
1d220 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a  pSub1->pPrior){.
1d230 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1d240 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73  (pSub1->selFlags
1d250 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
1d260 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
1d270 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  SF_Distinct );. 
1d280 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1d290 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
1d2a0 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
1d2b0 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
1d2c0 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20  F_Aggregate );. 
1d2d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
1d2e0 62 2d 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20 20  b->pSrc!=0 );.  
1d2f0 20 20 20 20 69 66 28 20 28 70 53 75 62 31 2d 3e      if( (pSub1->
1d300 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
1d310 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
1d320 67 61 74 65 29 29 21 3d 30 0a 20 20 20 20 20 20  gate))!=0.      
1d330 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70 50 72 69   || (pSub1->pPri
1d340 6f 72 20 26 26 20 70 53 75 62 31 2d 3e 6f 70 21  or && pSub1->op!
1d350 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20 20 20 20 20  =TK_ALL) .      
1d360 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72 63 2d   || pSub1->pSrc-
1d370 3e 6e 53 72 63 3c 31 0a 20 20 20 20 20 20 20 7c  >nSrc<1.       |
1d380 7c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  | pSub->pEList->
1d390 6e 45 78 70 72 21 3d 70 53 75 62 31 2d 3e 70 45  nExpr!=pSub1->pE
1d3a0 4c 69 73 74 2d 3e 6e 45 78 70 72 0a 20 20 20 20  List->nExpr.    
1d3b0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74    ){.        ret
1d3c0 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
1d3d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1d3e0 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  Sub1->pSrc->nSrc
1d3f0 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  >1 );.    }..   
1d400 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1d410 31 38 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  18. */.    if( p
1d420 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
1d430 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
1d440 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
1d450 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
1d460 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  r; ii++){.      
1d470 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
1d480 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72  y->a[ii].u.x.iOr
1d490 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65  derByCol==0 ) re
1d4a0 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
1d4b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a      }.  }..  /**
1d4c0 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68 20  *** If we reach 
1d4d0 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74  this point, flat
1d4e0 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
1d4f0 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 0a 20 20 2f  ted. *****/..  /
1d500 2a 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65 20  * Authorize the 
1d510 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 50  subquery */.  pP
1d520 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
1d530 78 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a  xt = pSubitem->z
1d540 4e 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59  Name;.  TESTONLY
1d550 28 69 20 3d 29 20 73 71 6c 69 74 65 33 41 75 74  (i =) sqlite3Aut
1d560 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
1d570 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c  QLITE_SELECT, 0,
1d580 20 30 2c 20 30 29 3b 0a 20 20 74 65 73 74 63 61   0, 0);.  testca
1d590 73 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45  se( i==SQLITE_DE
1d5a0 4e 59 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  NY );.  pParse->
1d5b0 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a  zAuthContext = z
1d5c0 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
1d5d0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  ;..  /* If the s
1d5e0 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
1d5f0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74  mpound SELECT st
1d600 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62  atement, then (b
1d610 79 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 20  y restrictions. 
1d620 20 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61 62   ** 17 and 18 ab
1d630 6f 76 65 29 20 69 74 20 6d 75 73 74 20 62 65 20  ove) it must be 
1d640 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20  a UNION ALL and 
1d650 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
1d660 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f   must .  ** be o
1d670 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a  f the form:.  **
1d680 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
1d690 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f   <expr-list> FRO
1d6a0 4d 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20  M (<sub-query>) 
1d6b0 3c 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a  <where-clause> .
1d6c0 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77    **.  ** follow
1d6d0 65 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20  ed by any ORDER 
1d6e0 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72  BY, LIMIT and/or
1d6f0 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e   OFFSET clauses.
1d700 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a   This block.  **
1d710 20 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f 70   creates N-1 cop
1d720 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e  ies of the paren
1d730 74 20 71 75 65 72 79 20 77 69 74 68 6f 75 74 20  t query without 
1d740 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49  any ORDER BY, LI
1d750 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46  MIT or .  ** OFF
1d760 53 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20  SET clauses and 
1d770 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68  joins them to th
1d780 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65  e left-hand-side
1d790 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
1d7a0 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f  .  ** using UNIO
1d7b0 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e  N ALL operators.
1d7c0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20   In this case N 
1d7d0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1d7e0 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c   simple.  ** sel
1d7f0 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ect statements i
1d800 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  n the compound s
1d810 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20  ub-query..  **. 
1d820 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a   ** Example:.  *
1d830 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
1d840 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a  T a+1 FROM (.  *
1d850 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
1d860 78 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20  x FROM tab.  ** 
1d870 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
1d880 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  .  **        SEL
1d890 45 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a 20  ECT y FROM tab. 
1d8a0 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e   **        UNION
1d8b0 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20   ALL.  **       
1d8c0 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29   SELECT abs(z*2)
1d8d0 20 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20   FROM tab2.  ** 
1d8e0 20 20 20 20 29 20 57 48 45 52 45 20 61 21 3d 35      ) WHERE a!=5
1d8f0 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a   ORDER BY 1.  **
1d900 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65  .  ** Transforme
1d910 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  d into:.  **.  *
1d920 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 31  *     SELECT x+1
1d930 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20   FROM tab WHERE 
1d940 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20  x+1!=5.  **     
1d950 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
1d960 20 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46 52     SELECT y+1 FR
1d970 4f 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b 31  OM tab WHERE y+1
1d980 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49  !=5.  **     UNI
1d990 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
1d9a0 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 2b  SELECT abs(z*2)+
1d9b0 31 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45 52  1 FROM tab2 WHER
1d9c0 45 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a  E abs(z*2)+1!=5.
1d9d0 20 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42    **     ORDER B
1d9e0 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65  Y 1.  **.  ** We
1d9f0 20 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22   call this the "
1da00 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
1da10 79 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20  y flattening".. 
1da20 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70   */.  for(pSub=p
1da30 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75  Sub->pPrior; pSu
1da40 62 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50  b; pSub=pSub->pP
1da50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63  rior){.    Selec
1da60 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70  t *pNew;.    Exp
1da70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
1da80 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
1da90 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20     Expr *pLimit 
1daa0 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
1dab0 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20 3d   Expr *pOffset =
1dac0 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
1dad0 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20   Select *pPrior 
1dae0 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
1daf0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
1db00 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20  ;.    p->pSrc = 
1db10 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  0;.    p->pPrior
1db20 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69   = 0;.    p->pLi
1db30 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  mit = 0;.    p->
1db40 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
1db50 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53   pNew = sqlite3S
1db60 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2c 20  electDup(db, p, 
1db70 30 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73  0);.    p->pOffs
1db80 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20  et = pOffset;.  
1db90 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
1dba0 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  imit;.    p->pOr
1dbb0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
1dbc0 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20  ;.    p->pSrc = 
1dbd0 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20  pSrc;.    p->op 
1dbe0 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69 66  = TK_ALL;.    if
1dbf0 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
1dc00 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
1dc10 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65  Prior;.    }else
1dc20 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50  {.      pNew->pP
1dc30 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
1dc40 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 20       if( pPrior 
1dc50 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20  ) pPrior->pNext 
1dc60 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e  = pNew;.      pN
1dc70 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20  ew->pNext = p;. 
1dc80 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
1dc90 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 20   pNew;.    }.   
1dca0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1dcb0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31  ailed ) return 1
1dcc0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
1dcd0 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65  n flattening the
1dce0 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20   iFrom-th entry 
1dcf0 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
1dd00 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  se .  ** in the 
1dd10 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a  outer query..  *
1dd20 2f 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 31  /.  pSub = pSub1
1dd30 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65   = pSubitem->pSe
1dd40 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  lect;..  /* Dele
1dd50 74 65 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74  te the transient
1dd60 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
1dd70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1dd80 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
1dd90 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ry.  */.  sqlite
1dda0 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
1ddb0 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  item->zDatabase)
1ddc0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1ddd0 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e  e(db, pSubitem->
1dde0 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
1ddf0 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
1de00 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  item->zAlias);. 
1de10 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61   pSubitem->zData
1de20 62 61 73 65 20 3d 20 30 3b 0a 20 20 70 53 75 62  base = 0;.  pSub
1de30 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b  item->zName = 0;
1de40 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c  .  pSubitem->zAl
1de50 69 61 73 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ias = 0;.  pSubi
1de60 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30  tem->pSelect = 0
1de70 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20 64 65  ;..  /* Defer de
1de80 6c 65 74 69 6e 67 20 74 68 65 20 54 61 62 6c 65  leting the Table
1de90 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74   object associat
1dea0 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a  ed with the.  **
1deb0 20 73 75 62 71 75 65 72 79 20 75 6e 74 69 6c 20   subquery until 
1dec0 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20  code generation 
1ded0 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65  is.  ** complete
1dee0 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 6d 61  , since there ma
1def0 79 20 73 74 69 6c 6c 20 65 78 69 73 74 20 45 78  y still exist Ex
1df00 70 72 2e 70 54 61 62 20 65 6e 74 72 69 65 73 20  pr.pTab entries 
1df10 74 68 61 74 0a 20 20 2a 2a 20 72 65 66 65 72 20  that.  ** refer 
1df20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20  to the subquery 
1df30 65 76 65 6e 20 61 66 74 65 72 20 66 6c 61 74 74  even after flatt
1df40 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74 20 23  ening.  Ticket #
1df50 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  3346..  **.  ** 
1df60 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 69  pSubitem->pTab i
1df70 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c  s always non-NUL
1df80 4c 20 62 79 20 74 65 73 74 20 72 65 73 74 72 69  L by test restri
1df90 63 74 69 6f 6e 73 20 61 6e 64 20 74 65 73 74 73  ctions and tests
1dfa0 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69   above..  */.  i
1dfb0 66 28 20 41 4c 57 41 59 53 28 70 53 75 62 69 74  f( ALWAYS(pSubit
1dfc0 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a  em->pTab!=0) ){.
1dfd0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 54      Table *pTabT
1dfe0 6f 44 65 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d  oDel = pSubitem-
1dff0 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  >pTab;.    if( p
1e000 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d  TabToDel->nRef==
1e010 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65  1 ){.      Parse
1e020 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
1e030 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
1e040 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
1e050 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65    pTabToDel->pNe
1e060 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c  xtZombie = pTopl
1e070 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62  evel->pZombieTab
1e080 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65  ;.      pTopleve
1e090 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20  l->pZombieTab = 
1e0a0 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d  pTabToDel;.    }
1e0b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62  else{.      pTab
1e0c0 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  ToDel->nRef--;. 
1e0d0 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69 74 65     }.    pSubite
1e0e0 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d  m->pTab = 0;.  }
1e0f0 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
1e100 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f  wing loop runs o
1e110 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 65 72  nce for each ter
1e120 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d  m in a compound-
1e130 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c  subquery.  ** fl
1e140 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64 65 73  attening (as des
1e150 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e 20 20  cribed above).  
1e160 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20  If we are doing 
1e170 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69 6e 64  a different kind
1e180 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e  .  ** of flatten
1e190 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65 6e 69  ing - a flatteni
1e1a0 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  ng other than a 
1e1b0 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
1e1c0 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20  y flattening -. 
1e1d0 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 6c 6f   ** then this lo
1e1e0 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63  op only runs onc
1e1f0 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
1e200 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c  s loop moves all
1e210 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65   of the FROM ele
1e220 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62  ments of the sub
1e230 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20  query into the. 
1e240 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   ** the FROM cla
1e250 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
1e260 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20   query.  Before 
1e270 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65  doing this, reme
1e280 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75  mber.  ** the cu
1e290 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
1e2a0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74  the original out
1e2b0 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c  er query FROM el
1e2c0 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50  ement in.  ** iP
1e2d0 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72  arent.  The iPar
1e2e0 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  ent cursor will 
1e2f0 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20 20  never be used.  
1e300 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a  Subsequent code.
1e310 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65    ** will scan e
1e320 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69  xpressions looki
1e330 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72  ng for iParent r
1e340 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65  eferences and re
1e350 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65  place.  ** those
1e360 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74 68   references with
1e370 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1e380 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65  t resolve to the
1e390 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20   subquery FROM. 
1e3a0 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20   ** elements we 
1e3b0 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20  are now copying 
1e3c0 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  in..  */.  for(p
1e3d0 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e  Parent=p; pParen
1e3e0 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61 72 65  t; pParent=pPare
1e3f0 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75 62  nt->pPrior, pSub
1e400 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a  =pSub->pPrior){.
1e410 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63 3b      int nSubSrc;
1e420 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79 70 65  .    u8 jointype
1e430 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 53 72   = 0;.    pSubSr
1e440 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 20  c = pSub->pSrc; 
1e450 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
1e460 73 65 20 6f 66 20 73 75 62 71 75 65 72 79 20 2a  se of subquery *
1e470 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20 3d 20  /.    nSubSrc = 
1e480 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20  pSubSrc->nSrc;  
1e490 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
1e4a0 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79 20 46  ms in subquery F
1e4b0 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
1e4c0 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74    pSrc = pParent
1e4d0 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46  ->pSrc;     /* F
1e4e0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
1e4f0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
1e500 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 20 29  ..    if( pSrc )
1e510 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1e520 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f  pParent==p );  /
1e530 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74 68 72  * First time thr
1e540 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  ough the loop */
1e550 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  .      jointype 
1e560 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e  = pSubitem->join
1e570 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  type;.    }else{
1e580 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1e590 50 61 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a  Parent!=p );  /*
1e5a0 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75   2nd and subsequ
1e5b0 65 6e 74 20 74 69 6d 65 73 20 74 68 72 6f 75 67  ent times throug
1e5c0 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  h the loop */.  
1e5d0 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65      pSrc = pPare
1e5e0 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74  nt->pSrc = sqlit
1e5f0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
1e600 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  db, 0, 0, 0);.  
1e610 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20      if( pSrc==0 
1e620 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1e630 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
1e640 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 62  led );.        b
1e650 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1e660 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
1e670 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61 20  subquery uses a 
1e680 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74  single slot of t
1e690 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1e6a0 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20 20 20  f the outer.    
1e6b0 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20 74 68  ** query.  If th
1e6c0 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6d  e subquery has m
1e6d0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65  ore than one ele
1e6e0 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52 4f 4d  ment in its FROM
1e6f0 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20   clause,.    ** 
1e700 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68 65 20  then expand the 
1e710 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f 20 6d  outer query to m
1e720 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 69 74  ake space for it
1e730 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65   to hold all ele
1e740 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20  ments.    ** of 
1e750 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
1e760 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d    **.    ** Exam
1e770 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
1e780 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
1e790 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c 45 43  ROM tabA, (SELEC
1e7a0 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20 73  T * FROM sub1, s
1e7b0 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20 20 20  ub2), tabB;.    
1e7c0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 75  **.    ** The ou
1e7d0 74 65 72 20 71 75 65 72 79 20 68 61 73 20 33 20  ter query has 3 
1e7e0 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46 52 4f  slots in its FRO
1e7f0 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73  M clause.  One s
1e800 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  lot of the.    *
1e810 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 28 74  * outer query (t
1e820 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20  he middle slot) 
1e830 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73  is used by the s
1e840 75 62 71 75 65 72 79 2e 20 20 54 68 65 20 6e 65  ubquery.  The ne
1e850 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20  xt.    ** block 
1e860 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65 78 70  of code will exp
1e870 61 6e 64 20 74 68 65 20 6f 75 74 20 71 75 65 72  and the out quer
1e880 79 20 74 6f 20 34 20 73 6c 6f 74 73 2e 20 20 54  y to 4 slots.  T
1e890 68 65 20 6d 69 64 64 6c 65 0a 20 20 20 20 2a 2a  he middle.    **
1e8a0 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e 64 65   slot is expande
1e8b0 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69  d to two slots i
1e8c0 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20  n order to make 
1e8d0 73 70 61 63 65 20 66 6f 72 20 74 68 65 0a 20 20  space for the.  
1e8e0 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74    ** two element
1e8f0 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
1e900 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71  ause of the subq
1e910 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uery..    */.   
1e920 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29   if( nSubSrc>1 )
1e930 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  {.      pParent-
1e940 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d 20 73  >pSrc = pSrc = s
1e950 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c  qlite3SrcListEnl
1e960 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c 20 6e  arge(db, pSrc, n
1e970 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31  SubSrc-1,iFrom+1
1e980 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  );.      if( db-
1e990 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
1e9a0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1e9b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1e9c0 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74     /* Transfer t
1e9d0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
1e9e0 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 73 75  erms from the su
1e9f0 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a  bquery into the.
1ea00 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
1ea10 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ry..    */.    f
1ea20 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72  or(i=0; i<nSubSr
1ea30 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  c; i++){.      s
1ea40 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
1ea50 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69  te(db, pSrc->a[i
1ea60 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b  +iFrom].pUsing);
1ea70 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69  .      pSrc->a[i
1ea80 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72  +iFrom] = pSubSr
1ea90 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d  c->a[i];.      m
1eaa0 65 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e  emset(&pSubSrc->
1eab0 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  a[i], 0, sizeof(
1eac0 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b  pSubSrc->a[i]));
1ead0 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d  .    }.    pSrc-
1eae0 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79  >a[iFrom].jointy
1eaf0 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20  pe = jointype;. 
1eb00 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65 67   .    /* Now beg
1eb10 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67 20  in substituting 
1eb20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 20  subquery result 
1eb30 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  set expressions 
1eb40 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65 66 65  for .    ** refe
1eb50 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50  rences to the iP
1eb60 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74  arent in the out
1eb70 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a  er query..    **
1eb80 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65   .    ** Example
1eb90 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
1eba0 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a    SELECT a+5, b*
1ebb0 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  10 FROM (SELECT 
1ebc0 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41  x*3 AS a, y+10 A
1ebd0 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45  S b FROM t1) WHE
1ebe0 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20 20  RE a>b;.    **  
1ebf0 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   \              
1ec00 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f         \________
1ec10 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f  _____ subquery _
1ec20 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20  _________/      
1ec30 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20 20      /.    **    
1ec40 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
1ec50 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65  ______ outer que
1ec60 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ry _____________
1ec70 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1ec80 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  _/.    **.    **
1ec90 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72   We look at ever
1eca0 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
1ecb0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1ecc0 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20  and every place 
1ecd0 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20 22 61  we see.    ** "a
1ece0 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
1ecf0 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20  "x*3" and every 
1ed00 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62 22  place we see "b"
1ed10 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22   we substitute "
1ed20 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20  y+10"..    */.  
1ed30 20 20 70 4c 69 73 74 20 3d 20 70 50 61 72 65 6e    pList = pParen
1ed40 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 66  t->pEList;.    f
1ed50 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1ed60 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
1ed70 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61      if( pList->a
1ed80 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  [i].zName==0 ){.
1ed90 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
1eda0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
1edb0 74 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d  trDup(db, pList-
1edc0 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20  >a[i].zSpan);.  
1edd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71        sqlite3Deq
1ede0 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  uote(zName);.   
1edf0 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d       pList->a[i]
1ee00 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  .zName = zName;.
1ee10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ee20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1ee30 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c  db, pParent->pEL
1ee40 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ist, iParent, pS
1ee50 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
1ee60 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20   if( isAgg ){.  
1ee70 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
1ee80 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  t(db, pParent->p
1ee90 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74  GroupBy, iParent
1eea0 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
1eeb0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1eec0 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45  pHaving = substE
1eed0 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  xpr(db, pParent-
1eee0 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e  >pHaving, iParen
1eef0 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1ef00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1ef10 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
1ef20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1ef30 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42  pParent->pOrderB
1ef40 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  y==0 );.      pP
1ef50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20  arent->pOrderBy 
1ef60 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  = pSub->pOrderBy
1ef70 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4f  ;.      pSub->pO
1ef80 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
1ef90 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72 65 6e  }else if( pParen
1efa0 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  t->pOrderBy ){. 
1efb0 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69       substExprLi
1efc0 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  st(db, pParent->
1efd0 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72 65 6e  pOrderBy, iParen
1efe0 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1eff0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1f000 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a  pSub->pWhere ){.
1f010 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 73        pWhere = s
1f020 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
1f030 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65 2c 20  , pSub->pWhere, 
1f040 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
1f050 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b       pWhere = 0;
1f060 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
1f070 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a  ubqueryIsAgg ){.
1f080 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1f090 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d 3d  arent->pHaving==
1f0a0 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  0 );.      pPare
1f0b0 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 50  nt->pHaving = pP
1f0c0 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a 20  arent->pWhere;. 
1f0d0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57       pParent->pW
1f0e0 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20  here = pWhere;. 
1f0f0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48       pParent->pH
1f100 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70  aving = substExp
1f110 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  r(db, pParent->p
1f120 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c  Having, iParent,
1f130 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
1f140 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1f150 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  Having = sqlite3
1f160 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72  ExprAnd(db, pPar
1f170 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a 20  ent->pHaving, . 
1f180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1a0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
1f1b0 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69 6e  db, pSub->pHavin
1f1c0 67 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 61 73  g, 0));.      as
1f1d0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
1f1e0 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20  GroupBy==0 );.  
1f1f0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47 72      pParent->pGr
1f200 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
1f210 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
1f220 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20 30  Sub->pGroupBy, 0
1f230 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1f240 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68      pParent->pWh
1f250 65 72 65 20 3d 20 73 75 62 73 74 45 78 70 72 28  ere = substExpr(
1f260 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68  db, pParent->pWh
1f270 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ere, iParent, pS
1f280 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
1f290 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65     pParent->pWhe
1f2a0 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
1f2b0 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  And(db, pParent-
1f2c0 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65 29  >pWhere, pWhere)
1f2d0 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
1f2e0 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20  * The flattened 
1f2f0 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63  query is distinc
1f300 74 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20  t if either the 
1f310 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20  inner or the.   
1f320 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20   ** outer query 
1f330 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20  is distinct. .  
1f340 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74    */.    pParent
1f350 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53  ->selFlags |= pS
1f360 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
1f370 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20  F_Distinct;.  . 
1f380 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c     /*.    ** SEL
1f390 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45  ECT ... FROM (SE
1f3a0 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61  LECT ... LIMIT a
1f3b0 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54   OFFSET b) LIMIT
1f3c0 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20   x OFFSET y;.   
1f3d0 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69   **.    ** One i
1f3e0 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79  s tempted to try
1f3f0 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20   to add a and b 
1f400 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c  to combine the l
1f410 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69 73  imits.  But this
1f420 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  .    ** does not
1f430 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20   work if either 
1f440 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76  limit is negativ
1f450 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1f460 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29  ( pSub->pLimit )
1f470 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  {.      pParent-
1f480 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e  >pLimit = pSub->
1f490 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53  pLimit;.      pS
1f4a0 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a  ub->pLimit = 0;.
1f4b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1f4c0 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65  Finially, delete
1f4d0 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66   what is left of
1f4e0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   the subquery an
1f4f0 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75  d return.  ** su
1f500 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  ccess..  */.  sq
1f510 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
1f520 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a 20  e(db, pSub1);.. 
1f530 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
1f540 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
1f550 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1f560 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
1f570 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
1f580 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 61  EW) */../*.** Ba
1f590 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  sed on the conte
1f5a0 6e 74 73 20 6f 66 20 74 68 65 20 41 67 67 49 6e  nts of the AggIn
1f5b0 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e 64  fo structure ind
1f5c0 69 63 61 74 65 64 20 62 79 20 74 68 65 20 66 69  icated by the fi
1f5d0 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2c  rst.** argument,
1f5e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   this function c
1f5f0 68 65 63 6b 73 20 69 66 20 74 68 65 20 66 6f 6c  hecks if the fol
1f600 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
1f610 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  .**.**    * the 
1f620 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 6a  query contains j
1f630 75 73 74 20 61 20 73 69 6e 67 6c 65 20 61 67 67  ust a single agg
1f640 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c  regate function,
1f650 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 67 67  .**    * the agg
1f660 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
1f670 69 73 20 65 69 74 68 65 72 20 6d 69 6e 28 29 20  is either min() 
1f680 6f 72 20 6d 61 78 28 29 2c 20 61 6e 64 0a 2a 2a  or max(), and.**
1f690 20 20 20 20 2a 20 74 68 65 20 61 72 67 75 6d 65      * the argume
1f6a0 6e 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  nt to the aggreg
1f6b0 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ate function is 
1f6c0 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2e 0a  a column value..
1f6d0 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20  **.** If all of 
1f6e0 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 74 72  the above are tr
1f6f0 75 65 2c 20 74 68 65 6e 20 57 48 45 52 45 5f 4f  ue, then WHERE_O
1f700 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48  RDERBY_MIN or WH
1f710 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 0a  ERE_ORDERBY_MAX.
1f720 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  ** is returned a
1f730 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 41  s appropriate. A
1f740 6c 73 6f 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69  lso, *ppMinMax i
1f750 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
1f760 6f 20 74 68 65 20 0a 2a 2a 20 6c 69 73 74 20 6f  o the .** list o
1f770 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  f arguments pass
1f780 65 64 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  ed to the aggreg
1f790 61 74 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ate before retur
1f7a0 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  ning..**.** Or, 
1f7b0 69 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  if the condition
1f7c0 73 20 61 62 6f 76 65 20 61 72 65 20 6e 6f 74 20  s above are not 
1f7d0 6d 65 74 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69  met, *ppMinMax i
1f7e0 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a  s set to 0 and.*
1f7f0 2a 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  * WHERE_ORDERBY_
1f800 4e 4f 52 4d 41 4c 20 69 73 20 72 65 74 75 72 6e  NORMAL is return
1f810 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  ed..*/.static u8
1f820 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 41 67 67   minMaxQuery(Agg
1f830 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 2c 20  Info *pAggInfo, 
1f840 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 4d 69 6e  ExprList **ppMin
1f850 4d 61 78 29 7b 0a 20 20 69 6e 74 20 65 52 65 74  Max){.  int eRet
1f860 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   = WHERE_ORDERBY
1f870 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20 20 20 20 20  _NORMAL;        
1f880 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
1f890 65 20 2a 2f 0a 0a 20 20 2a 70 70 4d 69 6e 4d 61  e */..  *ppMinMa
1f8a0 78 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 41 67  x = 0;.  if( pAg
1f8b0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 31 20  gInfo->nFunc==1 
1f8c0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
1f8d0 70 72 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61  pr = pAggInfo->a
1f8e0 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72 3b 20 2f  Func[0].pExpr; /
1f8f0 2a 20 41 67 67 72 65 67 61 74 65 20 66 75 6e 63  * Aggregate func
1f900 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78 70 72  tion */.    Expr
1f910 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
1f920 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 20 20  Expr->x.pList;  
1f930 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73      /* Arguments
1f940 20 74 6f 20 61 67 67 20 66 75 6e 63 74 69 6f 6e   to agg function
1f950 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
1f960 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
1f970 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
1f980 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26     if( pEList &&
1f990 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
1f9a0 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30  1 && pEList->a[0
1f9b0 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ].pExpr->op==TK_
1f9c0 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  AGG_COLUMN ){.  
1f9d0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1f9e0 7a 46 75 6e 63 20 3d 20 70 45 78 70 72 2d 3e 75  zFunc = pExpr->u
1f9f0 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 69  .zToken;.      i
1fa00 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
1fa10 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22 29 3d  p(zFunc, "min")=
1fa20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 52  =0 ){.        eR
1fa30 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  et = WHERE_ORDER
1fa40 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 20 20 20 20  BY_MIN;.        
1fa50 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69  *ppMinMax = pELi
1fa60 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  st;.      }else 
1fa70 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1fa80 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78 22 29  mp(zFunc, "max")
1fa90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
1faa0 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  Ret = WHERE_ORDE
1fab0 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20 20 20 20  RBY_MAX;.       
1fac0 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c   *ppMinMax = pEL
1fad0 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ist;.      }.   
1fae0 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
1faf0 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c  ( *ppMinMax==0 |
1fb00 7c 20 28 2a 70 70 4d 69 6e 4d 61 78 29 2d 3e 6e  | (*ppMinMax)->n
1fb10 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 72 65 74  Expr==1 );.  ret
1fb20 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn eRet;.}../*.
1fb30 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73 74  ** The select st
1fb40 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
1fb50 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
1fb60 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65  ment is an aggre
1fb70 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54  gate query..** T
1fb80 68 65 20 73 65 63 6f 6e 64 20 61 72 67 6d 65 6e  he second argmen
1fb90 74 20 69 73 20 74 68 65 20 61 73 73 6f 63 69 61  t is the associa
1fba0 74 65 64 20 61 67 67 72 65 67 61 74 65 2d 69 6e  ted aggregate-in
1fbb0 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20  fo object. This 
1fbc0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65 73  .** function tes
1fbd0 74 73 20 69 66 20 74 68 65 20 53 45 4c 45 43 54  ts if the SELECT
1fbe0 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
1fbf0 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
1fc00 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74  count(*) FROM <t
1fc10 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  bl>.**.** where 
1fc20 74 61 62 6c 65 20 69 73 20 61 20 64 61 74 61 62  table is a datab
1fc30 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61  ase table, not a
1fc40 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76   sub-select or v
1fc50 69 65 77 2e 20 49 66 20 74 68 65 20 71 75 65 72  iew. If the quer
1fc60 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68 20  y.** does match 
1fc70 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68  this pattern, th
1fc80 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  en a pointer to 
1fc90 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  the Table object
1fca0 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a   representing.**
1fcb0 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72 6e   <tbl> is return
1fcc0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30  ed. Otherwise, 0
1fcd0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1fce0 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a 69  .static Table *i
1fcf0 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c  sSimpleCount(Sel
1fd00 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20  ect *p, AggInfo 
1fd10 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61  *pAggInfo){.  Ta
1fd20 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78 70  ble *pTab;.  Exp
1fd30 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73 73  r *pExpr;..  ass
1fd40 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70 42  ert( !p->pGroupB
1fd50 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  y );..  if( p->p
1fd60 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69  Where || p->pELi
1fd70 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20  st->nExpr!=1 .  
1fd80 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72   || p->pSrc->nSr
1fd90 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d  c!=1 || p->pSrc-
1fda0 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20  >a[0].pSelect.  
1fdb0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1fdc0 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d  .  }.  pTab = p-
1fdd0 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62  >pSrc->a[0].pTab
1fde0 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70  ;.  pExpr = p->p
1fdf0 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
1fe00 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  r;.  assert( pTa
1fe10 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65 6c  b && !pTab->pSel
1fe20 65 63 74 20 26 26 20 70 45 78 70 72 20 29 3b 0a  ect && pExpr );.
1fe30 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
1fe40 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
1fe50 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
1fe60 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op!=TK_AGG_FUNCT
1fe70 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ION ) return 0;.
1fe80 20 20 69 66 28 20 4e 45 56 45 52 28 70 41 67 67    if( NEVER(pAgg
1fe90 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20  Info->nFunc==0) 
1fea0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
1feb0 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  ( (pAggInfo->aFu
1fec0 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e  nc[0].pFunc->fun
1fed0 63 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 55  cFlags&SQLITE_FU
1fee0 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72  NC_COUNT)==0 ) r
1fef0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
1ff00 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44  Expr->flags&EP_D
1ff10 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e  istinct ) return
1ff20 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54   0;..  return pT
1ff30 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ab;.}../*.** If 
1ff40 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20  the source-list 
1ff50 69 74 65 6d 20 70 61 73 73 65 64 20 61 73 20 61  item passed as a
1ff60 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 61  n argument was a
1ff70 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61 6e  ugmented with an
1ff80 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63  .** INDEXED BY c
1ff90 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79 20  lause, then try 
1ffa0 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73 70  to locate the sp
1ffb0 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20 49  ecified index. I
1ffc0 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20 73  f there.** was s
1ffd0 75 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e 64  uch a clause and
1ffe0 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78   the named index
1fff0 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
20000 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  , return .** SQL
20010 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65  ITE_ERROR and le
20020 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ave an error in 
20030 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69 73  pParse. Otherwis
20040 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20  e, populate .** 
20050 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e  pFrom->pIndex an
20060 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
20070 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
20080 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75  e3IndexedByLooku
20090 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
200a0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
200b0 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  item *pFrom){.  
200c0 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20  if( pFrom->pTab 
200d0 26 26 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78  && pFrom->zIndex
200e0 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
200f0 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
20100 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e  b;.    char *zIn
20110 64 65 78 20 3d 20 70 46 72 6f 6d 2d 3e 7a 49 6e  dex = pFrom->zIn
20120 64 65 78 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  dex;.    Index *
20130 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49  pIdx;.    for(pI
20140 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
20150 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 26   .        pIdx &
20160 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
20170 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49  (pIdx->zName, zI
20180 6e 64 65 78 29 3b 20 0a 20 20 20 20 20 20 20 20  ndex); .        
20190 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
201a0 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
201b0 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 73  !pIdx ){.      s
201c0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
201d0 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
201e0 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64  index: %s", zInd
201f0 65 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  ex, 0);.      pP
20200 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
20210 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  a = 1;.      ret
20220 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
20230 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72 6f  ;.    }.    pFro
20240 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 64 78  m->pIndex = pIdx
20250 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
20260 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a  QLITE_OK;.}./*.*
20270 2a 20 44 65 74 65 63 74 20 63 6f 6d 70 6f 75 6e  * Detect compoun
20280 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
20290 6e 74 73 20 74 68 61 74 20 75 73 65 20 61 6e 20  nts that use an 
202a0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
202b0 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61 6c 74 65  with .** an alte
202c0 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e  rnative collatin
202d0 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a  g sequence..**.*
202e0 2a 20 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20  *    SELECT ... 
202f0 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53  FROM t1 EXCEPT S
20300 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
20310 32 20 4f 52 44 45 52 20 42 59 20 2e 2e 20 43 4f  2 ORDER BY .. CO
20320 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  LLATE ....**.** 
20330 54 68 65 73 65 20 61 72 65 20 72 65 77 72 69 74  These are rewrit
20340 74 65 6e 20 61 73 20 61 20 73 75 62 71 75 65 72  ten as a subquer
20350 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  y:.**.**    SELE
20360 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT * FROM (SELEC
20370 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58  T ... FROM t1 EX
20380 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20  CEPT SELECT ... 
20390 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20 20 20 20  FROM t2).**     
203a0 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20 43 4f 4c  ORDER BY ... COL
203b0 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54  LATE ....**.** T
203c0 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  his transformati
203d0 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  on is necessary 
203e0 62 65 63 61 75 73 65 20 74 68 65 20 6d 75 6c 74  because the mult
203f0 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29  iSelectOrderBy()
20400 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 62 6f 76   routine.** abov
20410 65 20 74 68 61 74 20 67 65 6e 65 72 61 74 65 73  e that generates
20420 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20   the code for a 
20430 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
20440 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  with an ORDER BY
20450 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73 65 73 20   clause.** uses 
20460 61 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68  a merge algorith
20470 6d 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  m that requires 
20480 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69  the same collati
20490 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 6e 20 74  ng sequence on t
204a0 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c  he.** result col
204b0 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68 65 20 4f  umns as on the O
204c0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
204d0 20 53 65 65 20 74 69 63 6b 65 74 0a 2a 2a 20 68   See ticket.** h
204e0 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65  ttp://www.sqlite
204f0 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 36 37  .org/src/info/67
20500 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54  09574d2a.**.** T
20510 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  his transformati
20520 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65  on is only neede
20530 64 20 66 6f 72 20 45 58 43 45 50 54 2c 20 49 4e  d for EXCEPT, IN
20540 54 45 52 53 45 43 54 2c 20 61 6e 64 20 55 4e 49  TERSECT, and UNI
20550 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e 49 4f 4e  ON..** The UNION
20560 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 77 6f   ALL operator wo
20570 72 6b 73 20 66 69 6e 65 20 77 69 74 68 20 6d 75  rks fine with mu
20580 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
20590 28 29 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20  () even when.** 
205a0 74 68 65 72 65 20 61 72 65 20 43 4f 4c 4c 41 54  there are COLLAT
205b0 45 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  E terms in the O
205c0 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73 74 61 74  RDER BY..*/.stat
205d0 69 63 20 69 6e 74 20 63 6f 6e 76 65 72 74 43 6f  ic int convertCo
205e0 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75  mpoundSelectToSu
205f0 62 71 75 65 72 79 28 57 61 6c 6b 65 72 20 2a 70  bquery(Walker *p
20600 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
20610 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53  p){.  int i;.  S
20620 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53  elect *pNew;.  S
20630 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20 73 71 6c  elect *pX;.  sql
20640 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74 72 75  ite3 *db;.  stru
20650 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
20660 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a   *a;.  SrcList *
20670 70 4e 65 77 53 72 63 3b 0a 20 20 50 61 72 73 65  pNewSrc;.  Parse
20680 20 2a 70 50 61 72 73 65 3b 0a 20 20 54 6f 6b 65   *pParse;.  Toke
20690 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69 66 28 20  n dummy;..  if( 
206a0 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72  p->pPrior==0 ) r
206b0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
206c0 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72  ue;.  if( p->pOr
206d0 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72  derBy==0 ) retur
206e0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
206f0 20 20 66 6f 72 28 70 58 3d 70 3b 20 70 58 20 26    for(pX=p; pX &
20700 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  & (pX->op==TK_AL
20710 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  L || pX->op==TK_
20720 53 45 4c 45 43 54 29 3b 20 70 58 3d 70 58 2d 3e  SELECT); pX=pX->
20730 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69 66 28 20  pPrior){}.  if( 
20740 70 58 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  pX==0 ) return W
20750 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 61  RC_Continue;.  a
20760 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e   = p->pOrderBy->
20770 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 70 4f  a;.  for(i=p->pO
20780 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 3b  rderBy->nExpr-1;
20790 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
207a0 20 69 66 28 20 61 5b 69 5d 2e 70 45 78 70 72 2d   if( a[i].pExpr-
207b0 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
207c0 61 74 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ate ) break;.  }
207d0 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74  .  if( i<0 ) ret
207e0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
207f0 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65  ;..  /* If we re
20800 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
20810 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 74  that means the t
20820 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73  ransformation is
20830 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 0a 20   required. */.. 
20840 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65   pParse = pWalke
20850 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20  r->pParse;.  db 
20860 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
20870 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
20880 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
20890 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
208a0 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
208b0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
208c0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d  ;.  memset(&dumm
208d0 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d  y, 0, sizeof(dum
208e0 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53 72 63 20  my));.  pNewSrc 
208f0 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
20900 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70  AppendFromTerm(p
20910 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26 64 75 6d  Parse,0,0,0,&dum
20920 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a 20 20  my,pNew,0,0);.  
20930 69 66 28 20 70 4e 65 77 53 72 63 3d 3d 30 20 29  if( pNewSrc==0 )
20940 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
20950 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70 3b  t;.  *pNew = *p;
20960 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 4e 65  .  p->pSrc = pNe
20970 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45 4c 69 73  wSrc;.  p->pELis
20980 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
20990 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
209a0 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72  , 0, sqlite3Expr
209b0 28 64 62 2c 20 54 4b 5f 41 4c 4c 2c 20 30 29 29  (db, TK_ALL, 0))
209c0 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53  ;.  p->op = TK_S
209d0 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68 65  ELECT;.  p->pWhe
209e0 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  re = 0;.  pNew->
209f0 70 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20  pGroupBy = 0;.  
20a00 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20  pNew->pHaving = 
20a10 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  0;.  pNew->pOrde
20a20 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 50  rBy = 0;.  p->pP
20a30 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  rior = 0;.  p->p
20a40 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 73  Next = 0;.  p->s
20a50 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43  elFlags &= ~SF_C
20a60 6f 6d 70 6f 75 6e 64 3b 0a 20 20 61 73 73 65 72  ompound;.  asser
20a70 74 28 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 21  t( pNew->pPrior!
20a80 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 50  =0 );.  pNew->pP
20a90 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e  rior->pNext = pN
20aa0 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d  ew;.  pNew->pLim
20ab0 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  it = 0;.  pNew->
20ac0 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 72  pOffset = 0;.  r
20ad0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
20ae0 75 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ue;.}..#ifndef S
20af0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f  QLITE_OMIT_CTE./
20b00 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 57  *.** Argument pW
20b10 69 74 68 20 28 77 68 69 63 68 20 6d 61 79 20 62  ith (which may b
20b20 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73 20 74  e NULL) points t
20b30 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  o a linked list 
20b40 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20 57 49  of nested .** WI
20b50 54 48 20 63 6f 6e 74 65 78 74 73 2c 20 66 72 6f  TH contexts, fro
20b60 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74 65 72  m inner to outer
20b70 6d 6f 73 74 2e 20 49 66 20 74 68 65 20 74 61 62  most. If the tab
20b80 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  le identified by
20b90 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65   .** FROM clause
20ba0 20 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d 20 69   element pItem i
20bb0 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f  s really a commo
20bc0 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65 73 73 69  n-table-expressi
20bd0 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74 68 65  on (CTE) .** the
20be0 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  n return a point
20bf0 65 72 20 74 6f 20 74 68 65 20 43 54 45 20 64 65  er to the CTE de
20c00 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74 68 61  finition for tha
20c10 74 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 77 69  t table. Otherwi
20c20 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e 55 4c  se.** return NUL
20c30 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f  L..**.** If a no
20c40 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20  n-NULL value is 
20c50 72 65 74 75 72 6e 65 64 2c 20 73 65 74 20 2a 70  returned, set *p
20c60 70 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f 69 6e  pContext to poin
20c70 74 20 74 6f 20 74 68 65 20 57 69 74 68 0a 2a 2a  t to the With.**
20c80 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68 65   object that the
20c90 20 72 65 74 75 72 6e 65 64 20 43 54 45 20 62 65   returned CTE be
20ca0 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61  longs to..*/.sta
20cb0 74 69 63 20 73 74 72 75 63 74 20 43 74 65 20 2a  tic struct Cte *
20cc0 73 65 61 72 63 68 57 69 74 68 28 0a 20 20 57 69  searchWith(.  Wi
20cd0 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20  th *pWith,      
20ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20cf0 20 43 75 72 72 65 6e 74 20 6f 75 74 65 72 6d 6f   Current outermo
20d00 73 74 20 57 49 54 48 20 63 6c 61 75 73 65 20 2a  st WITH clause *
20d10 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
20d20 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20  st_item *pItem, 
20d30 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
20d40 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20 72 65  se element to re
20d50 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74 68 20  solve */.  With 
20d60 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20 20 20 20  **ppContext     
20d70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
20d80 54 3a 20 57 49 54 48 20 63 6c 61 75 73 65 20 72  T: WITH clause r
20d90 65 74 75 72 6e 20 76 61 6c 75 65 20 62 65 6c 6f  eturn value belo
20da0 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63  ngs to */.){.  c
20db0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
20dc0 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a  ;.  if( pItem->z
20dd0 44 61 74 61 62 61 73 65 3d 3d 30 20 26 26 20 28  Database==0 && (
20de0 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a  zName = pItem->z
20df0 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
20e00 57 69 74 68 20 2a 70 3b 0a 20 20 20 20 66 6f 72  With *p;.    for
20e10 28 70 3d 70 57 69 74 68 3b 20 70 3b 20 70 3d 70  (p=pWith; p; p=p
20e20 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20 20 20  ->pOuter){.     
20e30 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
20e40 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65  r(i=0; i<p->nCte
20e50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
20e60 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
20e70 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69  mp(zName, p->a[i
20e80 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
20e90 20 20 20 20 20 20 20 20 20 2a 70 70 43 6f 6e 74           *ppCont
20ea0 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ext = p;.       
20eb0 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 5b     return &p->a[
20ec0 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i];.        }.  
20ed0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
20ee0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
20ef0 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
20f00 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73 20 61  ator maintains a
20f10 20 73 74 61 63 6b 20 6f 66 20 61 63 74 69 76 65   stack of active
20f20 20 57 49 54 48 20 63 6c 61 75 73 65 73 0a 2a 2a   WITH clauses.**
20f30 20 77 69 74 68 20 74 68 65 20 69 6e 6e 65 72 2d   with the inner-
20f40 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65  most WITH clause
20f50 20 62 65 69 6e 67 20 61 74 20 74 68 65 20 74 6f   being at the to
20f60 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a  p of the stack..
20f70 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
20f80 6e 65 20 70 75 73 68 65 73 20 74 68 65 20 57 49  ne pushes the WI
20f90 54 48 20 63 6c 61 75 73 65 20 70 61 73 73 65 64  TH clause passed
20fa0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
20fb0 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20  rgument.** onto 
20fc0 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
20fd0 74 61 63 6b 2e 20 49 66 20 61 72 67 75 6d 65 6e  tack. If argumen
20fe0 74 20 62 46 72 65 65 20 69 73 20 74 72 75 65 2c  t bFree is true,
20ff0 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 57 49   then this.** WI
21000 54 48 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6e  TH clause will n
21010 65 76 65 72 20 62 65 20 70 6f 70 70 65 64 20 66  ever be popped f
21020 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20 49  rom the stack. I
21030 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 0a 2a  n this case it.*
21040 2a 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65 65  * should be free
21050 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
21060 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 20 49   Parse object. I
21070 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 77  n other cases, w
21080 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d 30 2c  hen.** bFree==0,
21090 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63 74   the With object
210a0 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61   will be freed a
210b0 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 53 45  long with the SE
210c0 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74 65 6d 65  LECT .** stateme
210d0 6e 74 20 77 69 74 68 20 77 68 69 63 68 20 69 74  nt with which it
210e0 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 2e 0a   is associated..
210f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
21100 69 74 68 50 75 73 68 28 50 61 72 73 65 20 2a 70  ithPush(Parse *p
21110 50 61 72 73 65 2c 20 57 69 74 68 20 2a 70 57 69  Parse, With *pWi
21120 74 68 2c 20 75 38 20 62 46 72 65 65 29 7b 0a 20  th, u8 bFree){. 
21130 20 61 73 73 65 72 74 28 20 62 46 72 65 65 3d 3d   assert( bFree==
21140 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70 57 69  0 || pParse->pWi
21150 74 68 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  th==0 );.  if( p
21160 57 69 74 68 20 29 7b 0a 20 20 20 20 70 57 69 74  With ){.    pWit
21170 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50 61 72  h->pOuter = pPar
21180 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70  se->pWith;.    p
21190 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
211a0 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65  With;.    pParse
211b0 2d 3e 62 46 72 65 65 57 69 74 68 20 3d 20 62 46  ->bFreeWith = bF
211c0 72 65 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ree;.  }.}../*.*
211d0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
211e0 63 68 65 63 6b 73 20 69 66 20 61 72 67 75 6d 65  checks if argume
211f0 6e 74 20 70 46 72 6f 6d 20 72 65 66 65 72 73 20  nt pFrom refers 
21200 74 6f 20 61 20 43 54 45 20 64 65 63 6c 61 72 65  to a CTE declare
21210 64 20 62 79 20 0a 2a 2a 20 61 20 57 49 54 48 20  d by .** a WITH 
21220 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 73 74  clause on the st
21230 61 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 6d 61  ack currently ma
21240 69 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65 20  intained by the 
21250 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20  parser. And,.** 
21260 69 66 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f  if currently pro
21270 63 65 73 73 69 6e 67 20 61 20 43 54 45 20 65 78  cessing a CTE ex
21280 70 72 65 73 73 69 6f 6e 2c 20 69 66 20 69 74 20  pression, if it 
21290 69 73 20 61 20 72 65 63 75 72 73 69 76 65 0a 2a  is a recursive.*
212a0 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  * reference to t
212b0 68 65 20 63 75 72 72 65 6e 74 20 43 54 45 2e 0a  he current CTE..
212c0 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 66  **.** If pFrom f
212d0 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68 65 72  alls into either
212e0 20 6f 66 20 74 68 65 20 74 77 6f 20 63 61 74 65   of the two cate
212f0 67 6f 72 69 65 73 20 61 62 6f 76 65 2c 20 70 46  gories above, pF
21300 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e 64  rom->pTab.** and
21310 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72   other fields ar
21320 65 20 70 6f 70 75 6c 61 74 65 64 20 61 63 63 6f  e populated acco
21330 72 64 69 6e 67 6c 79 2e 20 54 68 65 20 63 61 6c  rdingly. The cal
21340 6c 65 72 20 73 68 6f 75 6c 64 20 63 68 65 63 6b  ler should check
21350 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54 61 62  .** (pFrom->pTab
21360 21 3d 30 29 20 74 6f 20 64 65 74 65 72 6d 69 6e  !=0) to determin
21370 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
21380 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 6d 61   a successful ma
21390 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75 6e 64  tch.** was found
213a0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20  ..**.** Whether 
213b0 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63 68 20 69  or not a match i
213c0 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54 45 5f  s found, SQLITE_
213d0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
213e0 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63  f no error.** oc
213f0 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f  curs. If an erro
21400 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e  r does occur, an
21410 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
21420 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 0a  s stored in the.
21430 2a 2a 20 70 61 72 73 65 72 20 61 6e 64 20 73 6f  ** parser and so
21440 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  me error code ot
21450 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
21460 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OK returned..*/.
21470 73 74 61 74 69 63 20 69 6e 74 20 77 69 74 68 45  static int withE
21480 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65 72 20  xpand(.  Walker 
21490 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73 74 72  *pWalker, .  str
214a0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
214b0 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50 61 72   *pFrom.){.  Par
214c0 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61  se *pParse = pWa
214d0 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
214e0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
214f0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74 72 75  arse->db;.  stru
21500 63 74 20 43 74 65 20 2a 70 43 74 65 3b 20 20 20  ct Cte *pCte;   
21510 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
21520 61 74 63 68 65 64 20 43 54 45 20 28 6f 72 20 4e  atched CTE (or N
21530 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63 68 29  ULL if no match)
21540 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74   */.  With *pWit
21550 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
21560 20 20 20 20 20 20 2f 2a 20 57 49 54 48 20 63 6c        /* WITH cl
21570 61 75 73 65 20 74 68 61 74 20 70 43 74 65 20 62  ause that pCte b
21580 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20  elongs to */..  
21590 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
215a0 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70 43 74  Tab==0 );..  pCt
215b0 65 20 3d 20 73 65 61 72 63 68 57 69 74 68 28 70  e = searchWith(p
215c0 50 61 72 73 65 2d 3e 70 57 69 74 68 2c 20 70 46  Parse->pWith, pF
215d0 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a 20 20  rom, &pWith);.  
215e0 69 66 28 20 70 43 74 65 20 29 7b 0a 20 20 20 20  if( pCte ){.    
215f0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
21600 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
21610 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  t;.    Select *p
21620 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  Sel;.    Select 
21630 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20  *pLeft;         
21640 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d         /* Left-m
21650 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
21660 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ment */.    int 
21670 62 4d 61 79 52 65 63 75 72 73 69 76 65 3b 20 20  bMayRecursive;  
21680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
21690 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f  e if compound jo
216a0 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20 5b 41  ined by UNION [A
216b0 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74 68 20  LL] */.    With 
216c0 2a 70 53 61 76 65 64 57 69 74 68 3b 20 20 20 20  *pSavedWith;    
216d0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
216e0 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 50 61  ial value of pPa
216f0 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a 20  rse->pWith */.. 
21700 20 20 20 2f 2a 20 49 66 20 70 43 74 65 2d 3e 7a     /* If pCte->z
21710 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20  Err is non-NULL 
21720 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  at this point, t
21730 68 65 6e 20 74 68 69 73 20 69 73 20 61 6e 20 69  hen this is an i
21740 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20 72 65  llegal.    ** re
21750 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
21760 65 20 74 6f 20 43 54 45 20 70 43 74 65 2e 20 4c  e to CTE pCte. L
21770 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
21780 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
21790 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c 79 2e  rn.    ** early.
217a0 20 49 66 20 70 43 74 65 2d 3e 7a 45 72 72 20 69   If pCte->zErr i
217b0 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69  s NULL, then thi
217c0 73 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72  s is not a recur
217d0 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 2e 0a  sive reference..
217e0 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
217f0 61 73 65 2c 20 70 72 6f 63 65 65 64 2e 20 20 2a  ase, proceed.  *
21800 2f 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e  /.    if( pCte->
21810 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71  zErr ){.      sq
21820 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
21830 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a 45 72 72  arse, pCte->zErr
21840 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCte->zName);.
21850 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
21860 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
21870 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ..    assert( pF
21880 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
21890 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
218a0 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33  = pTab = sqlite3
218b0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
218c0 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b   sizeof(Table));
218d0 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30  .    if( pTab==0
218e0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
218f0 6f 72 74 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e  ort;.    pTab->n
21900 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 54 61  Ref = 1;.    pTa
21910 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  b->zName = sqlit
21920 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
21930 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Cte->zName);.   
21940 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
21950 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f  1;.    pTab->nRo
21960 77 45 73 74 20 3d 20 31 30 34 38 35 37 36 3b 0a  wEst = 1048576;.
21970 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
21980 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72  gs |= TF_Ephemer
21990 61 6c 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70  al;.    pFrom->p
219a0 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
219b0 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 43  SelectDup(db, pC
219c0 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b  te->pSelect, 0);
219d0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
219e0 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
219f0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
21a00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
21a10 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 0a  om->pSelect );..
21a20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
21a30 74 68 69 73 20 69 73 20 61 20 72 65 63 75 72 73  this is a recurs
21a40 69 76 65 20 43 54 45 2e 20 2a 2f 0a 20 20 20 20  ive CTE. */.    
21a50 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
21a60 65 6c 65 63 74 3b 0a 20 20 20 20 62 4d 61 79 52  elect;.    bMayR
21a70 65 63 75 72 73 69 76 65 20 3d 20 28 20 70 53 65  ecursive = ( pSe
21a80 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  l->op==TK_ALL ||
21a90 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e   pSel->op==TK_UN
21aa0 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 62  ION );.    if( b
21ab0 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a  MayRecursive ){.
21ac0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
21ad0 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
21ae0 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
21af0 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 66  t->pSrc;.      f
21b00 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
21b10 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
21b20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
21b30 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
21b40 20 26 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20   &pSrc->a[i];.  
21b50 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
21b60 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 0a 20  >zDatabase==0 . 
21b70 20 20 20 20 20 20 20 20 26 26 20 70 49 74 65 6d          && pItem
21b80 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20 20 20 20  ->zName!=0 .    
21b90 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74       && 0==sqlit
21ba0 65 33 53 74 72 49 43 6d 70 28 70 49 74 65 6d 2d  e3StrICmp(pItem-
21bb0 3e 7a 4e 61 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e  >zName, pCte->zN
21bc0 61 6d 65 29 0a 20 20 20 20 20 20 20 20 20 20 29  ame).          )
21bd0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  {.          pIte
21be0 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a  m->pTab = pTab;.
21bf0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
21c00 3e 69 73 52 65 63 75 72 73 69 76 65 20 3d 20 31  >isRecursive = 1
21c10 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62  ;.          pTab
21c20 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
21c30 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61      pSel->selFla
21c40 67 73 20 7c 3d 20 53 46 5f 52 65 63 75 72 73 69  gs |= SF_Recursi
21c50 76 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ve;.        }.  
21c60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
21c70 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72 65 63   /* Only one rec
21c80 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
21c90 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a   is permitted. *
21ca0 2f 20 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  / .    if( pTab-
21cb0 3e 6e 52 65 66 3e 32 20 29 7b 0a 20 20 20 20 20  >nRef>2 ){.     
21cc0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
21cd0 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72  (.          pPar
21ce0 73 65 2c 20 22 6d 75 6c 74 69 70 6c 65 20 72 65  se, "multiple re
21cf0 66 65 72 65 6e 63 65 73 20 74 6f 20 72 65 63 75  ferences to recu
21d00 72 73 69 76 65 20 74 61 62 6c 65 3a 20 25 73 22  rsive table: %s"
21d10 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20  , pCte->zName.  
21d20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 65 74      );.      ret
21d30 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
21d40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
21d50 72 74 28 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d  rt( pTab->nRef==
21d60 31 20 7c 7c 20 28 28 70 53 65 6c 2d 3e 73 65 6c  1 || ((pSel->sel
21d70 46 6c 61 67 73 26 53 46 5f 52 65 63 75 72 73 69  Flags&SF_Recursi
21d80 76 65 29 20 26 26 20 70 54 61 62 2d 3e 6e 52 65  ve) && pTab->nRe
21d90 66 3d 3d 32 20 29 29 3b 0a 0a 20 20 20 20 70 43  f==2 ));..    pC
21da0 74 65 2d 3e 7a 45 72 72 20 3d 20 22 63 69 72 63  te->zErr = "circ
21db0 75 6c 61 72 20 72 65 66 65 72 65 6e 63 65 3a 20  ular reference: 
21dc0 25 73 22 3b 0a 20 20 20 20 70 53 61 76 65 64 57  %s";.    pSavedW
21dd0 69 74 68 20 3d 20 70 50 61 72 73 65 2d 3e 70 57  ith = pParse->pW
21de0 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ith;.    pParse-
21df0 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a  >pWith = pWith;.
21e00 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
21e10 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 62  elect(pWalker, b
21e20 4d 61 79 52 65 63 75 72 73 69 76 65 20 3f 20 70  MayRecursive ? p
21e30 53 65 6c 2d 3e 70 50 72 69 6f 72 20 3a 20 70 53  Sel->pPrior : pS
21e40 65 6c 29 3b 0a 0a 20 20 20 20 66 6f 72 28 70 4c  el);..    for(pL
21e50 65 66 74 3d 70 53 65 6c 3b 20 70 4c 65 66 74 2d  eft=pSel; pLeft-
21e60 3e 70 50 72 69 6f 72 3b 20 70 4c 65 66 74 3d 70  >pPrior; pLeft=p
21e70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  Left->pPrior);. 
21e80 20 20 20 70 45 4c 69 73 74 20 3d 20 70 4c 65 66     pEList = pLef
21e90 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69  t->pEList;.    i
21ea0 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c 73 20 29  f( pCte->pCols )
21eb0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c 69  {.      if( pELi
21ec0 73 74 2d 3e 6e 45 78 70 72 21 3d 70 43 74 65 2d  st->nExpr!=pCte-
21ed0 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 20 29 7b  >pCols->nExpr ){
21ee0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21ef0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
21f00 20 22 74 61 62 6c 65 20 25 73 20 68 61 73 20 25   "table %s has %
21f10 64 20 76 61 6c 75 65 73 20 66 6f 72 20 25 64 20  d values for %d 
21f20 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20 20 20 20  columns",.      
21f30 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 4e 61 6d        pCte->zNam
21f40 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  e, pEList->nExpr
21f50 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e  , pCte->pCols->n
21f60 45 78 70 72 0a 20 20 20 20 20 20 20 20 29 3b 0a  Expr.        );.
21f70 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
21f80 70 57 69 74 68 20 3d 20 70 53 61 76 65 64 57 69  pWith = pSavedWi
21f90 74 68 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  th;.        retu
21fa0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
21fb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
21fc0 45 4c 69 73 74 20 3d 20 70 43 74 65 2d 3e 70 43  EList = pCte->pC
21fd0 6f 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ols;.    }..    
21fe0 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f  selectColumnsFro
21ff0 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
22000 2c 20 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d  , pEList, &pTab-
22010 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43  >nCol, &pTab->aC
22020 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61  ol);.    if( bMa
22030 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  yRecursive ){.  
22040 20 20 20 20 69 66 28 20 70 53 65 6c 2d 3e 73 65      if( pSel->se
22050 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
22060 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 20  rsive ){.       
22070 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20 22 6d   pCte->zErr = "m
22080 75 6c 74 69 70 6c 65 20 72 65 63 75 72 73 69 76  ultiple recursiv
22090 65 20 72 65 66 65 72 65 6e 63 65 73 3a 20 25 73  e references: %s
220a0 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
220b0 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 45          pCte->zE
220c0 72 72 20 3d 20 22 72 65 63 75 72 73 69 76 65 20  rr = "recursive 
220d0 72 65 66 65 72 65 6e 63 65 20 69 6e 20 61 20 73  reference in a s
220e0 75 62 71 75 65 72 79 3a 20 25 73 22 3b 0a 20 20  ubquery: %s";.  
220f0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
22100 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
22110 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20  alker, pSel);.  
22120 20 20 7d 0a 20 20 20 20 70 43 74 65 2d 3e 7a 45    }.    pCte->zE
22130 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 72  rr = 0;.    pPar
22140 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76  se->pWith = pSav
22150 65 64 57 69 74 68 3b 0a 20 20 7d 0a 0a 20 20 72  edWith;.  }..  r
22160 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
22170 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
22180 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
22190 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  TE./*.** If the 
221a0 53 45 4c 45 43 54 20 70 61 73 73 65 64 20 61 73  SELECT passed as
221b0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
221c0 6d 65 6e 74 20 68 61 73 20 61 6e 20 61 73 73 6f  ment has an asso
221d0 63 69 61 74 65 64 20 57 49 54 48 20 0a 2a 2a 20  ciated WITH .** 
221e0 63 6c 61 75 73 65 2c 20 70 6f 70 20 69 74 20 66  clause, pop it f
221f0 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 73 74  rom the stack st
22200 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ored as part of 
22210 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
22220 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
22230 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61 73  ction is used as
22240 20 74 68 65 20 78 53 65 6c 65 63 74 43 61 6c 6c   the xSelectCall
22250 62 61 63 6b 32 28 29 20 63 61 6c 6c 62 61 63 6b  back2() callback
22260 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65   by.** sqlite3Se
22270 6c 65 63 74 45 78 70 61 6e 64 28 29 20 77 68 65  lectExpand() whe
22280 6e 20 77 61 6c 6b 69 6e 67 20 61 20 53 45 4c 45  n walking a SELE
22290 43 54 20 74 72 65 65 20 74 6f 20 72 65 73 6f 6c  CT tree to resol
222a0 76 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65  ve table.** name
222b0 73 20 61 6e 64 20 6f 74 68 65 72 20 46 52 4f 4d  s and other FROM
222c0 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 73   clause elements
222d0 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
222e0 64 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 28  d selectPopWith(
222f0 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
22300 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50   Select *p){.  P
22310 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
22320 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
22330 20 20 57 69 74 68 20 2a 70 57 69 74 68 20 3d 20    With *pWith = 
22340 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29  findRightmost(p)
22350 2d 3e 70 57 69 74 68 3b 0a 20 20 69 66 28 20 70  ->pWith;.  if( p
22360 57 69 74 68 21 3d 30 20 29 7b 0a 20 20 20 20 61  With!=0 ){.    a
22370 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
22380 57 69 74 68 3d 3d 70 57 69 74 68 20 29 3b 0a 20  With==pWith );. 
22390 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68     pParse->pWith
223a0 20 3d 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72   = pWith->pOuter
223b0 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64  ;.  }.}.#else.#d
223c0 65 66 69 6e 65 20 73 65 6c 65 63 74 50 6f 70 57  efine selectPopW
223d0 69 74 68 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ith 0.#endif../*
223e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
223f0 20 69 73 20 61 20 57 61 6c 6b 65 72 20 63 61 6c   is a Walker cal
22400 6c 62 61 63 6b 20 66 6f 72 20 22 65 78 70 61 6e  lback for "expan
22410 64 69 6e 67 22 20 61 20 53 45 4c 45 43 54 20 73  ding" a SELECT s
22420 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78  tatement..** "Ex
22430 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20 74  panding" means t
22440 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  o do the followi
22450 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  ng:.**.**    (1)
22460 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45    Make sure VDBE
22470 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
22480 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e  have been assign
22490 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20  ed to every.**  
224a0 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f         element o
224b0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
224c0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  e..**.**    (2) 
224d0 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61   Fill in the pTa
224e0 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20  bList->a[].pTab 
224f0 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72  fields in the Sr
22500 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20  cList that .**  
22510 20 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 46         defines F
22520 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65  ROM clause.  Whe
22530 6e 20 76 69 65 77 73 20 61 70 70 65 61 72 20 69  n views appear i
22540 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
22550 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69  e,.**         fi
22560 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d  ll pTabList->a[]
22570 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20 61 20  .pSelect with a 
22580 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  copy of the SELE
22590 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  CT statement.** 
225a0 20 20 20 20 20 20 20 20 74 68 61 74 20 69 6d 70          that imp
225b0 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77  lements the view
225c0 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64  .  A copy is mad
225d0 65 20 6f 66 20 74 68 65 20 76 69 65 77 27 73 20  e of the view's 
225e0 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20  SELECT.**       
225f0 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74    statement so t
22600 68 61 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c  hat we can freel
22610 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65  y modify or dele
22620 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e  te that statemen
22630 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74  t.**         wit
22640 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62  hout worrying ab
22650 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74  out messing up t
22660 68 65 20 70 72 65 73 69 73 74 65 6e 74 20 72 65  he presistent re
22670 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20  presentation.** 
22680 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 76          of the v
22690 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33  iew..**.**    (3
226a0 29 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20  )  Add terms to 
226b0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
226c0 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74   to accomodate t
226d0 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
226e0 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e  rd.**         on
226f0 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f   joins and the O
22700 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
22710 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a  se of joins..**.
22720 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e 20  **    (4)  Scan 
22730 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  the list of colu
22740 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
22750 74 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c  t set (pEList) l
22760 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  ooking.**       
22770 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20    for instances 
22780 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61  of the "*" opera
22790 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45  tor or the TABLE
227a0 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  .* operator..** 
227b0 20 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64          If found
227c0 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a  , expand each "*
227d0 22 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  " to be every co
227e0 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61  lumn in every ta
227f0 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61  ble.**         a
22800 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65  nd TABLE.* to be
22810 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
22820 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74   TABLE..**.*/.st
22830 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45  atic int selectE
22840 78 70 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a  xpander(Walker *
22850 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
22860 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
22870 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
22880 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c  pParse;.  int i,
22890 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74   j, k;.  SrcList
228a0 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78   *pTabList;.  Ex
228b0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
228c0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
228d0 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20  _item *pFrom;.  
228e0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
228f0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
22900 20 2a 70 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a   *pE, *pRight, *
22910 70 45 78 70 72 3b 0a 20 20 75 31 36 20 73 65 6c  pExpr;.  u16 sel
22920 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c  Flags = p->selFl
22930 61 67 73 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c  ags;..  p->selFl
22940 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64  ags |= SF_Expand
22950 65 64 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ed;.  if( db->ma
22960 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20  llocFailed  ){. 
22970 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
22980 6f 72 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e  ort;.  }.  if( N
22990 45 56 45 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29  EVER(p->pSrc==0)
229a0 20 7c 7c 20 28 73 65 6c 46 6c 61 67 73 20 26 20   || (selFlags & 
229b0 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20  SF_Expanded)!=0 
229c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
229d0 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70  C_Prune;.  }.  p
229e0 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
229f0 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  c;.  pEList = p-
22a00 3e 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74  >pEList;.  sqlit
22a10 65 33 57 69 74 68 50 75 73 68 28 70 50 61 72 73  e3WithPush(pPars
22a20 65 2c 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74  e, findRightmost
22a30 28 70 29 2d 3e 70 57 69 74 68 2c 20 30 29 3b 0a  (p)->pWith, 0);.
22a40 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
22a50 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
22a60 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
22a70 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73  d to all entries
22a80 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f   in.  ** the FRO
22a90 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
22aa0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
22ab0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
22ac0 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
22ad0 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54 61  sors(pParse, pTa
22ae0 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  bList);..  /* Lo
22af0 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c  ok up every tabl
22b00 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46  e named in the F
22b10 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
22b20 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20  e select.  If.  
22b30 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  ** an entry of t
22b40 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
22b50 73 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73  s a subquery ins
22b60 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20  tead of a table 
22b70 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68  or view,.  ** th
22b80 65 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e  en create a tran
22b90 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  sient table stru
22ba0 63 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62  cture to describ
22bb0 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  e the subquery..
22bc0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
22bd0 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
22be0 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
22bf0 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
22c00 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
22c10 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Tab;.    assert(
22c20 20 70 46 72 6f 6d 2d 3e 69 73 52 65 63 75 72 73   pFrom->isRecurs
22c30 69 76 65 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d  ive==0 || pFrom-
22c40 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 69 66 28  >pTab );.    if(
22c50 20 70 46 72 6f 6d 2d 3e 69 73 52 65 63 75 72 73   pFrom->isRecurs
22c60 69 76 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ive ) continue;.
22c70 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70      if( pFrom->p
22c80 54 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab!=0 ){.      
22c90 2f 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e  /* This statemen
22ca0 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
22cb0 65 6e 20 70 72 65 70 61 72 65 64 2e 20 20 54 68  en prepared.  Th
22cc0 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20  ere is no need. 
22cd0 20 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75       ** to go fu
22ce0 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  rther. */.      
22cf0 61 73 73 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a  assert( i==0 );.
22d00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
22d10 4d 49 54 5f 43 54 45 0a 20 20 20 20 20 20 73 65  MIT_CTE.      se
22d20 6c 65 63 74 50 6f 70 57 69 74 68 28 70 57 61 6c  lectPopWith(pWal
22d30 6b 65 72 2c 20 70 29 3b 0a 23 65 6e 64 69 66 0a  ker, p);.#endif.
22d40 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
22d50 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 23 69  _Prune;.    }.#i
22d60 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22d70 54 5f 43 54 45 0a 20 20 20 20 69 66 28 20 77 69  T_CTE.    if( wi
22d80 74 68 45 78 70 61 6e 64 28 70 57 61 6c 6b 65 72  thExpand(pWalker
22d90 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72  , pFrom) ) retur
22da0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
22db0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
22dc0 20 29 20 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69   ) {} else.#endi
22dd0 66 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  f.    if( pFrom-
22de0 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66  >zName==0 ){.#if
22df0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
22e00 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20  _SUBQUERY.      
22e10 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70  Select *pSel = p
22e20 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
22e30 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75       /* A sub-qu
22e40 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ery in the FROM 
22e50 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
22e60 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  CT */.      asse
22e70 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20  rt( pSel!=0 );. 
22e80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
22e90 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20  om->pTab==0 );. 
22ea0 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
22eb0 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
22ec0 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 70 46 72  pSel);.      pFr
22ed0 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
22ee0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
22ef0 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
22f00 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20  (Table));.      
22f10 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
22f20 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
22f30 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66        pTab->nRef
22f40 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 61 62   = 1;.      pTab
22f50 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
22f60 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71  3MPrintf(db, "sq
22f70 6c 69 74 65 5f 73 71 5f 25 70 22 2c 20 28 76 6f  lite_sq_%p", (vo
22f80 69 64 2a 29 70 54 61 62 29 3b 0a 20 20 20 20 20  id*)pTab);.     
22f90 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50   while( pSel->pP
22fa0 72 69 6f 72 20 29 7b 20 70 53 65 6c 20 3d 20 70  rior ){ pSel = p
22fb0 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20  Sel->pPrior; }. 
22fc0 20 20 20 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d       selectColum
22fd0 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  nsFromExprList(p
22fe0 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c  Parse, pSel->pEL
22ff0 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c  ist, &pTab->nCol
23000 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  , &pTab->aCol);.
23010 20 20 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65        pTab->iPKe
23020 79 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 54  y = -1;.      pT
23030 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 31 30  ab->nRowEst = 10
23040 34 38 35 37 36 3b 0a 20 20 20 20 20 20 70 54 61  48576;.      pTa
23050 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  b->tabFlags |= T
23060 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e  F_Ephemeral;.#en
23070 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
23080 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e       /* An ordin
23090 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65  ary table or vie
230a0 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52  w name in the FR
230b0 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
230c0 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
230d0 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
230e0 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
230f0 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
23100 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70  ocateTableItem(p
23110 50 61 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29  Parse, 0, pFrom)
23120 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
23130 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
23140 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 69 66  _Abort;.      if
23150 28 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 30 78  ( pTab->nRef==0x
23160 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  ffff ){.        
23170 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
23180 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
23190 79 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  y references to 
231a0 5c 22 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33  \"%s\": max 6553
231b0 35 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  5",.           p
231c0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
231d0 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
231e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
231f0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
23200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
23210 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20  ab->nRef++;.#if 
23220 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
23230 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
23240 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f  efined (SQLITE_O
23250 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
23260 29 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ).      if( pTab
23270 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56  ->pSelect || IsV
23280 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
23290 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65          /* We re
232a0 61 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20  ach here if the 
232b0 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61  named table is a
232c0 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a   really a view *
232d0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  /.        if( sq
232e0 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
232f0 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
23300 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 57  pTab) ) return W
23310 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
23320 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
23330 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20  >pSelect==0 );. 
23340 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53         pFrom->pS
23350 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
23360 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61  electDup(db, pTa
23370 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  b->pSelect, 0);.
23380 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
23390 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
233a0 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  r, pFrom->pSelec
233b0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  t);.      }.#end
233c0 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
233d0 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65   Locate the inde
233e0 78 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49  x named by the I
233f0 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
23400 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20  , if any. */.   
23410 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65   if( sqlite3Inde
23420 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72  xedByLookup(pPar
23430 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20  se, pFrom) ){.  
23440 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
23450 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  bort;.    }.  }.
23460 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41  .  /* Process NA
23470 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20  TURAL keywords, 
23480 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  and ON and USING
23490 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e   clauses of join
234a0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  s..  */.  if( db
234b0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
234c0 7c 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a  | sqliteProcessJ
234d0 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29  oin(pParse, p) )
234e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
234f0 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f  _Abort;.  }..  /
23500 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20  * For every "*" 
23510 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74  that occurs in t
23520 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20  he column list, 
23530 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
23540 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c   of.  ** all col
23550 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
23560 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65  es.  And for eve
23570 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72  ry TABLE.* inser
23580 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a  t the names.  **
23590 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
235a0 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70  in TABLE.  The p
235b0 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61  arser inserted a
235c0 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73   special express
235d0 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68  ion.  ** with th
235e0 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f  e TK_ALL operato
235f0 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74  r for each "*" t
23600 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20  hat it found in 
23610 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e  the column list.
23620 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
23630 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61  ing code just ha
23640 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  s to locate the 
23650 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f  TK_ALL expressio
23660 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20  ns and expand.  
23670 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74  ** each one to t
23680 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63  he list of all c
23690 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61  olumns in all ta
236a0 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
236b0 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a  The first loop j
236c0 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ust checks to se
236d0 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  e if there are a
236e0 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73  ny "*" operators
236f0 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20  .  ** that need 
23700 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a  expanding..  */.
23710 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
23720 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
23730 7b 0a 20 20 20 20 70 45 20 3d 20 70 45 4c 69 73  {.    pE = pELis
23740 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20  t->a[k].pExpr;. 
23750 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
23760 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20  K_ALL ) break;. 
23770 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f     assert( pE->o
23780 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d  p!=TK_DOT || pE-
23790 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20  >pRight!=0 );.  
237a0 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
237b0 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d  !=TK_DOT || (pE-
237c0 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d  >pLeft!=0 && pE-
237d0 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  >pLeft->op==TK_I
237e0 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45  D) );.    if( pE
237f0 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20  ->op==TK_DOT && 
23800 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  pE->pRight->op==
23810 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a  TK_ALL ) break;.
23820 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69    }.  if( k<pELi
23830 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
23840 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65   /*.    ** If we
23850 20 67 65 74 20 68 65 72 65 20 69 74 20 6d 65 61   get here it mea
23860 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ns the result se
23870 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  t contains one o
23880 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a  r more "*".    *
23890 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74  * operators that
238a0 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61   need to be expa
238b0 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f  nded.  Loop thro
238c0 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73  ugh each express
238d0 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  ion.    ** in th
238e0 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64  e result set and
238f0 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65   expand them one
23900 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a   by one..    */.
23910 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
23920 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45  ist_item *a = pE
23930 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70  List->a;.    Exp
23940 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b  rList *pNew = 0;
23950 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  .    int flags =
23960 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
23970 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67  gs;.    int long
23980 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26  Names = (flags &
23990 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e   SQLITE_FullColN
239a0 61 6d 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20  ames)!=0.       
239b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
239c0 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  & (flags & SQLIT
239d0 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
239e0 3d 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65  ==0;..    /* Whe
239f0 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 46 52 4f  n processing FRO
23a00 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
23a10 69 65 73 2c 20 69 74 20 69 73 20 61 6c 77 61 79  ies, it is alway
23a20 73 20 74 68 65 20 63 61 73 65 0a 20 20 20 20 2a  s the case.    *
23a30 2a 20 74 68 61 74 20 66 75 6c 6c 5f 63 6f 6c 75  * that full_colu
23a40 6d 6e 5f 6e 61 6d 65 73 3d 4f 46 46 20 61 6e 64  mn_names=OFF and
23a50 20 73 68 6f 72 74 5f 63 6f 6c 75 6d 6e 5f 6e 61   short_column_na
23a60 6d 65 73 3d 4f 4e 2e 20 20 54 68 65 0a 20 20 20  mes=ON.  The.   
23a70 20 2a 2a 20 73 71 6c 69 74 65 33 52 65 73 75 6c   ** sqlite3Resul
23a80 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 72  tSetOfSelect() r
23a90 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 69 74 20  outine makes it 
23aa0 73 6f 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  so. */.    asser
23ab0 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  t( (p->selFlags 
23ac0 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29  & SF_NestedFrom)
23ad0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  ==0.          ||
23ae0 20 28 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54   ((flags & SQLIT
23af0 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 3d  E_FullColNames)=
23b00 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  =0 &&.          
23b10 20 20 20 20 28 66 6c 61 67 73 20 26 20 53 51 4c      (flags & SQL
23b20 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
23b30 73 29 21 3d 30 29 20 29 3b 0a 0a 20 20 20 20 66  s)!=0) );..    f
23b40 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
23b50 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
23b60 20 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70       pE = a[k].p
23b70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 52 69 67  Expr;.      pRig
23b80 68 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b  ht = pE->pRight;
23b90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
23ba0 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
23bb0 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20   pRight!=0 );.  
23bc0 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d      if( pE->op!=
23bd0 54 4b 5f 41 4c 4c 20 26 26 20 28 70 45 2d 3e 6f  TK_ALL && (pE->o
23be0 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69  p!=TK_DOT || pRi
23bf0 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29  ght->op!=TK_ALL)
23c00 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
23c10 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 65  his particular e
23c20 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e  xpression does n
23c30 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  ot need to be ex
23c40 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20  panded..        
23c50 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  */.        pNew 
23c60 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
23c70 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
23c80 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72  pNew, a[k].pExpr
23c90 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
23ca0 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  New ){.         
23cb0 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
23cc0 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20  Expr-1].zName = 
23cd0 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[k].zName;.    
23ce0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
23cf0 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70  ew->nExpr-1].zSp
23d00 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b  an = a[k].zSpan;
23d10 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e  .          a[k].
23d20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
23d30 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20       a[k].zSpan 
23d40 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
23d50 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70         a[k].pExp
23d60 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  r = 0;.      }el
23d70 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
23d80 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69  his expression i
23d90 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41  s a "*" or a "TA
23da0 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73  BLE.*" and needs
23db0 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a   to be.        *
23dc0 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20  * expanded. */. 
23dd0 20 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65         int table
23de0 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f  Seen = 0;      /
23df0 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20  * Set to 1 when 
23e00 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f  TABLE matches */
23e10 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
23e20 54 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  TName = 0;      
23e30 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65   /* text of name
23e40 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20   of TABLE */.   
23e50 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d       if( pE->op=
23e60 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20  =TK_DOT ){.     
23e70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d       assert( pE-
23e80 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20  >pLeft!=0 );.   
23e90 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
23ea0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
23eb0 70 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e  pE->pLeft, EP_In
23ec0 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
23ed0 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45       zTName = pE
23ee0 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65  ->pLeft->u.zToke
23ef0 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
23f00 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46       for(i=0, pF
23f10 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
23f20 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
23f30 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
23f40 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c  {.          Tabl
23f50 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
23f60 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  >pTab;.         
23f70 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20   Select *pSub = 
23f80 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pFrom->pSelect;.
23f90 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
23fa0 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d  zTabName = pFrom
23fb0 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20  ->zAlias;.      
23fc0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
23fd0 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 30 3b  zSchemaName = 0;
23fe0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
23ff0 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  Db;.          if
24000 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b  ( zTabName==0 ){
24010 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61  .            zTa
24020 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e  bName = pTab->zN
24030 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ame;.          }
24040 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64  .          if( d
24050 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
24060 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
24070 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c     if( pSub==0 |
24080 7c 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  | (pSub->selFlag
24090 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f  s & SF_NestedFro
240a0 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  m)==0 ){.       
240b0 20 20 20 20 20 70 53 75 62 20 3d 20 30 3b 0a 20       pSub = 0;. 
240c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
240d0 54 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33  TName && sqlite3
240e0 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20  StrICmp(zTName, 
240f0 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  zTabName)!=0 ){.
24100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
24110 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
24120 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
24130 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
24140 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
24150 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
24160 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63  .            zSc
24170 68 65 6d 61 4e 61 6d 65 20 3d 20 69 44 62 3e 3d  hemaName = iDb>=
24180 30 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  0 ? db->aDb[iDb]
24190 2e 7a 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20  .zName : "*";.  
241a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
241b0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
241c0 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
241d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
241e0 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d  r *zName = pTab-
241f0 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  >aCol[j].zName;.
24200 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
24210 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20   *zColname;  /* 
24220 54 68 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c  The computed col
24230 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  umn name */.    
24240 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
24250 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c  oFree;   /* Mall
24260 6f 63 65 64 20 73 74 72 69 6e 67 20 74 68 61 74  oced string that
24270 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65   needs to be fre
24280 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ed */.          
24290 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65    Token sColname
242a0 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63  ;  /* Computed c
242b0 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20  olumn name as a 
242c0 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20  token */..      
242d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e        assert( zN
242e0 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ame );.         
242f0 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26     if( zTName &&
24300 20 70 53 75 62 0a 20 20 20 20 20 20 20 20 20 20   pSub.          
24310 20 20 20 26 26 20 73 71 6c 69 74 65 33 4d 61 74     && sqlite3Mat
24320 63 68 53 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d  chSpanName(pSub-
24330 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53  >pEList->a[j].zS
24340 70 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20  pan, 0, zTName, 
24350 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  0)==0.          
24360 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
24370 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
24380 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
24390 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20          /* If a 
243a0 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64  column is marked
243b0 20 61 73 20 27 68 69 64 64 65 6e 27 20 28 63 75   as 'hidden' (cu
243c0 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73  rrently only pos
243d0 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20  sible.          
243e0 20 20 2a 2a 20 66 6f 72 20 76 69 72 74 75 61 6c    ** for virtual
243f0 20 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74   tables), do not
24400 20 69 6e 63 6c 75 64 65 20 69 74 20 69 6e 20 74   include it in t
24410 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20  he expanded.    
24420 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c          ** resul
24430 74 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20 20 20  t-set list..    
24440 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
24450 20 20 20 20 20 20 20 69 66 28 20 49 73 48 69 64         if( IsHid
24460 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d  denColumn(&pTab-
24470 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20  >aCol[j]) ){.   
24480 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
24490 74 28 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  t(IsVirtual(pTab
244a0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
244b0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
244c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
244d0 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20        tableSeen 
244e0 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  = 1;..          
244f0 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a 54 4e    if( i>0 && zTN
24500 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
24510 20 20 20 20 20 20 20 20 69 66 28 20 28 70 46 72          if( (pFr
24520 6f 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  om->jointype & J
24530 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20 20  T_NATURAL)!=0.  
24540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
24550 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49   tableAndColumnI
24560 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2c 20 69  ndex(pTabList, i
24570 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20  , zName, 0, 0). 
24580 20 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a               ){.
24590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245a0 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20  /* In a NATURAL 
245b0 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a  join, omit the j
245c0 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d  oin columns from
245d0 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20   the .          
245e0 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74        ** table t
245f0 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74  o the right of t
24600 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20  he join */.     
24610 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
24620 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
24630 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
24640 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 64     if( sqlite3Id
24650 4c 69 73 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d  ListIndex(pFrom-
24660 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e  >pUsing, zName)>
24670 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
24680 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f        /* In a jo
24690 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20  in with a USING 
246a0 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c  clause, omit col
246b0 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20  umns in the.    
246c0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75              ** u
246d0 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d  sing clause from
246e0 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68   the table on th
246f0 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  e right. */.    
24700 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
24710 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
24720 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
24730 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
24740 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
24750 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20  Expr(db, TK_ID, 
24760 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
24770 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a      zColname = z
24780 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
24790 20 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20    zToFree = 0;. 
247a0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
247b0 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62  ongNames || pTab
247c0 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a  List->nSrc>1 ){.
247d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
247e0 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr *pLeft;.     
247f0 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d           pLeft =
24800 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
24810 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65   TK_ID, zTabName
24820 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
24830 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
24840 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
24850 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69  _DOT, pLeft, pRi
24860 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ght, 0);.       
24870 20 20 20 20 20 20 20 69 66 28 20 7a 53 63 68 65         if( zSche
24880 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  maName ){.      
24890 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20            pLeft 
248a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
248b0 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61  , TK_ID, zSchema
248c0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
248d0 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
248e0 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
248f0 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66  se, TK_DOT, pLef
24900 74 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  t, pExpr, 0);.  
24910 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
24920 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
24930 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20  longNames ){.   
24940 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f               zCo
24950 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  lname = sqlite3M
24960 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
24970 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e  s", zTabName, zN
24980 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
24990 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20        zToFree = 
249a0 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20  zColname;.      
249b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
249c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
249d0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
249e0 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
249f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24a00 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
24a10 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
24a20 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  d(pParse, pNew, 
24a30 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
24a40 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 7a 20 3d      sColname.z =
24a50 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20   zColname;.     
24a60 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e         sColname.
24a70 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
24a80 6e 33 30 28 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20  n30(zColname);. 
24a90 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
24aa0 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d  e3ExprListSetNam
24ab0 65 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  e(pParse, pNew, 
24ac0 26 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20  &sColname, 0);. 
24ad0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
24ae0 4e 65 77 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c  New && (p->selFl
24af0 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46  ags & SF_NestedF
24b00 72 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  rom)!=0 ){.     
24b10 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
24b20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
24b30 58 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65  X = &pNew->a[pNe
24b40 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  w->nExpr-1];.   
24b50 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
24b60 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Sub ){.         
24b70 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e         pX->zSpan
24b80 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
24b90 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c  up(db, pSub->pEL
24ba0 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29  ist->a[j].zSpan)
24bb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
24bc0 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
24bd0 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  zSpan==0 );.    
24be0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
24bf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24c00 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c   pX->zSpan = sql
24c10 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
24c20 22 25 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20  "%s.%s.%s",.    
24c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c50 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61         zSchemaNa
24c60 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43  me, zTabName, zC
24c70 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  olname);.       
24c80 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
24c90 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20  e( pX->zSpan==0 
24ca0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
24cb0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
24cc0 20 70 58 2d 3e 62 53 70 61 6e 49 73 54 61 62 20   pX->bSpanIsTab 
24cd0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
24ce0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
24cf0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
24d00 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20   zToFree);.     
24d10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
24d20 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 74 61  .        if( !ta
24d30 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20  bleSeen ){.     
24d40 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
24d50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
24d60 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
24d70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
24d80 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61  table: %s", zTNa
24d90 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  me);.          }
24da0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
24db0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
24dc0 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61  g(pParse, "no ta
24dd0 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29  bles specified")
24de0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
24df0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
24e00 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
24e10 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
24e20 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  db, pEList);.   
24e30 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65   p->pEList = pNe
24e40 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54  w;.  }.#if SQLIT
24e50 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69  E_MAX_COLUMN.  i
24e60 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20  f( p->pEList && 
24e70 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
24e80 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
24e90 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
24ea0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
24eb0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
24ec0 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  "too many column
24ed0 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22  s in result set"
24ee0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
24ef0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
24f00 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f  nue;.}../*.** No
24f10 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  -op routine for 
24f20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65 20 77  the parse-tree w
24f30 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  alker..**.** Whe
24f40 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
24f50 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45 78  s the Walker.xEx
24f60 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20  prCallback then 
24f70 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
24f80 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20 77  .** are walked w
24f90 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69 6f  ithout any actio
24fa0 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20 61  ns being taken a
24fb0 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50 72  t each node.  Pr
24fc0 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65  esumably,.** whe
24fd0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
24fe0 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b 65  s used for Walke
24ff0 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  r.xExprCallback 
25000 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e  then .** Walker.
25010 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
25020 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d  is set to do som
25030 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66 6f  ething useful fo
25040 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62 71  r every .** subq
25050 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72 73  uery in the pars
25060 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  er tree..*/.stat
25070 69 63 20 69 6e 74 20 65 78 70 72 57 61 6c 6b 4e  ic int exprWalkN
25080 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55  oop(Walker *NotU
25090 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73  sed, Expr *NotUs
250a0 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2){.  UNUSED_P
250b0 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
250c0 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  d, NotUsed2);.  
250d0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
250e0 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  nue;.}../*.** Th
250f0 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70 61  is routine "expa
25100 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20 73 74  nds" a SELECT st
25110 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20  atement and all 
25120 6f 66 20 69 74 73 20 73 75 62 71 75 65 72 69 65  of its subquerie
25130 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74 69  s..** For additi
25140 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
25150 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61 6e   on what it mean
25160 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61 20  s to "expand" a 
25170 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d  SELECT.** statem
25180 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f 6d  ent, see the com
25190 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c 65  ment on the sele
251a0 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72 20  ctExpand worker 
251b0 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a  callback above..
251c0 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20  **.** Expanding 
251d0 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
251e0 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20  nt is the first 
251f0 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73 69  step in processi
25200 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  ng a.** SELECT s
25210 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 53  tatement.  The S
25220 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
25230 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64  must be expanded
25240 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20   before.** name 
25250 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65  resolution is pe
25260 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  rformed..**.** I
25270 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
25280 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20  wrong, an error 
25290 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74  message is writt
252a0 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a  en into pParse..
252b0 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  ** The calling f
252c0 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74 65  unction can dete
252d0 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 62  ct the problem b
252e0 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61  y looking at pPa
252f0 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64  rse->nErr.** and
25300 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  /or pParse->db->
25310 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f  mallocFailed..*/
25320 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
25330 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
25340 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
25350 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
25360 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
25370 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
25380 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45  zeof(w));.  w.xE
25390 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
253a0 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e  prWalkNoop;.  w.
253b0 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
253c0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 68  .  if( pParse->h
253d0 61 73 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20  asCompound ){.  
253e0 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
253f0 61 63 6b 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d  ack = convertCom
25400 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62  poundSelectToSub
25410 71 75 65 72 79 3b 0a 20 20 20 20 73 71 6c 69 74  query;.    sqlit
25420 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c  e3WalkSelect(&w,
25430 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20   pSelect);.  }. 
25440 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
25450 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e  ck = selectExpan
25460 64 65 72 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  der;.  w.xSelect
25470 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65  Callback2 = sele
25480 63 74 50 6f 70 57 69 74 68 3b 0a 20 20 73 71 6c  ctPopWith;.  sql
25490 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
254a0 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a  w, pSelect);.}..
254b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
254c0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
254d0 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57 61  .** This is a Wa
254e0 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
254f0 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f  back callback fo
25500 72 20 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c  r the sqlite3Sel
25510 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a  ectTypeInfo().**
25520 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a   interface..**.*
25530 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d  * For each FROM-
25540 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 2c  clause subquery,
25550 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70   add Column.zTyp
25560 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f  e and Column.zCo
25570 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ll.** informatio
25580 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73  n to the Table s
25590 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
255a0 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73  presents the res
255b0 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68  ult set.** of th
255c0 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a  at subquery..**.
255d0 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72  ** The Table str
255e0 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72  ucture that repr
255f0 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c  esents the resul
25600 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72  t set was constr
25610 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65  ucted.** by sele
25620 63 74 45 78 70 61 6e 64 65 72 28 29 20 62 75 74  ctExpander() but
25630 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f   the type and co
25640 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74  llation informat
25650 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a  ion was omitted.
25660 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ** at that point
25670 20 62 65 63 61 75 73 65 20 69 64 65 6e 74 69 66   because identif
25680 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74  iers had not yet
25690 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20   been resolved. 
256a0 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
256b0 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
256c0 20 69 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f   identifier reso
256d0 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lution..*/.stati
256e0 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64  c void selectAdd
256f0 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f  SubqueryTypeInfo
25700 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
25710 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
25720 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20  Parse *pParse;. 
25730 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73   int i;.  SrcLis
25740 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73  t *pTabList;.  s
25750 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
25760 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73  em *pFrom;..  as
25770 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67  sert( p->selFlag
25780 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20  s & SF_Resolved 
25790 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c  );.  if( (p->sel
257a0 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54 79  Flags & SF_HasTy
257b0 70 65 49 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20 20  peInfo)==0 ){.  
257c0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
257d0 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b   SF_HasTypeInfo;
257e0 0a 20 20 20 20 70 50 61 72 73 65 20 3d 20 70 57  .    pParse = pW
257f0 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
25800 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d     pTabList = p-
25810 3e 70 53 72 63 3b 0a 20 20 20 20 66 6f 72 28 69  >pSrc;.    for(i
25820 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
25830 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
25840 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
25850 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 54 61  rom++){.      Ta
25860 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
25870 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69  m->pTab;.      i
25880 66 28 20 41 4c 57 41 59 53 28 70 54 61 62 21 3d  f( ALWAYS(pTab!=
25890 30 29 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62  0) && (pTab->tab
258a0 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
258b0 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  eral)!=0 ){.    
258c0 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65      /* A sub-que
258d0 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ry in the FROM c
258e0 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
258f0 54 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c  T */.        Sel
25900 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f  ect *pSel = pFro
25910 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
25920 20 20 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a      if( pSel ){.
25930 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
25940 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20   pSel->pPrior ) 
25950 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72  pSel = pSel->pPr
25960 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ior;.          s
25970 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
25980 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70  peAndCollation(p
25990 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65  Parse, pTab, pSe
259a0 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
259b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
259c0 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
259d0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64   This routine ad
259e0 64 73 20 64 61 74 61 74 79 70 65 20 61 6e 64 20  ds datatype and 
259f0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
25a00 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  ce information t
25a10 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73  o.** the Table s
25a20 74 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c  tructures of all
25a30 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
25a40 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20  queries in a.** 
25a50 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
25a60 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73  ..**.** Use this
25a70 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e   routine after n
25a80 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a  ame resolution..
25a90 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
25aa0 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54  qlite3SelectAddT
25ab0 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70  ypeInfo(Parse *p
25ac0 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
25ad0 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66  Select){.#ifndef
25ae0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
25af0 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77  QUERY.  Walker w
25b00 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
25b10 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
25b20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
25b30 6b 32 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75  k2 = selectAddSu
25b40 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a  bqueryTypeInfo;.
25b50 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
25b60 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70  k = exprWalkNoop
25b70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
25b80 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33  Parse;.  sqlite3
25b90 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70  WalkSelect(&w, p
25ba0 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a  Select);.#endif.
25bb0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
25bc0 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61  outine sets up a
25bd0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
25be0 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67  t for processing
25bf0 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77  .  The.** follow
25c00 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73  ing is accomplis
25c10 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  hed:.**.**     *
25c20 20 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75    VDBE Cursor nu
25c30 6d 62 65 72 73 20 61 72 65 20 61 73 73 69 67 6e  mbers are assign
25c40 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63  ed to all FROM-c
25c50 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20  lause terms..** 
25c60 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c      *  Ephemeral
25c70 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61   Table objects a
25c80 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61  re created for a
25c90 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ll FROM-clause s
25ca0 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20  ubqueries..**   
25cb0 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e    *  ON and USIN
25cc0 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 73 68  G clauses are sh
25cd0 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45  ifted into WHERE
25ce0 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20   statements.**  
25cf0 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20     *  Wildcards 
25d00 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a  "*" and "TABLE.*
25d10 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73  " in result sets
25d20 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a   are expanded..*
25d30 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66  *     *  Identif
25d40 69 65 72 73 20 69 6e 20 65 78 70 72 65 73 73 69  iers in expressi
25d50 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20 74  on are matched t
25d60 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  o tables..**.** 
25d70 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74  This routine act
25d80 73 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e  s recursively on
25d90 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20   all subqueries 
25da0 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43  within the SELEC
25db0 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  T..*/.void sqlit
25dc0 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20  e3SelectPrep(.  
25dd0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
25de0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
25df0 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
25e00 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
25e10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
25e20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
25e30 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
25e40 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
25e50 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d  pOuterNC  /* Nam
25e60 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f  e context for co
25e70 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20  ntainer */.){.  
25e80 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
25e90 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29  f( NEVER(p==0) )
25ea0 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20   return;.  db = 
25eb0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
25ec0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
25ed0 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ed ) return;.  i
25ee0 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
25ef0 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20   SF_HasTypeInfo 
25f00 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
25f10 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
25f20 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66  pParse, p);.  if
25f30 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
25f40 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
25f50 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  ed ) return;.  s
25f60 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
25f70 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  ectNames(pParse,
25f80 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20   p, pOuterNC);. 
25f90 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
25fa0 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
25fb0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
25fc0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41    sqlite3SelectA
25fd0 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73  ddTypeInfo(pPars
25fe0 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e, p);.}../*.** 
25ff0 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67  Reset the aggreg
26000 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e  ate accumulator.
26010 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65  .**.** The aggre
26020 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
26030 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d   is a set of mem
26040 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68  ory cells that h
26050 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69  old.** intermedi
26060 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c  ate results whil
26070 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e  e calculating an
26080 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69   aggregate.  Thi
26090 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e  s.** routine gen
260a0 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74  erates code that
260b0 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e   stores NULLs in
260c0 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65   all of those me
260d0 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a  mory.** cells..*
260e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
260f0 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50  setAccumulator(P
26100 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
26110 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
26120 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
26130 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
26140 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
26150 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75  ggInfo_func *pFu
26160 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d  nc;.  int nReg =
26170 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63   pAggInfo->nFunc
26180 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f   + pAggInfo->nCo
26190 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67  lumn;.  if( nReg
261a0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69  ==0 ) return;.#i
261b0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
261c0 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68  G.  /* Verify th
261d0 61 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72  at all AggInfo r
261e0 65 67 69 73 74 65 72 73 20 61 72 65 20 77 69 74  egisters are wit
261f0 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20 73 70  hin the range sp
26200 65 63 69 66 69 65 64 20 62 79 0a 20 20 2a 2a 20  ecified by.  ** 
26210 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41  AggInfo.mnReg..A
26220 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a  ggInfo.mxReg */.
26230 20 20 61 73 73 65 72 74 28 20 6e 52 65 67 3d 3d    assert( nReg==
26240 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d  pAggInfo->mxReg-
26250 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b  pAggInfo->mnReg+
26260 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  1 );.  for(i=0; 
26270 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  i<pAggInfo->nCol
26280 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  umn; i++){.    a
26290 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d  ssert( pAggInfo-
262a0 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70  >aCol[i].iMem>=p
262b0 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20  AggInfo->mnReg. 
262c0 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67 49          && pAggI
262d0 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65  nfo->aCol[i].iMe
262e0 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52  m<=pAggInfo->mxR
262f0 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  eg );.  }.  for(
26300 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
26310 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20  >nFunc; i++){.  
26320 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e    assert( pAggIn
26330 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65  fo->aFunc[i].iMe
26340 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52  m>=pAggInfo->mnR
26350 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  eg.         && p
26360 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69  AggInfo->aFunc[i
26370 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f  ].iMem<=pAggInfo
26380 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23  ->mxReg );.  }.#
26390 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56  endif.  sqlite3V
263a0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
263b0 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66  Null, 0, pAggInf
263c0 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e  o->mnReg, pAggIn
263d0 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f  fo->mxReg);.  fo
263e0 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f  r(pFunc=pAggInfo
263f0 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c  ->aFunc, i=0; i<
26400 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
26410 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a   i++, pFunc++){.
26420 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69      if( pFunc->i
26430 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20  Distinct>=0 ){. 
26440 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
26450 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20  pFunc->pExpr;.  
26460 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
26470 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c  rHasProperty(pE,
26480 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
26490 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e  ;.      if( pE->
264a0 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45  x.pList==0 || pE
264b0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
264c0 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
264d0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
264e0 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54  Parse, "DISTINCT
264f0 20 61 67 67 72 65 67 61 74 65 73 20 6d 75 73 74   aggregates must
26500 20 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e   have exactly on
26510 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  e ".           "
26520 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20  argument");.    
26530 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74      pFunc->iDist
26540 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  inct = -1;.     
26550 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26560 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
26570 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
26580 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
26590 70 45 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c 20  pE->x.pList, 0, 
265a0 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
265b0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
265c0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
265d0 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69  l, pFunc->iDisti
265e0 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  nct, 0, 0,.     
265f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26600 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
26610 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
26620 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
26630 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
26640 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46  voke the OP_AggF
26650 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66  inalize opcode f
26660 6f 72 20 65 76 65 72 79 20 61 67 67 72 65 67 61  or every aggrega
26670 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  te function.** i
26680 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74  n the AggInfo st
26690 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
266a0 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65  ic void finalize
266b0 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72  AggFunctions(Par
266c0 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
266d0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
266e0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
266f0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
26700 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
26710 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20  Info_func *pF;. 
26720 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
26730 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
26740 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
26750 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
26760 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
26770 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e   = pF->pExpr->x.
26780 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72  pList;.    asser
26790 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
267a0 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45  rty(pF->pExpr, E
267b0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
267c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
267d0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 46  ddOp4(v, OP_AggF
267e0 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20  inal, pF->iMem, 
267f0 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e  pList ? pList->n
26800 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20  Expr : 0, 0,.   
26810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26820 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46     (void*)pF->pF
26830 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
26840 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  ;.  }.}../*.** U
26850 70 64 61 74 65 20 74 68 65 20 61 63 63 75 6d 75  pdate the accumu
26860 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c  lator memory cel
26870 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67  ls for an aggreg
26880 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ate based on.** 
26890 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
268a0 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a  or position..*/.
268b0 73 74 61 74 69 63 20 76 6f 69 64 20 75 70 64 61  static void upda
268c0 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61  teAccumulator(Pa
268d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
268e0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
268f0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
26900 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
26910 74 20 69 3b 0a 20 20 69 6e 74 20 72 65 67 48 69  t i;.  int regHi
26920 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64  t = 0;.  int add
26930 72 48 69 74 54 65 73 74 20 3d 20 30 3b 0a 20 20  rHitTest = 0;.  
26940 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
26950 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63  unc *pF;.  struc
26960 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
26970 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e  C;..  pAggInfo->
26980 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a  directMode = 1;.
26990 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41    for(i=0, pF=pA
269a0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69  ggInfo->aFunc; i
269b0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
269c0 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20  ; i++, pF++){.  
269d0 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20    int nArg;.    
269e0 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30  int addrNext = 0
269f0 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67 67  ;.    int regAgg
26a00 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
26a10 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70  pList = pF->pExp
26a20 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
26a30 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
26a40 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78  Property(pF->pEx
26a50 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
26a60 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
26a70 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67  st ){.      nArg
26a80 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
26a90 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20  .      regAgg = 
26aa0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
26ab0 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67  nge(pParse, nArg
26ac0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
26ad0 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
26ae0 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  (pParse, pList, 
26af0 72 65 67 41 67 67 2c 20 53 51 4c 49 54 45 5f 45  regAgg, SQLITE_E
26b00 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65  CEL_DUP);.    }e
26b10 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  lse{.      nArg 
26b20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67  = 0;.      regAg
26b30 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  g = 0;.    }.   
26b40 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e   if( pF->iDistin
26b50 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ct>=0 ){.      a
26b60 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65  ddrNext = sqlite
26b70 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
26b80 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
26b90 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20   nArg==1 );.    
26ba0 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70    codeDistinct(p
26bb0 50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69 73 74  Parse, pF->iDist
26bc0 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20  inct, addrNext, 
26bd0 31 2c 20 72 65 67 41 67 67 29 3b 0a 20 20 20 20  1, regAgg);.    
26be0 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46  }.    if( pF->pF
26bf0 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  unc->funcFlags &
26c00 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
26c10 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43  DCOLL ){.      C
26c20 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
26c30 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  0;.      struct 
26c40 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
26c50 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  Item;.      int 
26c60 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  j;.      assert(
26c70 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a   pList!=0 );  /*
26c80 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d   pList!=0 if pF-
26c90 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45 44 43  >pFunc has NEEDC
26ca0 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  OLL */.      for
26cb0 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73  (j=0, pItem=pLis
26cc0 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20  t->a; !pColl && 
26cd0 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74  j<nArg; j++, pIt
26ce0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
26cf0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
26d00 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
26d10 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
26d20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
26d30 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
26d40 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61       pColl = pPa
26d50 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
26d60 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
26d70 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d 30 20    if( regHit==0 
26d80 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63  && pAggInfo->nAc
26d90 63 75 6d 75 6c 61 74 6f 72 20 29 20 72 65 67 48  cumulator ) regH
26da0 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  it = ++pParse->n
26db0 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
26dc0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
26dd0 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48  OP_CollSeq, regH
26de0 69 74 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20  it, 0, 0, (char 
26df0 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
26e00 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  SEQ);.    }.    
26e10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
26e20 34 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c  4(v, OP_AggStep,
26e30 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46 2d 3e   0, regAgg, pF->
26e40 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  iMem,.          
26e50 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
26e60 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34  d*)pF->pFunc, P4
26e70 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73  _FUNCDEF);.    s
26e80 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
26e90 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67 29 3b  P5(v, (u8)nArg);
26ea0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
26eb0 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
26ec0 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41  nge(pParse, regA
26ed0 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 73  gg, nArg);.    s
26ee0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
26ef0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
26f00 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20  egAgg, nArg);.  
26f10 20 20 69 66 28 20 61 64 64 72 4e 65 78 74 20 29    if( addrNext )
26f20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
26f30 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
26f40 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20  v, addrNext);.  
26f50 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
26f60 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
26f70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
26f80 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70 75 6c 61  /* Before popula
26f90 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c  ting the accumul
26fa0 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20  ator registers, 
26fb0 63 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e  clear the column
26fc0 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f 74 68   cache..  ** Oth
26fd0 65 72 77 69 73 65 2c 20 69 66 20 61 6e 79 20 6f  erwise, if any o
26fe0 66 20 74 68 65 20 72 65 71 75 69 72 65 64 20 63  f the required c
26ff0 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61 72 65  olumn values are
27000 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74   already present
27010 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69 73 74   .  ** in regist
27020 65 72 73 2c 20 73 71 6c 69 74 65 33 45 78 70 72  ers, sqlite3Expr
27030 43 6f 64 65 28 29 20 6d 61 79 20 75 73 65 20 4f  Code() may use O
27040 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70 79 20  P_SCopy to copy 
27050 74 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74  the value.  ** t
27060 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75 74 20  o pC->iMem. But 
27070 62 79 20 74 68 65 20 74 69 6d 65 20 74 68 65 20  by the time the 
27080 76 61 6c 75 65 20 69 73 20 75 73 65 64 2c 20 74  value is used, t
27090 68 65 20 6f 72 69 67 69 6e 61 6c 20 72 65 67 69  he original regi
270a0 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20 68 61  ster.  ** may ha
270b0 76 65 20 62 65 65 6e 20 75 73 65 64 2c 20 69 6e  ve been used, in
270c0 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20 75  validating the u
270d0 6e 64 65 72 6c 79 69 6e 67 20 62 75 66 66 65 72  nderlying buffer
270e0 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a   holding the.  *
270f0 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 20 76  * text or blob v
27100 61 6c 75 65 2e 20 53 65 65 20 74 69 63 6b 65 74  alue. See ticket
27110 20 5b 38 38 33 30 33 34 64 63 62 35 5d 2e 0a 20   [883034dcb5].. 
27120 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68 65 72   **.  ** Another
27130 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c 64 20   solution would 
27140 62 65 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  be to change the
27150 20 4f 50 5f 53 43 6f 70 79 20 75 73 65 64 20 74   OP_SCopy used t
27160 6f 20 63 6f 70 79 20 63 61 63 68 65 64 0a 20 20  o copy cached.  
27170 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20 61 6e 20  ** values to an 
27180 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20  OP_Copy..  */.  
27190 69 66 28 20 72 65 67 48 69 74 20 29 7b 0a 20 20  if( regHit ){.  
271a0 20 20 61 64 64 72 48 69 74 54 65 73 74 20 3d 20    addrHitTest = 
271b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
271c0 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48  1(v, OP_If, regH
271d0 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  it); VdbeCoverag
271e0 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  e(v);.  }.  sqli
271f0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
27200 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72  r(pParse);.  for
27210 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66  (i=0, pC=pAggInf
27220 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49  o->aCol; i<pAggI
27230 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f  nfo->nAccumulato
27240 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20  r; i++, pC++){. 
27250 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
27260 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70  de(pParse, pC->p
27270 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b  Expr, pC->iMem);
27280 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d  .  }.  pAggInfo-
27290 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b  >directMode = 0;
272a0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
272b0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
272c0 3b 0a 20 20 69 66 28 20 61 64 64 72 48 69 74 54  ;.  if( addrHitT
272d0 65 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  est ){.    sqlit
272e0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
272f0 2c 20 61 64 64 72 48 69 74 54 65 73 74 29 3b 0a  , addrHitTest);.
27300 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
27310 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70   a single OP_Exp
27320 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  lain instruction
27330 20 74 6f 20 74 68 65 20 56 44 42 45 20 74 6f 20   to the VDBE to 
27340 65 78 70 6c 61 69 6e 20 61 20 73 69 6d 70 6c 65  explain a simple
27350 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71 75 65  .** count(*) que
27360 72 79 20 28 22 53 45 4c 45 43 54 20 63 6f 75 6e  ry ("SELECT coun
27370 74 28 2a 29 20 46 52 4f 4d 20 70 54 61 62 22 29  t(*) FROM pTab")
27380 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
27390 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
273a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
273b0 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28  lainSimpleCount(
273c0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
273d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
273e0 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
273f0 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
27400 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  pTab,           
27410 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
27420 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 20  e being queried 
27430 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
27440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27450 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75 73       /* Index us
27460 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 73  ed to optimize s
27470 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  can, or NULL */.
27480 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
27490 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20  >explain==2 ){. 
274a0 20 20 20 63 68 61 72 20 2a 7a 45 71 70 20 3d 20     char *zEqp = 
274b0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70  sqlite3MPrintf(p
274c0 50 61 72 73 65 2d 3e 64 62 2c 20 22 53 43 41 4e  Parse->db, "SCAN
274d0 20 54 41 42 4c 45 20 25 73 25 73 25 73 22 2c 0a   TABLE %s%s%s",.
274e0 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
274f0 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70 49  ame, .        pI
27500 64 78 20 3f 20 22 20 55 53 49 4e 47 20 43 4f 56  dx ? " USING COV
27510 45 52 49 4e 47 20 49 4e 44 45 58 20 22 20 3a 20  ERING INDEX " : 
27520 22 22 2c 0a 20 20 20 20 20 20 20 20 70 49 64 78  "",.        pIdx
27530 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a   ? pIdx->zName :
27540 20 22 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 73   "".    );.    s
27550 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
27560 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  (.        pParse
27570 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 45 78 70 6c  ->pVdbe, OP_Expl
27580 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65  ain, pParse->iSe
27590 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 45  lectId, 0, 0, zE
275a0 71 70 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a 20  qp, P4_DYNAMIC. 
275b0 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73     );.  }.}.#els
275c0 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  e.# define expla
275d0 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c  inSimpleCount(a,
275e0 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  b,c).#endif../*.
275f0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
27600 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43 54 20   for the SELECT 
27610 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20  statement given 
27620 69 6e 20 74 68 65 20 70 20 61 72 67 75 6d 65 6e  in the p argumen
27630 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  t.  .**.** The r
27640 65 73 75 6c 74 73 20 61 72 65 20 72 65 74 75 72  esults are retur
27650 6e 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ned according to
27660 20 74 68 65 20 53 65 6c 65 63 74 44 65 73 74 20   the SelectDest 
27670 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 53 65  structure..** Se
27680 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 73 71  e comments in sq
27690 6c 69 74 65 49 6e 74 2e 68 20 66 6f 72 20 66 75  liteInt.h for fu
276a0 72 74 68 65 72 20 69 6e 66 6f 72 6d 61 74 69 6f  rther informatio
276b0 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  n..**.** This ro
276c0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
276d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
276e0 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f  rs.  If any erro
276f0 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e  rs are.** encoun
27700 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61  tered, then an a
27710 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
27720 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74   message is left
27730 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a   in.** pParse->z
27740 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
27750 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
27760 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c  NOT free the Sel
27770 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ect structure pa
27780 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a  ssed in.  The.**
27790 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
277a0 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68  n needs to do th
277b0 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  at..*/.int sqlit
277c0 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  e3Select(.  Pars
277d0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
277e0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
277f0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
27800 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
27810 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
27820 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
27830 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53  ng coded. */.  S
27840 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
27850 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
27860 20 64 6f 20 77 69 74 68 20 74 68 65 20 71 75 65   do with the que
27870 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
27880 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
27890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
278a0 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
278b0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
278c0 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  o;     /* Return
278d0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65   from sqlite3Whe
278e0 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56  reBegin() */.  V
278f0 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
27900 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72        /* The vir
27910 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64  tual machine und
27920 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
27930 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20  */.  int isAgg; 
27940 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
27950 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c  rue for select l
27960 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74  ists like "count
27970 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69  (*)" */.  ExprLi
27980 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20  st *pEList;     
27990 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75   /* List of colu
279a0 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20  mns to extract. 
279b0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
279c0 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c  abList;     /* L
279d0 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f  ist of tables to
279e0 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a   select from */.
279f0 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
27a00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
27a10 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d  WHERE clause.  M
27a20 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
27a30 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70  ExprList *pGroup
27a40 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52  By;    /* The GR
27a50 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
27a60 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
27a70 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20   Expr *pHaving; 
27a80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48          /* The H
27a90 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d  AVING clause.  M
27aa0 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
27ab0 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20  int rc = 1;     
27ac0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
27ad0 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74  to return from t
27ae0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
27af0 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 73 44    DistinctCtx sD
27b00 69 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f  istinct; /* Info
27b10 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20   on how to code 
27b20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
27b30 77 6f 72 64 20 2a 2f 0a 20 20 53 6f 72 74 43 74  word */.  SortCt
27b40 78 20 73 53 6f 72 74 3b 20 20 20 20 20 20 20 20  x sSort;        
27b50 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20   /* Info on how 
27b60 74 6f 20 63 6f 64 65 20 74 68 65 20 4f 52 44 45  to code the ORDE
27b70 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
27b80 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66   AggInfo sAggInf
27b90 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72  o;      /* Infor
27ba0 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61  mation used by a
27bb0 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
27bc0 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20   */.  int iEnd; 
27bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27be0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 65  Address of the e
27bf0 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  nd of the query 
27c00 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
27c10 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
27c20 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
27c30 65 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64  ection */..#ifnd
27c40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
27c50 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 52 65  XPLAIN.  int iRe
27c60 73 74 6f 72 65 53 65 6c 65 63 74 49 64 20 3d 20  storeSelectId = 
27c70 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
27c80 64 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 53 65  d;.  pParse->iSe
27c90 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d  lectId = pParse-
27ca0 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 2b 2b  >iNextSelectId++
27cb0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 20 3d  ;.#endif..  db =
27cc0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
27cd0 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d  f( p==0 || db->m
27ce0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
27cf0 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
27d00 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
27d10 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
27d20 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
27d30 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30  SQLITE_SELECT, 0
27d40 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
27d50 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41   1;.  memset(&sA
27d60 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  ggInfo, 0, sizeo
27d70 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 20  f(sAggInfo));.. 
27d80 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
27d90 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74  erBy==0 || pDest
27da0 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73  ->eDest!=SRT_Dis
27db0 74 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72  tFifo );.  asser
27dc0 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
27dd0 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  0 || pDest->eDes
27de0 74 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20  t!=SRT_Fifo );. 
27df0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
27e00 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74  erBy==0 || pDest
27e10 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73  ->eDest!=SRT_Dis
27e20 74 51 75 65 75 65 20 29 3b 0a 20 20 61 73 73 65  tQueue );.  asse
27e30 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
27e40 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  =0 || pDest->eDe
27e50 73 74 21 3d 53 52 54 5f 51 75 65 75 65 20 29 3b  st!=SRT_Queue );
27e60 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65  .  if( Ignorable
27e70 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29  Orderby(pDest) )
27e80 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70 44 65  {.    assert(pDe
27e90 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
27ea0 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e  xists || pDest->
27eb0 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e  eDest==SRT_Union
27ec0 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
27ed0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
27ee0 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73  T_Except || pDes
27ef0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  t->eDest==SRT_Di
27f00 73 63 61 72 64 20 7c 7c 0a 20 20 20 20 20 20 20  scard ||.       
27f10 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74      pDest->eDest
27f20 3d 3d 53 52 54 5f 51 75 65 75 65 20 20 7c 7c 20  ==SRT_Queue  || 
27f30 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
27f40 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20 20  T_DistFifo ||.  
27f50 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e           pDest->
27f60 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51  eDest==SRT_DistQ
27f70 75 65 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e 65  ueue || pDest->e
27f80 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29 3b  Dest==SRT_Fifo);
27f90 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52  .    /* If ORDER
27fa0 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66   BY makes no dif
27fb0 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f  ference in the o
27fc0 75 74 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68  utput then neith
27fd0 65 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44  er does.    ** D
27fe0 49 53 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61  ISTINCT so it ca
27ff0 6e 20 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f  n be removed too
28000 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
28010 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
28020 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  b, p->pOrderBy);
28030 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  .    p->pOrderBy
28040 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c   = 0;.    p->sel
28050 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73  Flags &= ~SF_Dis
28060 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c  tinct;.  }.  sql
28070 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70  ite3SelectPrep(p
28080 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20  Parse, p, 0);.  
28090 6d 65 6d 73 65 74 28 26 73 53 6f 72 74 2c 20 30  memset(&sSort, 0
280a0 2c 20 73 69 7a 65 6f 66 28 73 53 6f 72 74 29 29  , sizeof(sSort))
280b0 3b 0a 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  ;.  sSort.pOrder
280c0 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
280d0 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  ;.  pTabList = p
280e0 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74  ->pSrc;.  pEList
280f0 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
28100 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
28110 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
28120 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
28130 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
28140 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d 3e 73  .  isAgg = (p->s
28150 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
28160 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 61 73  regate)!=0;.  as
28170 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
28180 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67  );..  /* Begin g
28190 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a  enerating code..
281a0 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
281b0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
281c0 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
281d0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
281e0 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e  ..  /* If writin
281f0 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67  g to memory or g
28200 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a  enerating a set.
28210 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67    ** only a sing
28220 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65  le column may be
28230 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69   output..  */.#i
28240 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
28250 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28  T_SUBQUERY.  if(
28260 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f   checkForMultiCo
28270 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28  lumnSelectError(
28280 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70  pParse, pDest, p
28290 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  EList->nExpr) ){
282a0 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
282b0 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  _end;.  }.#endif
282c0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
282d0 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62  code for all sub
282e0 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20  -queries in the 
282f0 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FROM clause.  */
28300 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
28310 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
28320 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
28330 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
28340 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d  ).  for(i=0; !p-
28350 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61  >pPrior && i<pTa
28360 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
28370 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
28380 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
28390 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
283a0 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44  [i];.    SelectD
283b0 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65  est dest;.    Se
283c0 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74  lect *pSub = pIt
283d0 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  em->pSelect;.   
283e0 20 69 6e 74 20 69 73 41 67 67 53 75 62 3b 0a 0a   int isAggSub;..
283f0 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20      if( pSub==0 
28400 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
28410 20 2f 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68   /* Sometimes th
28420 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 75 62  e code for a sub
28430 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20 67 65  query will be ge
28440 6e 65 72 61 74 65 64 20 6d 6f 72 65 20 74 68 61  nerated more tha
28450 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63 65 2c 20 69  n.    ** once, i
28460 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
28470 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 57 48  s part of the WH
28480 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 61 20  ERE clause in a 
28490 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a  LEFT JOIN,.    *
284a0 2a 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20  * for example.  
284b0 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64 6f  In that case, do
284c0 20 6e 6f 74 20 72 65 67 65 6e 65 72 61 74 65 20   not regenerate 
284d0 74 68 65 20 63 6f 64 65 20 74 6f 20 6d 61 6e 69  the code to mani
284e0 66 65 73 74 0a 20 20 20 20 2a 2a 20 61 20 76 69  fest.    ** a vi
284f0 65 77 20 6f 72 20 74 68 65 20 63 6f 2d 72 6f 75  ew or the co-rou
28500 74 69 6e 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  tine to implemen
28510 74 20 61 20 76 69 65 77 2e 20 20 54 68 65 20 66  t a view.  The f
28520 69 72 73 74 20 69 6e 73 74 61 6e 63 65 0a 20 20  irst instance.  
28530 20 20 2a 2a 20 69 73 20 73 75 66 66 69 63 69 65    ** is sufficie
28540 6e 74 2c 20 74 68 6f 75 67 68 20 74 68 65 20 73  nt, though the s
28550 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6e  ubroutine to man
28560 69 66 65 73 74 20 74 68 65 20 76 69 65 77 20 64  ifest the view d
28570 6f 65 73 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20  oes need.    ** 
28580 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 67  to be invoked ag
28590 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ain. */.    if( 
285a0 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
285b0 75 62 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ub ){.      if( 
285c0 70 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74  pItem->viaCorout
285d0 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ine==0 ){.      
285e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
285f0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
28600 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
28610 6e 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69  n, pItem->addrFi
28620 6c 6c 53 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a  llSub);.      }.
28630 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
28640 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e      }..    /* In
28650 63 72 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48  crement Parse.nH
28660 65 69 67 68 74 20 62 79 20 74 68 65 20 68 65 69  eight by the hei
28670 67 68 74 20 6f 66 20 74 68 65 20 6c 61 72 67 65  ght of the large
28680 73 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  st expression.  
28690 20 20 2a 2a 20 74 72 65 65 20 72 65 66 65 72 72    ** tree referr
286a0 65 64 20 74 6f 20 62 79 20 74 68 69 73 2c 20 74  ed to by this, t
286b0 68 65 20 70 61 72 65 6e 74 20 73 65 6c 65 63 74  he parent select
286c0 2e 20 54 68 65 20 63 68 69 6c 64 20 73 65 6c 65  . The child sele
286d0 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f  ct.    ** may co
286e0 6e 74 61 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  ntain expression
286f0 20 74 72 65 65 73 20 6f 66 20 61 74 20 6d 6f 73   trees of at mos
28700 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49 54 45  t.    ** (SQLITE
28710 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2d  _MAX_EXPR_DEPTH-
28720 50 61 72 73 65 2e 6e 48 65 69 67 68 74 29 20 68  Parse.nHeight) h
28730 65 69 67 68 74 2e 20 54 68 69 73 20 69 73 20 61  eight. This is a
28740 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65   bit.    ** more
28750 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 74 68   conservative th
28760 61 6e 20 6e 65 63 65 73 73 61 72 79 2c 20 62 75  an necessary, bu
28770 74 20 6d 75 63 68 20 65 61 73 69 65 72 20 74 68  t much easier th
28780 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20  an enforcing.   
28790 20 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c 69 6d   ** an exact lim
287a0 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  it..    */.    p
287b0 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b  Parse->nHeight +
287c0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  = sqlite3SelectE
287d0 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 0a 20  xprHeight(p);.. 
287e0 20 20 20 69 73 41 67 67 53 75 62 20 3d 20 28 70     isAggSub = (p
287f0 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
28800 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30  SF_Aggregate)!=0
28810 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74 65  ;.    if( flatte
28820 6e 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65  nSubquery(pParse
28830 2c 20 70 2c 20 69 2c 20 69 73 41 67 67 2c 20 69  , p, i, isAgg, i
28840 73 41 67 67 53 75 62 29 20 29 7b 0a 20 20 20 20  sAggSub) ){.    
28850 20 20 2f 2a 20 54 68 69 73 20 73 75 62 71 75 65    /* This subque
28860 72 79 20 63 61 6e 20 62 65 20 61 62 73 6f 72 62  ry can be absorb
28870 65 64 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65  ed into its pare
28880 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  nt. */.      if(
28890 20 69 73 41 67 67 53 75 62 20 29 7b 0a 20 20 20   isAggSub ){.   
288a0 20 20 20 20 20 69 73 41 67 67 20 3d 20 31 3b 0a       isAgg = 1;.
288b0 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c          p->selFl
288c0 61 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67  ags |= SF_Aggreg
288d0 61 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ate;.      }.   
288e0 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d     i = -1;.    }
288f0 65 6c 73 65 20 69 66 28 20 70 54 61 62 4c 69 73  else if( pTabLis
28900 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20  t->nSrc==1.     
28910 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a        && Optimiz
28920 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
28930 20 53 51 4c 49 54 45 5f 53 75 62 71 43 6f 72 6f   SQLITE_SubqCoro
28940 75 74 69 6e 65 29 0a 20 20 20 20 29 7b 0a 20 20  utine).    ){.  
28950 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74      /* Implement
28960 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68   a co-routine th
28970 61 74 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  at will return a
28980 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74   single row of t
28990 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  he result.      
289a0 2a 2a 20 73 65 74 20 6f 6e 20 65 61 63 68 20 69  ** set on each i
289b0 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20  nvocation..     
289c0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
289d0 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  drTop = sqlite3V
289e0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
289f0 29 2b 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  )+1;.      pItem
28a00 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  ->regReturn = ++
28a10 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
28a20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
28a30 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74  ddOp3(v, OP_Init
28a40 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d  Coroutine, pItem
28a50 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 30 2c 20  ->regReturn, 0, 
28a60 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20  addrTop);.      
28a70 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
28a80 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61  "%s", pItem->pTa
28a90 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
28aa0 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c    pItem->addrFil
28ab0 6c 53 75 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a  lSub = addrTop;.
28ac0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
28ad0 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
28ae0 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t, SRT_Coroutine
28af0 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
28b00 72 6e 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  rn);.      expla
28b10 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 49 74  inSetInteger(pIt
28b20 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28  em->iSelectId, (
28b30 75 38 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  u8)pParse->iNext
28b40 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
28b50 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
28b60 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65  Parse, pSub, &de
28b70 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  st);.      pItem
28b80 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20  ->pTab->nRowEst 
28b90 3d 20 28 75 6e 73 69 67 6e 65 64 29 70 53 75 62  = (unsigned)pSub
28ba0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
28bb0 20 20 20 20 70 49 74 65 6d 2d 3e 76 69 61 43 6f      pItem->viaCo
28bc0 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20  routine = 1;.   
28bd0 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 73     pItem->regRes
28be0 75 6c 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74  ult = dest.iSdst
28bf0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
28c00 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
28c10 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49  EndCoroutine, pI
28c20 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b  tem->regReturn);
28c30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
28c40 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
28c50 64 72 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20  drTop-1);.      
28c60 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70  sqlite3ClearTemp
28c70 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65 29  RegCache(pParse)
28c80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
28c90 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
28ca0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
28cb0 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70   will fill an ep
28cc0 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69  hemeral table wi
28cd0 74 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  th.      ** the 
28ce0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20  content of this 
28cf0 73 75 62 71 75 65 72 79 2e 20 20 70 49 74 65 6d  subquery.  pItem
28d00 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 77 69  ->addrFillSub wi
28d10 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a  ll point.      *
28d20 2a 20 74 6f 20 74 68 65 20 61 64 64 72 65 73 73  * to the address
28d30 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65   of the generate
28d40 64 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 70  d subroutine.  p
28d50 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a  Item->regReturn.
28d60 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20 72 65        ** is a re
28d70 67 69 73 74 65 72 20 61 6c 6c 6f 63 61 74 65 64  gister allocated
28d80 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 73 75 62   to hold the sub
28d90 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20 61  routine return a
28da0 64 64 72 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a  ddress.      */.
28db0 20 20 20 20 20 20 69 6e 74 20 74 6f 70 41 64 64        int topAdd
28dc0 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63  r;.      int onc
28dd0 65 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20  eAddr = 0;.     
28de0 20 69 6e 74 20 72 65 74 41 64 64 72 3b 0a 20 20   int retAddr;.  
28df0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
28e00 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d  m->addrFillSub==
28e10 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  0 );.      pItem
28e20 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  ->regReturn = ++
28e30 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
28e40 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73 71      topAddr = sq
28e50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
28e60 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
28e70 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
28e80 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  rn);.      pItem
28e90 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20  ->addrFillSub = 
28ea0 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20 20  topAddr+1;.     
28eb0 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 73 43 6f   if( pItem->isCo
28ec0 72 72 65 6c 61 74 65 64 3d 3d 30 20 29 7b 0a 20  rrelated==0 ){. 
28ed0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
28ee0 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
28ef0 20 63 6f 72 72 65 6c 61 74 65 64 20 61 6e 64 20   correlated and 
28f00 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e  if we are not in
28f10 73 69 64 65 20 6f 66 0a 20 20 20 20 20 20 20 20  side of.        
28f20 2a 2a 20 61 20 74 72 69 67 67 65 72 2c 20 74 68  ** a trigger, th
28f30 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20  en we only need 
28f40 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 76  to compute the v
28f50 61 6c 75 65 20 6f 66 20 74 68 65 20 73 75 62 71  alue of the subq
28f60 75 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  uery.        ** 
28f70 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  once. */.       
28f80 20 6f 6e 63 65 41 64 64 72 20 3d 20 73 71 6c 69   onceAddr = sqli
28f90 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72  te3CodeOnce(pPar
28fa0 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  se); VdbeCoverag
28fb0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64  e(v);.        Vd
28fc0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d  beComment((v, "m
28fd0 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c  aterialize \"%s\
28fe0 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  "", pItem->pTab-
28ff0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
29000 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 56  }else{.        V
29010 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
29020 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20  v, "materialize 
29030 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e  \"%s\"", pItem->
29040 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
29050 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
29060 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
29070 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 45 70  it(&dest, SRT_Ep
29080 68 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69  hemTab, pItem->i
29090 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 65  Cursor);.      e
290a0 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
290b0 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49  (pItem->iSelectI
290c0 64 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69  d, (u8)pParse->i
290d0 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
290e0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
290f0 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c  ct(pParse, pSub,
29100 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70   &dest);.      p
29110 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77  Item->pTab->nRow
29120 45 73 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 29  Est = (unsigned)
29130 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  pSub->nSelectRow
29140 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65  ;.      if( once
29150 41 64 64 72 20 29 20 73 71 6c 69 74 65 33 56 64  Addr ) sqlite3Vd
29160 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e  beJumpHere(v, on
29170 63 65 41 64 64 72 29 3b 0a 20 20 20 20 20 20 72  ceAddr);.      r
29180 65 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33  etAddr = sqlite3
29190 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
291a0 5f 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e  _Return, pItem->
291b0 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
291c0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
291d0 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49 74 65  , "end %s", pIte
291e0 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
291f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
29200 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 74  dbeChangeP1(v, t
29210 6f 70 41 64 64 72 2c 20 72 65 74 41 64 64 72 29  opAddr, retAddr)
29220 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
29230 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65  learTempRegCache
29240 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a  (pParse);.    }.
29250 20 20 20 20 69 66 28 20 2f 2a 70 50 61 72 73 65      if( /*pParse
29260 2d 3e 6e 45 72 72 20 7c 7c 2a 2f 20 64 62 2d 3e  ->nErr ||*/ db->
29270 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
29280 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
29290 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
292a0 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74   pParse->nHeight
292b0 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63   -= sqlite3Selec
292c0 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a  tExprHeight(p);.
292d0 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70      pTabList = p
292e0 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20  ->pSrc;.    if( 
292f0 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62  !IgnorableOrderb
29300 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(pDest) ){.    
29310 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
29320 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
29330 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69      }.  }.  pELi
29340 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
29350 23 65 6e 64 69 66 0a 20 20 70 57 68 65 72 65 20  #endif.  pWhere 
29360 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70  = p->pWhere;.  p
29370 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
29380 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67  oupBy;.  pHaving
29390 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20   = p->pHaving;. 
293a0 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
293b0 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  t = (p->selFlags
293c0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21   & SF_Distinct)!
293d0 3d 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  =0;..#ifndef SQL
293e0 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
293f0 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66  D_SELECT.  /* If
29400 20 74 68 65 72 65 20 69 73 20 61 72 65 20 61 20   there is are a 
29410 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72  sequence of quer
29420 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c  ies, do the earl
29430 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a  ier ones first..
29440 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50    */.  if( p->pP
29450 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  rior ){.    rc =
29460 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61   multiSelect(pPa
29470 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a  rse, p, pDest);.
29480 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
29490 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53  teger(pParse->iS
294a0 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72  electId, iRestor
294b0 65 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  eSelectId);.    
294c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23  return rc;.  }.#
294d0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
294e0 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 20 47  here is both a G
294f0 52 4f 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f  ROUP BY and an O
29500 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
29510 6e 64 20 74 68 65 79 20 61 72 65 0a 20 20 2a 2a  nd they are.  **
29520 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e   identical, then
29530 20 64 69 73 61 62 6c 65 20 74 68 65 20 4f 52 44   disable the ORD
29540 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 69 6e  ER BY clause sin
29550 63 65 20 74 68 65 20 47 52 4f 55 50 20 42 59 0a  ce the GROUP BY.
29560 20 20 2a 2a 20 77 69 6c 6c 20 63 61 75 73 65 20    ** will cause 
29570 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65  elements to come
29580 20 6f 75 74 20 69 6e 20 74 68 65 20 63 6f 72 72   out in the corr
29590 65 63 74 20 6f 72 64 65 72 2e 20 20 54 68 69 73  ect order.  This
295a0 20 69 73 0a 20 20 2a 2a 20 61 6e 20 6f 70 74 69   is.  ** an opti
295b0 6d 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20 63  mization - the c
295c0 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 73 68  orrect answer sh
295d0 6f 75 6c 64 20 72 65 73 75 6c 74 20 72 65 67 61  ould result rega
295e0 72 64 6c 65 73 73 2e 0a 20 20 2a 2a 20 55 73 65  rdless..  ** Use
295f0 20 74 68 65 20 53 51 4c 49 54 45 5f 47 72 6f 75   the SQLITE_Grou
29600 70 42 79 4f 72 64 65 72 20 66 6c 61 67 20 77 69  pByOrder flag wi
29610 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  th SQLITE_TESTCT
29620 52 4c 5f 4f 50 54 49 4d 49 5a 45 52 0a 20 20 2a  RL_OPTIMIZER.  *
29630 2a 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 69  * to disable thi
29640 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66  s optimization f
29650 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  or testing purpo
29660 73 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ses..  */.  if( 
29670 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
29680 6f 6d 70 61 72 65 28 70 2d 3e 70 47 72 6f 75 70  ompare(p->pGroup
29690 42 79 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  By, sSort.pOrder
296a0 42 79 2c 20 2d 31 29 3d 3d 30 0a 20 20 20 20 20  By, -1)==0.     
296b0 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74      && Optimizat
296c0 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
296d0 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64  QLITE_GroupByOrd
296e0 65 72 29 20 29 7b 0a 20 20 20 20 73 53 6f 72 74  er) ){.    sSort
296f0 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  .pOrderBy = 0;. 
29700 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
29710 71 75 65 72 79 20 69 73 20 44 49 53 54 49 4e 43  query is DISTINC
29720 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20  T with an ORDER 
29730 42 59 20 62 75 74 20 69 73 20 6e 6f 74 20 61 6e  BY but is not an
29740 20 61 67 67 72 65 67 61 74 65 2c 20 61 6e 64 20   aggregate, and 
29750 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 73 65 6c  .  ** if the sel
29760 65 63 74 2d 6c 69 73 74 20 69 73 20 74 68 65 20  ect-list is the 
29770 73 61 6d 65 20 61 73 20 74 68 65 20 4f 52 44 45  same as the ORDE
29780 52 20 42 59 20 6c 69 73 74 2c 20 74 68 65 6e 20  R BY list, then 
29790 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2a 20  this query.  ** 
297a0 63 61 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e  can be rewritten
297b0 20 61 73 20 61 20 47 52 4f 55 50 20 42 59 2e 20   as a GROUP BY. 
297c0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
297d0 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this:.  **.  ** 
297e0 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49      SELECT DISTI
297f0 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e  NCT xyz FROM ...
29800 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20   ORDER BY xyz.  
29810 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e 73  **.  ** is trans
29820 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a  formed to:.  **.
29830 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
29840 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f  xyz FROM ... GRO
29850 55 50 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20  UP BY xyz.  **. 
29860 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66   ** The second f
29870 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72 65 64  orm is preferred
29880 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64   as a single ind
29890 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c  ex (or temp-tabl
298a0 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20  e) may be .  ** 
298b0 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68  used for both th
298c0 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 44  e ORDER BY and D
298d0 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69  ISTINCT processi
298e0 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c  ng. As originall
298f0 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20  y .  ** written 
29900 74 68 65 20 71 75 65 72 79 20 6d 75 73 74 20 75  the query must u
29910 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20  se a temp-table 
29920 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  for at least one
29930 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a 20   of the ORDER . 
29940 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54 49   ** BY and DISTI
29950 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65  NCT, and an inde
29960 78 20 6f 72 20 73 65 70 61 72 61 74 65 20 74 65  x or separate te
29970 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68 65  mp-table for the
29980 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69   other..  */.  i
29990 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
299a0 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
299b0 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
299c0 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20 26  F_Distinct .   &
299d0 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  & sqlite3ExprLis
299e0 74 43 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e 70  tCompare(sSort.p
299f0 4f 72 64 65 72 42 79 2c 20 70 2d 3e 70 45 4c 69  OrderBy, p->pELi
29a00 73 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a  st, -1)==0.  ){.
29a10 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
29a20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b  &= ~SF_Distinct;
29a30 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79  .    p->pGroupBy
29a40 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
29a50 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c  stDup(db, p->pEL
29a60 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 70 47 72  ist, 0);.    pGr
29a70 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
29a80 70 42 79 3b 0a 20 20 20 20 73 53 6f 72 74 2e 70  pBy;.    sSort.p
29a90 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
29aa0 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20   /* Notice that 
29ab0 65 76 65 6e 20 74 68 6f 75 67 68 74 20 53 46 5f  even thought SF_
29ac0 44 69 73 74 69 6e 63 74 20 68 61 73 20 62 65 65  Distinct has bee
29ad0 6e 20 63 6c 65 61 72 65 64 20 66 72 6f 6d 20 70  n cleared from p
29ae0 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20  ->selFlags,.    
29af0 2a 2a 20 74 68 65 20 73 44 69 73 74 69 6e 63 74  ** the sDistinct
29b00 2e 69 73 54 6e 63 74 20 69 73 20 73 74 69 6c 6c  .isTnct is still
29b10 20 73 65 74 2e 20 20 48 65 6e 63 65 2c 20 69 73   set.  Hence, is
29b20 54 6e 63 74 20 72 65 70 72 65 73 65 6e 74 73 20  Tnct represents 
29b30 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67 69  the.    ** origi
29b40 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f 66 20 74  nal setting of t
29b50 68 65 20 53 46 5f 44 69 73 74 69 6e 63 74 20 66  he SF_Distinct f
29b60 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20 63 75 72  lag, not the cur
29b70 72 65 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f 0a  rent setting */.
29b80 20 20 20 20 61 73 73 65 72 74 28 20 73 44 69 73      assert( sDis
29b90 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b 0a  tinct.isTnct );.
29ba0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
29bb0 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
29bc0 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74  Y clause, then t
29bd0 68 69 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a 2a  his sorting.  **
29be0 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64   index might end
29bf0 20 75 70 20 62 65 69 6e 67 20 75 6e 75 73 65 64   up being unused
29c00 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e   if the data can
29c10 20 62 65 20 0a 20 20 2a 2a 20 65 78 74 72 61 63   be .  ** extrac
29c20 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65  ted in pre-sorte
29c30 64 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68 61  d order.  If tha
29c40 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  t is the case, t
29c50 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f  hen the.  ** OP_
29c60 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
29c70 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62  struction will b
29c80 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20  e changed to an 
29c90 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a  OP_Noop once.  *
29ca0 2a 20 77 65 20 66 69 67 75 72 65 20 6f 75 74 20  * we figure out 
29cb0 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67  that the sorting
29cc0 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e 65   index is not ne
29cd0 65 64 65 64 2e 20 20 54 68 65 20 61 64 64 72 53  eded.  The addrS
29ce0 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61  ortIndex.  ** va
29cf0 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
29d00 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 68 61  o facilitate tha
29d10 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20  t change..  */. 
29d20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65   if( sSort.pOrde
29d30 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  rBy ){.    KeyIn
29d40 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
29d50 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
29d60 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
29d70 28 70 50 61 72 73 65 2c 20 73 53 6f 72 74 2e 70  (pParse, sSort.p
29d80 4f 72 64 65 72 42 79 2c 20 30 2c 20 30 29 3b 0a  OrderBy, 0, 0);.
29d90 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73      sSort.iECurs
29da0 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
29db0 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e 61  b++;.    sSort.a
29dc0 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20  ddrSortIndex =. 
29dd0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
29de0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
29df0 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20  nEphemeral,.    
29e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e10 20 20 20 20 20 20 20 73 53 6f 72 74 2e 69 45 43         sSort.iEC
29e20 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72  ursor, sSort.pOr
29e30 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20  derBy->nExpr+2, 
29e40 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
29e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
29e60 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
29e70 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 7d 65  4_KEYINFO);.  }e
29e80 6c 73 65 7b 0a 20 20 20 20 73 53 6f 72 74 2e 61  lse{.    sSort.a
29e90 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d  ddrSortIndex = -
29ea0 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
29eb0 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64 65  the output is de
29ec0 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d  stined for a tem
29ed0 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70  porary table, op
29ee0 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20  en that table.. 
29ef0 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d   */.  if( pDest-
29f00 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65  >eDest==SRT_Ephe
29f10 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  mTab ){.    sqli
29f20 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
29f30 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
29f40 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  l, pDest->iSDPar
29f50 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  m, pEList->nExpr
29f60 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  );.  }..  /* Set
29f70 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20   the limiter..  
29f80 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c 69  */.  iEnd = sqli
29f90 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
29fa0 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63  (v);.  p->nSelec
29fb0 74 52 6f 77 20 3d 20 4c 41 52 47 45 53 54 5f 49  tRow = LARGEST_I
29fc0 4e 54 36 34 3b 0a 20 20 63 6f 6d 70 75 74 65 4c  NT64;.  computeL
29fd0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
29fe0 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a  arse, p, iEnd);.
29ff0 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d    if( p->iLimit=
2a000 3d 30 20 26 26 20 73 53 6f 72 74 2e 61 64 64 72  =0 && sSort.addr
2a010 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a  SortIndex>=0 ){.
2a020 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
2a030 65 74 4f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64  etOp(v, sSort.ad
2a040 64 72 53 6f 72 74 49 6e 64 65 78 29 2d 3e 6f 70  drSortIndex)->op
2a050 63 6f 64 65 20 3d 20 4f 50 5f 53 6f 72 74 65 72  code = OP_Sorter
2a060 4f 70 65 6e 3b 0a 20 20 20 20 73 53 6f 72 74 2e  Open;.    sSort.
2a070 73 6f 72 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52  sortFlags |= SOR
2a080 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 3b  TFLAG_UseSorter;
2a090 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
2a0a0 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20  a virtual index 
2a0b0 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64  to use for the d
2a0c0 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a  istinct set..  *
2a0d0 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
2a0e0 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
2a0f0 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69 6e  t ){.    sDistin
2a100 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50 61  ct.tabTnct = pPa
2a110 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
2a120 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72 54   sDistinct.addrT
2a130 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nct = sqlite3Vdb
2a140 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
2a150 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20  enEphemeral,.   
2a160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a170 20 20 20 20 20 20 20 20 20 20 20 20 20 73 44 69               sDi
2a180 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20  stinct.tabTnct, 
2a190 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
2a1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1b0 20 20 20 20 20 20 28 63 68 61 72 2a 29 6b 65 79        (char*)key
2a1c0 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
2a1d0 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
2a1e0 73 74 2c 30 2c 30 29 2c 0a 20 20 20 20 20 20 20  st,0,0),.       
2a1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a200 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49           P4_KEYI
2a210 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  NFO);.    sqlite
2a220 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
2a230 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
2a240 29 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  );.    sDistinct
2a250 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45  .eTnctType = WHE
2a260 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52  RE_DISTINCT_UNOR
2a270 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DERED;.  }else{.
2a280 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54      sDistinct.eT
2a290 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f  nctType = WHERE_
2a2a0 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20  DISTINCT_NOOP;. 
2a2b0 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 41 67 67   }..  if( !isAgg
2a2c0 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20   && pGroupBy==0 
2a2d0 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61 67 67  ){.    /* No agg
2a2e0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
2a2f0 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59   and no GROUP BY
2a300 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 75   clause */.    u
2a310 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20  16 wctrlFlags = 
2a320 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63  (sDistinct.isTnc
2a330 74 20 3f 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  t ? WHERE_WANT_D
2a340 49 53 54 49 4e 43 54 20 3a 20 30 29 3b 0a 0a 20  ISTINCT : 0);.. 
2a350 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20     /* Begin the 
2a360 64 61 74 61 62 61 73 65 20 73 63 61 6e 2e 20 2a  database scan. *
2a370 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73  /.    pWInfo = s
2a380 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2a390 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
2a3a0 74 2c 20 70 57 68 65 72 65 2c 20 73 53 6f 72 74  t, pWhere, sSort
2a3b0 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20  .pOrderBy,.     
2a3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a3d0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45 4c            p->pEL
2a3e0 69 73 74 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c  ist, wctrlFlags,
2a3f0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49   0);.    if( pWI
2a400 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  nfo==0 ) goto se
2a410 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66  lect_end;.    if
2a420 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75  ( sqlite3WhereOu
2a430 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49  tputRowCount(pWI
2a440 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63  nfo) < p->nSelec
2a450 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 2d  tRow ){.      p-
2a460 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71  >nSelectRow = sq
2a470 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74  lite3WhereOutput
2a480 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29  RowCount(pWInfo)
2a490 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2a4a0 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
2a4b0 20 26 26 20 73 71 6c 69 74 65 33 57 68 65 72 65   && sqlite3Where
2a4c0 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66  IsDistinct(pWInf
2a4d0 6f 29 20 29 7b 0a 20 20 20 20 20 20 73 44 69 73  o) ){.      sDis
2a4e0 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20  tinct.eTnctType 
2a4f0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  = sqlite3WhereIs
2a500 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29  Distinct(pWInfo)
2a510 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2a520 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29  sSort.pOrderBy )
2a530 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f  {.      sSort.nO
2a540 42 53 61 74 20 3d 20 73 71 6c 69 74 65 33 57 68  BSat = sqlite3Wh
2a550 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49  ereIsOrdered(pWI
2a560 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nfo);.      if( 
2a570 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d 73 53  sSort.nOBSat==sS
2a580 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ort.pOrderBy->nE
2a590 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  xpr ){.        s
2a5a0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
2a5b0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
2a5c0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74  ..    /* If sort
2a5d0 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77  ing index that w
2a5e0 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20  as created by a 
2a5f0 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68  prior OP_OpenEph
2a600 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69  emeral .    ** i
2a610 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64  nstruction ended
2a620 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65   up not being ne
2a630 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67  eded, then chang
2a640 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  e the OP_OpenEph
2a650 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e  emeral.    ** in
2a660 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20  to an OP_Noop.. 
2a670 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 53     */.    if( sS
2a680 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
2a690 78 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e 70 4f  x>=0 && sSort.pO
2a6a0 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
2a6b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2a6c0 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53  angeToNoop(v, sS
2a6d0 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
2a6e0 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  x);.    }..    /
2a6f0 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61  * Use the standa
2a700 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a  rd inner loop. *
2a710 2f 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65  /.    selectInne
2a720 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
2a730 20 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26 73 53   pEList, -1, &sS
2a740 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63 74 2c  ort, &sDistinct,
2a750 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   pDest,.        
2a760 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2a770 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75 65  te3WhereContinue
2a780 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20  Label(pWInfo),. 
2a790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7a0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42     sqlite3WhereB
2a7b0 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f  reakLabel(pWInfo
2a7c0 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20  ));..    /* End 
2a7d0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
2a7e0 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
2a7f0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
2a800 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65  nd(pWInfo);.  }e
2a810 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  lse{.    /* This
2a820 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 72 65   case when there
2a830 20 65 78 69 73 74 20 61 67 67 72 65 67 61 74 65   exist aggregate
2a840 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20   functions or a 
2a850 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a  GROUP BY clause.
2a860 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a      ** or both *
2a870 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78  /.    NameContex
2a880 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d  t sNC;    /* Nam
2a890 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72  e context for pr
2a8a0 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61  ocessing aggrega
2a8b0 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  te information *
2a8c0 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b  /.    int iAMem;
2a8d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
2a8e0 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66  st Mem address f
2a8f0 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65  or storing curre
2a900 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20  nt GROUP BY */. 
2a910 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20     int iBMem;   
2a920 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
2a930 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20  Mem address for 
2a940 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42  previous GROUP B
2a950 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73  Y */.    int iUs
2a960 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20  eFlag;       /* 
2a970 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64  Mem address hold
2a980 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74  ing flag indicat
2a990 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61 73  ing that at leas
2a9a0 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
2a9b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65            ** one
2a9c0 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75   row of the inpu
2a9d0 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61  t to the aggrega
2a9e0 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20  tor has been.   
2a9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa00 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
2aa10 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62  d */.    int iAb
2aa20 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20  ortFlag;     /* 
2aa30 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69 63  Mem address whic
2aa40 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20 61  h causes query a
2aa50 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76 65  bort if positive
2aa60 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75   */.    int grou
2aa70 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52  pBySort;    /* R
2aa80 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f  ows come from so
2aa90 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59  urce in GROUP BY
2aaa0 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e   order */.    in
2aab0 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20  t addrEnd;      
2aac0 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63    /* End of proc
2aad0 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20  essing for this 
2aae0 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e  SELECT */.    in
2aaf0 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20  t sortPTab = 0; 
2ab00 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65    /* Pseudotable
2ab10 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20   used to decode 
2ab20 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20  sorting results 
2ab30 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f  */.    int sortO
2ab40 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75  ut = 0;    /* Ou
2ab50 74 70 75 74 20 72 65 67 69 73 74 65 72 20 66 72  tput register fr
2ab60 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f  om the sorter */
2ab70 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20  ..    /* Remove 
2ab80 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61  any and all alia
2ab90 73 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20  ses between the 
2aba0 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74  result set and t
2abb0 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20  he.    ** GROUP 
2abc0 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a  BY clause..    *
2abd0 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
2abe0 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  By ){.      int 
2abf0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
2ac00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
2ac10 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
2ac20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
2ac30 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20  st_item *pItem; 
2ac40 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
2ac50 6f 76 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  over expression 
2ac60 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20  in a list */..  
2ac70 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c      for(k=p->pEL
2ac80 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  ist->nExpr, pIte
2ac90 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20  m=p->pEList->a; 
2aca0 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b  k>0; k--, pItem+
2acb0 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65  +){.        pIte
2acc0 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20  m->u.x.iAlias = 
2acd0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
2ace0 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d   for(k=pGroupBy-
2acf0 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47  >nExpr, pItem=pG
2ad00 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20  roupBy->a; k>0; 
2ad10 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  k--, pItem++){. 
2ad20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e         pItem->u.
2ad30 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  x.iAlias = 0;.  
2ad40 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2ad50 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 31 30  p->nSelectRow>10
2ad60 30 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  0 ) p->nSelectRo
2ad70 77 20 3d 20 31 30 30 3b 0a 20 20 20 20 7d 65 6c  w = 100;.    }el
2ad80 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65  se{.      p->nSe
2ad90 6c 65 63 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20  lectRow = 1;.   
2ada0 20 7d 0a 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65   }.. .    /* Cre
2adb0 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a  ate a label to j
2adc0 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77  ump to when we w
2add0 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65  ant to abort the
2ade0 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64   query */.    ad
2adf0 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  drEnd = sqlite3V
2ae00 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
2ae10 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74  ..    /* Convert
2ae20 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73   TK_COLUMN nodes
2ae30 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c   into TK_AGG_COL
2ae40 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74  UMN and make ent
2ae50 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73  ries in.    ** s
2ae60 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20  AggInfo for all 
2ae70 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
2ae80 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73  nodes in express
2ae90 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ions of the.    
2aea0 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
2aeb0 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ent..    */.    
2aec0 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
2aed0 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
2aee0 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
2aef0 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70  Parse;.    sNC.p
2af00 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  SrcList = pTabLi
2af10 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67  st;.    sNC.pAgg
2af20 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f  Info = &sAggInfo
2af30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d  ;.    sAggInfo.m
2af40 6e 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nReg = pParse->n
2af50 4d 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49  Mem+1;.    sAggI
2af60 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
2af70 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20  mn = pGroupBy ? 
2af80 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b  pGroupBy->nExpr+
2af90 31 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49  1 : 0;.    sAggI
2afa0 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70  nfo.pGroupBy = p
2afb0 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c  GroupBy;.    sql
2afc0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2afd0 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c  ggList(&sNC, pEL
2afe0 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
2aff0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
2b000 69 73 74 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e  ist(&sNC, sSort.
2b010 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69  pOrderBy);.    i
2b020 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  f( pHaving ){.  
2b030 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
2b040 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
2b050 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b  (&sNC, pHaving);
2b060 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49  .    }.    sAggI
2b070 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  nfo.nAccumulator
2b080 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   = sAggInfo.nCol
2b090 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  umn;.    for(i=0
2b0a0 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75  ; i<sAggInfo.nFu
2b0b0 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nc; i++){.      
2b0c0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2b0d0 50 72 6f 70 65 72 74 79 28 73 41 67 67 49 6e 66  Property(sAggInf
2b0e0 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72  o.aFunc[i].pExpr
2b0f0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
2b100 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46  );.      sNC.ncF
2b110 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67  lags |= NC_InAgg
2b120 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  Func;.      sqli
2b130 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2b140 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67  gList(&sNC, sAgg
2b150 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45  Info.aFunc[i].pE
2b160 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  xpr->x.pList);. 
2b170 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73       sNC.ncFlags
2b180 20 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e   &= ~NC_InAggFun
2b190 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67  c;.    }.    sAg
2b1a0 67 49 6e 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50  gInfo.mxReg = pP
2b1b0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2b1c0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
2b1d0 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65  iled ) goto sele
2b1e0 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20  ct_end;..    /* 
2b1f0 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61  Processing for a
2b200 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20 47  ggregates with G
2b210 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79 20  ROUP BY is very 
2b220 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20  different and.  
2b230 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63    ** much more c
2b240 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72  omplex than aggr
2b250 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61  egates without a
2b260 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a   GROUP BY..    *
2b270 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
2b280 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49  By ){.      KeyI
2b290 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
2b2a0 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d  /* Keying inform
2b2b0 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72  ation for the gr
2b2c0 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f  oup by clause */
2b2d0 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 3b 20 20  .      int j1;  
2b2e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d             /* A-
2b2f0 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e  vs-B comparision
2b300 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69   jump */.      i
2b310 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  nt addrOutputRow
2b320 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73  ;  /* Start of s
2b330 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
2b340 75 74 70 75 74 73 20 61 20 72 65 73 75 6c 74 20  utputs a result 
2b350 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  row */.      int
2b360 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20   regOutputRow;  
2b370 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65   /* Return addre
2b380 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
2b390 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
2b3a0 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  e */.      int a
2b3b0 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f  ddrSetAbort;   /
2b3c0 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72 74 20  * Set the abort 
2b3d0 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20  flag and return 
2b3e0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
2b3f0 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20  rTopOfLoop;  /* 
2b400 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74  Top of the input
2b410 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69   loop */.      i
2b420 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64  nt addrSortingId
2b430 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65  x; /* The OP_Ope
2b440 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74  nEphemeral for t
2b450 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
2b460 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
2b470 64 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  drReset;      /*
2b480 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   Subroutine for 
2b490 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 61 63  resetting the ac
2b4a0 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20  cumulator */.   
2b4b0 20 20 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b     int regReset;
2b4c0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2b4d0 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
2b4e0 72 20 66 6f 72 20 72 65 73 65 74 20 73 75 62 72  r for reset subr
2b4f0 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20  outine */..     
2b500 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
2b510 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
2b520 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20  e we might need 
2b530 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  a sorting index 
2b540 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c  to.      ** impl
2b550 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63  ement it.  Alloc
2b560 61 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67  ate that sorting
2b570 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20   index now.  If 
2b580 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20  it turns out.   
2b590 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
2b5a0 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74   not need it aft
2b5b0 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53  er all, the OP_S
2b5c0 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 72 75  orterOpen instru
2b5d0 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77  ction.      ** w
2b5e0 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
2b5f0 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a   into a Noop.  .
2b600 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
2b610 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
2b620 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
2b630 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  b++;.      pKeyI
2b640 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
2b650 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
2b660 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 30  , pGroupBy, 0, 0
2b670 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72  );.      addrSor
2b680 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65  tingIdx = sqlite
2b690 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
2b6a0 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20  P_SorterOpen, . 
2b6b0 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66           sAggInf
2b6c0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41  o.sortingIdx, sA
2b6d0 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43  ggInfo.nSortingC
2b6e0 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20  olumn, .        
2b6f0 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79    0, (char*)pKey
2b700 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
2b710 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69  );..      /* Ini
2b720 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c  tialize memory l
2b730 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79  ocations used by
2b740 20 47 52 4f 55 50 20 42 59 20 61 67 67 72 65 67   GROUP BY aggreg
2b750 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20  ate processing. 
2b760 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55       */.      iU
2b770 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73  seFlag = ++pPars
2b780 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69  e->nMem;.      i
2b790 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50  AbortFlag = ++pP
2b7a0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2b7b0 20 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d    regOutputRow =
2b7c0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2b7d0 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75  .      addrOutpu
2b7e0 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64  tRow = sqlite3Vd
2b7f0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
2b800 20 20 20 20 20 20 72 65 67 52 65 73 65 74 20 3d        regReset =
2b810 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2b820 0a 20 20 20 20 20 20 61 64 64 72 52 65 73 65 74  .      addrReset
2b830 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
2b840 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
2b850 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65    iAMem = pParse
2b860 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20  ->nMem + 1;.    
2b870 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
2b880 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
2b890 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d  r;.      iBMem =
2b8a0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
2b8b0 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  1;.      pParse-
2b8c0 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42  >nMem += pGroupB
2b8d0 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
2b8e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2b8f0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
2b900 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   0, iAbortFlag);
2b910 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
2b920 6e 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62  nt((v, "clear ab
2b930 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
2b940 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2b950 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
2b960 65 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29  er, 0, iUseFlag)
2b970 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2b980 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74  ent((v, "indicat
2b990 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d  e accumulator em
2b9a0 70 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71  pty"));.      sq
2b9b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2b9c0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69  v, OP_Null, 0, i
2b9d0 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f  AMem, iAMem+pGro
2b9e0 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a  upBy->nExpr-1);.
2b9f0 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20  .      /* Begin 
2ba00 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c  a loop that will
2ba10 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75   extract all sou
2ba20 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55  rce rows in GROU
2ba30 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20  P BY order..    
2ba40 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20    ** This might 
2ba50 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61  involve two sepa
2ba60 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20  rate loops with 
2ba70 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65  an OP_Sort in be
2ba80 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20  tween, or.      
2ba90 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  ** it might be a
2baa0 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61   single loop tha
2bab0 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20  t uses an index 
2bac0 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72  to extract infor
2bad0 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  mation.      ** 
2bae0 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72 64  in the right ord
2baf0 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68  er to begin with
2bb00 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2bb10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2bb20 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
2bb30 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65  regReset, addrRe
2bb40 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e  set);.      pWIn
2bb50 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
2bb60 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
2bb70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
2bb80 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20   pGroupBy, 0,.  
2bb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
2bbb0 48 45 52 45 5f 47 52 4f 55 50 42 59 2c 20 30 29  HERE_GROUPBY, 0)
2bbc0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  ;.      if( pWIn
2bbd0 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
2bbe0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69  ect_end;.      i
2bbf0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  f( sqlite3WhereI
2bc00 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29  sOrdered(pWInfo)
2bc10 3d 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  ==pGroupBy->nExp
2bc20 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  r ){.        /* 
2bc30 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73  The optimizer is
2bc40 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72   able to deliver
2bc50 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62   rows in group b
2bc60 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20  y order so.     
2bc70 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20     ** we do not 
2bc80 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54  have to sort.  T
2bc90 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
2bca0 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62  ral table will b
2bcb0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e  e.        ** can
2bcc0 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63  celled later bec
2bcd0 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65  ause we still ne
2bce0 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b  ed to use the pK
2bcf0 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a  eyInfo.        *
2bd00 2f 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42  /.        groupB
2bd10 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20  ySort = 0;.     
2bd20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2bd30 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69  /* Rows are comi
2bd40 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65  ng out in undete
2bd50 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57  rmined order.  W
2bd60 65 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20  e have to push. 
2bd70 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72         ** each r
2bd80 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e  ow into a sortin
2bd90 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61  g index, termina
2bda0 74 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f  te the first loo
2bdb0 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  p,.        ** th
2bdc0 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65  en loop over the
2bdd0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69   sorting index i
2bde0 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
2bdf0 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20  he output.      
2be00 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f    ** in sorted o
2be10 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a  rder.        */.
2be20 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 42          int regB
2be30 61 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ase;.        int
2be40 20 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20 20   regRecord;.    
2be50 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20      int nCol;.  
2be60 20 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75 70        int nGroup
2be70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20 65 78 70  By;..        exp
2be80 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50  lainTempTable(pP
2be90 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
2bea0 20 20 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73     (sDistinct.is
2beb0 54 6e 63 74 20 26 26 20 28 70 2d 3e 73 65 6c 46  Tnct && (p->selF
2bec0 6c 61 67 73 26 53 46 5f 44 69 73 74 69 6e 63 74  lags&SF_Distinct
2bed0 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20 20  )==0) ?.        
2bee0 20 20 20 20 20 20 20 20 20 20 20 20 22 44 49 53              "DIS
2bef0 54 49 4e 43 54 22 20 3a 20 22 47 52 4f 55 50 20  TINCT" : "GROUP 
2bf00 42 59 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 67  BY");..        g
2bf10 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a  roupBySort = 1;.
2bf20 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42 79          nGroupBy
2bf30 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   = pGroupBy->nEx
2bf40 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c  pr;.        nCol
2bf50 20 3d 20 6e 47 72 6f 75 70 42 79 20 2b 20 31 3b   = nGroupBy + 1;
2bf60 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72  .        j = nGr
2bf70 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20 20  oupBy+1;.       
2bf80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
2bf90 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Info.nColumn; i+
2bfa0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
2bfb0 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b  ( sAggInfo.aCol[
2bfc0 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  i].iSorterColumn
2bfd0 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=j ){.         
2bfe0 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20     nCol++;.     
2bff0 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
2c000 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c010 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73  }.        regBas
2c020 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  e = sqlite3GetTe
2c030 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
2c040 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
2c050 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
2c060 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
2c070 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2c080 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
2c090 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20  arse, pGroupBy, 
2c0a0 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20 20 20  regBase, 0);.   
2c0b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2c0c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71  AddOp2(v, OP_Seq
2c0d0 75 65 6e 63 65 2c 20 73 41 67 67 49 6e 66 6f 2e  uence, sAggInfo.
2c0e0 73 6f 72 74 69 6e 67 49 64 78 2c 72 65 67 42 61  sortingIdx,regBa
2c0f0 73 65 2b 6e 47 72 6f 75 70 42 79 29 3b 0a 20 20  se+nGroupBy);.  
2c100 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70        j = nGroup
2c110 42 79 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f  By+1;.        fo
2c120 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
2c130 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  o.nColumn; i++){
2c140 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
2c150 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
2c160 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e  Col = &sAggInfo.
2c170 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20  aCol[i];.       
2c180 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f     if( pCol->iSo
2c190 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b  rterColumn>=j ){
2c1a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
2c1b0 20 72 31 20 3d 20 6a 20 2b 20 72 65 67 42 61 73   r1 = j + regBas
2c1c0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e;.            i
2c1d0 6e 74 20 72 32 3b 0a 0a 20 20 20 20 20 20 20 20  nt r2;..        
2c1e0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
2c1f0 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
2c200 6e 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  n(pParse, .     
2c210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c220 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
2c230 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c  pTab, pCol->iCol
2c240 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c  umn, pCol->iTabl
2c250 65 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20  e, r1, 0);.     
2c260 20 20 20 20 20 20 20 69 66 28 20 72 31 21 3d 72         if( r1!=r
2c270 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  2 ){.           
2c280 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2c290 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
2c2a0 2c 20 72 32 2c 20 72 31 29 3b 0a 20 20 20 20 20  , r2, r1);.     
2c2b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c2c0 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
2c2d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2c2e0 20 20 20 20 20 20 20 20 72 65 67 52 65 63 6f 72          regRecor
2c2f0 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
2c300 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
2c310 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2c320 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
2c330 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61  akeRecord, regBa
2c340 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 52 65 63  se, nCol, regRec
2c350 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ord);.        sq
2c360 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2c370 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65  v, OP_SorterInse
2c380 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  rt, sAggInfo.sor
2c390 74 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63 6f  tingIdx, regReco
2c3a0 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rd);.        sql
2c3b0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
2c3c0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
2c3d0 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73  cord);.        s
2c3e0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
2c3f0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
2c400 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20  egBase, nCol);. 
2c410 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
2c420 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
2c430 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
2c440 2e 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62 20  .sortingIdxPTab 
2c450 3d 20 73 6f 72 74 50 54 61 62 20 3d 20 70 50 61  = sortPTab = pPa
2c460 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
2c470 20 20 20 20 20 73 6f 72 74 4f 75 74 20 3d 20 73       sortOut = s
2c480 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
2c490 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
2c4a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2c4b0 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73  Op3(v, OP_OpenPs
2c4c0 65 75 64 6f 2c 20 73 6f 72 74 50 54 61 62 2c 20  eudo, sortPTab, 
2c4d0 73 6f 72 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a  sortOut, nCol);.
2c4e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2c4f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2c500 53 6f 72 74 65 72 53 6f 72 74 2c 20 73 41 67 67  SorterSort, sAgg
2c510 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
2c520 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20   addrEnd);.     
2c530 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2c540 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f 72  v, "GROUP BY sor
2c550 74 22 29 29 3b 20 56 64 62 65 43 6f 76 65 72 61  t")); VdbeCovera
2c560 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
2c570 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69  AggInfo.useSorti
2c580 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20  ngIdx = 1;.     
2c590 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
2c5a0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
2c5b0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2c5c0 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
2c5d0 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
2c5e0 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72  Y terms and stor
2c5f0 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e  e in b0, b1, b2.
2c600 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20  ...      ** (b0 
2c610 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  is memory locati
2c620 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69  on iBMem+0, b1 i
2c630 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73  s iBMem+1, and s
2c640 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a  o forth).      *
2c650 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74  * Then compare t
2c660 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  he current GROUP
2c670 20 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73   BY terms agains
2c680 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74  t the GROUP BY t
2c690 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72  erms.      ** fr
2c6a0 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  om the previous 
2c6b0 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74  row currently st
2c6c0 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20  ored in a0, a1, 
2c6d0 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  a2....      */. 
2c6e0 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f       addrTopOfLo
2c6f0 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
2c700 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
2c710 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2c720 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
2c730 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 67  se);.      if( g
2c740 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20  roupBySort ){.  
2c750 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2c760 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
2c770 72 74 65 72 44 61 74 61 2c 20 73 41 67 67 49 6e  rterData, sAggIn
2c780 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73  fo.sortingIdx, s
2c790 6f 72 74 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d  ortOut);.      }
2c7a0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
2c7b0 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  j<pGroupBy->nExp
2c7c0 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; j++){.       
2c7d0 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
2c7e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2c7f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2c800 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f  v, OP_Column, so
2c810 72 74 50 54 61 62 2c 20 6a 2c 20 69 42 4d 65 6d  rtPTab, j, iBMem
2c820 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  +j);.          i
2c830 66 28 20 6a 3d 3d 30 20 29 20 73 71 6c 69 74 65  f( j==0 ) sqlite
2c840 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
2c850 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43   OPFLAG_CLEARCAC
2c860 48 45 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  HE);.        }el
2c870 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41  se{.          sA
2c880 67 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64  ggInfo.directMod
2c890 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  e = 1;.         
2c8a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
2c8b0 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
2c8c0 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69  y->a[j].pExpr, i
2c8d0 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20  BMem+j);.       
2c8e0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2c8f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2c900 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p4(v, OP_Compare
2c910 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20  , iAMem, iBMem, 
2c920 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c  pGroupBy->nExpr,
2c930 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c940 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
2c950 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  *)sqlite3KeyInfo
2c960 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50  Ref(pKeyInfo), P
2c970 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
2c980 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64    j1 = sqlite3Vd
2c990 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
2c9a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2c9b0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
2c9c0 4a 75 6d 70 2c 20 6a 31 2b 31 2c 20 30 2c 20 6a  Jump, j1+1, 0, j
2c9d0 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  1+1); VdbeCovera
2c9e0 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ge(v);..      /*
2c9f0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
2ca00 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76 65  hat runs wheneve
2ca10 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63  r the GROUP BY c
2ca20 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a  hanges..      **
2ca30 20 43 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20   Changes in the 
2ca40 47 52 4f 55 50 20 42 59 20 61 72 65 20 64 65 74  GROUP BY are det
2ca50 65 63 74 65 64 20 62 79 20 74 68 65 20 70 72 65  ected by the pre
2ca60 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 20  vious code.     
2ca70 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74   ** block.  If t
2ca80 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68 61  here were no cha
2ca90 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b  nges, this block
2caa0 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 20   is skipped..   
2cab0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
2cac0 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73 20  his code copies 
2cad0 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62 79  current group by
2cae0 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c   terms in b0,b1,
2caf0 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20  b2,....      ** 
2cb00 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61 32  over to a0,a1,a2
2cb10 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73  .  It then calls
2cb20 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72   the output subr
2cb30 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
2cb40 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 61  and resets the a
2cb50 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
2cb60 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 20 69  ator registers i
2cb70 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20 20  n preparation.  
2cb80 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e      ** for the n
2cb90 65 78 74 20 47 52 4f 55 50 20 42 59 20 62 61 74  ext GROUP BY bat
2cba0 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ch..      */.   
2cbb0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
2cbc0 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 69  deMove(pParse, i
2cbd0 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72  BMem, iAMem, pGr
2cbe0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20  oupBy->nExpr);. 
2cbf0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2cc00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
2cc10 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  ub, regOutputRow
2cc20 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29  , addrOutputRow)
2cc30 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2cc40 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20  ent((v, "output 
2cc50 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20 20 20  one row"));.    
2cc60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2cc70 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op2(v, OP_IfPos,
2cc80 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64   iAbortFlag, add
2cc90 72 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65 72  rEnd); VdbeCover
2cca0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64  age(v);.      Vd
2ccb0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63  beComment((v, "c
2ccc0 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67 22  heck abort flag"
2ccd0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
2cce0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2ccf0 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65  P_Gosub, regRese
2cd00 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  t, addrReset);. 
2cd10 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2cd20 28 28 76 2c 20 22 72 65 73 65 74 20 61 63 63 75  ((v, "reset accu
2cd30 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20  mulator"));..   
2cd40 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
2cd50 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
2cd60 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f 6e  ulators based on
2cd70 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a   the content of.
2cd80 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72        ** the cur
2cd90 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20 2a  rent row.      *
2cda0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
2cdb0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
2cdc0 31 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65  1);.      update
2cdd0 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
2cde0 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
2cdf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2ce00 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
2ce10 74 65 67 65 72 2c 20 31 2c 20 69 55 73 65 46 6c  teger, 1, iUseFl
2ce20 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
2ce30 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69  omment((v, "indi
2ce40 63 61 74 65 20 64 61 74 61 20 69 6e 20 61 63 63  cate data in acc
2ce50 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20  umulator"));..  
2ce60 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68      /* End of th
2ce70 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a  e loop.      */.
2ce80 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42        if( groupB
2ce90 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  ySort ){.       
2cea0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2ceb0 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e  p2(v, OP_SorterN
2cec0 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ext, sAggInfo.so
2ced0 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f  rtingIdx, addrTo
2cee0 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  pOfLoop);.      
2cef0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
2cf00 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2cf10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
2cf20 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
2cf30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2cf40 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
2cf50 28 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67 49  (v, addrSortingI
2cf60 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  dx);.      }..  
2cf70 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68      /* Output th
2cf80 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72  e final row of r
2cf90 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20  esult.      */. 
2cfa0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2cfb0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
2cfc0 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  ub, regOutputRow
2cfd0 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29  , addrOutputRow)
2cfe0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2cff0 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20  ent((v, "output 
2d000 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20  final row"));.. 
2d010 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65       /* Jump ove
2d020 72 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  r the subroutine
2d030 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  s.      */.     
2d040 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2d050 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
2d060 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20  , addrEnd);..   
2d070 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
2d080 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
2d090 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67 6c   outputs a singl
2d0a0 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73  e row of the res
2d0b0 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74  ult.      ** set
2d0c0 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75 74 69  .  This subrouti
2d0d0 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61  ne first looks a
2d0e0 74 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e 20  t the iUseFlag. 
2d0f0 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20 20   If iUseFlag.   
2d100 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74 68     ** is less th
2d110 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
2d120 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75 74  ero, the subrout
2d130 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ine is a no-op. 
2d140 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   If.      ** the
2d150 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c   processing call
2d160 73 20 66 6f 72 20 74 68 65 20 71 75 65 72 79 20  s for the query 
2d170 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20 73  to abort, this s
2d180 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20  ubroutine.      
2d190 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68  ** increments th
2d1a0 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d  e iAbortFlag mem
2d1b0 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66  ory location bef
2d1c0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ore returning in
2d1d0 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20  .      ** order 
2d1e0 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63 61  to signal the ca
2d1f0 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20  ller to abort.. 
2d200 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
2d210 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71 6c  drSetAbort = sql
2d220 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2d230 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
2d240 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2d250 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
2d260 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20  , iAbortFlag);. 
2d270 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2d280 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72 74 20  ((v, "set abort 
2d290 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
2d2a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
2d2b0 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
2d2c0 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
2d2d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
2d2e0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
2d2f0 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
2d300 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52       addrOutputR
2d310 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ow = sqlite3Vdbe
2d320 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
2d330 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2d340 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
2d350 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61  Pos, iUseFlag, a
2d360 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b  ddrOutputRow+2);
2d370 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2d380 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2d390 65 6e 74 28 28 76 2c 20 22 47 72 6f 75 70 62 79  ent((v, "Groupby
2d3a0 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f   result generato
2d3b0 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29  r entry point"))
2d3c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2d3d0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
2d3e0 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75  Return, regOutpu
2d3f0 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 66 69 6e  tRow);.      fin
2d400 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
2d410 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  s(pParse, &sAggI
2d420 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
2d430 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
2d440 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20  Parse, pHaving, 
2d450 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c  addrOutputRow+1,
2d460 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
2d470 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63  LL);.      selec
2d480 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
2d490 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
2d4a0 20 2d 31 2c 20 26 73 53 6f 72 74 2c 0a 20 20 20   -1, &sSort,.   
2d4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d4c0 20 20 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70     &sDistinct, p
2d4d0 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
2d4e0 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72              addr
2d4f0 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64  OutputRow+1, add
2d500 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20 20 20  rSetAbort);.    
2d510 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2d520 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
2d530 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b  , regOutputRow);
2d540 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
2d550 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75  nt((v, "end grou
2d560 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72  pby result gener
2d570 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
2d580 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
2d590 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  broutine that wi
2d5a0 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67 72 6f  ll reset the gro
2d5b0 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f  up-by accumulato
2d5c0 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  r.      */.     
2d5d0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
2d5e0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
2d5f0 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 65  Reset);.      re
2d600 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  setAccumulator(p
2d610 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
2d620 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2d630 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2d640 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65  _Return, regRese
2d650 74 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d 20  t);.     .    } 
2d660 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42  /* endif pGroupB
2d670 79 2e 20 20 42 65 67 69 6e 20 61 67 67 72 65 67  y.  Begin aggreg
2d680 61 74 65 20 71 75 65 72 69 65 73 20 77 69 74 68  ate queries with
2d690 6f 75 74 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f  out GROUP BY: */
2d6a0 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20  .    else {.    
2d6b0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 65 6c    ExprList *pDel
2d6c0 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
2d6d0 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43  LITE_OMIT_BTREEC
2d6e0 4f 55 4e 54 0a 20 20 20 20 20 20 54 61 62 6c 65  OUNT.      Table
2d6f0 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66   *pTab;.      if
2d700 28 20 28 70 54 61 62 20 3d 20 69 73 53 69 6d 70  ( (pTab = isSimp
2d710 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73 41 67 67  leCount(p, &sAgg
2d720 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20  Info))!=0 ){.   
2d730 20 20 20 20 20 2f 2a 20 49 66 20 69 73 53 69 6d       /* If isSim
2d740 70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74 75 72  pleCount() retur
2d750 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
2d760 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
2d770 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20  e, then.        
2d780 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  ** the SQL state
2d790 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66  ment is of the f
2d7a0 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  orm:.        **.
2d7b0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
2d7c0 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
2d7d0 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20 20  M <tbl>.        
2d7e0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68  **.        ** wh
2d7f0 65 72 65 20 74 68 65 20 54 61 62 6c 65 20 73 74  ere the Table st
2d800 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64  ructure returned
2d810 20 72 65 70 72 65 73 65 6e 74 73 20 74 61 62 6c   represents tabl
2d820 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20  e <tbl>..       
2d830 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
2d840 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73  his statement is
2d850 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20   so common that 
2d860 69 74 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20  it is optimized 
2d870 73 70 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20  specially. The. 
2d880 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75         ** OP_Cou
2d890 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  nt instruction i
2d8a0 73 20 65 78 65 63 75 74 65 64 20 65 69 74 68 65  s executed eithe
2d8b0 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79 20  r on the intkey 
2d8c0 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20 20  table that.     
2d8d0 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74     ** contains t
2d8e0 68 65 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c  he data for tabl
2d8f0 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e  e <tbl> or on on
2d900 65 20 6f 66 20 69 74 73 20 69 6e 64 65 78 65 73  e of its indexes
2d910 2e 20 49 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  . It.        ** 
2d920 69 73 20 62 65 74 74 65 72 20 74 6f 20 65 78 65  is better to exe
2d930 63 75 74 65 20 74 68 65 20 6f 70 20 6f 6e 20 61  cute the op on a
2d940 6e 20 69 6e 64 65 78 2c 20 61 73 20 69 6e 64 65  n index, as inde
2d950 78 65 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20  xes are almost. 
2d960 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
2d970 20 73 70 72 65 61 64 20 61 63 72 6f 73 73 20 6c   spread across l
2d980 65 73 73 20 70 61 67 65 73 20 74 68 61 6e 20 74  ess pages than t
2d990 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e 64 69  heir correspondi
2d9a0 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20  ng tables..     
2d9b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f     */.        co
2d9c0 6e 73 74 20 69 6e 74 20 69 44 62 20 3d 20 73 71  nst int iDb = sq
2d9d0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
2d9e0 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
2d9f0 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
2da00 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74         const int
2da10 20 69 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e   iCsr = pParse->
2da20 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43  nTab++;     /* C
2da30 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d  ursor to scan b-
2da40 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  tree */.        
2da50 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
2da60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da70 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
2da80 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20   variable */.   
2da90 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
2daa0 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20  eyInfo = 0;     
2dab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79            /* Key
2dac0 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64  info for scanned
2dad0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
2dae0 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d    Index *pBest =
2daf0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2db00 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20 69         /* Best i
2db10 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f 20 66 61  ndex found so fa
2db20 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  r */.        int
2db30 20 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74   iRoot = pTab->t
2db40 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  num;            
2db50 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
2db60 66 20 73 63 61 6e 6e 65 64 20 62 2d 74 72 65 65  f scanned b-tree
2db70 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73 71 6c   */..        sql
2db80 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
2db90 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
2dba0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2dbb0 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
2dbc0 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
2dbd0 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  num, 0, pTab->zN
2dbe0 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ame);..        /
2dbf0 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65  * Search for the
2dc00 20 69 6e 64 65 78 20 74 68 61 74 20 68 61 73 20   index that has 
2dc10 74 68 65 20 6c 6f 77 65 73 74 20 73 63 61 6e 20  the lowest scan 
2dc20 63 6f 73 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a  cost..        **
2dc30 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31  .        ** (201
2dc40 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f 74 20  1-04-15) Do not 
2dc50 64 6f 20 61 20 66 75 6c 6c 20 73 63 61 6e 20 6f  do a full scan o
2dc60 66 20 61 6e 20 75 6e 6f 72 64 65 72 65 64 20 69  f an unordered i
2dc70 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ndex..        **
2dc80 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31  .        ** (201
2dc90 33 2d 31 30 2d 30 33 29 20 44 6f 20 6e 6f 74 20  3-10-03) Do not 
2dca0 63 6f 75 6e 74 20 74 68 65 20 65 6e 74 72 69 65  count the entrie
2dcb0 73 20 69 6e 20 61 20 70 61 72 74 69 61 6c 20 69  s in a partial i
2dcc0 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ndex..        **
2dcd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 70  .        ** In p
2dce0 72 61 63 74 69 63 65 20 74 68 65 20 4b 65 79 49  ractice the KeyI
2dcf0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 77 69  nfo structure wi
2dd00 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20  ll not be used. 
2dd10 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20  It is only .    
2dd20 20 20 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f      ** passed to
2dd30 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52 65 61   keep OP_OpenRea
2dd40 64 20 68 61 70 70 79 2e 0a 20 20 20 20 20 20 20  d happy..       
2dd50 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
2dd60 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
2dd70 29 20 70 42 65 73 74 20 3d 20 73 71 6c 69 74 65  ) pBest = sqlite
2dd80 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
2dd90 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20  (pTab);.        
2dda0 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
2ddb0 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
2ddc0 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
2ddd0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
2dde0 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d  dx->bUnordered==
2ddf0 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  0.           && 
2de00 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70  pIdx->szIdxRow<p
2de10 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 0a 20 20  Tab->szTabRow.  
2de20 20 20 20 20 20 20 20 20 20 26 26 20 70 49 64 78           && pIdx
2de30 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 3d  ->pPartIdxWhere=
2de40 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
2de50 20 28 21 70 42 65 73 74 20 7c 7c 20 70 49 64 78   (!pBest || pIdx
2de60 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 42 65 73 74  ->szIdxRow<pBest
2de70 2d 3e 73 7a 49 64 78 52 6f 77 29 0a 20 20 20 20  ->szIdxRow).    
2de80 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2de90 20 20 20 20 20 70 42 65 73 74 20 3d 20 70 49 64       pBest = pId
2dea0 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  x;.          }. 
2deb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2dec0 20 69 66 28 20 70 42 65 73 74 20 29 7b 0a 20 20   if( pBest ){.  
2ded0 20 20 20 20 20 20 20 20 69 52 6f 6f 74 20 3d 20          iRoot = 
2dee0 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20  pBest->tnum;.   
2def0 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20         pKeyInfo 
2df00 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
2df10 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  OfIndex(pParse, 
2df20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20  pBest);.        
2df30 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  }..        /* Op
2df40 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  en a read-only c
2df50 75 72 73 6f 72 2c 20 65 78 65 63 75 74 65 20 74  ursor, execute t
2df60 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f  he OP_Count, clo
2df70 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e 20 2a  se the cursor. *
2df80 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
2df90 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
2dfa0 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
2dfb0 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62 2c  Csr, iRoot, iDb,
2dfc0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
2dfd0 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
2dfe0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2dff0 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
2e000 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79 49 6e  , (char *)pKeyIn
2e010 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
2e020 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2e030 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2e040 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74  dOp2(v, OP_Count
2e050 2c 20 69 43 73 72 2c 20 73 41 67 67 49 6e 66 6f  , iCsr, sAggInfo
2e060 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b  .aFunc[0].iMem);
2e070 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2e080 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2e090 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29 3b 0a 20  _Close, iCsr);. 
2e0a0 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 69         explainSi
2e0b0 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61 72 73 65  mpleCount(pParse
2e0c0 2c 20 70 54 61 62 2c 20 70 42 65 73 74 29 3b 0a  , pTab, pBest);.
2e0d0 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
2e0e0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2e0f0 54 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a  T_BTREECOUNT */.
2e100 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
2e110 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
2e120 71 75 65 72 79 20 69 73 20 6f 66 20 6f 6e 65 20  query is of one 
2e130 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2e140 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20 20 20   forms:.        
2e150 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
2e160 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 46 52  SELECT min(x) FR
2e170 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a  OM ....        *
2e180 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 78  *   SELECT max(x
2e190 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20  ) FROM ....     
2e1a0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
2e1b0 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   If it is, then 
2e1c0 61 73 6b 20 74 68 65 20 63 6f 64 65 20 69 6e 20  ask the code in 
2e1d0 77 68 65 72 65 2e 63 20 74 6f 20 61 74 74 65 6d  where.c to attem
2e1e0 70 74 20 74 6f 20 73 6f 72 74 20 72 65 73 75 6c  pt to sort resul
2e1f0 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73  ts.        ** as
2e200 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61 6e   if there was an
2e210 20 22 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f 72   "ORDER ON x" or
2e220 20 22 4f 52 44 45 52 20 4f 4e 20 78 20 44 45 53   "ORDER ON x DES
2e230 43 22 20 63 6c 61 75 73 65 2e 20 0a 20 20 20 20  C" clause. .    
2e240 20 20 20 20 2a 2a 20 49 66 20 77 68 65 72 65 2e      ** If where.
2e250 63 20 69 73 20 61 62 6c 65 20 74 6f 20 70 72 6f  c is able to pro
2e260 64 75 63 65 20 72 65 73 75 6c 74 73 20 73 6f 72  duce results sor
2e270 74 65 64 20 69 6e 20 74 68 69 73 20 6f 72 64 65  ted in this orde
2e280 72 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20  r, then.        
2e290 2a 2a 20 61 64 64 20 76 64 62 65 20 63 6f 64 65  ** add vdbe code
2e2a0 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
2e2b0 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
2e2c0 6c 6f 6f 70 20 61 66 74 65 72 20 74 68 65 20 0a  loop after the .
2e2d0 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74          ** first
2e2e0 20 69 74 65 72 61 74 69 6f 6e 20 28 73 69 6e 63   iteration (sinc
2e2f0 65 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  e the first iter
2e300 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f  ation of the loo
2e310 70 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  p is .        **
2e320 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6f   guaranteed to o
2e330 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 72 6f  perate on the ro
2e340 77 20 77 69 74 68 20 74 68 65 20 6d 69 6e 69 6d  w with the minim
2e350 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20  um or maximum . 
2e360 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20         ** value 
2e370 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72  of x, the only r
2e380 6f 77 20 72 65 71 75 69 72 65 64 29 2e 0a 20 20  ow required)..  
2e390 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2e3a0 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 66 6c   ** A special fl
2e3b0 61 67 20 6d 75 73 74 20 62 65 20 70 61 73 73 65  ag must be passe
2e3c0 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  d to sqlite3Wher
2e3d0 65 42 65 67 69 6e 28 29 20 74 6f 20 73 6c 69 67  eBegin() to slig
2e3e0 68 74 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  htly.        ** 
2e3f0 6d 6f 64 69 66 79 20 62 65 68 61 76 69 6f 72 20  modify behavior 
2e400 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
2e410 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2e420 2a 20 20 20 2b 20 49 66 20 74 68 65 20 71 75 65  *   + If the que
2e430 72 79 20 69 73 20 61 20 22 53 45 4c 45 43 54 20  ry is a "SELECT 
2e440 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e 20 74 68  min(x)", then th
2e450 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20 62 79 0a  e loop coded by.
2e460 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 77          **     w
2e470 68 65 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e 6f  here.c should no
2e480 74 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 61  t iterate over a
2e490 6e 79 20 76 61 6c 75 65 73 20 77 69 74 68 20 61  ny values with a
2e4a0 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20 20   NULL value.    
2e4b0 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72 20 78      **     for x
2e4c0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
2e4d0 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68 65 20       **   + The 
2e4e0 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65 20 69  optimizer code i
2e4f0 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65 20 74  n where.c (the t
2e500 68 69 6e 67 20 74 68 61 74 20 64 65 63 69 64 65  hing that decide
2e510 73 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20  s which.        
2e520 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 6f 72 20  **     index or 
2e530 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65 29 20  indices to use) 
2e540 73 68 6f 75 6c 64 20 70 6c 61 63 65 20 61 20 64  should place a d
2e550 69 66 66 65 72 65 6e 74 20 70 72 69 6f 72 69 74  ifferent priorit
2e560 79 20 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a  y on .        **
2e570 20 20 20 20 20 73 61 74 69 73 66 79 69 6e 67 20       satisfying 
2e580 74 68 65 20 27 4f 52 44 45 52 20 42 59 27 20 63  the 'ORDER BY' c
2e590 6c 61 75 73 65 20 74 68 61 6e 20 69 74 20 64 6f  lause than it do
2e5a0 65 73 20 69 6e 20 6f 74 68 65 72 20 63 61 73 65  es in other case
2e5b0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  s..        **   
2e5c0 20 20 52 65 66 65 72 20 74 6f 20 63 6f 64 65 20    Refer to code 
2e5d0 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  and comments in 
2e5e0 77 68 65 72 65 2e 63 20 66 6f 72 20 64 65 74 61  where.c for deta
2e5f0 69 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ils..        */.
2e600 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
2e610 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20   *pMinMax = 0;. 
2e620 20 20 20 20 20 20 20 75 38 20 66 6c 61 67 20 3d         u8 flag =
2e630 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
2e640 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 20 20 0a  ORMAL;.        .
2e650 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2e660 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  p->pGroupBy==0 )
2e670 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2e680 28 20 66 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20  ( flag==0 );.   
2e690 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61 76       if( p->pHav
2e6a0 69 6e 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ing==0 ){.      
2e6b0 20 20 20 20 66 6c 61 67 20 3d 20 6d 69 6e 4d 61      flag = minMa
2e6c0 78 51 75 65 72 79 28 26 73 41 67 67 49 6e 66 6f  xQuery(&sAggInfo
2e6d0 2c 20 26 70 4d 69 6e 4d 61 78 29 3b 0a 20 20 20  , &pMinMax);.   
2e6e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
2e6f0 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30 20 7c  ssert( flag==0 |
2e700 7c 20 28 70 4d 69 6e 4d 61 78 21 3d 30 20 26 26  | (pMinMax!=0 &&
2e710 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d   pMinMax->nExpr=
2e720 3d 31 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20  =1) );..        
2e730 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20 20 20  if( flag ){.    
2e740 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d 20        pMinMax = 
2e750 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
2e760 75 70 28 64 62 2c 20 70 4d 69 6e 4d 61 78 2c 20  up(db, pMinMax, 
2e770 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44  0);.          pD
2e780 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20 20  el = pMinMax;.  
2e790 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 69 6e          if( pMin
2e7a0 4d 61 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c  Max && !db->mall
2e7b0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
2e7c0 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d          pMinMax-
2e7d0 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[0].sortOrder 
2e7e0 3d 20 66 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52  = flag!=WHERE_OR
2e7f0 44 45 52 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a  DERBY_MIN ?1:0;.
2e800 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e              pMin
2e810 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  Max->a[0].pExpr-
2e820 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b  >op = TK_COLUMN;
2e830 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2e840 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
2e850 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72    /* This case r
2e860 75 6e 73 20 69 66 20 74 68 65 20 61 67 67 72 65  uns if the aggre
2e870 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55  gate has no GROU
2e880 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68  P BY clause.  Th
2e890 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f  e.        ** pro
2e8a0 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20  cessing is much 
2e8b0 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68  simpler since th
2e8c0 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69  ere is only a si
2e8d0 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 20  ngle row.       
2e8e0 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20   ** of output.. 
2e8f0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2e900 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74    resetAccumulat
2e910 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
2e920 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70  Info);.        p
2e930 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
2e940 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
2e950 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
2e960 72 65 2c 20 70 4d 69 6e 4d 61 78 2c 30 2c 66 6c  re, pMinMax,0,fl
2e970 61 67 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69  ag,0);.        i
2e980 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a  f( pWInfo==0 ){.
2e990 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2e9a0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
2e9b0 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 20  db, pDel);.     
2e9c0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
2e9d0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
2e9e0 20 20 20 20 20 20 20 20 75 70 64 61 74 65 41 63          updateAc
2e9f0 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
2ea00 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
2ea10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
2ea20 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 70 4d 69 6e  inMax==0 || pMin
2ea30 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b  Max->nExpr==1 );
2ea40 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
2ea50 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72  ite3WhereIsOrder
2ea60 65 64 28 70 57 49 6e 66 6f 29 3e 30 20 29 7b 0a  ed(pWInfo)>0 ){.
2ea70 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2ea80 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2ea90 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 71 6c 69 74  P_Goto, 0, sqlit
2eaa0 65 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65  e3WhereBreakLabe
2eab0 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 20 20 20 20  l(pWInfo));.    
2eac0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2ead0 74 28 28 76 2c 20 22 25 73 28 29 20 62 79 20 69  t((v, "%s() by i
2eae0 6e 64 65 78 22 2c 0a 20 20 20 20 20 20 20 20 20  ndex",.         
2eaf0 20 20 20 20 20 20 20 28 66 6c 61 67 3d 3d 57 48         (flag==WH
2eb00 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f  ERE_ORDERBY_MIN?
2eb10 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a  "min":"max")));.
2eb20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2eb30 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
2eb40 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
2eb50 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75     finalizeAggFu
2eb60 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20  nctions(pParse, 
2eb70 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
2eb80 20 20 7d 0a 0a 20 20 20 20 20 20 73 53 6f 72 74    }..      sSort
2eb90 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  .pOrderBy = 0;. 
2eba0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2ebb0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
2ebc0 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64  pHaving, addrEnd
2ebd0 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
2ebe0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65  ULL);.      sele
2ebf0 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
2ec00 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
2ec10 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 0a 20 20 20  , -1, 0, 0, .   
2ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec30 20 20 20 70 44 65 73 74 2c 20 61 64 64 72 45 6e     pDest, addrEn
2ec40 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  d, addrEnd);.   
2ec50 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
2ec60 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65  stDelete(db, pDe
2ec70 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  l);.    }.    sq
2ec80 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
2ec90 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64  Label(v, addrEnd
2eca0 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65  );.    .  } /* e
2ecb0 6e 64 69 66 20 61 67 67 72 65 67 61 74 65 20 71  ndif aggregate q
2ecc0 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20 73  uery */..  if( s
2ecd0 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
2ece0 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e  pe==WHERE_DISTIN
2ecf0 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 7b 0a  CT_UNORDERED ){.
2ed00 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54      explainTempT
2ed10 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22 44 49  able(pParse, "DI
2ed20 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a 20  STINCT");.  }.. 
2ed30 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
2ed40 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
2ed50 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64  se, then we need
2ed60 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73   to sort the res
2ed70 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65  ults.  ** and se
2ed80 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63  nd them to the c
2ed90 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f  allback one by o
2eda0 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ne..  */.  if( s
2edb0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b  Sort.pOrderBy ){
2edc0 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70  .    explainTemp
2edd0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 73 53  Table(pParse, sS
2ede0 6f 72 74 2e 6e 4f 42 53 61 74 3e 30 20 3f 20 22  ort.nOBSat>0 ? "
2edf0 52 49 47 48 54 20 50 41 52 54 20 4f 46 20 4f 52  RIGHT PART OF OR
2ee00 44 45 52 20 42 59 22 3a 22 4f 52 44 45 52 20 42  DER BY":"ORDER B
2ee10 59 22 29 3b 0a 20 20 20 20 67 65 6e 65 72 61 74  Y");.    generat
2ee20 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65  eSortTail(pParse
2ee30 2c 20 70 2c 20 26 73 53 6f 72 74 2c 20 70 45 4c  , p, &sSort, pEL
2ee40 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73  ist->nExpr, pDes
2ee50 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75  t);.  }..  /* Ju
2ee60 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20  mp here to skip 
2ee70 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a  this query.  */.
2ee80 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
2ee90 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e  olveLabel(v, iEn
2eea0 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45  d);..  /* The SE
2eeb0 4c 45 43 54 20 77 61 73 20 73 75 63 63 65 73 73  LECT was success
2eec0 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53  fully coded.   S
2eed0 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  et the return co
2eee0 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20  de to 0.  ** to 
2eef0 69 6e 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f  indicate no erro
2ef00 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  rs..  */.  rc = 
2ef10 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c  0;..  /* Control
2ef20 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69   jumps to here i
2ef30 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  f an error is en
2ef40 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c  countered above,
2ef50 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75   or upon.  ** su
2ef60 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20  ccessful coding 
2ef70 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20  of the SELECT.. 
2ef80 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a   */.select_end:.
2ef90 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
2efa0 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c  ger(pParse->iSel
2efb0 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53  ectId, iRestoreS
2efc0 65 6c 65 63 74 49 64 29 3b 0a 0a 20 20 2f 2a 20  electId);..  /* 
2efd0 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20  Identify column 
2efe0 6e 61 6d 65 73 20 69 66 20 72 65 73 75 6c 74 73  names if results
2eff0 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 61   of the SELECT a
2f000 72 65 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e  re to be output.
2f010 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
2f020 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65  SQLITE_OK && pDe
2f030 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  st->eDest==SRT_O
2f040 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e  utput ){.    gen
2f050 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
2f060 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
2f070 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  t, pEList);.  }.
2f080 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
2f090 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43  (db, sAggInfo.aC
2f0a0 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ol);.  sqlite3Db
2f0b0 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66  Free(db, sAggInf
2f0c0 6f 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65 74 75  o.aFunc);.  retu
2f0d0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65  rn rc;.}..#if de
2f0e0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
2f0f0 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e  BLE_TREE_EXPLAIN
2f100 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  )./*.** Generate
2f110 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c   a human-readabl
2f120 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  e description of
2f130 20 61 20 74 68 65 20 53 65 6c 65 63 74 20 6f 62   a the Select ob
2f140 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
2f150 76 6f 69 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53  void explainOneS
2f160 65 6c 65 63 74 28 56 64 62 65 20 2a 70 56 64 62  elect(Vdbe *pVdb
2f170 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
2f180 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2f190 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 53 45  rintf(pVdbe, "SE
2f1a0 4c 45 43 54 20 22 29 3b 0a 20 20 69 66 28 20 70  LECT ");.  if( p
2f1b0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
2f1c0 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
2f1d0 72 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 69  regate) ){.    i
2f1e0 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
2f1f0 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a   SF_Distinct ){.
2f200 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2f210 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
2f220 2c 20 22 44 49 53 54 49 4e 43 54 20 22 29 3b 0a  , "DISTINCT ");.
2f230 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
2f240 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
2f250 67 67 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20  ggregate ){.    
2f260 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2f270 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 61  Printf(pVdbe, "a
2f280 67 67 5f 66 6c 61 67 20 22 29 3b 0a 20 20 20 20  gg_flag ");.    
2f290 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
2f2a0 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20  lainNL(pVdbe);. 
2f2b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2f2c0 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2f2d0 20 20 20 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c     ");.  }.  sql
2f2e0 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c  ite3ExplainExprL
2f2f0 69 73 74 28 70 56 64 62 65 2c 20 70 2d 3e 70 45  ist(pVdbe, p->pE
2f300 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
2f310 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29  ExplainNL(pVdbe)
2f320 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20  ;.  if( p->pSrc 
2f330 26 26 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  && p->pSrc->nSrc
2f340 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
2f350 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2f360 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2f370 46 52 4f 4d 20 22 29 3b 0a 20 20 20 20 73 71 6c  FROM ");.    sql
2f380 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28  ite3ExplainPush(
2f390 70 56 64 62 65 29 3b 0a 20 20 20 20 66 6f 72 28  pVdbe);.    for(
2f3a0 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e  i=0; i<p->pSrc->
2f3b0 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
2f3c0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2f3d0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
2f3e0 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20  p->pSrc->a[i];. 
2f3f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
2f400 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2f410 20 22 7b 25 64 2c 2a 7d 20 3d 20 22 2c 20 70 49   "{%d,*} = ", pI
2f420 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
2f430 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
2f440 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
2f450 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2f460 6e 53 65 6c 65 63 74 28 70 56 64 62 65 2c 20 70  nSelect(pVdbe, p
2f470 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  Item->pSelect);.
2f480 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
2f490 6d 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20 20 20  m->pTab ){.     
2f4a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
2f4b0 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2f4c0 20 22 20 28 74 61 62 6e 61 6d 65 3d 25 73 29 22   " (tabname=%s)"
2f4d0 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
2f4e0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Name);.        }
2f4f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2f500 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b   pItem->zName ){
2f510 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f520 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
2f530 64 62 65 2c 20 22 25 73 22 2c 20 70 49 74 65 6d  dbe, "%s", pItem
2f540 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
2f550 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  }.      if( pIte
2f560 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->zAlias ){.   
2f570 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
2f580 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2f590 20 22 20 28 41 53 20 25 73 29 22 2c 20 70 49 74   " (AS %s)", pIt
2f5a0 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
2f5b0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
2f5c0 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  Item->jointype &
2f5d0 20 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20   JT_LEFT ){.    
2f5e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2f5f0 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
2f600 22 20 4c 45 46 54 2d 4a 4f 49 4e 22 29 3b 0a 20  " LEFT-JOIN");. 
2f610 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
2f620 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56  ite3ExplainNL(pV
2f630 64 62 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  dbe);.    }.    
2f640 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f  sqlite3ExplainPo
2f650 70 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20  p(pVdbe);.  }.  
2f660 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 7b  if( p->pWhere ){
2f670 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2f680 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2f690 20 22 57 48 45 52 45 20 22 29 3b 0a 20 20 20 20   "WHERE ");.    
2f6a0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
2f6b0 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70 57 68  pr(pVdbe, p->pWh
2f6c0 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ere);.    sqlite
2f6d0 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65  3ExplainNL(pVdbe
2f6e0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
2f6f0 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
2f700 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2f710 69 6e 74 66 28 70 56 64 62 65 2c 20 22 47 52 4f  intf(pVdbe, "GRO
2f720 55 50 42 59 20 22 29 3b 0a 20 20 20 20 73 71 6c  UPBY ");.    sql
2f730 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c  ite3ExplainExprL
2f740 69 73 74 28 70 56 64 62 65 2c 20 70 2d 3e 70 47  ist(pVdbe, p->pG
2f750 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c  roupBy);.    sql
2f760 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56  ite3ExplainNL(pV
2f770 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  dbe);.  }.  if( 
2f780 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  p->pHaving ){.  
2f790 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2f7a0 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 48  Printf(pVdbe, "H
2f7b0 41 56 49 4e 47 20 22 29 3b 0a 20 20 20 20 73 71  AVING ");.    sq
2f7c0 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
2f7d0 28 70 56 64 62 65 2c 20 70 2d 3e 70 48 61 76 69  (pVdbe, p->pHavi
2f7e0 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ng);.    sqlite3
2f7f0 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29  ExplainNL(pVdbe)
2f800 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
2f810 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
2f820 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2f830 6e 74 66 28 70 56 64 62 65 2c 20 22 4f 52 44 45  ntf(pVdbe, "ORDE
2f840 52 42 59 20 22 29 3b 0a 20 20 20 20 73 71 6c 69  RBY ");.    sqli
2f850 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69  te3ExplainExprLi
2f860 73 74 28 70 56 64 62 65 2c 20 70 2d 3e 70 4f 72  st(pVdbe, p->pOr
2f870 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69  derBy);.    sqli
2f880 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64  te3ExplainNL(pVd
2f890 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  be);.  }.  if( p
2f8a0 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
2f8b0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2f8c0 69 6e 74 66 28 70 56 64 62 65 2c 20 22 4c 49 4d  intf(pVdbe, "LIM
2f8d0 49 54 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  IT ");.    sqlit
2f8e0 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56  e3ExplainExpr(pV
2f8f0 64 62 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  dbe, p->pLimit);
2f900 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2f910 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20  ainNL(pVdbe);.  
2f920 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73  }.  if( p->pOffs
2f930 65 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  et ){.    sqlite
2f940 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
2f950 56 64 62 65 2c 20 22 4f 46 46 53 45 54 20 22 29  Vdbe, "OFFSET ")
2f960 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2f970 6c 61 69 6e 45 78 70 72 28 70 56 64 62 65 2c 20  lainExpr(pVdbe, 
2f980 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 20  p->pOffset);.   
2f990 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
2f9a0 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 7d 0a  L(pVdbe);.  }.}.
2f9b0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 6c  void sqlite3Expl
2f9c0 61 69 6e 53 65 6c 65 63 74 28 56 64 62 65 20 2a  ainSelect(Vdbe *
2f9d0 70 56 64 62 65 2c 20 53 65 6c 65 63 74 20 2a 70  pVdbe, Select *p
2f9e0 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  ){.  if( p==0 ){
2f9f0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2fa00 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2fa10 20 22 28 6e 75 6c 6c 2d 73 65 6c 65 63 74 29 22   "(null-select)"
2fa20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
2fa30 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c   }.  sqlite3Expl
2fa40 61 69 6e 50 75 73 68 28 70 56 64 62 65 29 3b 0a  ainPush(pVdbe);.
2fa50 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
2fa60 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 65 6c 65    explainOneSele
2fa70 63 74 28 70 56 64 62 65 2c 20 70 29 3b 0a 20 20  ct(pVdbe, p);.  
2fa80 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a    p = p->pNext;.
2fa90 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 62      if( p==0 ) b
2faa0 72 65 61 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65  reak;.    sqlite
2fab0 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65  3ExplainNL(pVdbe
2fac0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2fad0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
2fae0 65 2c 20 22 25 73 5c 6e 22 2c 20 73 65 6c 65 63  e, "%s\n", selec
2faf0 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
2fb00 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
2fb10 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
2fb20 65 2c 20 22 45 4e 44 22 29 3b 0a 20 20 73 71 6c  e, "END");.  sql
2fb30 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70 28 70  ite3ExplainPop(p
2fb40 56 64 62 65 29 3b 0a 7d 0a 0a 2f 2a 20 45 6e 64  Vdbe);.}../* End
2fb50 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72   of the structur
2fb60 65 20 64 65 62 75 67 20 70 72 69 6e 74 69 6e 67  e debug printing
2fb70 20 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   code.**********
2fb80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2fb90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2fba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2fbb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2fbc0 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64  ***/.#endif /* d
2fbd0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
2fbe0 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49  ABLE_TREE_EXPLAI
2fbf0 4e 29 20 2a 2f 0a                                N) */.