/ Hex Artifact Content
Login

Artifact c28f5165280ea7214285e4c53a23b257e1a06127:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
0210: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
0220: 6e 67 20 6f 62 6a 65 63 74 20 69 73 20 75 73 65  ng object is use
0230: 64 20 74 6f 20 72 65 63 6f 72 64 20 69 6e 66 6f  d to record info
0240: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a  rmation about.**
0250: 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20   how to process 
0260: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
0270: 77 6f 72 64 2c 20 74 6f 20 73 69 6d 70 6c 69 66  word, to simplif
0280: 79 20 70 61 73 73 69 6e 67 20 74 68 61 74 20 69  y passing that i
0290: 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e  nformation.** in
02a0: 74 6f 20 74 68 65 20 73 65 6c 65 63 74 49 6e 6e  to the selectInn
02b0: 65 72 4c 6f 6f 70 28 29 20 72 6f 75 74 69 6e 65  erLoop() routine
02c0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
02d0: 75 63 74 20 44 69 73 74 69 6e 63 74 43 74 78 20  uct DistinctCtx 
02e0: 44 69 73 74 69 6e 63 74 43 74 78 3b 0a 73 74 72  DistinctCtx;.str
02f0: 75 63 74 20 44 69 73 74 69 6e 63 74 43 74 78 20  uct DistinctCtx 
0300: 7b 0a 20 20 75 38 20 69 73 54 6e 63 74 3b 20 20  {.  u8 isTnct;  
0310: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
0320: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
0330: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
0340: 2f 0a 20 20 75 38 20 65 54 6e 63 74 54 79 70 65  /.  u8 eTnctType
0350: 3b 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68  ;   /* One of th
0360: 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
0370: 5f 2a 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  _* operators */.
0380: 20 20 69 6e 74 20 74 61 62 54 6e 63 74 3b 20 20    int tabTnct;  
0390: 20 20 2f 2a 20 45 70 68 65 6d 65 72 61 6c 20 74    /* Ephemeral t
03a0: 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20 44 49  able used for DI
03b0: 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69 6e  STINCT processin
03c0: 67 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  g */.  int addrT
03d0: 6e 63 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73  nct;   /* Addres
03e0: 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65  s of OP_OpenEphe
03f0: 6d 65 72 61 6c 20 6f 70 63 6f 64 65 20 66 6f 72  meral opcode for
0400: 20 74 61 62 54 6e 63 74 20 2a 2f 0a 7d 3b 0a 0a   tabTnct */.};..
0410: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
0420: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
0430: 6e 67 20 6f 62 6a 65 63 74 20 69 73 20 75 73 65  ng object is use
0440: 64 20 74 6f 20 72 65 63 6f 72 64 20 69 6e 66 6f  d to record info
0450: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a  rmation about.**
0460: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 28 6f   the ORDER BY (o
0470: 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c 61 75  r GROUP BY) clau
0480: 73 65 20 6f 66 20 71 75 65 72 79 20 69 73 20 62  se of query is b
0490: 65 69 6e 67 20 63 6f 64 65 64 2e 0a 2a 2f 0a 74  eing coded..*/.t
04a0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53 6f  ypedef struct So
04b0: 72 74 43 74 78 20 53 6f 72 74 43 74 78 3b 0a 73  rtCtx SortCtx;.s
04c0: 74 72 75 63 74 20 53 6f 72 74 43 74 78 20 7b 0a  truct SortCtx {.
04d0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
04e0: 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f  erBy;   /* The O
04f0: 52 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55  RDER BY (or GROU
0500: 50 20 42 59 20 63 6c 61 75 73 65 29 20 2a 2f 0a  P BY clause) */.
0510: 20 20 69 6e 74 20 6e 4f 42 53 61 74 3b 20 20 20    int nOBSat;   
0520: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
0530: 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65  r of ORDER BY te
0540: 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 62 79  rms satisfied by
0550: 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e   indices */.  in
0560: 74 20 69 45 43 75 72 73 6f 72 3b 20 20 20 20 20  t iECursor;     
0570: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
0580: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 73 6f 72  mber for the sor
0590: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ter */.  int reg
05a0: 52 65 74 75 72 6e 3b 20 20 20 20 20 20 20 20 2f  Return;        /
05b0: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
05c0: 6e 67 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20  ng block-output 
05d0: 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 2a  return address *
05e0: 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 42 6b 4f  /.  int labelBkO
05f0: 75 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61  ut;       /* Sta
0600: 72 74 20 6c 61 62 65 6c 20 66 6f 72 20 74 68 65  rt label for the
0610: 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 73 75   block-output su
0620: 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
0630: 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b  t addrSortIndex;
0640: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
0650: 66 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f  f the OP_SorterO
0660: 70 65 6e 20 6f 72 20 4f 50 5f 4f 70 65 6e 45 70  pen or OP_OpenEp
0670: 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 75 38 20  hemeral */.  u8 
0680: 73 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20 20  sortFlags;      
0690: 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f     /* Zero or mo
06a0: 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62 69  re SORTFLAG_* bi
06b0: 74 73 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65  ts */.};.#define
06c0: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
06d0: 74 65 72 20 20 30 78 30 31 20 20 20 2f 2a 20 55  ter  0x01   /* U
06e0: 73 65 20 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e  se SorterOpen in
06f0: 73 74 65 61 64 20 6f 66 20 4f 70 65 6e 45 70 68  stead of OpenEph
0700: 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  emeral */../*.**
0710: 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68 65 20   Delete all the 
0720: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53 65 6c  content of a Sel
0730: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 62 75  ect structure bu
0740: 74 20 64 6f 20 6e 6f 74 20 64 65 61 6c 6c 6f 63  t do not dealloc
0750: 61 74 65 0a 2a 2a 20 74 68 65 20 73 65 6c 65 63  ate.** the selec
0760: 74 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  t structure itse
0770: 6c 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  lf..*/.static vo
0780: 69 64 20 63 6c 65 61 72 53 65 6c 65 63 74 28 73  id clearSelect(s
0790: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65  qlite3 *db, Sele
07a0: 63 74 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  ct *p){.  sqlite
07b0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
07c0: 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  db, p->pEList);.
07d0: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
07e0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53  Delete(db, p->pS
07f0: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  rc);.  sqlite3Ex
0800: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
0810: 70 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74  pWhere);.  sqlit
0820: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
0830: 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
0840: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
0850: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 48  Delete(db, p->pH
0860: 61 76 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65  aving);.  sqlite
0870: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
0880: 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  db, p->pOrderBy)
0890: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
08a0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
08b0: 50 72 69 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65  Prior);.  sqlite
08c0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
08d0: 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 73 71  p->pLimit);.  sq
08e0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
08f0: 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
0900: 0a 20 20 73 71 6c 69 74 65 33 57 69 74 68 44 65  .  sqlite3WithDe
0910: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69 74  lete(db, p->pWit
0920: 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  h);.}../*.** Ini
0930: 74 69 61 6c 69 7a 65 20 61 20 53 65 6c 65 63 74  tialize a Select
0940: 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a  Dest structure..
0950: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
0960: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 53 65  electDestInit(Se
0970: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c  lectDest *pDest,
0980: 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20   int eDest, int 
0990: 69 50 61 72 6d 29 7b 0a 20 20 70 44 65 73 74 2d  iParm){.  pDest-
09a0: 3e 65 44 65 73 74 20 3d 20 28 75 38 29 65 44 65  >eDest = (u8)eDe
09b0: 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53 44  st;.  pDest->iSD
09c0: 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20 20  Parm = iParm;.  
09d0: 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20 3d  pDest->affSdst =
09e0: 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53 64   0;.  pDest->iSd
09f0: 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d  st = 0;.  pDest-
0a00: 3e 6e 53 64 73 74 20 3d 20 30 3b 0a 7d 0a 0a 0a  >nSdst = 0;.}...
0a10: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
0a20: 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74 72 75   new Select stru
0a30: 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e  cture and return
0a40: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
0a50: 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  at.** structure.
0a60: 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  .*/.Select *sqli
0a70: 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a 20 20  te3SelectNew(.  
0a80: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
0a90: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
0aa0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
0ab0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
0ac0: 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c      /* which col
0ad0: 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64 65 20  umns to include 
0ae0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
0af0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
0b00: 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20  ,        /* the 
0b10: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77  FROM clause -- w
0b20: 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f 20 73  hich tables to s
0b30: 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  can */.  Expr *p
0b40: 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
0b50: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
0b60: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
0b70: 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a   *pGroupBy,   /*
0b80: 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
0b90: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
0ba0: 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20 20 20  pHaving,        
0bb0: 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  /* the HAVING cl
0bc0: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
0bd0: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
0be0: 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  /* the ORDER BY 
0bf0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20  clause */.  u16 
0c00: 73 65 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20  selFlags,       
0c10: 20 20 2f 2a 20 46 6c 61 67 20 70 61 72 61 6d 65    /* Flag parame
0c20: 74 65 72 73 2c 20 73 75 63 68 20 61 73 20 53 46  ters, such as SF
0c30: 5f 44 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 45  _Distinct */.  E
0c40: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20  xpr *pLimit,    
0c50: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61       /* LIMIT va
0c60: 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73  lue.  NULL means
0c70: 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 45   not used */.  E
0c80: 78 70 72 20 2a 70 4f 66 66 73 65 74 20 20 20 20  xpr *pOffset    
0c90: 20 20 20 20 20 2f 2a 20 4f 46 46 53 45 54 20 76       /* OFFSET v
0ca0: 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e  alue.  NULL mean
0cb0: 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29  s no offset */.)
0cc0: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
0cd0: 3b 0a 20 20 53 65 6c 65 63 74 20 73 74 61 6e 64  ;.  Select stand
0ce0: 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  in;.  sqlite3 *d
0cf0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
0d00: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
0d10: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
0d20: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
0d30: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
0d40: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
0d50: 21 70 4f 66 66 73 65 74 20 7c 7c 20 70 4c 69 6d  !pOffset || pLim
0d60: 69 74 20 29 3b 20 2f 2a 20 4f 46 46 53 45 54 20  it ); /* OFFSET 
0d70: 69 6d 70 6c 69 65 73 20 4c 49 4d 49 54 20 2a 2f  implies LIMIT */
0d80: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
0d90: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
0da0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
0db0: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 26 73 74  ;.    pNew = &st
0dc0: 61 6e 64 69 6e 3b 0a 20 20 20 20 6d 65 6d 73 65  andin;.    memse
0dd0: 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f  t(pNew, 0, sizeo
0de0: 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 7d 0a 20  f(*pNew));.  }. 
0df0: 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29   if( pEList==0 )
0e00: 7b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73  {.    pEList = s
0e10: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
0e20: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
0e30: 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 54  sqlite3Expr(db,T
0e40: 4b 5f 41 4c 4c 2c 30 29 29 3b 0a 20 20 7d 0a 20  K_ALL,0));.  }. 
0e50: 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20   pNew->pEList = 
0e60: 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 53  pEList;.  if( pS
0e70: 72 63 3d 3d 30 20 29 20 70 53 72 63 20 3d 20 73  rc==0 ) pSrc = s
0e80: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
0e90: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
0ea0: 53 72 63 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  Src));.  pNew->p
0eb0: 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 70 4e  Src = pSrc;.  pN
0ec0: 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68  ew->pWhere = pWh
0ed0: 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72  ere;.  pNew->pGr
0ee0: 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79  oupBy = pGroupBy
0ef0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e  ;.  pNew->pHavin
0f00: 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 70  g = pHaving;.  p
0f10: 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  New->pOrderBy = 
0f20: 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 4e 65 77  pOrderBy;.  pNew
0f30: 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 73 65 6c  ->selFlags = sel
0f40: 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 6f  Flags;.  pNew->o
0f50: 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20  p = TK_SELECT;. 
0f60: 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20   pNew->pLimit = 
0f70: 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d 3e  pLimit;.  pNew->
0f80: 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
0f90: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 66  t;.  assert( pOf
0fa0: 66 73 65 74 3d 3d 30 20 7c 7c 20 70 4c 69 6d 69  fset==0 || pLimi
0fb0: 74 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e  t!=0 );.  pNew->
0fc0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
0fd0: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
0fe0: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
0ff0: 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  -1;.  if( db->ma
1000: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a 20  llocFailed ) {. 
1010: 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64     clearSelect(d
1020: 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 69 66  b, pNew);.    if
1030: 28 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e  ( pNew!=&standin
1040: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
1050: 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  (db, pNew);.    
1060: 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  pNew = 0;.  }els
1070: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
1080: 4e 65 77 2d 3e 70 53 72 63 21 3d 30 20 7c 7c 20  New->pSrc!=0 || 
1090: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29  pParse->nErr>0 )
10a0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
10b0: 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e 20 29  pNew!=&standin )
10c0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
10d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
10e0: 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63   the given Selec
10f0: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
1100: 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74  all of its subst
1110: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69  ructures..*/.voi
1120: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  d sqlite3SelectD
1130: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
1140: 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  b, Select *p){. 
1150: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63 6c   if( p ){.    cl
1160: 65 61 72 53 65 6c 65 63 74 28 64 62 2c 20 70 29  earSelect(db, p)
1170: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
1180: 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  ree(db, p);.  }.
1190: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11a0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
11b0: 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
11c0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
11d0: 61 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f 0a 73  a compound..*/.s
11e0: 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 66 69  tatic Select *fi
11f0: 6e 64 52 69 67 68 74 6d 6f 73 74 28 53 65 6c 65  ndRightmost(Sele
1200: 63 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28  ct *p){.  while(
1210: 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 20 3d 20   p->pNext ) p = 
1220: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65 74 75  p->pNext;.  retu
1230: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn p;.}../*.** G
1240: 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e  iven 1 to 3 iden
1250: 74 69 66 69 65 72 73 20 70 72 65 63 65 64 69 6e  tifiers precedin
1260: 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f  g the JOIN keywo
1270: 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68  rd, determine th
1280: 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69  e.** type of joi
1290: 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
12a0: 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74  teger constant t
12b0: 68 61 74 20 65 78 70 72 65 73 73 65 73 20 74 68  hat expresses th
12c0: 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65  at type.** in te
12d0: 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  rms of the follo
12e0: 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a  wing bit values:
12f0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e  .**.**     JT_IN
1300: 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52  NER.**     JT_CR
1310: 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55  OSS.**     JT_OU
1320: 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41  TER.**     JT_NA
1330: 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f  TURAL.**     JT_
1340: 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52  LEFT.**     JT_R
1350: 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c  IGHT.**.** A ful
1360: 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20  l outer join is 
1370: 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  the combination 
1380: 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a  of JT_LEFT and J
1390: 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49  T_RIGHT..**.** I
13a0: 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20  f an illegal or 
13b0: 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e  unsupported join
13c0: 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74   type is seen, t
13d0: 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e  hen still return
13e0: 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c  .** a join type,
13f0: 20 62 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f   but put an erro
1400: 72 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  r in the pParse 
1410: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e  structure..*/.in
1420: 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70  t sqlite3JoinTyp
1430: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1440: 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65   Token *pA, Toke
1450: 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43  n *pB, Token *pC
1460: 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70  ){.  int jointyp
1470: 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a  e = 0;.  Token *
1480: 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65  apAll[3];.  Toke
1490: 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 20 20  n *p;.          
14a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b0: 20 20 20 2f 2a 20 20 20 30 31 32 33 34 35 36 37     /*   01234567
14c0: 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32 33  89 123456789 123
14d0: 34 35 36 37 38 39 20 31 32 33 20 2a 2f 0a 20 20  456789 123 */.  
14e0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
14f0: 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22  r zKeyText[] = "
1500: 6e 61 74 75 72 61 6c 65 66 74 6f 75 74 65 72 69  naturaleftouteri
1510: 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73  ghtfullinnercros
1520: 73 22 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  s";.  static con
1530: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
1540: 75 38 20 69 3b 20 20 20 20 20 20 20 20 2f 2a 20  u8 i;        /* 
1550: 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79  Beginning of key
1560: 77 6f 72 64 20 74 65 78 74 20 69 6e 20 7a 4b 65  word text in zKe
1570: 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75  yText[] */.    u
1580: 38 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c  8 nChar;    /* L
1590: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b 65 79  ength of the key
15a0: 77 6f 72 64 20 69 6e 20 63 68 61 72 61 63 74 65  word in characte
15b0: 72 73 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64  rs */.    u8 cod
15c0: 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74  e;     /* Join t
15d0: 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20  ype mask */.  } 
15e0: 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20  aKeyword[] = {. 
15f0: 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f     /* natural */
1600: 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54   { 0,  7, JT_NAT
1610: 55 52 41 4c 20 20 20 20 20 20 20 20 20 20 20 20  URAL            
1620: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65      },.    /* le
1630: 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34  ft    */ { 6,  4
1640: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54  , JT_LEFT|JT_OUT
1650: 45 52 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  ER          },. 
1660: 20 20 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f     /* outer   */
1670: 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54   { 10, 5, JT_OUT
1680: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ER              
1690: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69      },.    /* ri
16a0: 67 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35  ght   */ { 14, 5
16b0: 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  , JT_RIGHT|JT_OU
16c0: 54 45 52 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  TER         },. 
16d0: 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f     /* full    */
16e0: 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46   { 19, 4, JT_LEF
16f0: 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  T|JT_RIGHT|JT_OU
1700: 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e  TER },.    /* in
1710: 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35  ner   */ { 23, 5
1720: 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20 20  , JT_INNER      
1730: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
1740: 20 20 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f     /* cross   */
1750: 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e   { 28, 5, JT_INN
1760: 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20 20  ER|JT_CROSS     
1770: 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e      },.  };.  in
1780: 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b  t i, j;.  apAll[
1790: 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c  0] = pA;.  apAll
17a0: 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c  [1] = pB;.  apAl
17b0: 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72  l[2] = pC;.  for
17c0: 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41  (i=0; i<3 && apA
17d0: 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll[i]; i++){.   
17e0: 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20   p = apAll[i];. 
17f0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72     for(j=0; j<Ar
1800: 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64  raySize(aKeyword
1810: 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); j++){.      i
1820: 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72  f( p->n==aKeywor
1830: 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20  d[j].nChar .    
1840: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
1850: 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29  StrNICmp((char*)
1860: 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b  p->z, &zKeyText[
1870: 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20  aKeyword[j].i], 
1880: 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  p->n)==0 ){.    
1890: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20      jointype |= 
18a0: 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65  aKeyword[j].code
18b0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
18c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18d0: 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
18e0: 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d  0 || j==1 || j==
18f0: 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d  2 || j==3 || j==
1900: 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d  4 || j==5 || j==
1910: 36 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d  6 );.    if( j>=
1920: 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f  ArraySize(aKeywo
1930: 72 64 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69  rd) ){.      joi
1940: 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f  ntype |= JT_ERRO
1950: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
1960: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a      }.  }.  if(.
1970: 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26       (jointype &
1980: 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55   (JT_INNER|JT_OU
1990: 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52  TER))==(JT_INNER
19a0: 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20  |JT_OUTER) ||.  
19b0: 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a     (jointype & J
19c0: 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b  T_ERROR)!=0.  ){
19d0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
19e0: 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20 20 20  *zSp = " ";.    
19f0: 61 73 73 65 72 74 28 20 70 42 21 3d 30 20 29 3b  assert( pB!=0 );
1a00: 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29  .    if( pC==0 )
1a10: 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73  { zSp++; }.    s
1a20: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1a30: 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20  Parse, "unknown 
1a40: 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a  or unsupported j
1a50: 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20  oin type: ".    
1a60: 20 20 20 22 25 54 20 25 54 25 73 25 54 22 2c 20     "%T %T%s%T", 
1a70: 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43 29  pA, pB, zSp, pC)
1a80: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
1a90: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c   JT_INNER;.  }el
1aa0: 73 65 20 69 66 28 20 28 6a 6f 69 6e 74 79 70 65  se if( (jointype
1ab0: 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
1ac0: 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 6a 6f  .         && (jo
1ad0: 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46  intype & (JT_LEF
1ae0: 54 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a 54  T|JT_RIGHT))!=JT
1af0: 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 73 71 6c  _LEFT ){.    sql
1b00: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1b10: 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49 47  rse, .      "RIG
1b20: 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45  HT and FULL OUTE
1b30: 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20  R JOINs are not 
1b40: 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72  currently suppor
1b50: 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74  ted");.    joint
1b60: 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a  ype = JT_INNER;.
1b70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69    }.  return joi
1b80: 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ntype;.}../*.** 
1b90: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
1ba0: 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   of a column in 
1bb0: 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  a table.  Return
1bc0: 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75 6d   -1 if the colum
1bd0: 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74  n.** is not cont
1be0: 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62  ained in the tab
1bf0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1c00: 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61  t columnIndex(Ta
1c10: 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74  ble *pTab, const
1c20: 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20   char *zCol){.  
1c30: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1c40: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
1c50: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
1c60: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54 61  lite3StrICmp(pTa
1c70: 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  b->aCol[i].zName
1c80: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74  , zCol)==0 ) ret
1c90: 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
1ca0: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
1cb0: 20 53 65 61 72 63 68 20 74 68 65 20 66 69 72 73   Search the firs
1cc0: 74 20 4e 20 74 61 62 6c 65 73 20 69 6e 20 70 53  t N tables in pS
1cd0: 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  rc, from left to
1ce0: 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20   right, looking 
1cf0: 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74  for a.** table t
1d00: 68 61 74 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e  hat has a column
1d10: 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a   named zCol.  .*
1d20: 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c  *.** When found,
1d30: 20 73 65 74 20 2a 70 69 54 61 62 20 61 6e 64 20   set *piTab and 
1d40: 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65 20 74 61  *piCol to the ta
1d50: 62 6c 65 20 69 6e 64 65 78 20 61 6e 64 20 63 6f  ble index and co
1d60: 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66  lumn index.** of
1d70: 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f   the matching co
1d80: 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e 20  lumn and return 
1d90: 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  TRUE..**.** If n
1da0: 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  ot found, return
1db0: 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69   FALSE..*/.stati
1dc0: 63 20 69 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f  c int tableAndCo
1dd0: 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72 63  lumnIndex(.  Src
1de0: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
1df0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 61    /* Array of ta
1e00: 62 6c 65 73 20 74 6f 20 73 65 61 72 63 68 20 2a  bles to search *
1e10: 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
1e20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1e30: 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
1e40: 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61  pSrc->a[] to sea
1e50: 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  rch */.  const c
1e60: 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a  har *zCol,    /*
1e70: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   Name of the col
1e80: 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69  umn we are looki
1e90: 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ng for */.  int 
1ea0: 2a 70 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  *piTab,         
1eb0: 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20   /* Write index 
1ec0: 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72  of pSrc->a[] her
1ed0: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f  e */.  int *piCo
1ee0: 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  l           /* W
1ef0: 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53  rite index of pS
1f00: 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54  rc->a[*piTab].pT
1f10: 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20  ab->aCol[] here 
1f20: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f40: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
1f50: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 20   tables in pSrc 
1f60: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  */.  int iCol;  
1f70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1f80: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74  ex of column mat
1f90: 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20  ching zCol */.. 
1fa0: 20 61 73 73 65 72 74 28 20 28 70 69 54 61 62 3d   assert( (piTab=
1fb0: 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20  =0)==(piCol==0) 
1fc0: 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e  );  /* Both or n
1fd0: 65 69 74 68 65 72 20 61 72 65 20 4e 55 4c 4c 20  either are NULL 
1fe0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
1ff0: 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f  N; i++){.    iCo
2000: 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  l = columnIndex(
2010: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c  pSrc->a[i].pTab,
2020: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20   zCol);.    if( 
2030: 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iCol>=0 ){.     
2040: 20 69 66 28 20 70 69 54 61 62 20 29 7b 0a 20 20   if( piTab ){.  
2050: 20 20 20 20 20 20 2a 70 69 54 61 62 20 3d 20 69        *piTab = i
2060: 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c  ;.        *piCol
2070: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d   = iCol;.      }
2080: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2090: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
20a0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
20b0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
20c0: 20 75 73 65 64 20 74 6f 20 61 64 64 20 74 65 72   used to add ter
20d0: 6d 73 20 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f  ms implied by JO
20e0: 49 4e 20 73 79 6e 74 61 78 20 74 6f 20 74 68 65  IN syntax to the
20f0: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
2100: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 61   expression of a
2110: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2120: 74 2e 20 54 68 65 20 6e 65 77 20 74 65 72 6d 2c  t. The new term,
2130: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44   which.** is AND
2140: 65 64 20 77 69 74 68 20 74 68 65 20 65 78 69 73  ed with the exis
2150: 74 69 6e 67 20 57 48 45 52 45 20 63 6c 61 75 73  ting WHERE claus
2160: 65 2c 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  e, is of the for
2170: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62  m:.**.**    (tab
2180: 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f  1.col1 = tab2.co
2190: 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  l2).**.** where 
21a0: 74 61 62 31 20 69 73 20 74 68 65 20 69 53 72 63  tab1 is the iSrc
21b0: 27 74 68 20 74 61 62 6c 65 20 69 6e 20 53 72 63  'th table in Src
21c0: 4c 69 73 74 20 70 53 72 63 20 61 6e 64 20 74 61  List pSrc and ta
21d0: 62 32 20 69 73 20 74 68 65 20 0a 2a 2a 20 28 69  b2 is the .** (i
21e0: 53 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d  Src+1)'th. Colum
21f0: 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e  n col1 is column
2200: 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62   iColLeft of tab
2210: 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a  1, and col2 is.*
2220: 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67  * column iColRig
2230: 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73  ht of tab2..*/.s
2240: 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57 68  tatic void addWh
2250: 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65  ereTerm(.  Parse
2260: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2270: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2280: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
2290: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
22a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22b0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61     /* List of ta
22c0: 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61  bles in FROM cla
22d0: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  use */.  int iLe
22e0: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
22f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2300: 78 20 6f 66 20 66 69 72 73 74 20 74 61 62 6c 65  x of first table
2310: 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63   to join in pSrc
2320: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65   */.  int iColLe
2330: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
2340: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
2350: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73  f column in firs
2360: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  t table */.  int
2370: 20 69 52 69 67 68 74 2c 20 20 20 20 20 20 20 20   iRight,        
2380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2390: 49 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e 64 20  Index of second 
23a0: 74 61 62 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f  table in pSrc */
23b0: 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69 67 68 74  .  int iColRight
23c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23d0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
23e0: 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20  olumn in second 
23f0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
2400: 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20  sOuterJoin,     
2410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2420: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e  ue if this is an
2430: 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20   OUTER join */. 
2440: 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65 20   Expr **ppWhere 
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2460: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20   /* IN/OUT: The 
2470: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
2480: 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73  add to */.){.  s
2490: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
24a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20  rse->db;.  Expr 
24b0: 2a 70 45 31 3b 0a 20 20 45 78 70 72 20 2a 70 45  *pE1;.  Expr *pE
24c0: 32 3b 0a 20 20 45 78 70 72 20 2a 70 45 71 3b 0a  2;.  Expr *pEq;.
24d0: 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 66 74  .  assert( iLeft
24e0: 3c 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73  <iRight );.  ass
24f0: 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e  ert( pSrc->nSrc>
2500: 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65  iRight );.  asse
2510: 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66  rt( pSrc->a[iLef
2520: 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61 73 73  t].pTab );.  ass
2530: 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 52 69  ert( pSrc->a[iRi
2540: 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20  ght].pTab );..  
2550: 70 45 31 20 3d 20 73 71 6c 69 74 65 33 43 72 65  pE1 = sqlite3Cre
2560: 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62  ateColumnExpr(db
2570: 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69  , pSrc, iLeft, i
2580: 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32 20  ColLeft);.  pE2 
2590: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43  = sqlite3CreateC
25a0: 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53  olumnExpr(db, pS
25b0: 72 63 2c 20 69 52 69 67 68 74 2c 20 69 43 6f 6c  rc, iRight, iCol
25c0: 52 69 67 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d  Right);..  pEq =
25d0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
25e0: 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31  arse, TK_EQ, pE1
25f0: 2c 20 70 45 32 2c 20 30 29 3b 0a 20 20 69 66 28  , pE2, 0);.  if(
2600: 20 70 45 71 20 26 26 20 69 73 4f 75 74 65 72 4a   pEq && isOuterJ
2610: 6f 69 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53  oin ){.    ExprS
2620: 65 74 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20  etProperty(pEq, 
2630: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20  EP_FromJoin);.  
2640: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2650: 61 73 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20  asProperty(pEq, 
2660: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
2670: 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
2680: 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72  ExprSetVVAProper
2690: 74 79 28 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64  ty(pEq, EP_NoRed
26a0: 75 63 65 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69  uce);.    pEq->i
26b0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d  RightJoinTable =
26c0: 20 28 69 31 36 29 70 45 32 2d 3e 69 54 61 62 6c   (i16)pE2->iTabl
26d0: 65 3b 0a 20 20 7d 0a 20 20 2a 70 70 57 68 65 72  e;.  }.  *ppWher
26e0: 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  e = sqlite3ExprA
26f0: 6e 64 28 64 62 2c 20 2a 70 70 57 68 65 72 65 2c  nd(db, *ppWhere,
2700: 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pEq);.}../*.** 
2710: 53 65 74 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a  Set the EP_FromJ
2720: 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e 20  oin property on 
2730: 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
2740: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
2750: 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74 20 74 68  n..** And set th
2760: 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69  e Expr.iRightJoi
2770: 6e 54 61 62 6c 65 20 74 6f 20 69 54 61 62 6c 65  nTable to iTable
2780: 20 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20   for every term 
2790: 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  in the.** expres
27a0: 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sion..**.** The 
27b0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70  EP_FromJoin prop
27c0: 65 72 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20  erty is used on 
27d0: 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72  terms of an expr
27e0: 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a  ession to tell.*
27f0: 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52  * the LEFT OUTER
2800: 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67   JOIN processing
2810: 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68 69 73   logic that this
2820: 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66   term is part of
2830: 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73   the.** join res
2840: 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69  triction specifi
2850: 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  ed in the ON or 
2860: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64  USING clause and
2870: 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f   not a part.** o
2880: 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72  f the more gener
2890: 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  al WHERE clause.
28a0: 20 20 54 68 65 73 65 20 74 65 72 6d 73 20 61 72    These terms ar
28b0: 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20  e moved over to 
28c0: 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  the.** WHERE cla
28d0: 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20  use during join 
28e0: 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77  processing but w
28f0: 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62  e need to rememb
2900: 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20  er that they.** 
2910: 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68  originated in th
2920: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
2930: 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ause..**.** The 
2940: 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
2950: 61 62 6c 65 20 74 65 6c 6c 73 20 74 68 65 20 57  able tells the W
2960: 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
2970: 65 73 73 69 6e 67 20 74 68 61 74 20 74 68 65 0a  essing that the.
2980: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65  ** expression de
2990: 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c 65 20 69  pends on table i
29a0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65  RightJoinTable e
29b0: 76 65 6e 20 69 66 20 74 68 61 74 20 74 61 62 6c  ven if that tabl
29c0: 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c  e is not.** expl
29d0: 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64  icitly mentioned
29e0: 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   in the expressi
29f0: 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66 6f 72 6d  on.  That inform
2a00: 61 74 69 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a  ation is needed.
2a10: 2a 2a 20 66 6f 72 20 63 61 73 65 73 20 6c 69 6b  ** for cases lik
2a20: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
2a30: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2a40: 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f  1 LEFT JOIN t2 O
2a50: 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20  N t1.a=t2.b AND 
2a60: 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65  t1.x=5.**.** The
2a70: 20 77 68 65 72 65 20 63 6c 61 75 73 65 20 6e 65   where clause ne
2a80: 65 64 73 20 74 6f 20 64 65 66 65 72 20 74 68 65  eds to defer the
2a90: 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65   handling of the
2aa0: 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20   t1.x=5.** term 
2ab0: 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68 65 20  until after the 
2ac0: 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a  t2 loop of the j
2ad0: 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74 20 77 61  oin.  In that wa
2ae0: 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20  y, a.** NULL t2 
2af0: 72 6f 77 20 77 69 6c 6c 20 62 65 20 69 6e 73 65  row will be inse
2b00: 72 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 31  rted whenever t1
2b10: 2e 78 21 3d 35 2e 20 20 49 66 20 77 65 20 64 6f  .x!=5.  If we do
2b20: 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72 20 74 68   not.** defer th
2b30: 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31  e handling of t1
2b40: 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c 20 62 65  .x=5, it will be
2b50: 20 70 72 6f 63 65 73 73 65 64 20 69 6d 6d 65 64   processed immed
2b60: 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20  iately.** after 
2b70: 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20  the t1 loop and 
2b80: 72 6f 77 73 20 77 69 74 68 20 74 31 2e 78 21 3d  rows with t1.x!=
2b90: 35 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 70 70  5 will never app
2ba0: 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75  ear in.** the ou
2bb0: 74 70 75 74 2c 20 77 68 69 63 68 20 69 73 20 69  tput, which is i
2bc0: 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61  ncorrect..*/.sta
2bd0: 74 69 63 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e  tic void setJoin
2be0: 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e  Expr(Expr *p, in
2bf0: 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 77 68 69  t iTable){.  whi
2c00: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70  le( p ){.    Exp
2c10: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20  rSetProperty(p, 
2c20: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20  EP_FromJoin);.  
2c30: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2c40: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
2c50: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
2c60: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78  duced) );.    Ex
2c70: 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
2c80: 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29  (p, EP_NoReduce)
2c90: 3b 0a 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a  ;.    p->iRightJ
2ca0: 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29  oinTable = (i16)
2cb0: 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 65 74 4a  iTable;.    setJ
2cc0: 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74  oinExpr(p->pLeft
2cd0: 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70  , iTable);.    p
2ce0: 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20   = p->pRight;.  
2cf0: 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  } .}../*.** This
2d00: 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73   routine process
2d10: 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f  es the join info
2d20: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45  rmation for a SE
2d30: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
2d40: 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  ** ON and USING 
2d50: 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76  clauses are conv
2d60: 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61  erted into extra
2d70: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
2d80: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e  ERE clause..** N
2d90: 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73  ATURAL joins als
2da0: 6f 20 63 72 65 61 74 65 20 65 78 74 72 61 20 57  o create extra W
2db0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
2dc0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72  s..**.** The ter
2dd0: 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61  ms of a FROM cla
2de0: 75 73 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  use are containe
2df0: 64 20 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e  d in the Select.
2e00: 70 53 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a  pSrc structure..
2e10: 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74  ** The left most
2e20: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 66 69   table is the fi
2e30: 72 73 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c  rst entry in Sel
2e40: 65 63 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72  ect.pSrc.  The r
2e50: 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62  ight-most.** tab
2e60: 6c 65 20 69 73 20 74 68 65 20 6c 61 73 74 20 65  le is the last e
2e70: 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20  ntry.  The join 
2e80: 6f 70 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64  operator is held
2e90: 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f   in the entry to
2ea0: 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54  .** the left.  T
2eb0: 68 75 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74  hus entry 0 cont
2ec0: 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ains the join op
2ed0: 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a  erator for the j
2ee0: 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65  oin between.** e
2ef0: 6e 74 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20  ntries 0 and 1. 
2f00: 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47   Any ON or USING
2f10: 20 63 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61   clauses associa
2f20: 74 65 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69  ted with the joi
2f30: 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74  n are.** also at
2f40: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65  tached to the le
2f50: 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20  ft entry..**.** 
2f60: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
2f70: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
2f80: 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e  of errors encoun
2f90: 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  tered..*/.static
2fa0: 20 69 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65   int sqliteProce
2fb0: 73 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50  ssJoin(Parse *pP
2fc0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
2fd0: 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
2fe0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2ff0: 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65      /* All table
3000: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
3010: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ause */.  int i,
3020: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
3030: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
3040: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
3050: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
3060: 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20  tem *pLeft;     
3070: 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65  /* Left table be
3080: 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20  ing joined */.  
3090: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
30a0: 74 65 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20  tem *pRight;    
30b0: 2f 2a 20 52 69 67 68 74 20 74 61 62 6c 65 20 62  /* Right table b
30c0: 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a  eing joined */..
30d0: 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
30e0: 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72  ;.  pLeft = &pSr
30f0: 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68  c->a[0];.  pRigh
3100: 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20  t = &pLeft[1];. 
3110: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
3120: 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70  ->nSrc-1; i++, p
3130: 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b  Right++, pLeft++
3140: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c  ){.    Table *pL
3150: 65 66 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e  eftTab = pLeft->
3160: 70 54 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20  pTab;.    Table 
3170: 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70 52 69  *pRightTab = pRi
3180: 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  ght->pTab;.    i
3190: 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20  nt isOuter;..   
31a0: 20 69 66 28 20 4e 45 56 45 52 28 70 4c 65 66 74   if( NEVER(pLeft
31b0: 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74  Tab==0 || pRight
31c0: 54 61 62 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e  Tab==0) ) contin
31d0: 75 65 3b 0a 20 20 20 20 69 73 4f 75 74 65 72 20  ue;.    isOuter 
31e0: 3d 20 28 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74  = (pRight->joint
31f0: 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
3200: 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e  =0;..    /* When
3210: 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
3220: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c  word is present,
3230: 20 61 64 64 20 57 48 45 52 45 20 63 6c 61 75 73   add WHERE claus
3240: 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20  e terms for.    
3250: 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  ** every column 
3260: 74 68 61 74 20 74 68 65 20 74 77 6f 20 74 61 62  that the two tab
3270: 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d  les have in comm
3280: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
3290: 66 28 20 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74  f( pRight->joint
32a0: 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
32b0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52   ){.      if( pR
32c0: 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69  ight->pOn || pRi
32d0: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
32e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
32f0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3300: 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d  a NATURAL join m
3310: 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20  ay not have ".  
3320: 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20           "an ON 
3330: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22  or USING clause"
3340: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65  , 0);.        re
3350: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
3360: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
3370: 3c 70 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c  <pRightTab->nCol
3380: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
3390: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f  char *zName;   /
33a0: 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e  * Name of column
33b0: 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 74 61   in the right ta
33c0: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ble */.        i
33d0: 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a  nt iLeft;     /*
33e0: 20 4d 61 74 63 68 69 6e 67 20 6c 65 66 74 20 74   Matching left t
33f0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
3400: 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f  int iLeftCol;  /
3410: 2a 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  * Matching colum
3420: 6e 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61  n in the left ta
3430: 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ble */..        
3440: 7a 4e 61 6d 65 20 3d 20 70 52 69 67 68 74 54 61  zName = pRightTa
3450: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
3460: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 61  ;.        if( ta
3470: 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65  bleAndColumnInde
3480: 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61  x(pSrc, i+1, zNa
3490: 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65  me, &iLeft, &iLe
34a0: 66 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20  ftCol) ){.      
34b0: 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d      addWhereTerm
34c0: 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69  (pParse, pSrc, i
34d0: 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20  Left, iLeftCol, 
34e0: 69 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20  i+1, j,.        
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
3500: 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65  sOuter, &p->pWhe
3510: 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  re);.        }. 
3520: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
3530: 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f    /* Disallow bo
3540: 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  th ON and USING 
3550: 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73  clauses in the s
3560: 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a  ame join.    */.
3570: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
3580: 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70  pOn && pRight->p
3590: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73  Using ){.      s
35a0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
35b0: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68  Parse, "cannot h
35c0: 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20  ave both ON and 
35d0: 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20  USING ".        
35e0: 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20  "clauses in the 
35f0: 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20  same join");.   
3600: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3610: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74   }..    /* Add t
3620: 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20  he ON clause to 
3630: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
3640: 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e  HERE clause, con
3650: 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a  nected by.    **
3660: 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
3670: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
3680: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a   pRight->pOn ){.
3690: 20 20 20 20 20 20 69 66 28 20 69 73 4f 75 74 65        if( isOute
36a0: 72 20 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28  r ) setJoinExpr(
36b0: 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69  pRight->pOn, pRi
36c0: 67 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  ght->iCursor);. 
36d0: 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d       p->pWhere =
36e0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
36f0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
3700: 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70  Where, pRight->p
3710: 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68  On);.      pRigh
3720: 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20  t->pOn = 0;.    
3730: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  }..    /* Create
3740: 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20   extra terms on 
3750: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3760: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
3770: 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e   named.    ** in
3780: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
3790: 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20  e.  Example: If 
37a0: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74  the two tables t
37b0: 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20  o be joined are 
37c0: 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20  .    ** A and B 
37d0: 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c  and the USING cl
37e0: 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c  ause names X, Y,
37f0: 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64   and Z, then add
3800: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20   this.    ** to 
3810: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3820: 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44  :    A.X=B.X AND
3830: 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a   A.Y=B.Y AND A.Z
3840: 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f  =B.Z.    ** Repo
3850: 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61  rt an error if a
3860: 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f  ny column mentio
3870: 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47  ned in the USING
3880: 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a   clause is.    *
3890: 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  * not contained 
38a0: 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74  in both tables t
38b0: 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20  o be joined..   
38c0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
38d0: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
38e0: 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73      IdList *pLis
38f0: 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69  t = pRight->pUsi
3900: 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  ng;.      for(j=
3910: 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; j<pList->nId;
3920: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
3930: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
3940: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
3950: 65 72 6d 20 69 6e 20 74 68 65 20 55 53 49 4e 47  erm in the USING
3960: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
3970: 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20     int iLeft;   
3980: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e 20      /* Table on 
3990: 74 68 65 20 6c 65 66 74 20 77 69 74 68 20 6d 61  the left with ma
39a0: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61  tching column na
39b0: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  me */.        in
39c0: 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20 2f  t iLeftCol;    /
39d0: 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  * Column number 
39e0: 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  of matching colu
39f0: 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a  mn on the left *
3a00: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52  /.        int iR
3a10: 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f  ightCol;   /* Co
3a20: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d  lumn number of m
3a30: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f  atching column o
3a40: 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 0a  n the right */..
3a50: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
3a60: 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d  pList->a[j].zNam
3a70: 65 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67 68  e;.        iRigh
3a80: 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64  tCol = columnInd
3a90: 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e  ex(pRightTab, zN
3aa0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
3ab0: 28 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20 20  ( iRightCol<0.  
3ac0: 20 20 20 20 20 20 20 7c 7c 20 21 74 61 62 6c 65         || !table
3ad0: 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  AndColumnIndex(p
3ae0: 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c  Src, i+1, zName,
3af0: 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43   &iLeft, &iLeftC
3b00: 6f 6c 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ol).        ){. 
3b10: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
3b20: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3b30: 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73   "cannot join us
3b40: 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20  ing column %s - 
3b50: 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20  column ".       
3b60: 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e       "not presen
3b70: 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73  t in both tables
3b80: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
3b90: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
3ba0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3bb0: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 50   addWhereTerm(pP
3bc0: 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66  arse, pSrc, iLef
3bd0: 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31  t, iLeftCol, i+1
3be0: 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20 20  , iRightCol,.   
3bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c00: 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70    isOuter, &p->p
3c10: 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Where);.      }.
3c20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
3c30: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  rn 0;.}../* Forw
3c40: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
3c50: 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20  .static KeyInfo 
3c60: 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  *keyInfoFromExpr
3c70: 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
3c80: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
3c90: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
3ca0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
3cb0: 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72  List,     /* For
3cc0: 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62  m the KeyInfo ob
3cd0: 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73 20 45  ject from this E
3ce0: 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  xprList */.  int
3cf0: 20 69 53 74 61 72 74 2c 20 20 20 20 20 20 20 20   iStart,        
3d00: 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74 68 20    /* Begin with 
3d10: 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70  this column of p
3d20: 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  List */.  int nE
3d30: 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20 2f  xtra           /
3d40: 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20  * Add this many 
3d50: 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f  extra columns to
3d60: 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 3b 0a 0a   the end */.);..
3d70: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
3d80: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 70 75  ode that will pu
3d90: 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e  sh the record in
3da0: 20 72 65 67 69 73 74 65 72 73 20 72 65 67 44 61   registers regDa
3db0: 74 61 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72 65  ta.** through re
3dc0: 67 44 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f 6e  gData+nData-1 on
3dd0: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a  to the sorter..*
3de0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75  /.static void pu
3df0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
3e00: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
3e10: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72         /* Parser
3e20: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f   context */.  So
3e30: 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20  rtCtx *pSort,   
3e40: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
3e50: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 4f 52  ion about the OR
3e60: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
3e70: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
3e80: 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ct,       /* The
3e90: 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74   whole SELECT st
3ea0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
3eb0: 20 72 65 67 44 61 74 61 2c 20 20 20 20 20 20 20   regData,       
3ec0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67      /* First reg
3ed0: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61  ister holding da
3ee0: 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20  ta to be sorted 
3ef0: 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20  */.  int nData, 
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3f10: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
3f20: 73 20 69 6e 20 74 68 65 20 64 61 74 61 20 61 72  s in the data ar
3f30: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72  ray */.  int nPr
3f40: 65 66 69 78 52 65 67 20 20 20 20 20 20 20 20 20  efixReg         
3f50: 2f 2a 20 4e 6f 2e 20 6f 66 20 72 65 67 20 70 72  /* No. of reg pr
3f60: 69 6f 72 20 74 6f 20 72 65 67 44 61 74 61 20 61  ior to regData a
3f70: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
3f80: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
3f90: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
3fa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6d            /* Stm
3fc0: 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
3fd0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 53  tion */.  int bS
3fe0: 65 71 20 3d 20 28 28 70 53 6f 72 74 2d 3e 73 6f  eq = ((pSort->so
3ff0: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
4000: 41 47 5f 55 73 65 53 6f 72 74 65 72 29 3d 3d 30  AG_UseSorter)==0
4010: 29 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d  );.  int nExpr =
4020: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
4030: 2d 3e 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20  ->nExpr;        
4040: 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20        /* No. of 
4050: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a  ORDER BY terms *
4060: 2f 0a 20 20 69 6e 74 20 6e 42 61 73 65 20 3d 20  /.  int nBase = 
4070: 6e 45 78 70 72 20 2b 20 62 53 65 71 20 2b 20 6e  nExpr + bSeq + n
4080: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
4090: 20 20 20 20 20 2f 2a 20 46 69 65 6c 64 73 20 69       /* Fields i
40a0: 6e 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  n sorter record 
40b0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65  */.  int regBase
40c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
40d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40e0: 20 20 20 20 20 20 2f 2a 20 52 65 67 73 20 66 6f        /* Regs fo
40f0: 72 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  r sorter record 
4100: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  */.  int regReco
4110: 72 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rd = ++pParse->n
4120: 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
4130: 20 20 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c        /* Assembl
4140: 65 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  ed sorter record
4150: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74   */.  int nOBSat
4160: 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74   = pSort->nOBSat
4170: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4180: 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20         /* ORDER 
4190: 42 59 20 74 65 72 6d 73 20 74 6f 20 73 6b 69 70  BY terms to skip
41a0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f           /* Opco
41d0: 64 65 20 74 6f 20 61 64 64 20 73 6f 72 74 65 72  de to add sorter
41e0: 20 72 65 63 6f 72 64 20 74 6f 20 73 6f 72 74 65   record to sorte
41f0: 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
4200: 62 53 65 71 3d 3d 30 20 7c 7c 20 62 53 65 71 3d  bSeq==0 || bSeq=
4210: 3d 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 72 65  =1 );.  if( nPre
4220: 66 69 78 52 65 67 20 29 7b 0a 20 20 20 20 61 73  fixReg ){.    as
4230: 73 65 72 74 28 20 6e 50 72 65 66 69 78 52 65 67  sert( nPrefixReg
4240: 3d 3d 6e 45 78 70 72 2b 62 53 65 71 20 29 3b 0a  ==nExpr+bSeq );.
4250: 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 72 65      regBase = re
4260: 67 44 61 74 61 20 2d 20 6e 45 78 70 72 20 2d 20  gData - nExpr - 
4270: 62 53 65 71 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  bSeq;.  }else{. 
4280: 20 20 20 72 65 67 42 61 73 65 20 3d 20 70 50 61     regBase = pPa
4290: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
42a0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
42b0: 2b 3d 20 6e 42 61 73 65 3b 0a 20 20 7d 0a 20 20  += nBase;.  }.  
42c0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
42d0: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
42e0: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c  pSort->pOrderBy,
42f0: 20 72 65 67 42 61 73 65 2c 20 53 51 4c 49 54 45   regBase, SQLITE
4300: 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20 69 66  _ECEL_DUP);.  if
4310: 28 20 62 53 65 71 20 29 7b 0a 20 20 20 20 73 71  ( bSeq ){.    sq
4320: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
4330: 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20  v, OP_Sequence, 
4340: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c  pSort->iECursor,
4350: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b   regBase+nExpr);
4360: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 72 65 66  .  }.  if( nPref
4370: 69 78 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ixReg==0 ){.    
4380: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4390: 33 28 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20 72 65  3(v, OP_Move, re
43a0: 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e  gData, regBase+n
43b0: 45 78 70 72 2b 62 53 65 71 2c 20 6e 44 61 74 61  Expr+bSeq, nData
43c0: 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
43d0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
43e0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
43f0: 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42  gBase+nOBSat, nB
4400: 61 73 65 2d 6e 4f 42 53 61 74 2c 20 72 65 67 52  ase-nOBSat, regR
4410: 65 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 6e 4f  ecord);.  if( nO
4420: 42 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e  BSat>0 ){.    in
4430: 74 20 72 65 67 50 72 65 76 4b 65 79 3b 20 20 20  t regPrevKey;   
4440: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 6e 4f 42  /* The first nOB
4450: 53 61 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  Sat columns of t
4460: 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20  he previous row 
4470: 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 46  */.    int addrF
4480: 69 72 73 74 3b 20 20 20 20 2f 2a 20 41 64 64 72  irst;    /* Addr
4490: 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 49 66  ess of the OP_If
44a0: 4e 6f 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  Not opcode */.  
44b0: 20 20 69 6e 74 20 61 64 64 72 4a 6d 70 3b 20 20    int addrJmp;  
44c0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
44d0: 66 20 74 68 65 20 4f 50 5f 4a 75 6d 70 20 6f 70  f the OP_Jump op
44e0: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 56 64 62 65  code */.    Vdbe
44f0: 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 2f 2a  Op *pOp;      /*
4500: 20 4f 70 63 6f 64 65 20 74 68 61 74 20 6f 70 65   Opcode that ope
4510: 6e 73 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f  ns the sorter */
4520: 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20  .    int nKey;  
4530: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4540: 20 6f 66 20 73 6f 72 74 69 6e 67 20 6b 65 79 20   of sorting key 
4550: 63 6f 6c 75 6d 6e 73 2c 20 69 6e 63 6c 75 64 69  columns, includi
4560: 6e 67 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 2a  ng OP_Sequence *
4570: 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  /.    KeyInfo *p
4580: 4b 49 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  KI;     /* Origi
4590: 6e 61 6c 20 4b 65 79 49 6e 66 6f 20 6f 6e 20 74  nal KeyInfo on t
45a0: 68 65 20 73 6f 72 74 65 72 20 74 61 62 6c 65 20  he sorter table 
45b0: 2a 2f 0a 0a 20 20 20 20 72 65 67 50 72 65 76 4b  */..    regPrevK
45c0: 65 79 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ey = pParse->nMe
45d0: 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
45e0: 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e  >nMem += pSort->
45f0: 6e 4f 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65 79  nOBSat;.    nKey
4600: 20 3d 20 6e 45 78 70 72 20 2d 20 70 53 6f 72 74   = nExpr - pSort
4610: 2d 3e 6e 4f 42 53 61 74 20 2b 20 62 53 65 71 3b  ->nOBSat + bSeq;
4620: 0a 20 20 20 20 69 66 28 20 62 53 65 71 20 29 7b  .    if( bSeq ){
4630: 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73 74  .      addrFirst
4640: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
4650: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
4660: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29  , regBase+nExpr)
4670: 3b 20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ; .    }else{.  
4680: 20 20 20 20 61 64 64 72 46 69 72 73 74 20 3d 20      addrFirst = 
4690: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
46a0: 31 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  1(v, OP_Sequence
46b0: 54 65 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43  Test, pSort->iEC
46c0: 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20  ursor);.    }.  
46d0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
46e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
46f0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
4700: 6f 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76 4b  ompare, regPrevK
4710: 65 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53 6f  ey, regBase, pSo
4720: 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20  rt->nOBSat);.   
4730: 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
4740: 62 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74  beGetOp(v, pSort
4750: 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  ->addrSortIndex)
4760: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  ;.    if( pParse
4770: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
4780: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ed ) return;.   
4790: 20 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79 20   pOp->p2 = nKey 
47a0: 2b 20 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b 49  + nData;.    pKI
47b0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49   = pOp->p4.pKeyI
47c0: 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  nfo;.    memset(
47d0: 70 4b 49 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c  pKI->aSortOrder,
47e0: 20 30 2c 20 70 4b 49 2d 3e 6e 46 69 65 6c 64 29   0, pKI->nField)
47f0: 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50 5f 4a 75  ; /* Makes OP_Ju
4800: 6d 70 20 62 65 6c 6f 77 20 74 65 73 74 61 62 6c  mp below testabl
4810: 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  e */.    sqlite3
4820: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
4830: 2d 31 2c 20 28 63 68 61 72 2a 29 70 4b 49 2c 20  -1, (char*)pKI, 
4840: 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
4850: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
4860: 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
4870: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
4880: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c  pSort->pOrderBy,
4890: 20 6e 4f 42 53 61 74 2c 20 31 29 3b 0a 20 20 20   nOBSat, 1);.   
48a0: 20 61 64 64 72 4a 6d 70 20 3d 20 73 71 6c 69 74   addrJmp = sqlit
48b0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
48c0: 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(v);.    sqlite
48d0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
48e0: 50 5f 4a 75 6d 70 2c 20 61 64 64 72 4a 6d 70 2b  P_Jump, addrJmp+
48f0: 31 2c 20 30 2c 20 61 64 64 72 4a 6d 70 2b 31 29  1, 0, addrJmp+1)
4900: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
4910: 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e 6c 61  );.    pSort->la
4920: 62 65 6c 42 6b 4f 75 74 20 3d 20 73 71 6c 69 74  belBkOut = sqlit
4930: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
4940: 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e 72  v);.    pSort->r
4950: 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
4960: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
4970: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
4980: 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53  (v, OP_Gosub, pS
4990: 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  ort->regReturn, 
49a0: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
49b0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
49c0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
49d0: 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70 53 6f  ResetSorter, pSo
49e0: 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20  rt->iECursor);. 
49f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
4a00: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 46 69  mpHere(v, addrFi
4a10: 72 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rst);.    sqlite
4a20: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4a30: 50 5f 4d 6f 76 65 2c 20 72 65 67 42 61 73 65 2c  P_Move, regBase,
4a40: 20 72 65 67 50 72 65 76 4b 65 79 2c 20 70 53 6f   regPrevKey, pSo
4a50: 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20  rt->nOBSat);.   
4a60: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
4a70: 48 65 72 65 28 76 2c 20 61 64 64 72 4a 6d 70 29  Here(v, addrJmp)
4a80: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72  ;.  }.  if( pSor
4a90: 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53  t->sortFlags & S
4aa0: 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65  ORTFLAG_UseSorte
4ab0: 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50  r ){.    op = OP
4ac0: 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 3b 0a 20  _SorterInsert;. 
4ad0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d   }else{.    op =
4ae0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 3b 0a 20   OP_IdxInsert;. 
4af0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
4b00: 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 70 53  AddOp2(v, op, pS
4b10: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72  ort->iECursor, r
4b20: 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 69 66 28  egRecord);.  if(
4b30: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
4b40: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
4b50: 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 69 6e  1, addr2;.    in
4b60: 74 20 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69 66  t iLimit;.    if
4b70: 28 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73  ( pSelect->iOffs
4b80: 65 74 20 29 7b 0a 20 20 20 20 20 20 69 4c 69 6d  et ){.      iLim
4b90: 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f  it = pSelect->iO
4ba0: 66 66 73 65 74 2b 31 3b 0a 20 20 20 20 7d 65 6c  ffset+1;.    }el
4bb0: 73 65 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74  se{.      iLimit
4bc0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d   = pSelect->iLim
4bd0: 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64  it;.    }.    ad
4be0: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
4bf0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
4c00: 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29 3b 20 56  Zero, iLimit); V
4c10: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
4c20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4c30: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
4c40: 6d 6d 2c 20 69 4c 69 6d 69 74 2c 20 2d 31 29 3b  mm, iLimit, -1);
4c50: 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c  .    addr2 = sql
4c60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
4c70: 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20  , OP_Goto);.    
4c80: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
4c90: 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
4ca0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4cb0: 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73 74 2c  dOp1(v, OP_Last,
4cc0: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
4cd0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4ce0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44  beAddOp1(v, OP_D
4cf0: 65 6c 65 74 65 2c 20 70 53 6f 72 74 2d 3e 69 45  elete, pSort->iE
4d00: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c  Cursor);.    sql
4d10: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
4d20: 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 7d 0a  (v, addr2);.  }.
4d30: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64  }../*.** Add cod
4d40: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
4d50: 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61  he OFFSET.*/.sta
4d60: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66  tic void codeOff
4d70: 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  set(.  Vdbe *v, 
4d80: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
4d90: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
4da0: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
4db0: 69 4f 66 66 73 65 74 2c 20 20 20 20 20 20 2f 2a  iOffset,      /*
4dc0: 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
4dd0: 67 20 74 68 65 20 6f 66 66 73 65 74 20 63 6f 75  g the offset cou
4de0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43  nter */.  int iC
4df0: 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a  ontinue     /* J
4e00: 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
4e10: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63   the current rec
4e20: 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ord */.){.  if( 
4e30: 69 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20  iOffset>0 ){.   
4e40: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 61   int addr;.    a
4e50: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
4e60: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
4e70: 4e 65 67 2c 20 69 4f 66 66 73 65 74 2c 20 30 2c  Neg, iOffset, 0,
4e80: 20 2d 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61   -1); VdbeCovera
4e90: 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
4ea0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4eb0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e  OP_Goto, 0, iCon
4ec0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65  tinue);.    Vdbe
4ed0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69  Comment((v, "ski
4ee0: 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72 64 73  p OFFSET records
4ef0: 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
4f00: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
4f10: 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  addr);.  }.}../*
4f20: 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61  .** Add code tha
4f30: 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20  t will check to 
4f40: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20  make sure the N 
4f50: 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
4f60: 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f  ng at iMem.** fo
4f70: 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e  rm a distinct en
4f80: 74 72 79 2e 20 20 69 54 61 62 20 69 73 20 61 20  try.  iTab is a 
4f90: 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68  sorting index th
4fa0: 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75  at holds previou
4fb0: 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62  sly.** seen comb
4fc0: 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  inations of the 
4fd0: 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77  N values.  A new
4fe0: 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69   entry is made i
4ff0: 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65  n iTab.** if the
5000: 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65   current N value
5010: 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a  s are new..**.**
5020: 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52   A jump to addrR
5030: 65 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e  epeat is made an
5040: 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73  d the N+1 values
5050: 20 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d   are popped from
5060: 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66   the.** stack if
5070: 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65   the top N eleme
5080: 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74  nts are not dist
5090: 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  inct..*/.static 
50a0: 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63  void codeDistinc
50b0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
50c0: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
50d0: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
50e0: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
50f0: 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20  /.  int iTab,   
5100: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74         /* A sort
5110: 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74  ing index used t
5120: 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69  o test for disti
5130: 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74  nctness */.  int
5140: 20 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20   addrRepeat,    
5150: 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20  /* Jump to here 
5160: 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20  if not distinct 
5170: 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  */.  int N,     
5180: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5190: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  r of elements */
51a0: 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20  .  int iMem     
51b0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65        /* First e
51c0: 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56  lement */.){.  V
51d0: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31  dbe *v;.  int r1
51e0: 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  ;..  v = pParse-
51f0: 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73  >pVdbe;.  r1 = s
5200: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
5210: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
5220: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
5230: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54  (v, OP_Found, iT
5240: 61 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20  ab, addrRepeat, 
5250: 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65 43 6f  iMem, N); VdbeCo
5260: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
5270: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5280: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
5290: 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20   iMem, N, r1);. 
52a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
52b0: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
52c0: 72 74 2c 20 69 54 61 62 2c 20 72 31 29 3b 0a 20  rt, iTab, r1);. 
52d0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
52e0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
52f0: 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  1);.}..#ifndef S
5300: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
5310: 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  ERY./*.** Genera
5320: 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  te an error mess
5330: 61 67 65 20 77 68 65 6e 20 61 20 53 45 4c 45 43  age when a SELEC
5340: 54 20 69 73 20 75 73 65 64 20 77 69 74 68 69 6e  T is used within
5350: 20 61 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e   a subexpression
5360: 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a 20 20 22  .** (example:  "
5370: 61 20 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46  a IN (SELECT * F
5380: 52 4f 4d 20 74 61 62 6c 65 29 22 29 20 62 75 74  ROM table)") but
5390: 20 69 74 20 68 61 73 20 6d 6f 72 65 20 74 68 61   it has more tha
53a0: 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a 20 63 6f  n 1 result.** co
53b0: 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20 74 68 69  lumn.  We do thi
53c0: 73 20 69 6e 20 61 20 73 75 62 72 6f 75 74 69 6e  s in a subroutin
53d0: 65 20 62 65 63 61 75 73 65 20 74 68 65 20 65 72  e because the er
53e0: 72 6f 72 20 75 73 65 64 20 74 6f 20 6f 63 63 75  ror used to occu
53f0: 72 0a 2a 2a 20 69 6e 20 6d 75 6c 74 69 70 6c 65  r.** in multiple
5400: 20 70 6c 61 63 65 73 2e 20 20 28 54 68 65 20 65   places.  (The e
5410: 72 72 6f 72 20 6f 6e 6c 79 20 6f 63 63 75 72 73  rror only occurs
5420: 20 69 6e 20 6f 6e 65 20 70 6c 61 63 65 20 6e 6f   in one place no
5430: 77 2c 20 62 75 74 20 77 65 0a 2a 2a 20 72 65 74  w, but we.** ret
5440: 61 69 6e 20 74 68 65 20 73 75 62 72 6f 75 74 69  ain the subrouti
5450: 6e 65 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 63  ne to minimize c
5460: 6f 64 65 20 64 69 73 72 75 70 74 69 6f 6e 2e 29  ode disruption.)
5470: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
5480: 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75  heckForMultiColu
5490: 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 0a 20  mnSelectError(. 
54a0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
54b0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
54c0: 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20 53 65 6c  ontext. */.  Sel
54d0: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
54e0: 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e    /* Destination
54f0: 20 6f 66 20 53 45 4c 45 43 54 20 72 65 73 75 6c   of SELECT resul
5500: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70  ts */.  int nExp
5510: 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r            /* 
5520: 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  Number of result
5530: 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65   columns returne
5540: 64 20 62 79 20 53 45 4c 45 43 54 20 2a 2f 0a 29  d by SELECT */.)
5550: 7b 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20  {.  int eDest = 
5560: 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20  pDest->eDest;.  
5570: 69 66 28 20 6e 45 78 70 72 3e 31 20 26 26 20 28  if( nExpr>1 && (
5580: 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c  eDest==SRT_Mem |
5590: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74  | eDest==SRT_Set
55a0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
55b0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
55c0: 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20   "only a single 
55d0: 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66  result allowed f
55e0: 6f 72 20 22 0a 20 20 20 20 20 20 20 22 61 20 53  or ".       "a S
55f0: 45 4c 45 43 54 20 74 68 61 74 20 69 73 20 70 61  ELECT that is pa
5600: 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
5610: 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ion");.    retur
5620: 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n 1;.  }else{.  
5630: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
5640: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
5650: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
5660: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
5670: 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f  for the inside o
5680: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
5690: 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e  .** of a SELECT.
56a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62  .**.** If srcTab
56b0: 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
56c0: 65 6e 20 74 68 65 20 70 45 4c 69 73 74 20 65 78  en the pEList ex
56d0: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65  pressions.** are
56e0: 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72   evaluated in or
56f0: 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 64  der to get the d
5700: 61 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77  ata for this row
5710: 2e 20 20 49 66 20 73 72 63 54 61 62 20 69 73 0a  .  If srcTab is.
5720: 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 2c  ** zero or more,
5730: 20 74 68 65 6e 20 64 61 74 61 20 69 73 20 70 75   then data is pu
5740: 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62  lled from srcTab
5750: 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75   and pEList is u
5760: 73 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20  sed only .** to 
5770: 67 65 74 20 6e 75 6d 62 65 72 20 63 6f 6c 75 6d  get number colum
5780: 6e 73 20 61 6e 64 20 74 68 65 20 64 61 74 61 74  ns and the datat
5790: 79 70 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  ype for each col
57a0: 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  umn..*/.static v
57b0: 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  oid selectInnerL
57c0: 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  oop(.  Parse *pP
57d0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
57e0: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
57f0: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
5800: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
5810: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74    /* The complet
5820: 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
5830: 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  nt being coded *
5840: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
5850: 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c  List,       /* L
5860: 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20 62 65  ist of values be
5870: 69 6e 67 20 65 78 74 72 61 63 74 65 64 20 2a 2f  ing extracted */
5880: 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20  .  int srcTab,  
5890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75             /* Pu
58a0: 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69  ll data from thi
58b0: 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 6f 72  s table */.  Sor
58c0: 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20  tCtx *pSort,    
58d0: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
58e0: 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77  ULL, info on how
58f0: 20 74 6f 20 70 72 6f 63 65 73 73 20 4f 52 44 45   to process ORDE
5900: 52 20 42 59 20 2a 2f 0a 20 20 44 69 73 74 69 6e  R BY */.  Distin
5910: 63 74 43 74 78 20 2a 70 44 69 73 74 69 6e 63 74  ctCtx *pDistinct
5920: 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c  , /* If not NULL
5930: 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  , info on how to
5940: 20 70 72 6f 63 65 73 73 20 44 49 53 54 49 4e 43   process DISTINC
5950: 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  T */.  SelectDes
5960: 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f  t *pDest,      /
5970: 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
5980: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   of the results 
5990: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  */.  int iContin
59a0: 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ue,          /* 
59b0: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e  Jump here to con
59c0: 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20  tinue with next 
59d0: 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72  row */.  int iBr
59e0: 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  eak             
59f0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
5a00: 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
5a10: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a  e inner loop */.
5a20: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
5a30: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
5a40: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73  int i;.  int has
5a50: 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  Distinct;       
5a60: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
5a70: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
5a80: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
5a90: 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b 20   int regResult; 
5aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5ab0: 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20  Start of memory 
5ac0: 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 73  holding result s
5ad0: 65 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  et */.  int eDes
5ae0: 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74  t = pDest->eDest
5af0: 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69  ;   /* How to di
5b00: 73 70 6f 73 65 20 6f 66 20 72 65 73 75 6c 74 73  spose of results
5b10: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20   */.  int iParm 
5b20: 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  = pDest->iSDParm
5b30: 3b 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d  ; /* First argum
5b40: 65 6e 74 20 74 6f 20 64 69 73 70 6f 73 61 6c 20  ent to disposal 
5b50: 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20  method */.  int 
5b60: 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20  nResultCol;     
5b70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5b80: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
5b90: 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72  mns */.  int nPr
5ba0: 65 66 69 78 52 65 67 20 3d 20 30 3b 20 20 20 20  efixReg = 0;    
5bb0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5bc0: 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  f extra register
5bd0: 73 20 62 65 66 6f 72 65 20 72 65 67 52 65 73 75  s before regResu
5be0: 6c 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  lt */..  assert(
5bf0: 20 76 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20   v );.  assert( 
5c00: 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 68  pEList!=0 );.  h
5c10: 61 73 44 69 73 74 69 6e 63 74 20 3d 20 70 44 69  asDistinct = pDi
5c20: 73 74 69 6e 63 74 20 3f 20 70 44 69 73 74 69 6e  stinct ? pDistin
5c30: 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 3a 20  ct->eTnctType : 
5c40: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e  WHERE_DISTINCT_N
5c50: 4f 4f 50 3b 0a 20 20 69 66 28 20 70 53 6f 72 74  OOP;.  if( pSort
5c60: 20 26 26 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65   && pSort->pOrde
5c70: 72 42 79 3d 3d 30 20 29 20 70 53 6f 72 74 20 3d  rBy==0 ) pSort =
5c80: 20 30 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 3d   0;.  if( pSort=
5c90: 3d 30 20 26 26 20 21 68 61 73 44 69 73 74 69 6e  =0 && !hasDistin
5ca0: 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ct ){.    assert
5cb0: 28 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29  ( iContinue!=0 )
5cc0: 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74  ;.    codeOffset
5cd0: 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  (v, p->iOffset, 
5ce0: 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a  iContinue);.  }.
5cf0: 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72  .  /* Pull the r
5d00: 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73  equested columns
5d10: 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65 73 75 6c 74  ..  */.  nResult
5d20: 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  Col = pEList->nE
5d30: 78 70 72 3b 0a 0a 20 20 69 66 28 20 70 44 65 73  xpr;..  if( pDes
5d40: 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20  t->iSdst==0 ){. 
5d50: 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a     if( pSort ){.
5d60: 20 20 20 20 20 20 6e 50 72 65 66 69 78 52 65 67        nPrefixReg
5d70: 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72   = pSort->pOrder
5d80: 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
5d90: 20 69 66 28 20 21 28 70 53 6f 72 74 2d 3e 73 6f   if( !(pSort->so
5da0: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
5db0: 41 47 5f 55 73 65 53 6f 72 74 65 72 29 20 29 20  AG_UseSorter) ) 
5dc0: 6e 50 72 65 66 69 78 52 65 67 2b 2b 3b 0a 20 20  nPrefixReg++;.  
5dd0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
5de0: 20 2b 3d 20 6e 50 72 65 66 69 78 52 65 67 3b 0a   += nPrefixReg;.
5df0: 20 20 20 20 7d 0a 20 20 20 20 70 44 65 73 74 2d      }.    pDest-
5e00: 3e 69 53 64 73 74 20 3d 20 70 50 61 72 73 65 2d  >iSdst = pParse-
5e10: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
5e20: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
5e30: 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65  sultCol;.  }else
5e40: 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73   if( pDest->iSds
5e50: 74 2b 6e 52 65 73 75 6c 74 43 6f 6c 20 3e 20 70  t+nResultCol > p
5e60: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20  Parse->nMem ){. 
5e70: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e     /* This is an
5e80: 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e   error condition
5e90: 20 74 68 61 74 20 63 61 6e 20 72 65 73 75 6c 74   that can result
5ea0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77  , for example, w
5eb0: 68 65 6e 20 61 20 53 45 4c 45 43 54 0a 20 20 20  hen a SELECT.   
5ec0: 20 2a 2a 20 6f 6e 20 74 68 65 20 72 69 67 68 74   ** on the right
5ed0: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 6e  -hand side of an
5ee0: 20 49 4e 53 45 52 54 20 63 6f 6e 74 61 69 6e 73   INSERT contains
5ef0: 20 6d 6f 72 65 20 72 65 73 75 6c 74 20 63 6f 6c   more result col
5f00: 75 6d 6e 73 20 74 68 61 6e 0a 20 20 20 20 2a 2a  umns than.    **
5f10: 20 74 68 65 72 65 20 61 72 65 20 63 6f 6c 75 6d   there are colum
5f20: 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ns in the table 
5f30: 6f 6e 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68  on the left.  Th
5f40: 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20  e error will be 
5f50: 63 61 75 67 68 74 0a 20 20 20 20 2a 2a 20 61 6e  caught.    ** an
5f60: 64 20 72 65 70 6f 72 74 65 64 20 6c 61 74 65 72  d reported later
5f70: 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 20 74  .  But we need t
5f80: 6f 20 6d 61 6b 65 20 73 75 72 65 20 65 6e 6f 75  o make sure enou
5f90: 67 68 20 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c  gh memory is all
5fa0: 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 74 6f  ocated.    ** to
5fb0: 20 61 76 6f 69 64 20 6f 74 68 65 72 20 73 70 75   avoid other spu
5fc0: 72 69 6f 75 73 20 65 72 72 6f 72 73 20 69 6e 20  rious errors in 
5fd0: 74 68 65 20 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f  the meantime. */
5fe0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
5ff0: 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  m += nResultCol;
6000: 0a 20 20 7d 0a 20 20 70 44 65 73 74 2d 3e 6e 53  .  }.  pDest->nS
6010: 64 73 74 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  dst = nResultCol
6020: 3b 0a 20 20 72 65 67 52 65 73 75 6c 74 20 3d 20  ;.  regResult = 
6030: 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20  pDest->iSdst;.  
6040: 69 66 28 20 73 72 63 54 61 62 3e 3d 30 20 29 7b  if( srcTab>=0 ){
6050: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
6060: 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29  nResultCol; i++)
6070: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
6080: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6090: 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20  Column, srcTab, 
60a0: 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 29 3b  i, regResult+i);
60b0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
60c0: 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 45 4c  nt((v, "%s", pEL
60d0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
60e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
60f0: 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f   if( eDest!=SRT_
6100: 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a  Exists ){.    /*
6110: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
6120: 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53  ion is an EXISTS
6130: 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
6140: 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20  , the actual.   
6150: 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72   ** values retur
6160: 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43  ned by the SELEC
6170: 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72  T are not requir
6180: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
6190: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
61a0: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
61b0: 45 4c 69 73 74 2c 20 72 65 67 52 65 73 75 6c 74  EList, regResult
61c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
61d0: 20 20 20 20 28 65 44 65 73 74 3d 3d 53 52 54 5f      (eDest==SRT_
61e0: 4f 75 74 70 75 74 7c 7c 65 44 65 73 74 3d 3d 53  Output||eDest==S
61f0: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 29 3f 53 51  RT_Coroutine)?SQ
6200: 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 3a 30 29  LITE_ECEL_DUP:0)
6210: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
6220: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
6230: 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74 20  ord was present 
6240: 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  on the SELECT st
6250: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64  atement.  ** and
6260: 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62 65   this row has be
6270: 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20  en seen before, 
6280: 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65  then do not make
6290: 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70   this row.  ** p
62a0: 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c  art of the resul
62b0: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61  t..  */.  if( ha
62c0: 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
62d0: 20 73 77 69 74 63 68 28 20 70 44 69 73 74 69 6e   switch( pDistin
62e0: 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 29 7b  ct->eTnctType ){
62f0: 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
6300: 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
6310: 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64  ED: {.        Vd
6320: 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20  beOp *pOp;      
6330: 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67        /* No long
6340: 65 72 20 72 65 71 75 69 72 65 64 20 4f 70 65 6e  er required Open
6350: 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e  Ephemeral instr.
6360: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
6370: 69 4a 75 6d 70 3b 20 20 20 20 20 20 20 20 20 20  iJump;          
6380: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74      /* Jump dest
6390: 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ination */.     
63a0: 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20     int regPrev; 
63b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
63c0: 65 76 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74 65  evious row conte
63d0: 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f  nt */..        /
63e0: 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
63f0: 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75   for the previou
6400: 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20  s row */.       
6410: 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72 73   regPrev = pPars
6420: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20  e->nMem+1;.     
6430: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
6440: 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a  += nResultCol;..
6450: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67          /* Chang
6460: 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  e the OP_OpenEph
6470: 65 6d 65 72 61 6c 20 63 6f 64 65 64 20 65 61 72  emeral coded ear
6480: 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e 75  lier to an OP_Nu
6490: 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  ll.        ** se
64a0: 74 73 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61 72  ts the MEM_Clear
64b0: 65 64 20 62 69 74 20 6f 6e 20 74 68 65 20 66 69  ed bit on the fi
64c0: 72 73 74 20 72 65 67 69 73 74 65 72 20 6f 66 20  rst register of 
64d0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  the.        ** p
64e0: 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e 20 20  revious value.  
64f0: 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20  This will cause 
6500: 74 68 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77 20  the OP_Ne below 
6510: 74 6f 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20  to always.      
6520: 20 20 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68 65    ** fail on the
6530: 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
6540: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 65 76 65   of the loop eve
6550: 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20  n if the first. 
6560: 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 69 73         ** row is
6570: 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20 20   all NULLs..    
6580: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
6590: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
65a0: 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69  ToNoop(v, pDisti
65b0: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
65c0: 20 20 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71          pOp = sq
65d0: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
65e0: 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64  , pDistinct->add
65f0: 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20  rTnct);.        
6600: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
6610: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  _Null;.        p
6620: 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20 20  Op->p1 = 1;.    
6630: 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72 65      pOp->p2 = re
6640: 67 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 20 20  gPrev;..        
6650: 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56  iJump = sqlite3V
6660: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
6670: 29 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a  ) + nResultCol;.
6680: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
6690: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69   i<nResultCol; i
66a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 43  ++){.          C
66b0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
66c0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
66d0: 65 71 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  eq(pParse, pELis
66e0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
66f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
6700: 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 20 29 7b 0a  nResultCol-1 ){.
6710: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
6720: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6730: 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73 75 6c   OP_Ne, regResul
6740: 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65 67 50  t+i, iJump, regP
6750: 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20  rev+i);.        
6760: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
6770: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  (v);.          }
6780: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
6790: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
67a0: 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65  Op3(v, OP_Eq, re
67b0: 67 52 65 73 75 6c 74 2b 69 2c 20 69 43 6f 6e 74  gResult+i, iCont
67c0: 69 6e 75 65 2c 20 72 65 67 50 72 65 76 2b 69 29  inue, regPrev+i)
67d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64  ;.            Vd
67e0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
67f0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6800: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6810: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
6820: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
6830: 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
6840: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
6850: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
6860: 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  (v, SQLITE_NULLE
6870: 51 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  Q);.        }.  
6880: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
6890: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
68a0: 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d 70 20 29  Addr(v)==iJump )
68b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
68c0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
68d0: 50 5f 43 6f 70 79 2c 20 72 65 67 52 65 73 75 6c  P_Copy, regResul
68e0: 74 2c 20 72 65 67 50 72 65 76 2c 20 6e 52 65 73  t, regPrev, nRes
68f0: 75 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20  ultCol-1);.     
6900: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6910: 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57 48  }..      case WH
6920: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
6930: 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  QUE: {.        s
6940: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6950: 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69  ToNoop(v, pDisti
6960: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
6970: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6980: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65       }..      de
6990: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20  fault: {.       
69a0: 20 61 73 73 65 72 74 28 20 70 44 69 73 74 69 6e   assert( pDistin
69b0: 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57  ct->eTnctType==W
69c0: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
69d0: 4f 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20 20  ORDERED );.     
69e0: 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28     codeDistinct(
69f0: 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63  pParse, pDistinc
6a00: 74 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e  t->tabTnct, iCon
6a10: 74 69 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f  tinue, nResultCo
6a20: 6c 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  l, regResult);. 
6a30: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
6a40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
6a50: 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 29 7b 0a  if( pSort==0 ){.
6a60: 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74        codeOffset
6a70: 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  (v, p->iOffset, 
6a80: 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  iContinue);.    
6a90: 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  }.  }..  switch(
6aa0: 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a   eDest ){.    /*
6ab0: 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77   In this mode, w
6ac0: 72 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20  rite each query 
6ad0: 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65  result to the ke
6ae0: 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  y of the tempora
6af0: 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  ry.    ** table 
6b00: 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69  iParm..    */.#i
6b10: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6b20: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
6b30: 54 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55  T.    case SRT_U
6b40: 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  nion: {.      in
6b50: 74 20 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d  t r1;.      r1 =
6b60: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
6b70: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
6b80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6b90: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
6ba0: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
6bb0: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29   nResultCol, r1)
6bc0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6bd0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6be0: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
6bf0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
6c00: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
6c10: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
6c20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6c30: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74   }..    /* Const
6c40: 72 75 63 74 20 61 20 72 65 63 6f 72 64 20 66 72  ruct a record fr
6c50: 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72 65 73  om the query res
6c60: 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64  ult, but instead
6c70: 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e   of.    ** savin
6c80: 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75  g that record, u
6c90: 73 65 20 69 74 20 61 73 20 61 20 6b 65 79 20 74  se it as a key t
6ca0: 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74  o delete element
6cb0: 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  s from.    ** th
6cc0: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
6cd0: 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a  e iParm..    */.
6ce0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63      case SRT_Exc
6cf0: 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ept: {.      sql
6d00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6d10: 2c 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20  , OP_IdxDelete, 
6d20: 69 50 61 72 6d 2c 20 72 65 67 52 65 73 75 6c 74  iParm, regResult
6d30: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
6d40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6d50: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
6d60: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
6d70: 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20  _SELECT */..    
6d80: 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
6d90: 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e  ult as data usin
6da0: 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a  g a unique key..
6db0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
6dc0: 53 52 54 5f 46 69 66 6f 3a 0a 20 20 20 20 63 61  SRT_Fifo:.    ca
6dd0: 73 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3a  se SRT_DistFifo:
6de0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
6df0: 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
6e00: 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20  T_EphemTab: {.  
6e10: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
6e20: 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
6e30: 28 70 50 61 72 73 65 2c 20 6e 50 72 65 66 69 78  (pParse, nPrefix
6e40: 52 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 74 65  Reg+1);.      te
6e50: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
6e60: 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  RT_Table );.    
6e70: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
6e80: 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
6e90: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6ea0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6eb0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
6ec0: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
6ed0: 6f 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65  ol, r1+nPrefixRe
6ee0: 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  g);.#ifndef SQLI
6ef0: 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
6f00: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
6f10: 5f 44 69 73 74 46 69 66 6f 20 29 7b 0a 20 20 20  _DistFifo ){.   
6f20: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
6f30: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69  estination is Di
6f40: 73 74 46 69 66 6f 2c 20 74 68 65 6e 20 63 75 72  stFifo, then cur
6f50: 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73  sor (iParm+1) is
6f60: 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
6f70: 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c   on an ephemeral
6f80: 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 20 63   index. If the c
6f90: 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 61 6c  urrent row is al
6fa0: 72 65 61 64 79 20 70 72 65 73 65 6e 74 0a 20 20  ready present.  
6fb0: 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
6fc0: 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77 72  index, do not wr
6fd0: 69 74 65 20 69 74 20 74 6f 20 74 68 65 20 6f 75  ite it to the ou
6fe0: 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61 64  tput. If not, ad
6ff0: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
7000: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 74 6f 20   current row to 
7010: 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 70 72  the index and pr
7020: 6f 63 65 65 64 20 77 69 74 68 20 77 72 69 74 69  oceed with writi
7030: 6e 67 20 69 74 20 74 6f 20 74 68 65 0a 20 20 20  ng it to the.   
7040: 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 74       ** output t
7050: 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20 2a  able as well.  *
7060: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  /.        int ad
7070: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
7080: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
7090: 20 34 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   4;.        sqli
70a0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
70b0: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50  (v, OP_Found, iP
70c0: 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c  arm+1, addr, r1,
70d0: 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   0); VdbeCoverag
70e0: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  e(v);.        sq
70f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7100: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
7110: 20 69 50 61 72 6d 2b 31 2c 20 72 31 29 3b 0a 20   iParm+1, r1);. 
7120: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
7130: 53 6f 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Sort==0 );.     
7140: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
7150: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
7160: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
7170: 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ter(pParse, pSor
7180: 74 2c 20 70 2c 20 72 31 2b 6e 50 72 65 66 69 78  t, p, r1+nPrefix
7190: 52 65 67 2c 20 31 2c 20 6e 50 72 65 66 69 78 52  Reg, 1, nPrefixR
71a0: 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
71b0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 32  {.        int r2
71c0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
71d0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
71e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
71f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
7200: 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72  wRowid, iParm, r
7210: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
7220: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7230: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72   OP_Insert, iPar
7240: 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20  m, r1, r2);.    
7250: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
7260: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
7270: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
7280: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
7290: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
72a0: 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r2);.      }.  
72b0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
72c0: 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
72d0: 73 65 2c 20 72 31 2c 20 6e 50 72 65 66 69 78 52  se, r1, nPrefixR
72e0: 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 62 72 65  eg+1);.      bre
72f0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
7300: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
7310: 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49  UBQUERY.    /* I
7320: 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
7330: 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
7340: 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
7350: 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c  ...)" construct,
7360: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
7370: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73  re should be a s
7380: 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68  ingle item on th
7390: 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20  e stack.  Write 
73a0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d  this.    ** item
73b0: 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61   into the set ta
73c0: 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64  ble with bogus d
73d0: 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
73e0: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
73f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 52        assert( nR
7400: 65 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20  esultCol==1 );. 
7410: 20 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53       pDest->affS
7420: 64 73 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20  dst =.          
7430: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
7440: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
7450: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
7460: 72 2c 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73  r, pDest->affSds
7470: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  t);.      if( pS
7480: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ort ){.        /
7490: 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63  * At first glanc
74a0: 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e  e you would thin
74b0: 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d  k we could optim
74c0: 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20  ize out the.    
74d0: 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20      ** ORDER BY 
74e0: 69 6e 20 74 68 69 73 20 63 61 73 65 20 73 69 6e  in this case sin
74f0: 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  ce the order of 
7500: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 73  entries in the s
7510: 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f  et.        ** do
7520: 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20  es not matter.  
7530: 42 75 74 20 74 68 65 72 65 20 6d 69 67 68 74 20  But there might 
7540: 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  be a LIMIT claus
7550: 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20  e, in which.    
7560: 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20      ** case the 
7570: 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65  order does matte
7580: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73  r */.        pus
7590: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
75a0: 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65  se, pSort, p, re
75b0: 67 52 65 73 75 6c 74 2c 20 31 2c 20 6e 50 72 65  gResult, 1, nPre
75c0: 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  fixReg);.      }
75d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
75e0: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
75f0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
7600: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7610: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
7620: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
7630: 67 52 65 73 75 6c 74 2c 31 2c 72 31 2c 20 26 70  gResult,1,r1, &p
7640: 44 65 73 74 2d 3e 61 66 66 53 64 73 74 2c 20 31  Dest->affSdst, 1
7650: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7660: 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
7670: 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
7680: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b  , regResult, 1);
7690: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
76a0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
76b0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
76c0: 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  m, r1);.        
76d0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
76e0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
76f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7700: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
7710: 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77     /* If any row
7720: 20 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65   exist in the re
7730: 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64  sult set, record
7740: 20 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61   that fact and a
7750: 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  bort..    */.   
7760: 20 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73   case SRT_Exists
7770: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
7780: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7790: 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50  P_Integer, 1, iP
77a0: 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  arm);.      /* T
77b0: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
77c0: 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  will terminate t
77d0: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
77e0: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
77f0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
7800: 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72  this is a scalar
7810: 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20   select that is 
7820: 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65  part of an expre
7830: 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ssion, then.    
7840: 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  ** store the res
7850: 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72  ults in the appr
7860: 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63  opriate memory c
7870: 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75  ell and break ou
7880: 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
7890: 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a  scan loop..    *
78a0: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d  /.    case SRT_M
78b0: 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  em: {.      asse
78c0: 72 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d  rt( nResultCol==
78d0: 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1 );.      if( p
78e0: 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
78f0: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
7900: 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c  Parse, pSort, p,
7910: 20 72 65 67 52 65 73 75 6c 74 2c 20 31 2c 20 6e   regResult, 1, n
7920: 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20  PrefixReg);.    
7930: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7940: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
7950: 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67  Move(pParse, reg
7960: 52 65 73 75 6c 74 2c 20 69 50 61 72 6d 2c 20 31  Result, iParm, 1
7970: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  );.        /* Th
7980: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
7990: 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20  ill jump out of 
79a0: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
79b0: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
79c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
79d0: 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
79e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
79f0: 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 63 61 73  UERY */..    cas
7a00: 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a  e SRT_Coroutine:
7a10: 20 20 20 20 20 20 20 2f 2a 20 53 65 6e 64 20 64         /* Send d
7a20: 61 74 61 20 74 6f 20 61 20 63 6f 2d 72 6f 75 74  ata to a co-rout
7a30: 69 6e 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ine */.    case 
7a40: 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b 20 20 20  SRT_Output: {   
7a50: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
7a60: 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  he results */.  
7a70: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
7a80: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
7a90: 6e 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ne );.      test
7aa0: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
7ab0: 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20  _Output );.     
7ac0: 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20   if( pSort ){.  
7ad0: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
7ae0: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f  rter(pParse, pSo
7af0: 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74  rt, p, regResult
7b00: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50  , nResultCol, nP
7b10: 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20  refixReg);.     
7b20: 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74   }else if( eDest
7b30: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
7b40: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7b50: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
7b60: 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d  OP_Yield, pDest-
7b70: 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  >iSDParm);.     
7b80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7b90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7ba0: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
7bb0: 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  w, regResult, nR
7bc0: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
7bd0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
7be0: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
7bf0: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73  e(pParse, regRes
7c00: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  ult, nResultCol)
7c10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7c20: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
7c30: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7c40: 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20 57 72 69  T_CTE.    /* Wri
7c50: 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  te the results i
7c60: 6e 74 6f 20 61 20 70 72 69 6f 72 69 74 79 20 71  nto a priority q
7c70: 75 65 75 65 20 74 68 61 74 20 69 73 20 6f 72 64  ueue that is ord
7c80: 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 0a  er according to.
7c90: 20 20 20 20 2a 2a 20 70 44 65 73 74 2d 3e 70 4f      ** pDest->pO
7ca0: 72 64 65 72 42 79 20 28 69 6e 20 70 53 4f 29 2e  rderBy (in pSO).
7cb0: 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d    pDest->iSDParm
7cc0: 20 28 69 6e 20 69 50 61 72 6d 29 20 69 73 20 74   (in iParm) is t
7cd0: 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20 61 6e  he cursor for an
7ce0: 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 77 69  .    ** index wi
7cf0: 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72 2b 32 20  th pSO->nExpr+2 
7d00: 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69 6c 64 20  columns.  Build 
7d10: 61 20 6b 65 79 20 75 73 69 6e 67 20 70 53 4f 20  a key using pSO 
7d20: 66 6f 72 20 74 68 65 20 66 69 72 73 74 0a 20 20  for the first.  
7d30: 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78 70 72 20    ** pSO->nExpr 
7d40: 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6d 61  columns, then ma
7d50: 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b 65 79 73  ke sure all keys
7d60: 20 61 72 65 20 75 6e 69 71 75 65 20 62 79 20 61   are unique by a
7d70: 64 64 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66  dding a.    ** f
7d80: 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65 6e 63 65  inal OP_Sequence
7d90: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 6c 61   column.  The la
7da0: 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65  st column is the
7db0: 20 72 65 63 6f 72 64 20 61 73 20 61 20 62 6c 6f   record as a blo
7dc0: 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  b..    */.    ca
7dd0: 73 65 20 53 52 54 5f 44 69 73 74 51 75 65 75 65  se SRT_DistQueue
7de0: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 51  :.    case SRT_Q
7df0: 75 65 75 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e  ueue: {.      in
7e00: 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20 69 6e  t nKey;.      in
7e10: 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 20 20  t r1, r2, r3;.  
7e20: 20 20 20 20 69 6e 74 20 61 64 64 72 54 65 73 74      int addrTest
7e30: 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78 70 72   = 0;.      Expr
7e40: 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20 20 20 20  List *pSO;.     
7e50: 20 70 53 4f 20 3d 20 70 44 65 73 74 2d 3e 70 4f   pSO = pDest->pO
7e60: 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 61 73  rderBy;.      as
7e70: 73 65 72 74 28 20 70 53 4f 20 29 3b 0a 20 20 20  sert( pSO );.   
7e80: 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f 2d 3e 6e     nKey = pSO->n
7e90: 45 78 70 72 3b 0a 20 20 20 20 20 20 72 31 20 3d  Expr;.      r1 =
7ea0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
7eb0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
7ec0: 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65    r2 = sqlite3Ge
7ed0: 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
7ee0: 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20  e, nKey+2);.    
7ef0: 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65 79 2b 31    r3 = r2+nKey+1
7f00: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  ;.      if( eDes
7f10: 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65  t==SRT_DistQueue
7f20: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
7f30: 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  f the destinatio
7f40: 6e 20 69 73 20 44 69 73 74 51 75 65 75 65 2c 20  n is DistQueue, 
7f50: 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50 61  then cursor (iPa
7f60: 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20 20  rm+1) is open.  
7f70: 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 20 73 65        ** on a se
7f80: 63 6f 6e 64 20 65 70 68 65 6d 65 72 61 6c 20 69  cond ephemeral i
7f90: 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20  ndex that holds 
7fa0: 61 6c 6c 20 76 61 6c 75 65 73 20 65 76 65 72 79  all values every
7fb0: 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20 20 20   previously.    
7fc0: 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74 6f 20      ** added to 
7fd0: 74 68 65 20 71 75 65 75 65 2e 20 2a 2f 0a 20 20  the queue. */.  
7fe0: 20 20 20 20 20 20 61 64 64 72 54 65 73 74 20 3d        addrTest =
7ff0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8000: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e  p4Int(v, OP_Foun
8010: 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30 2c 20 0a  d, iParm+1, 0, .
8020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8040: 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75 6c          regResul
8050: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
8060: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
8070: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
8080: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8090: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
80a0: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
80b0: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
80c0: 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 69 66 28  , r3);.      if(
80d0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74   eDest==SRT_Dist
80e0: 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20  Queue ){.       
80f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8100: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
8110: 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 33 29  rt, iParm+1, r3)
8120: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
8130: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
8140: 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
8150: 45 53 55 4c 54 29 3b 0a 20 20 20 20 20 20 7d 0a  ESULT);.      }.
8160: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
8170: 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nKey; i++){.   
8180: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8190: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
81a0: 70 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  py,.            
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
81c0: 67 52 65 73 75 6c 74 20 2b 20 70 53 4f 2d 3e 61  gResult + pSO->a
81d0: 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
81e0: 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20 20 20 20  Col - 1,.       
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8200: 20 20 20 72 32 2b 69 29 3b 0a 20 20 20 20 20 20     r2+i);.      
8210: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
8220: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8230: 53 65 71 75 65 6e 63 65 2c 20 69 50 61 72 6d 2c  Sequence, iParm,
8240: 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20 20 20 20   r2+nKey);.     
8250: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8260: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
8270: 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 2c  ord, r2, nKey+2,
8280: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
8290: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
82a0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
82b0: 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20  Parm, r1);.     
82c0: 20 69 66 28 20 61 64 64 72 54 65 73 74 20 29 20   if( addrTest ) 
82d0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
82e0: 65 72 65 28 76 2c 20 61 64 64 72 54 65 73 74 29  ere(v, addrTest)
82f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
8300: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
8310: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
8320: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
8330: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
8340: 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20   r2, nKey+2);.  
8350: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8360: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
8370: 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 0a  E_OMIT_CTE */...
8380: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
8390: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
83a0: 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72  R).    /* Discar
83b0: 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20  d the results.  
83c0: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
83d0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
83e0: 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a  ts inside.    **
83f0: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54   the body of a T
8400: 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75 72  RIGGER.  The pur
8410: 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c  pose of such sel
8420: 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a  ects is to call.
8430: 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69      ** user-defi
8440: 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  ned functions th
8450: 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66 66  at have side eff
8460: 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74  ects.  We do not
8470: 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f   care.    ** abo
8480: 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65  ut the actual re
8490: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
84a0: 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ect..    */.    
84b0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
84c0: 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d   assert( eDest==
84d0: 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20  SRT_Discard );. 
84e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
84f0: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  }.#endif.  }..  
8500: 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65  /* Jump to the e
8510: 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  nd of the loop i
8520: 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72  f the LIMIT is r
8530: 65 61 63 68 65 64 2e 20 20 45 78 63 65 70 74 2c  eached.  Except,
8540: 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65 20 69   if.  ** there i
8550: 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e 20 77  s a sorter, in w
8560: 68 69 63 68 20 63 61 73 65 20 74 68 65 20 73 6f  hich case the so
8570: 72 74 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  rter has already
8580: 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20 74 68   limited.  ** th
8590: 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75 73 2e  e output for us.
85a0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 6f 72  .  */.  if( pSor
85b0: 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69 6d 69  t==0 && p->iLimi
85c0: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
85d0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
85e0: 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d  _IfZero, p->iLim
85f0: 69 74 2c 20 69 42 72 65 61 6b 2c 20 2d 31 29 3b  it, iBreak, -1);
8600: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
8610: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
8620: 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66  llocate a KeyInf
8630: 6f 20 6f 62 6a 65 63 74 20 73 75 66 66 69 63 69  o object suffici
8640: 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e 64 65 78  ent for an index
8650: 20 6f 66 20 4e 20 6b 65 79 20 63 6f 6c 75 6d 6e   of N key column
8660: 73 20 61 6e 64 0a 2a 2a 20 58 20 65 78 74 72 61  s and.** X extra
8670: 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79   columns..*/.Key
8680: 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79  Info *sqlite3Key
8690: 49 6e 66 6f 41 6c 6c 6f 63 28 73 71 6c 69 74 65  InfoAlloc(sqlite
86a0: 33 20 2a 64 62 2c 20 69 6e 74 20 4e 2c 20 69 6e  3 *db, int N, in
86b0: 74 20 58 29 7b 0a 20 20 4b 65 79 49 6e 66 6f 20  t X){.  KeyInfo 
86c0: 2a 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  *p = sqlite3DbMa
86d0: 6c 6c 6f 63 5a 65 72 6f 28 30 2c 20 0a 20 20 20  llocZero(0, .   
86e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86f0: 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20  sizeof(KeyInfo) 
8700: 2b 20 28 4e 2b 58 29 2a 28 73 69 7a 65 6f 66 28  + (N+X)*(sizeof(
8710: 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 29 3b 0a 20  CollSeq*)+1));. 
8720: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d   if( p ){.    p-
8730: 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
8740: 38 2a 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58  8*)&p->aColl[N+X
8750: 5d 3b 0a 20 20 20 20 70 2d 3e 6e 46 69 65 6c 64  ];.    p->nField
8760: 20 3d 20 28 75 31 36 29 4e 3b 0a 20 20 20 20 70   = (u16)N;.    p
8770: 2d 3e 6e 58 46 69 65 6c 64 20 3d 20 28 75 31 36  ->nXField = (u16
8780: 29 58 3b 0a 20 20 20 20 70 2d 3e 65 6e 63 20 3d  )X;.    p->enc =
8790: 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 2d   ENC(db);.    p-
87a0: 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d  >db = db;.    p-
87b0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 7d 65 6c  >nRef = 1;.  }el
87c0: 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c  se{.    db->mall
87d0: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
87e0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
87f0: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
8800: 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  e a KeyInfo obje
8810: 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  ct.*/.void sqlit
8820: 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 4b  e3KeyInfoUnref(K
8830: 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66  eyInfo *p){.  if
8840: 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ( p ){.    asser
8850: 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  t( p->nRef>0 );.
8860: 20 20 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a 20      p->nRef--;. 
8870: 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d     if( p->nRef==
8880: 30 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  0 ) sqlite3DbFre
8890: 65 28 30 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  e(0, p);.  }.}..
88a0: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 6e 65 77  /*.** Make a new
88b0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65   pointer to a Ke
88c0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a  yInfo object.*/.
88d0: 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  KeyInfo *sqlite3
88e0: 4b 65 79 49 6e 66 6f 52 65 66 28 4b 65 79 49 6e  KeyInfoRef(KeyIn
88f0: 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  fo *p){.  if( p 
8900: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
8910: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
8920: 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20  p->nRef++;.  }. 
8930: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23 69   return p;.}..#i
8940: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
8950: 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  G./*.** Return T
8960: 52 55 45 20 69 66 20 61 20 4b 65 79 49 6e 66 6f  RUE if a KeyInfo
8970: 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 20 63   object can be c
8980: 68 61 6e 67 65 2e 20 20 54 68 65 20 4b 65 79 49  hange.  The KeyI
8990: 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 63 61  nfo object.** ca
89a0: 6e 20 6f 6e 6c 79 20 62 65 20 63 68 61 6e 67 65  n only be change
89b0: 64 20 69 66 20 74 68 69 73 20 69 73 20 6a 75 73  d if this is jus
89c0: 74 20 61 20 73 69 6e 67 6c 65 20 72 65 66 65 72  t a single refer
89d0: 65 6e 63 65 20 74 6f 20 74 68 65 20 6f 62 6a 65  ence to the obje
89e0: 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ct..**.** This r
89f0: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f  outine is used o
8a00: 6e 6c 79 20 69 6e 73 69 64 65 20 6f 66 20 61 73  nly inside of as
8a10: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
8a20: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
8a30: 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
8a40: 62 6c 65 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b  ble(KeyInfo *p){
8a50: 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 66 3d   return p->nRef=
8a60: 3d 31 3b 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  =1; }.#endif /* 
8a70: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
8a80: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20  ./*.** Given an 
8a90: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c  expression list,
8aa0: 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79 49   generate a KeyI
8ab0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
8ac0: 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68  at records.** th
8ad0: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
8ae0: 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65 78  ence for each ex
8af0: 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61 74  pression in that
8b00: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
8b10: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45  ..**.** If the E
8b20: 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f 52  xprList is an OR
8b30: 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
8b40: 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74  BY clause then t
8b50: 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20  he resulting.** 
8b60: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
8b70: 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  e is appropriate
8b80: 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e   for initializin
8b90: 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65  g a virtual inde
8ba0: 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  x to.** implemen
8bb0: 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20 20  t that clause.  
8bc0: 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20  If the ExprList 
8bd0: 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  is the result se
8be0: 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a  t of a SELECT.**
8bf0: 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e 66   then the KeyInf
8c00: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
8c10: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
8c20: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
8c30: 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74  rtual.** index t
8c40: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49  o implement a DI
8c50: 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a  STINCT test..**.
8c60: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
8c70: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
8c80: 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e  ucture is obtain
8c90: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54   from malloc.  T
8ca0: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
8cb0: 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e  nction is respon
8cc0: 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67  sible for seeing
8cd0: 20 74 68 61 74 20 74 68 69 73 20 73 74 72 75 63   that this struc
8ce0: 74 75 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c  ture is eventual
8cf0: 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a  ly.** freed..*/.
8d00: 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a  static KeyInfo *
8d10: 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
8d20: 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ist(.  Parse *pP
8d30: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
8d40: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
8d50: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
8d60: 69 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d  ist,     /* Form
8d70: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a   the KeyInfo obj
8d80: 65 63 74 20 66 72 6f 6d 20 74 68 69 73 20 45 78  ect from this Ex
8d90: 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  prList */.  int 
8da0: 69 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20  iStart,         
8db0: 20 2f 2a 20 42 65 67 69 6e 20 77 69 74 68 20 74   /* Begin with t
8dc0: 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c  his column of pL
8dd0: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ist */.  int nEx
8de0: 74 72 61 20 20 20 20 20 20 20 20 20 20 20 2f 2a  tra           /*
8df0: 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 65   Add this many e
8e00: 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  xtra columns to 
8e10: 74 68 65 20 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20  the end */.){.  
8e20: 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79  int nExpr;.  Key
8e30: 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73  Info *pInfo;.  s
8e40: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
8e50: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71  tem *pItem;.  sq
8e60: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
8e70: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b  se->db;.  int i;
8e80: 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c 69 73  ..  nExpr = pLis
8e90: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66  t->nExpr;.  pInf
8ea0: 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
8eb0: 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70  foAlloc(db, nExp
8ec0: 72 2b 6e 45 78 74 72 61 2d 69 53 74 61 72 74 2c  r+nExtra-iStart,
8ed0: 20 31 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f   1);.  if( pInfo
8ee0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
8ef0: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
8f00: 57 72 69 74 65 61 62 6c 65 28 70 49 6e 66 6f 29  Writeable(pInfo)
8f10: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 69 53   );.    for(i=iS
8f20: 74 61 72 74 2c 20 70 49 74 65 6d 3d 70 4c 69 73  tart, pItem=pLis
8f30: 74 2d 3e 61 2b 69 53 74 61 72 74 3b 20 69 3c 6e  t->a+iStart; i<n
8f40: 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
8f50: 2b 2b 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  ++){.      CollS
8f60: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  eq *pColl;.     
8f70: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
8f80: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
8f90: 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
8fa0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 43  );.      if( !pC
8fb0: 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  oll ) pColl = db
8fc0: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
8fd0: 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b     pInfo->aColl[
8fe0: 69 2d 69 53 74 61 72 74 5d 20 3d 20 70 43 6f 6c  i-iStart] = pCol
8ff0: 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  l;.      pInfo->
9000: 61 53 6f 72 74 4f 72 64 65 72 5b 69 2d 69 53 74  aSortOrder[i-iSt
9010: 61 72 74 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f  art] = pItem->so
9020: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20  rtOrder;.    }. 
9030: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66   }.  return pInf
9040: 6f 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  o;.}..#ifndef SQ
9050: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
9060: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
9070: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e  Name of the conn
9080: 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c  ection operator,
9090: 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20   used for error 
90a0: 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61  messages..*/.sta
90b0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
90c0: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74  selectOpName(int
90d0: 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b   id){.  char *z;
90e0: 0a 20 20 73 77 69 74 63 68 28 20 69 64 20 29 7b  .  switch( id ){
90f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c  .    case TK_ALL
9100: 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49  :       z = "UNI
9110: 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b  ON ALL";   break
9120: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  ;.    case TK_IN
9130: 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e  TERSECT: z = "IN
9140: 54 45 52 53 45 43 54 22 3b 20 20 20 62 72 65 61  TERSECT";   brea
9150: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  k;.    case TK_E
9160: 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45  XCEPT:    z = "E
9170: 58 43 45 50 54 22 3b 20 20 20 20 20 20 62 72 65  XCEPT";      bre
9180: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
9190: 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22             z = "
91a0: 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72  UNION";       br
91b0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
91c0: 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n z;.}.#endif /*
91d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
91e0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a  POUND_SELECT */.
91f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9200: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a  OMIT_EXPLAIN./*.
9210: 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58  ** Unless an "EX
9220: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
9230: 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69  " command is bei
9240: 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68  ng processed, th
9250: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
9260: 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72  s a no-op. Other
9270: 77 69 73 65 2c 20 69 74 20 61 64 64 73 20 61 20  wise, it adds a 
9280: 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75  single row of ou
9290: 74 70 75 74 20 74 6f 20 74 68 65 20 45 51 50 20  tput to the EQP 
92a0: 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65  result,.** where
92b0: 20 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20   the caption is 
92c0: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
92d0: 2a 2a 20 20 20 22 55 53 45 20 54 45 4d 50 20 42  **   "USE TEMP B
92e0: 2d 54 52 45 45 20 46 4f 52 20 78 78 78 22 0a 2a  -TREE FOR xxx".*
92f0: 2a 0a 2a 2a 20 77 68 65 72 65 20 78 78 78 20 69  *.** where xxx i
9300: 73 20 6f 6e 65 20 6f 66 20 22 44 49 53 54 49 4e  s one of "DISTIN
9310: 43 54 22 2c 20 22 4f 52 44 45 52 20 42 59 22 20  CT", "ORDER BY" 
9320: 6f 72 20 22 47 52 4f 55 50 20 42 59 22 2e 20 45  or "GROUP BY". E
9330: 78 61 63 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20  xactly which.** 
9340: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
9350: 20 74 68 65 20 7a 55 73 61 67 65 20 61 72 67 75   the zUsage argu
9360: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
9370: 76 6f 69 64 20 65 78 70 6c 61 69 6e 54 65 6d 70  void explainTemp
9380: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
9390: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
93a0: 2a 7a 55 73 61 67 65 29 7b 0a 20 20 69 66 28 20  *zUsage){.  if( 
93b0: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
93c0: 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  =2 ){.    Vdbe *
93d0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
93e0: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  e;.    char *zMs
93f0: 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
9400: 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22  tf(pParse->db, "
9410: 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20  USE TEMP B-TREE 
9420: 46 4f 52 20 25 73 22 2c 20 7a 55 73 61 67 65 29  FOR %s", zUsage)
9430: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
9440: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78  eAddOp4(v, OP_Ex
9450: 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69  plain, pParse->i
9460: 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20  SelectId, 0, 0, 
9470: 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zMsg, P4_DYNAMIC
9480: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
9490: 41 73 73 69 67 6e 20 65 78 70 72 65 73 73 69 6f  Assign expressio
94a0: 6e 20 62 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e  n b to lvalue a.
94b0: 20 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70   A second, no-op
94c0: 2c 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69  , version of thi
94d0: 73 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72  s macro.** is pr
94e0: 6f 76 69 64 65 64 20 77 68 65 6e 20 53 51 4c 49  ovided when SQLI
94f0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
9500: 69 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73  is defined. This
9510: 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64 65   allows the code
9520: 0a 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33 53 65  .** in sqlite3Se
9530: 6c 65 63 74 28 29 20 74 6f 20 61 73 73 69 67 6e  lect() to assign
9540: 20 76 61 6c 75 65 73 20 74 6f 20 73 74 72 75 63   values to struc
9550: 74 75 72 65 20 6d 65 6d 62 65 72 20 76 61 72 69  ture member vari
9560: 61 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e  ables that.** on
9570: 6c 79 20 65 78 69 73 74 20 69 66 20 53 51 4c 49  ly exist if SQLI
9580: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
9590: 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 77  is not defined w
95a0: 69 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67  ithout polluting
95b0: 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74   the.** code wit
95c0: 68 20 23 69 66 6e 64 65 66 20 64 69 72 65 63 74  h #ifndef direct
95d0: 69 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e  ives..*/.# defin
95e0: 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65  e explainSetInte
95f0: 67 65 72 28 61 2c 20 62 29 20 61 20 3d 20 62 0a  ger(a, b) a = b.
9600: 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20  .#else./* No-op 
9610: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
9620: 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e  explainXXX() fun
9630: 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f  ctions and macro
9640: 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65  s. */.# define e
9650: 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
9660: 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20 65 78  y,z).# define ex
9670: 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
9680: 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  y,z).#endif..#if
9690: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
96a0: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 26  _OMIT_EXPLAIN) &
96b0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
96c0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
96d0: 53 45 4c 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e  SELECT)./*.** Un
96e0: 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e  less an "EXPLAIN
96f0: 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d   QUERY PLAN" com
9700: 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72  mand is being pr
9710: 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20 66 75  ocessed, this fu
9720: 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e  nction.** is a n
9730: 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  o-op. Otherwise,
9740: 20 69 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c   it adds a singl
9750: 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20  e row of output 
9760: 74 6f 20 74 68 65 20 45 51 50 20 72 65 73 75 6c  to the EQP resul
9770: 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20  t,.** where the 
9780: 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 6f 6e  caption is of on
9790: 65 20 6f 66 20 74 68 65 20 74 77 6f 20 66 6f 72  e of the two for
97a0: 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d  ms:.**.**   "COM
97b0: 50 4f 53 49 54 45 20 53 55 42 51 55 45 52 49 45  POSITE SUBQUERIE
97c0: 53 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62  S iSub1 and iSub
97d0: 32 20 28 6f 70 29 22 0a 2a 2a 20 20 20 22 43 4f  2 (op)".**   "CO
97e0: 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45 52 49  MPOSITE SUBQUERI
97f0: 45 53 20 69 53 75 62 31 20 61 6e 64 20 69 53 75  ES iSub1 and iSu
9800: 62 32 20 55 53 49 4e 47 20 54 45 4d 50 20 42 2d  b2 USING TEMP B-
9810: 54 52 45 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a  TREE (op)".**.**
9820: 20 77 68 65 72 65 20 69 53 75 62 31 20 61 6e 64   where iSub1 and
9830: 20 69 53 75 62 32 20 61 72 65 20 74 68 65 20 69   iSub2 are the i
9840: 6e 74 65 67 65 72 73 20 70 61 73 73 65 64 20 61  ntegers passed a
9850: 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  s the correspond
9860: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ing.** function 
9870: 70 61 72 61 6d 65 74 65 72 73 2c 20 61 6e 64 20  parameters, and 
9880: 6f 70 20 69 73 20 74 68 65 20 74 65 78 74 20 72  op is the text r
9890: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
98a0: 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 0a 2a   the parameter.*
98b0: 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61  * of the same na
98c0: 6d 65 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65  me. The paramete
98d0: 72 20 22 6f 70 22 20 6d 75 73 74 20 62 65 20 6f  r "op" must be o
98e0: 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20  ne of TK_UNION, 
98f0: 54 4b 5f 45 58 43 45 50 54 2c 0a 2a 2a 20 54 4b  TK_EXCEPT,.** TK
9900: 5f 49 4e 54 45 52 53 45 43 54 20 6f 72 20 54 4b  _INTERSECT or TK
9910: 5f 41 4c 4c 2e 20 54 68 65 20 66 69 72 73 74 20  _ALL. The first 
9920: 66 6f 72 6d 20 69 73 20 75 73 65 64 20 69 66 20  form is used if 
9930: 61 72 67 75 6d 65 6e 74 20 62 55 73 65 54 6d 70  argument bUseTmp
9940: 20 69 73 20 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f   is .** false, o
9950: 72 20 74 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  r the second for
9960: 6d 20 69 66 20 69 74 20 69 73 20 74 72 75 65 2e  m if it is true.
9970: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9980: 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65  explainComposite
9990: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
99a0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
99b0: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
99c0: 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  text */.  int op
99d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
99e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
99f0: 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b   of TK_UNION, TK
9a00: 5f 45 58 43 45 50 54 20 65 74 63 2e 20 2a 2f 0a  _EXCEPT etc. */.
9a10: 20 20 69 6e 74 20 69 53 75 62 31 2c 20 20 20 20    int iSub1,    
9a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a30: 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64    /* Subquery id
9a40: 20 31 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62   1 */.  int iSub
9a50: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2,              
9a60: 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75          /* Subqu
9a70: 65 72 79 20 69 64 20 32 20 2a 2f 0a 20 20 69 6e  ery id 2 */.  in
9a80: 74 20 62 55 73 65 54 6d 70 20 20 20 20 20 20 20  t bUseTmp       
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9aa0: 20 54 72 75 65 20 69 66 20 61 20 74 65 6d 70 20   True if a temp 
9ab0: 74 61 62 6c 65 20 77 61 73 20 75 73 65 64 20 2a  table was used *
9ac0: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6f  /.){.  assert( o
9ad0: 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f  p==TK_UNION || o
9ae0: 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20  p==TK_EXCEPT || 
9af0: 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
9b00: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29   || op==TK_ALL )
9b10: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
9b20: 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
9b30: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
9b40: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63  se->pVdbe;.    c
9b50: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69  har *zMsg = sqli
9b60: 74 65 33 4d 50 72 69 6e 74 66 28 0a 20 20 20 20  te3MPrintf(.    
9b70: 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20      pParse->db, 
9b80: 22 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51 55 45  "COMPOUND SUBQUE
9b90: 52 49 45 53 20 25 64 20 41 4e 44 20 25 64 20 25  RIES %d AND %d %
9ba0: 73 28 25 73 29 22 2c 20 69 53 75 62 31 2c 20 69  s(%s)", iSub1, i
9bb0: 53 75 62 32 2c 0a 20 20 20 20 20 20 20 20 62 55  Sub2,.        bU
9bc0: 73 65 54 6d 70 3f 22 55 53 49 4e 47 20 54 45 4d  seTmp?"USING TEM
9bd0: 50 20 42 2d 54 52 45 45 20 22 3a 22 22 2c 20 73  P B-TREE ":"", s
9be0: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 6f 70 29 0a  electOpName(op).
9bf0: 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
9c00: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
9c10: 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72  OP_Explain, pPar
9c20: 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30  se->iSelectId, 0
9c30: 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59  , 0, zMsg, P4_DY
9c40: 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  NAMIC);.  }.}.#e
9c50: 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72  lse./* No-op ver
9c60: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70  sions of the exp
9c70: 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69  lainXXX() functi
9c80: 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20  ons and macros. 
9c90: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  */.# define expl
9ca0: 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 76 2c 77  ainComposite(v,w
9cb0: 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a  ,x,y,z).#endif..
9cc0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e  /*.** If the inn
9cd0: 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65  er loop was gene
9ce0: 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f  rated using a no
9cf0: 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20  n-null pOrderBy 
9d00: 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65  argument,.** the
9d10: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65  n the results we
9d20: 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73  re placed in a s
9d30: 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68  orter.  After th
9d40: 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e  e loop is termin
9d50: 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20  ated.** we need 
9d60: 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65  to run the sorte
9d70: 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65  r and output the
9d80: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66   results.  The f
9d90: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74  ollowing.** rout
9da0: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
9db0: 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f  e code needed to
9dc0: 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61   do that..*/.sta
9dd0: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
9de0: 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72  eSortTail(.  Par
9df0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
9e00: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
9e10: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
9e20: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
9e30: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
9e40: 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70   */.  SortCtx *p
9e50: 53 6f 72 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72  Sort,   /* Infor
9e60: 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52  mation on the OR
9e70: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
9e80: 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20  .  int nColumn, 
9e90: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9ea0: 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74  f columns of dat
9eb0: 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  a */.  SelectDes
9ec0: 74 20 2a 70 44 65 73 74 20 2f 2a 20 57 72 69 74  t *pDest /* Writ
9ed0: 65 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 73  e the sorted res
9ee0: 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
9ef0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
9f00: 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
9f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9f20: 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
9f30: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
9f40: 74 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71  t addrBreak = sq
9f50: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
9f60: 65 6c 28 76 29 3b 20 20 20 20 20 2f 2a 20 4a 75  el(v);     /* Ju
9f70: 6d 70 20 68 65 72 65 20 74 6f 20 65 78 69 74 20  mp here to exit 
9f80: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
9f90: 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c  drContinue = sql
9fa0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
9fb0: 6c 28 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68  l(v);  /* Jump h
9fc0: 65 72 65 20 66 6f 72 20 6e 65 78 74 20 63 79 63  ere for next cyc
9fd0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  le */.  int addr
9fe0: 3b 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e 63 65  ;.  int addrOnce
9ff0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62   = 0;.  int iTab
a000: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  ;.  ExprList *pO
a010: 72 64 65 72 42 79 20 3d 20 70 53 6f 72 74 2d 3e  rderBy = pSort->
a020: 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20  pOrderBy;.  int 
a030: 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65  eDest = pDest->e
a040: 44 65 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72  Dest;.  int iPar
a050: 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61  m = pDest->iSDPa
a060: 72 6d 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77  rm;.  int regRow
a070: 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64  ;.  int regRowid
a080: 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20  ;.  int nKey;.  
a090: 69 6e 74 20 69 53 6f 72 74 54 61 62 3b 20 20 20  int iSortTab;   
a0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0b0: 2f 2a 20 53 6f 72 74 65 72 20 63 75 72 73 6f 72  /* Sorter cursor
a0c0: 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
a0d0: 0a 20 20 69 6e 74 20 6e 53 6f 72 74 44 61 74 61  .  int nSortData
a0e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a0f0: 20 20 20 2f 2a 20 54 72 61 69 6c 69 6e 67 20 76     /* Trailing v
a100: 61 6c 75 65 73 20 74 6f 20 72 65 61 64 20 66 72  alues to read fr
a110: 6f 6d 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 75  om sorter */.  u
a120: 38 20 70 35 3b 20 20 20 20 20 20 20 20 20 20 20  8 p5;           
a130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a140: 2a 20 70 35 20 70 61 72 61 6d 65 74 65 72 20 66  * p5 parameter f
a150: 6f 72 20 31 73 74 20 4f 50 5f 43 6f 6c 75 6d 6e  or 1st OP_Column
a160: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   */.  int i;.  i
a170: 6e 74 20 62 53 65 71 3b 20 20 20 20 20 20 20 20  nt bSeq;        
a180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a190: 2a 20 54 72 75 65 20 69 66 20 73 6f 72 74 65 72  * True if sorter
a1a0: 20 72 65 63 6f 72 64 20 69 6e 63 6c 75 64 65 73   record includes
a1b0: 20 73 65 71 2e 20 6e 6f 2e 20 2a 2f 0a 23 69 66   seq. no. */.#if
a1c0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
a1d0: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
a1e0: 54 53 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  TS.  struct Expr
a1f0: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4f 75 74 45  List_item *aOutE
a200: 78 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  x = p->pEList->a
a210: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
a220: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
a230: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
a240: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
a250: 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72  _Gosub, pSort->r
a260: 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d  egReturn, pSort-
a270: 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20  >labelBkOut);.  
a280: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a290: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
a2a0: 30 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  0, addrBreak);. 
a2b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
a2c0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 53  solveLabel(v, pS
a2d0: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29  ort->labelBkOut)
a2e0: 3b 0a 20 20 7d 0a 20 20 69 54 61 62 20 3d 20 70  ;.  }.  iTab = p
a2f0: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 3b 0a  Sort->iECursor;.
a300: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
a310: 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74  _Output || eDest
a320: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
a330: 29 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20  ){.    regRowid 
a340: 3d 20 30 3b 0a 20 20 20 20 72 65 67 52 6f 77 20  = 0;.    regRow 
a350: 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a  = pDest->iSdst;.
a360: 20 20 20 20 6e 53 6f 72 74 44 61 74 61 20 3d 20      nSortData = 
a370: 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65  nColumn;.  }else
a380: 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d  {.    regRowid =
a390: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
a3a0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
a3b0: 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  regRow = sqlite3
a3c0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
a3d0: 65 29 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61 74  e);.    nSortDat
a3e0: 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 6e 4b 65  a = 1;.  }.  nKe
a3f0: 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  y = pOrderBy->nE
a400: 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42  xpr - pSort->nOB
a410: 53 61 74 3b 0a 20 20 69 66 28 20 70 53 6f 72 74  Sat;.  if( pSort
a420: 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f  ->sortFlags & SO
a430: 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72  RTFLAG_UseSorter
a440: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 53   ){.    int regS
a450: 6f 72 74 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73  ortOut = ++pPars
a460: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 53 6f  e->nMem;.    iSo
a470: 72 74 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  rtTab = pParse->
a480: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 69 66 28 20  nTab++;.    if( 
a490: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
a4a0: 74 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4f  t ){.      addrO
a4b0: 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  nce = sqlite3Cod
a4c0: 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56  eOnce(pParse); V
a4d0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
a4e0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
a4f0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
a500: 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 53  P_OpenPseudo, iS
a510: 6f 72 74 54 61 62 2c 20 72 65 67 53 6f 72 74 4f  ortTab, regSortO
a520: 75 74 2c 20 6e 4b 65 79 2b 31 2b 6e 53 6f 72 74  ut, nKey+1+nSort
a530: 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 61  Data);.    if( a
a540: 64 64 72 4f 6e 63 65 20 29 20 73 71 6c 69 74 65  ddrOnce ) sqlite
a550: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
a560: 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20   addrOnce);.    
a570: 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74  addr = 1 + sqlit
a580: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a590: 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69  OP_SorterSort, i
a5a0: 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  Tab, addrBreak);
a5b0: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
a5c0: 65 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66  e(v);.    codeOf
a5d0: 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73  fset(v, p->iOffs
a5e0: 65 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65  et, addrContinue
a5f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a600: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
a610: 6f 72 74 65 72 44 61 74 61 2c 20 69 54 61 62 2c  orterData, iTab,
a620: 20 72 65 67 53 6f 72 74 4f 75 74 29 3b 0a 20 20   regSortOut);.  
a630: 20 20 70 35 20 3d 20 4f 50 46 4c 41 47 5f 43 4c    p5 = OPFLAG_CL
a640: 45 41 52 43 41 43 48 45 3b 0a 20 20 20 20 62 53  EARCACHE;.    bS
a650: 65 71 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  eq = 0;.  }else{
a660: 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20  .    addr = 1 + 
a670: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a680: 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54  2(v, OP_Sort, iT
a690: 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 20  ab, addrBreak); 
a6a0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
a6b0: 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28  .    codeOffset(
a6c0: 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61  v, p->iOffset, a
a6d0: 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  ddrContinue);.  
a6e0: 20 20 69 53 6f 72 74 54 61 62 20 3d 20 69 54 61    iSortTab = iTa
a6f0: 62 3b 0a 20 20 20 20 70 35 20 3d 20 30 3b 0a 20  b;.    p5 = 0;. 
a700: 20 20 20 62 53 65 71 20 3d 20 31 3b 0a 20 20 7d     bSeq = 1;.  }
a710: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53  .  for(i=0; i<nS
a720: 6f 72 74 44 61 74 61 3b 20 69 2b 2b 29 7b 0a 20  ortData; i++){. 
a730: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a740: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
a750: 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20 6e 4b 65  n, iSortTab, nKe
a760: 79 2b 62 53 65 71 2b 69 2c 20 72 65 67 52 6f 77  y+bSeq+i, regRow
a770: 2b 69 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d  +i);.    if( i==
a780: 30 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 43  0 ) sqlite3VdbeC
a790: 68 61 6e 67 65 50 35 28 76 2c 20 70 35 29 3b 0a  hangeP5(v, p5);.
a7a0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
a7b0: 28 76 2c 20 22 25 73 22 2c 20 61 4f 75 74 45 78  (v, "%s", aOutEx
a7c0: 5b 69 5d 2e 7a 4e 61 6d 65 20 3f 20 61 4f 75 74  [i].zName ? aOut
a7d0: 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3a 20 61 4f  Ex[i].zName : aO
a7e0: 75 74 45 78 5b 69 5d 2e 7a 53 70 61 6e 29 29 3b  utEx[i].zSpan));
a7f0: 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 65  .  }.  switch( e
a800: 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65  Dest ){.    case
a810: 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20   SRT_Table:.    
a820: 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
a830: 62 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  b: {.      testc
a840: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
a850: 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74  Table );.      t
a860: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
a870: 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a  SRT_EphemTab );.
a880: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a890: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
a8a0: 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72  wRowid, iParm, r
a8b0: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
a8c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a8d0: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
a8e0: 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20 72  iParm, regRow, r
a8f0: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
a900: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
a910: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
a920: 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72 65  PEND);.      bre
a930: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
a940: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
a950: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
a960: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
a970: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
a980: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
a990: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
a9a0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
a9b0: 20 72 65 67 52 6f 77 2c 20 31 2c 20 72 65 67 52   regRow, 1, regR
a9c0: 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20  owid,.          
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
a9e0: 44 65 73 74 2d 3e 61 66 66 53 64 73 74 2c 20 31  Dest->affSdst, 1
a9f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
aa00: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
aa10: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
aa20: 72 65 67 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20  regRow, 1);.    
aa30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
aa40: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
aa50: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ert, iParm, regR
aa60: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 62 72 65  owid);.      bre
aa70: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
aa80: 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
aa90: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
aaa0: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
aab0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
aac0: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  ove(pParse, regR
aad0: 6f 77 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  ow, iParm, 1);. 
aae0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
aaf0: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
ab00: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
ab10: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
ab20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
ab30: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
ab40: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
ab50: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
ab60: 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  put || eDest==SR
ab70: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a  T_Coroutine ); .
ab80: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ab90: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
aba0: 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
abb0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
abc0: 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20  Coroutine );.   
abd0: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
abe0: 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
abf0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ac00: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
ac10: 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53  ltRow, pDest->iS
ac20: 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  dst, nColumn);. 
ac30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
ac40: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
ac50: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 44  hange(pParse, pD
ac60: 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c  est->iSdst, nCol
ac70: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  umn);.      }els
ac80: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
ac90: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
aca0: 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d  OP_Yield, pDest-
acb0: 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  >iSDParm);.     
acc0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
acd0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
ace0: 72 65 67 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  regRowid ){.    
acf0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
ad00: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
ad10: 67 52 6f 77 29 3b 0a 20 20 20 20 73 71 6c 69 74  gRow);.    sqlit
ad20: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
ad30: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69  (pParse, regRowi
ad40: 64 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65  d);.  }.  /* The
ad50: 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c   bottom of the l
ad60: 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  oop.  */.  sqlit
ad70: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
ad80: 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e  el(v, addrContin
ad90: 75 65 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74  ue);.  if( pSort
ada0: 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f  ->sortFlags & SO
adb0: 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72  RTFLAG_UseSorter
adc0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
add0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
ade0: 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 54 61 62  SorterNext, iTab
adf0: 2c 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76  , addr); VdbeCov
ae00: 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73  erage(v);.  }els
ae10: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
ae20: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
ae30: 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29  ext, iTab, addr)
ae40: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
ae50: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f  );.  }.  if( pSo
ae60: 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 20 29 20  rt->regReturn ) 
ae70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ae80: 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
ae90: 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e  pSort->regReturn
aea0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
aeb0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
aec0: 61 64 64 72 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f  addrBreak);.}../
aed0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
aee0: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e  inter to a strin
aef0: 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  g containing the
af00: 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79   'declaration ty
af10: 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78  pe' of the.** ex
af20: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
af30: 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62  The string may b
af40: 65 20 74 72 65 61 74 65 64 20 61 73 20 73 74 61  e treated as sta
af50: 74 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65  tic by the calle
af60: 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72  r..**.** Also tr
af70: 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68  y to estimate th
af80: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65  e size of the re
af90: 74 75 72 6e 65 64 20 76 61 6c 75 65 20 61 6e 64  turned value and
afa0: 20 72 65 74 75 72 6e 20 74 68 61 74 0a 2a 2a 20   return that.** 
afb0: 72 65 73 75 6c 74 20 69 6e 20 2a 70 45 73 74 57  result in *pEstW
afc0: 69 64 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  idth..**.** The 
afd0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
afe0: 20 69 73 20 74 68 65 20 65 78 61 63 74 20 64 61   is the exact da
aff0: 74 61 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f  tatype definitio
b000: 6e 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  n extracted from
b010: 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c   the.** original
b020: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
b030: 61 74 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65  atement if the e
b040: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
b050: 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65  olumn. The.** de
b060: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66  claration type f
b070: 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64  or a ROWID field
b080: 20 69 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61   is INTEGER. Exa
b090: 63 74 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70  ctly when an exp
b0a0: 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f  ression.** is co
b0b0: 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d  nsidered a colum
b0c0: 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78  n can be complex
b0d0: 20 69 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65   in the presence
b0e0: 20 6f 66 20 73 75 62 71 75 65 72 69 65 73 2e 20   of subqueries. 
b0f0: 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65  The.** result-se
b100: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  t expression in 
b110: 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
b120: 77 69 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74  wing SELECT stat
b130: 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f  ements is .** co
b140: 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d  nsidered a colum
b150: 6e 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  n by this functi
b160: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  on..**.**   SELE
b170: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b  CT col FROM tbl;
b180: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45  .**   SELECT (SE
b190: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
b1a0: 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28  l;.**   SELECT (
b1b0: 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20  SELECT col FROM 
b1c0: 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43  tbl);.**   SELEC
b1d0: 54 20 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45  T abc FROM (SELE
b1e0: 43 54 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52  CT col AS abc FR
b1f0: 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20  OM tbl);.** .** 
b200: 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  The declaration 
b210: 74 79 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70  type for any exp
b220: 72 65 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68  ression other th
b230: 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e  an a column is N
b240: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ULL..**.** This 
b250: 72 6f 75 74 69 6e 65 20 68 61 73 20 65 69 74 68  routine has eith
b260: 65 72 20 33 20 6f 72 20 36 20 70 61 72 61 6d 65  er 3 or 6 parame
b270: 74 65 72 73 20 64 65 70 65 6e 64 69 6e 67 20 6f  ters depending o
b280: 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
b290: 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 45  .** the SQLITE_E
b2a0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
b2b0: 41 44 41 54 41 20 63 6f 6d 70 69 6c 65 2d 74 69  ADATA compile-ti
b2c0: 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65  me option is use
b2d0: 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  d..*/.#ifdef SQL
b2e0: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
b2f0: 4e 5f 4d 45 54 41 44 41 54 41 0a 23 20 64 65 66  N_METADATA.# def
b300: 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41  ine columnType(A
b310: 2c 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75  ,B,C,D,E,F) colu
b320: 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c 43  mnTypeImpl(A,B,C
b330: 2c 44 2c 45 2c 46 29 0a 73 74 61 74 69 63 20 63  ,D,E,F).static c
b340: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d  onst char *colum
b350: 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d  nTypeImpl(.  Nam
b360: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a  eContext *pNC, .
b370: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20    Expr *pExpr,. 
b380: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
b390: 4f 72 69 67 44 62 2c 0a 20 20 63 6f 6e 73 74 20  OrigDb,.  const 
b3a0: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 54 61 62  char **pzOrigTab
b3b0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
b3c0: 2a 70 7a 4f 72 69 67 43 6f 6c 2c 0a 20 20 75 38  *pzOrigCol,.  u8
b3d0: 20 2a 70 45 73 74 57 69 64 74 68 0a 29 7b 0a 20   *pEstWidth.){. 
b3e0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72   char const *zOr
b3f0: 69 67 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72  igDb = 0;.  char
b400: 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 54 61 62   const *zOrigTab
b410: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e   = 0;.  char con
b420: 73 74 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30  st *zOrigCol = 0
b430: 3b 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 21 64  ;.#else /* if !d
b440: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
b450: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
b460: 44 41 54 41 29 20 2a 2f 0a 23 20 64 65 66 69 6e  DATA) */.# defin
b470: 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42  e columnType(A,B
b480: 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e  ,C,D,E,F) column
b490: 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c 46 29 0a  TypeImpl(A,B,F).
b4a0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
b4b0: 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70  r *columnTypeImp
b4c0: 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  l(.  NameContext
b4d0: 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a   *pNC, .  Expr *
b4e0: 70 45 78 70 72 2c 0a 20 20 75 38 20 2a 70 45 73  pExpr,.  u8 *pEs
b4f0: 74 57 69 64 74 68 0a 29 7b 0a 23 65 6e 64 69 66  tWidth.){.#endif
b500: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
b510: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
b520: 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a 20  N_METADATA) */. 
b530: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79   char const *zTy
b540: 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b  pe = 0;.  int j;
b550: 0a 20 20 75 38 20 65 73 74 57 69 64 74 68 20 3d  .  u8 estWidth =
b560: 20 31 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52   1;..  if( NEVER
b570: 28 70 45 78 70 72 3d 3d 30 29 20 7c 7c 20 70 4e  (pExpr==0) || pN
b580: 43 2d 3e 70 53 72 63 4c 69 73 74 3d 3d 30 20 29  C->pSrcList==0 )
b590: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69   return 0;.  swi
b5a0: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
b5b0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
b5c0: 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  G_COLUMN:.    ca
b5d0: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
b5e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
b5f0: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
b600: 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20  umn. Locate the 
b610: 74 61 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e  table the column
b620: 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20   is being.      
b630: 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ** extracted fro
b640: 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74  m in NameContext
b650: 2e 70 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20  .pSrcList. This 
b660: 74 61 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61  table may be rea
b670: 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  l.      ** datab
b680: 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73  ase table or a s
b690: 75 62 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a  ubquery..      *
b6a0: 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
b6b0: 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Tab = 0;        
b6c0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72      /* Table str
b6d0: 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73  ucture column is
b6e0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
b6f0: 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  */.      Select 
b700: 2a 70 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20  *pS = 0;        
b710: 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74       /* Select t
b720: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74  he column is ext
b730: 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20  racted from */. 
b740: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
b750: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20  pExpr->iColumn; 
b760: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
b770: 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20  umn in pTab */. 
b780: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
b790: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
b7a0: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
b7b0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
b7c0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
b7d0: 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
b7e0: 70 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a  pNC && !pTab ){.
b7f0: 20 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20          SrcList 
b800: 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d  *pTabList = pNC-
b810: 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20  >pSrcList;.     
b820: 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61     for(j=0;j<pTa
b830: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70  bList->nSrc && p
b840: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43  TabList->a[j].iC
b850: 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54  ursor!=pExpr->iT
b860: 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20  able;j++);.     
b870: 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73     if( j<pTabLis
b880: 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20  t->nSrc ){.     
b890: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62       pTab = pTab
b8a0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b  List->a[j].pTab;
b8b0: 0a 20 20 20 20 20 20 20 20 20 20 70 53 20 3d 20  .          pS = 
b8c0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
b8d0: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
b8e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
b8f0: 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78   pNC = pNC->pNex
b900: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
b910: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
b920: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pTab==0 ){.     
b930: 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d     /* At one tim
b940: 65 2c 20 63 6f 64 65 20 73 75 63 68 20 61 73 20  e, code such as 
b950: 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77  "SELECT new.x" w
b960: 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 20  ithin a trigger 
b970: 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  would.        **
b980: 20 63 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64   cause this cond
b990: 69 74 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53  ition to run.  S
b9a0: 69 6e 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61  ince then, we ha
b9b0: 76 65 20 72 65 73 74 72 75 63 74 75 72 65 64 20  ve restructured 
b9c0: 68 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  how.        ** t
b9d0: 72 69 67 67 65 72 20 63 6f 64 65 20 69 73 20 67  rigger code is g
b9e0: 65 6e 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20  enerated and so 
b9f0: 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  this condition i
ba00: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20  s no longer .   
ba10: 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65       ** possible
ba20: 2e 20 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61  . However, it ca
ba30: 6e 20 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20  n still be true 
ba40: 66 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c  for statements l
ba50: 69 6b 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ike.        ** t
ba60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  he following:.  
ba70: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
ba80: 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
ba90: 4c 45 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45  LE t1(col INTEGE
baa0: 52 29 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  R);.        **  
bab0: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
bac0: 74 31 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f  t1.col) FROM FRO
bad0: 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a  M t1;.        **
bae0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e  .        ** when
baf0: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73   columnType() is
bb00: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65   called on the e
bb10: 78 70 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f  xpression "t1.co
bb20: 6c 22 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20  l" in the .     
bb30: 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74     ** sub-select
bb40: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
bb50: 73 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74  set the column t
bb60: 79 70 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65  ype to NULL, eve
bb70: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f  n.        ** tho
bb80: 75 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65  ugh it should re
bb90: 61 6c 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52  ally be "INTEGER
bba0: 22 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  "..        **.  
bbb0: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
bbc0: 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20   not a problem, 
bbd0: 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  as the column ty
bbe0: 70 65 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69  pe of "t1.col" i
bbf0: 73 20 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20  s never.        
bc00: 2a 2a 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f  ** used. When co
bc10: 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61  lumnType() is ca
bc20: 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72  lled on the expr
bc30: 65 73 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20  ession .        
bc40: 2a 2a 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63  ** "(SELECT t1.c
bc50: 6f 6c 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63  ol)", the correc
bc60: 74 20 74 79 70 65 20 69 73 20 72 65 74 75 72 6e  t type is return
bc70: 65 64 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53  ed (see the TK_S
bc80: 45 4c 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a  ELECT.        **
bc90: 20 62 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20   branch below.  
bca0: 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
bcb0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
bcc0: 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26   assert( pTab &&
bcd0: 20 70 45 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54   pExpr->pTab==pT
bce0: 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ab );.      if( 
bcf0: 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  pS ){.        /*
bd00: 20 54 68 65 20 22 74 61 62 6c 65 22 20 69 73 20   The "table" is 
bd10: 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73  actually a sub-s
bd20: 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77 20  elect or a view 
bd30: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
bd40: 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  se.        ** of
bd50: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
bd60: 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68  ement. Return th
bd70: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
bd80: 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20  pe and origin.  
bd90: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f        ** data fo
bda0: 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74  r the result-set
bdb0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73   column of the s
bdc0: 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20  ub-select..     
bdd0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
bde0: 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 41 4c 57  ( iCol>=0 && ALW
bdf0: 41 59 53 28 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c  AYS(iCol<pS->pEL
be00: 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
be10: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69           /* If i
be20: 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e  Col is less than
be30: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
be40: 65 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65  expression reque
be50: 73 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20  sts the.        
be60: 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68    ** rowid of th
be70: 65 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  e sub-select or 
be80: 76 69 65 77 2e 20 54 68 69 73 20 65 78 70 72 65  view. This expre
be90: 73 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28  ssion is legal (
bea0: 73 65 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a  see .          *
beb0: 2a 20 74 65 73 74 20 63 61 73 65 20 6d 69 73 63  * test case misc
bec0: 32 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61  2.2.2) - it alwa
bed0: 79 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  ys evaluates to 
bee0: 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20  NULL..          
bef0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d  */.          Nam
bf00: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
bf10: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 20          Expr *p 
bf20: 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  = pS->pEList->a[
bf30: 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20  iCol].pExpr;.   
bf40: 20 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c         sNC.pSrcL
bf50: 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a  ist = pS->pSrc;.
bf60: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e            sNC.pN
bf70: 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20  ext = pNC;.     
bf80: 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20       sNC.pParse 
bf90: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pNC->pParse;. 
bfa0: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
bfb0: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
bfc0: 2c 20 70 2c 26 7a 4f 72 69 67 44 62 2c 26 7a 4f  , p,&zOrigDb,&zO
bfd0: 72 69 67 54 61 62 2c 26 7a 4f 72 69 67 43 6f 6c  rigTab,&zOrigCol
bfe0: 2c 20 26 65 73 74 57 69 64 74 68 29 3b 20 0a 20  , &estWidth); . 
bff0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
c000: 65 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e 70  else if( pTab->p
c010: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
c020: 20 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62 6c    /* A real tabl
c030: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  e */.        ass
c040: 65 72 74 28 20 21 70 53 20 29 3b 0a 20 20 20 20  ert( !pS );.    
c050: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
c060: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
c070: 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Key;.        ass
c080: 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c  ert( iCol==-1 ||
c090: 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f   (iCol>=0 && iCo
c0a0: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b  l<pTab->nCol) );
c0b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
c0c0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
c0d0: 41 44 41 54 41 0a 20 20 20 20 20 20 20 20 69 66  ADATA.        if
c0e0: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
c0f0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49        zType = "I
c100: 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20  NTEGER";.       
c110: 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 22 72     zOrigCol = "r
c120: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d  owid";.        }
c130: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
c140: 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43  zType = pTab->aC
c150: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a  ol[iCol].zType;.
c160: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43            zOrigC
c170: 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ol = pTab->aCol[
c180: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  iCol].zName;.   
c190: 20 20 20 20 20 20 20 65 73 74 57 69 64 74 68 20         estWidth 
c1a0: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
c1b0: 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20 20 20 20 20  l].szEst;.      
c1c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72 69    }.        zOri
c1d0: 67 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  gTab = pTab->zNa
c1e0: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
c1f0: 70 4e 43 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20  pNC->pParse ){. 
c200: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62           int iDb
c210: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
c220: 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61  ToIndex(pNC->pPa
c230: 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
c240: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
c250: 20 20 20 7a 4f 72 69 67 44 62 20 3d 20 70 4e 43     zOrigDb = pNC
c260: 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44  ->pParse->db->aD
c270: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
c280: 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20        }.#else.  
c290: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
c2a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   ){.          zT
c2b0: 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b  ype = "INTEGER";
c2c0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
c2d0: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
c2e0: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
c2f0: 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20  l].zType;.      
c300: 20 20 20 20 65 73 74 57 69 64 74 68 20 3d 20 70      estWidth = p
c310: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
c320: 73 7a 45 73 74 3b 0a 20 20 20 20 20 20 20 20 7d  szEst;.        }
c330: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a  .#endif.      }.
c340: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c350: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
c360: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
c370: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
c380: 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  CT: {.      /* T
c390: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
c3a0: 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 52   a sub-select. R
c3b0: 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72  eturn the declar
c3c0: 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20  ation type and. 
c3d0: 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69       ** origin i
c3e0: 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e 67  nfo for the sing
c3f0: 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  le column in the
c400: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
c410: 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20  he SELECT.      
c420: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  ** statement..  
c430: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d      */.      Nam
c440: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
c450: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d      Select *pS =
c460: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
c470: 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
c480: 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61   = pS->pEList->a
c490: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [0].pExpr;.     
c4a0: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
c4b0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
c4c0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
c4d0: 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  .      sNC.pSrcL
c4e0: 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a  ist = pS->pSrc;.
c4f0: 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20        sNC.pNext 
c500: 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43  = pNC;.      sNC
c510: 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  .pParse = pNC->p
c520: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79  Parse;.      zTy
c530: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
c540: 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44  &sNC, p, &zOrigD
c550: 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a  b, &zOrigTab, &z
c560: 4f 72 69 67 43 6f 6c 2c 20 26 65 73 74 57 69 64  OrigCol, &estWid
c570: 74 68 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  th); .      brea
c580: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
c590: 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
c5a0: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
c5b0: 5f 4d 45 54 41 44 41 54 41 20 20 0a 20 20 69 66  _METADATA  .  if
c5c0: 28 20 70 7a 4f 72 69 67 44 62 20 29 7b 0a 20 20  ( pzOrigDb ){.  
c5d0: 20 20 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67    assert( pzOrig
c5e0: 54 61 62 20 26 26 20 70 7a 4f 72 69 67 43 6f 6c  Tab && pzOrigCol
c5f0: 20 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 44   );.    *pzOrigD
c600: 62 20 3d 20 7a 4f 72 69 67 44 62 3b 0a 20 20 20  b = zOrigDb;.   
c610: 20 2a 70 7a 4f 72 69 67 54 61 62 20 3d 20 7a 4f   *pzOrigTab = zO
c620: 72 69 67 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f  rigTab;.    *pzO
c630: 72 69 67 43 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f  rigCol = zOrigCo
c640: 6c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  l;.  }.#endif.  
c650: 69 66 28 20 70 45 73 74 57 69 64 74 68 20 29 20  if( pEstWidth ) 
c660: 2a 70 45 73 74 57 69 64 74 68 20 3d 20 65 73 74  *pEstWidth = est
c670: 57 69 64 74 68 3b 0a 20 20 72 65 74 75 72 6e 20  Width;.  return 
c680: 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zType;.}../*.** 
c690: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
c6a0: 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65  at will tell the
c6b0: 20 56 44 42 45 20 74 68 65 20 64 65 63 6c 61 72   VDBE the declar
c6c0: 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63  ation types of c
c6d0: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
c6e0: 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a   result set..*/.
c6f0: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
c700: 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
c710: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
c720: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72  ,      /* Parser
c730: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
c740: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
c750: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
c760: 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  les */.  ExprLis
c770: 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
c780: 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69  Expressions defi
c790: 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20  ning the result 
c7a0: 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  set */.){.#ifnde
c7b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
c7c0: 43 4c 54 59 50 45 0a 20 20 56 64 62 65 20 2a 76  CLTYPE.  Vdbe *v
c7d0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
c7e0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d  ;.  int i;.  Nam
c7f0: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
c800: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
c810: 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70  TabList;.  sNC.p
c820: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
c830: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
c840: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
c850: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
c860: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
c870: 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  pr;.    const ch
c880: 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65  ar *zType;.#ifde
c890: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
c8a0: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
c8b0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
c8c0: 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20  zOrigDb = 0;.   
c8d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
c8e0: 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63  igTab = 0;.    c
c8f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67  onst char *zOrig
c900: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79  Col = 0;.    zTy
c910: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
c920: 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44  &sNC, p, &zOrigD
c930: 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a  b, &zOrigTab, &z
c940: 4f 72 69 67 43 6f 6c 2c 20 30 29 3b 0a 0a 20 20  OrigCol, 0);..  
c950: 20 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75    /* The vdbe mu
c960: 73 74 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20  st make its own 
c970: 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75  copy of the colu
c980: 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65  mn-type and othe
c990: 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  r .    ** column
c9a0: 20 73 70 65 63 69 66 69 63 20 73 74 72 69 6e 67   specific string
c9b0: 73 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  s, in case the s
c9c0: 63 68 65 6d 61 20 69 73 20 72 65 73 65 74 20 62  chema is reset b
c9d0: 65 66 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a  efore this.    *
c9e0: 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * virtual machin
c9f0: 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20  e is deleted..  
ca00: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
ca10: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
ca20: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54  , i, COLNAME_DAT
ca30: 41 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20  ABASE, zOrigDb, 
ca40: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
ca50: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
ca60: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
ca70: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45  i, COLNAME_TABLE
ca80: 2c 20 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49  , zOrigTab, SQLI
ca90: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
caa0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
cab0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
cac0: 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a  OLNAME_COLUMN, z
cad0: 4f 72 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f  OrigCol, SQLITE_
cae0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73  TRANSIENT);.#els
caf0: 65 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  e.    zType = co
cb00: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
cb10: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23  , 0, 0, 0, 0);.#
cb20: 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65  endif.    sqlite
cb30: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
cb40: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45  v, i, COLNAME_DE
cb50: 43 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c 20 53  CLTYPE, zType, S
cb60: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
cb70: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
cb80: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
cb90: 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 29 20 2a  OMIT_DECLTYPE) *
cba0: 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  /.}../*.** Gener
cbb0: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
cbc0: 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45  ll tell the VDBE
cbd0: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f   the names of co
cbe0: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
cbf0: 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69  result set.  Thi
cc00: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
cc10: 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65   used to provide
cc20: 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20   the.** azCol[] 
cc30: 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61  values in the ca
cc40: 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  llback..*/.stati
cc50: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43  c void generateC
cc60: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61  olumnNames(.  Pa
cc70: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
cc80: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
cc90: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
cca0: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20   *pTabList,  /* 
ccb0: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a  List of tables *
ccc0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
ccd0: 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65  List    /* Expre
cce0: 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20  ssions defining 
ccf0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
cd00: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
cd10: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
cd20: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71    int i, j;.  sq
cd30: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
cd40: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75  se->db;.  int fu
cd50: 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61  llNames, shortNa
cd60: 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  mes;..#ifndef SQ
cd70: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
cd80: 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  N.  /* If this i
cd90: 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b  s an EXPLAIN, sk
cda0: 69 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a  ip this step */.
cdb0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
cdc0: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74  plain ){.    ret
cdd0: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
cde0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
cdf0: 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 4e 45  olNamesSet || NE
ce00: 56 45 52 28 76 3d 3d 30 29 20 7c 7c 20 64 62 2d  VER(v==0) || db-
ce10: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
ce20: 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65  return;.  pParse
ce30: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20  ->colNamesSet = 
ce40: 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d  1;.  fullNames =
ce50: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
ce60: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
ce70: 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61  s)!=0;.  shortNa
ce80: 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  mes = (db->flags
ce90: 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43   & SQLITE_ShortC
cea0: 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73  olNames)!=0;.  s
ceb0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
cec0: 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e  Cols(v, pEList->
ced0: 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d  nExpr);.  for(i=
cee0: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
cef0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
cf00: 70 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70  pr *p;.    p = p
cf10: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
cf20: 72 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  r;.    if( NEVER
cf30: 28 70 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75  (p==0) ) continu
cf40: 65 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73  e;.    if( pELis
cf50: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b  t->a[i].zName ){
cf60: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  .      char *zNa
cf70: 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  me = pEList->a[i
cf80: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73  ].zName;.      s
cf90: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
cfa0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
cfb0: 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20  ME_NAME, zName, 
cfc0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
cfd0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
cfe0: 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55   (p->op==TK_COLU
cff0: 4d 4e 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  MN || p->op==TK_
d000: 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70  AGG_COLUMN) && p
d010: 54 61 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  TabList ){.     
d020: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
d030: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a      char *zCol;.
d040: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
d050: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20   p->iColumn;.   
d060: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 41 4c 57 41     for(j=0; ALWA
d070: 59 53 28 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  YS(j<pTabList->n
d080: 53 72 63 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Src); j++){.    
d090: 20 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74      if( pTabList
d0a0: 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 3d 3d  ->a[j].iCursor==
d0b0: 70 2d 3e 69 54 61 62 6c 65 20 29 20 62 72 65 61  p->iTable ) brea
d0c0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
d0d0: 20 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c   assert( j<pTabL
d0e0: 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20  ist->nSrc );.   
d0f0: 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69     pTab = pTabLi
d100: 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20  st->a[j].pTab;. 
d110: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
d120: 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69  ) iCol = pTab->i
d130: 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65  PKey;.      asse
d140: 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20  rt( iCol==-1 || 
d150: 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c  (iCol>=0 && iCol
d160: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a  <pTab->nCol) );.
d170: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
d180: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c   ){.        zCol
d190: 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20   = "rowid";.    
d1a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d1b0: 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43   zCol = pTab->aC
d1c0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a  ol[iCol].zName;.
d1d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
d1e0: 28 20 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26  ( !shortNames &&
d1f0: 20 21 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20   !fullNames ){. 
d200: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d210: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
d220: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
d230: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71   .            sq
d240: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
d250: 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  , pEList->a[i].z
d260: 53 70 61 6e 29 2c 20 53 51 4c 49 54 45 5f 44 59  Span), SQLITE_DY
d270: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65  NAMIC);.      }e
d280: 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65  lse if( fullName
d290: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  s ){.        cha
d2a0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
d2b0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
d2c0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
d2d0: 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e   "%s.%s", pTab->
d2e0: 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20  zName, zCol);.  
d2f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d300: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
d310: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
d320: 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 44 59  zName, SQLITE_DY
d330: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65  NAMIC);.      }e
d340: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
d350: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
d360: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
d370: 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c  _NAME, zCol, SQL
d380: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
d390: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
d3a0: 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  e{.      const c
d3b0: 68 61 72 20 2a 7a 20 3d 20 70 45 4c 69 73 74 2d  har *z = pEList-
d3c0: 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20  >a[i].zSpan;.   
d3d0: 20 20 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20 73 71     z = z==0 ? sq
d3e0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
d3f0: 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31   "column%d", i+1
d400: 29 20 3a 20 73 71 6c 69 74 65 33 44 62 53 74 72  ) : sqlite3DbStr
d410: 44 75 70 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  Dup(db, z);.    
d420: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
d430: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
d440: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c 20 53  LNAME_NAME, z, S
d450: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
d460: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65      }.  }.  gene
d470: 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
d480: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
d490: 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  , pEList);.}../*
d4a0: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 61 6e 20 65  .** Given a an e
d4b0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 28  xpression list (
d4c0: 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20  which is really 
d4d0: 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72  the list of expr
d4e0: 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
d4f0: 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74 20  form the result 
d500: 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 20  set of a SELECT 
d510: 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75  statement) compu
d520: 74 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  te appropriate.*
d530: 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  * column names f
d540: 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  or a table that 
d550: 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
d560: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
d570: 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e  **.** All column
d580: 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20 75   names will be u
d590: 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  nique..**.** Onl
d5a0: 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  y the column nam
d5b0: 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64 2e  es are computed.
d5c0: 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20    Column.zType, 
d5d0: 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a  Column.zColl,.**
d5e0: 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64   and other field
d5f0: 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20  s of Column are 
d600: 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  zeroed..**.** Re
d610: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
d620: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 61  n success.  If a
d630: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
d640: 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
d650: 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69  .** store NULL i
d660: 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20 69  n *paCol and 0 i
d670: 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74  n *pnCol and ret
d680: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
d690: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d6a0: 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f  selectColumnsFro
d6b0: 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  mExprList(.  Par
d6c0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
d6d0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
d6e0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
d6f0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
d700: 20 20 20 20 20 2f 2a 20 45 78 70 72 20 6c 69 73       /* Expr lis
d710: 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  t from which to 
d720: 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61  derive column na
d730: 6d 65 73 20 2a 2f 0a 20 20 69 31 36 20 2a 70 6e  mes */.  i16 *pn
d740: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
d750: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75   /* Write the nu
d760: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
d770: 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e  here */.  Column
d780: 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20 20 20   **paCol        
d790: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
d7a0: 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68  ew column list h
d7b0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ere */.){.  sqli
d7c0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
d7d0: 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61 74 61 62  ->db;   /* Datab
d7e0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
d7f0: 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  /.  int i, j;   
d800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d810: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
d820: 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20   */.  int cnt;  
d830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d840: 20 20 2f 2a 20 49 6e 64 65 78 20 61 64 64 65 64    /* Index added
d850: 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d   to make the nam
d860: 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f  e unique */.  Co
d870: 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f  lumn *aCol, *pCo
d880: 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  l;        /* For
d890: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72 65   looping over re
d8a0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  sult columns */.
d8b0: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
d8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d8d0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
d8e0: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
d8f0: 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a   set */.  Expr *
d900: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
d910: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
d920: 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ion for a single
d930: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a   result column *
d940: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  /.  char *zName;
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d960: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  /* Column name *
d970: 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
d980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d990: 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20  /* Size of name 
d9a0: 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a 20  in zName[] */.. 
d9b0: 20 69 66 28 20 70 45 4c 69 73 74 20 29 7b 0a 20   if( pEList ){. 
d9c0: 20 20 20 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74     nCol = pEList
d9d0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 43 6f  ->nExpr;.    aCo
d9e0: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  l = sqlite3DbMal
d9f0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
da00: 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c  of(aCol[0])*nCol
da10: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
da20: 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 7d 65   aCol==0 );.  }e
da30: 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  lse{.    nCol = 
da40: 30 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b  0;.    aCol = 0;
da50: 0a 20 20 7d 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20  .  }.  *pnCol = 
da60: 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d  nCol;.  *paCol =
da70: 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d   aCol;..  for(i=
da80: 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c  0, pCol=aCol; i<
da90: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
daa0: 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20 61  +){.    /* Get a
dab0: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61  n appropriate na
dac0: 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  me for the colum
dad0: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d  n.    */.    p =
dae0: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
daf0: 43 6f 6c 6c 61 74 65 28 70 45 4c 69 73 74 2d 3e  Collate(pEList->
db00: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
db10: 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45   if( (zName = pE
db20: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
db30: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )!=0 ){.      /*
db40: 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   If the column c
db50: 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20 3c  ontains an "AS <
db60: 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20 75  name>" phrase, u
db70: 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65  se <name> as the
db80: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a   name */.      z
db90: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
dba0: 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d 65  StrDup(db, zName
dbb0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
dbc0: 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c 45 78      Expr *pColEx
dbd0: 70 72 20 3d 20 70 3b 20 20 2f 2a 20 54 68 65 20  pr = p;  /* The 
dbe0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
dbf0: 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  is the result co
dc00: 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  lumn name */.   
dc10: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20     Table *pTab; 
dc20: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
dc30: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
dc40: 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   this expression
dc50: 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28   */.      while(
dc60: 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54   pColExpr->op==T
dc70: 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20  K_DOT ){.       
dc80: 20 70 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f 6c   pColExpr = pCol
dc90: 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
dca0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
dcb0: 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20  olExpr!=0 );.   
dcc0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
dcd0: 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ColExpr->op==TK_
dce0: 43 4f 4c 55 4d 4e 20 26 26 20 41 4c 57 41 59 53  COLUMN && ALWAYS
dcf0: 28 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62 21  (pColExpr->pTab!
dd00: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  =0) ){.        /
dd10: 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 75 73  * For columns us
dd20: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
dd30: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  e name */.      
dd40: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 43 6f    int iCol = pCo
dd50: 6c 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  lExpr->iColumn;.
dd60: 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70          pTab = p
dd70: 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20  ColExpr->pTab;. 
dd80: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
dd90: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
dda0: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  >iPKey;.        
ddb0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
ddc0: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c  Printf(db, "%s",
ddd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
dde0: 20 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62    iCol>=0 ? pTab
ddf0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
de00: 6d 65 20 3a 20 22 72 6f 77 69 64 22 29 3b 0a 20  me : "rowid");. 
de10: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
de20: 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ColExpr->op==TK_
de30: 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ID ){.        as
de40: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
de50: 6f 70 65 72 74 79 28 70 43 6f 6c 45 78 70 72 2c  operty(pColExpr,
de60: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
de70: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
de80: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
de90: 64 62 2c 20 22 25 73 22 2c 20 70 43 6f 6c 45 78  db, "%s", pColEx
dea0: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
deb0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
dec0: 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f      /* Use the o
ded0: 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20  riginal text of 
dee0: 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65  the column expre
def0: 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d  ssion as its nam
df00: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 4e 61  e */.        zNa
df10: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
df20: 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 70 45  ntf(db, "%s", pE
df30: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
df40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
df50: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
df60: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
df70: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
df80: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  (db, zName);.   
df90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
dfa0: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
dfb0: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
dfc0: 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20 49 66  e is unique.  If
dfd0: 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74   the name is not
dfe0: 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20   unique,.    ** 
dff0: 61 70 70 65 6e 64 20 61 20 69 6e 74 65 67 65 72  append a integer
e000: 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20   to the name so 
e010: 74 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20  that it becomes 
e020: 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20  unique..    */. 
e030: 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74     nName = sqlit
e040: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
e050: 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74  );.    for(j=cnt
e060: 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<i; j++){. 
e070: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
e080: 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e  StrICmp(aCol[j].
e090: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30  zName, zName)==0
e0a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
e0b0: 20 2a 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20   *zNewName;.    
e0c0: 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
e0d0: 20 20 20 66 6f 72 28 6b 3d 6e 4e 61 6d 65 2d 31     for(k=nName-1
e0e0: 3b 20 6b 3e 31 20 26 26 20 73 71 6c 69 74 65 33  ; k>1 && sqlite3
e0f0: 49 73 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6b 5d  Isdigit(zName[k]
e100: 29 3b 20 6b 2d 2d 29 7b 7d 0a 20 20 20 20 20 20  ); k--){}.      
e110: 20 20 69 66 28 20 6b 3e 3d 30 20 26 26 20 7a 4e    if( k>=0 && zN
e120: 61 6d 65 5b 6b 5d 3d 3d 27 3a 27 20 29 20 6e 4e  ame[k]==':' ) nN
e130: 61 6d 65 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20  ame = k;.       
e140: 20 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20   zName[nName] = 
e150: 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 65 77 4e  0;.        zNewN
e160: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
e170: 69 6e 74 66 28 64 62 2c 20 22 25 73 3a 25 64 22  intf(db, "%s:%d"
e180: 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b  , zName, ++cnt);
e190: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e1a0: 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
e1b0: 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  );.        zName
e1c0: 20 3d 20 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20   = zNewName;.   
e1d0: 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20       j = -1;.   
e1e0: 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d       if( zName==
e1f0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
e200: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f   }.    }.    pCo
e210: 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  l->zName = zName
e220: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e  ;.  }.  if( db->
e230: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
e240: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69      for(j=0; j<i
e250: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; j++){.      sq
e260: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
e270: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a  aCol[j].zName);.
e280: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
e290: 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c  3DbFree(db, aCol
e2a0: 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d 20  );.    *paCol = 
e2b0: 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20  0;.    *pnCol = 
e2c0: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
e2d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
e2e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e2f0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  OK;.}../*.** Add
e300: 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74   type and collat
e310: 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ion information 
e320: 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74  to a column list
e330: 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 20 53   based on.** a S
e340: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
e350: 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 6c 75  .** .** The colu
e360: 6d 6e 20 6c 69 73 74 20 70 72 65 73 75 6d 61 62  mn list presumab
e370: 6c 79 20 63 61 6d 65 20 66 72 6f 6d 20 73 65 6c  ly came from sel
e380: 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72  ectColumnNamesFr
e390: 6f 6d 45 78 70 72 4c 69 73 74 28 29 2e 0a 2a 2a  omExprList()..**
e3a0: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   The column list
e3b0: 20 68 61 73 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c   has only names,
e3c0: 20 6e 6f 74 20 74 79 70 65 73 20 6f 72 20 63 6f   not types or co
e3d0: 6c 6c 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 0a  llations.  This.
e3e0: 2a 2a 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20  ** routine goes 
e3f0: 74 68 72 6f 75 67 68 20 61 6e 64 20 61 64 64 73  through and adds
e400: 20 74 68 65 20 74 79 70 65 73 20 61 6e 64 20 63   the types and c
e410: 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  ollations..**.**
e420: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
e430: 71 75 69 72 65 73 20 74 68 61 74 20 61 6c 6c 20  quires that all 
e440: 69 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20 74  identifiers in t
e450: 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61  he SELECT.** sta
e460: 74 65 6d 65 6e 74 20 62 65 20 72 65 73 6f 6c 76  tement be resolv
e470: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
e480: 69 64 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75  id selectAddColu
e490: 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69  mnTypeAndCollati
e4a0: 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  on(.  Parse *pPa
e4b0: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
e4c0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 73 20  arsing contexts 
e4d0: 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
e4e0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ,          /* Ad
e4f0: 64 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69 6e  d column type in
e500: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69  formation to thi
e510: 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c  s table */.  Sel
e520: 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20  ect *pSelect    
e530: 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 75 73 65     /* SELECT use
e540: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  d to determine t
e550: 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69  ypes and collati
e560: 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ons */.){.  sqli
e570: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
e580: 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74  ->db;.  NameCont
e590: 65 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d  ext sNC;.  Colum
e5a0: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53  n *pCol;.  CollS
e5b0: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74  eq *pColl;.  int
e5c0: 20 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20   i;.  Expr *p;. 
e5d0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
e5e0: 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 75 36 34 20  _item *a;.  u64 
e5f0: 73 7a 41 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73  szAll = 0;..  as
e600: 73 65 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30  sert( pSelect!=0
e610: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
e620: 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73  Select->selFlags
e630: 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21   & SF_Resolved)!
e640: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
e650: 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c  pTab->nCol==pSel
e660: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
e670: 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  pr || db->malloc
e680: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
e690: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e6a0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d   ) return;.  mem
e6b0: 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
e6c0: 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43  eof(sNC));.  sNC
e6d0: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c  .pSrcList = pSel
e6e0: 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d  ect->pSrc;.  a =
e6f0: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
e700: 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ->a;.  for(i=0, 
e710: 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  pCol=pTab->aCol;
e720: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
e730: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
e740: 20 70 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b   p = a[i].pExpr;
e750: 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  .    pCol->zType
e760: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
e770: 75 70 28 64 62 2c 20 63 6f 6c 75 6d 6e 54 79 70  up(db, columnTyp
e780: 65 28 26 73 4e 43 2c 20 70 2c 30 2c 30 2c 30 2c  e(&sNC, p,0,0,0,
e790: 20 26 70 43 6f 6c 2d 3e 73 7a 45 73 74 29 29 3b   &pCol->szEst));
e7a0: 0a 20 20 20 20 73 7a 41 6c 6c 20 2b 3d 20 70 43  .    szAll += pC
e7b0: 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 20 20 70  ol->szEst;.    p
e7c0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
e7d0: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
e7e0: 69 74 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20  ity(p);.    if( 
e7f0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
e800: 30 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  0 ) pCol->affini
e810: 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
e820: 4e 4f 4e 45 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  NONE;.    pColl 
e830: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
e840: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b  lSeq(pParse, p);
e850: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
e860: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43  {.      pCol->zC
e870: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53  oll = sqlite3DbS
e880: 74 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d  trDup(db, pColl-
e890: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
e8a0: 20 7d 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62   }.  pTab->szTab
e8b0: 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
e8c0: 45 73 74 28 73 7a 41 6c 6c 2a 34 29 3b 0a 7d 0a  Est(szAll*4);.}.
e8d0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53  ./*.** Given a S
e8e0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
e8f0: 20 67 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c   generate a Tabl
e900: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
e910: 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68   describes.** th
e920: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
e930: 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a  that SELECT..*/.
e940: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65  Table *sqlite3Re
e950: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
e960: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
e970: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
e980: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
e990: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
e9a0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
e9b0: 74 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 0a 20  t savedFlags;.. 
e9c0: 20 73 61 76 65 64 46 6c 61 67 73 20 3d 20 64 62   savedFlags = db
e9d0: 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d 3e 66  ->flags;.  db->f
e9e0: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
e9f0: 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20  FullColNames;.  
ea00: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
ea10: 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
ea20: 73 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  s;.  sqlite3Sele
ea30: 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20 70  ctPrep(pParse, p
ea40: 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66  Select, 0);.  if
ea50: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
ea60: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69   return 0;.  whi
ea70: 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  le( pSelect->pPr
ea80: 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20  ior ) pSelect = 
ea90: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b  pSelect->pPrior;
eaa0: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73  .  db->flags = s
eab0: 61 76 65 64 46 6c 61 67 73 3b 0a 20 20 70 54 61  avedFlags;.  pTa
eac0: 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  b = sqlite3DbMal
ead0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
eae0: 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69  of(Table) );.  i
eaf0: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
eb00: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
eb10: 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 33    /* The sqlite3
eb20: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
eb30: 74 28 29 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  t() is only used
eb40: 20 6e 20 63 6f 6e 74 65 78 74 73 20 77 68 65 72   n contexts wher
eb50: 65 20 6c 6f 6f 6b 61 73 69 64 65 0a 20 20 2a 2a  e lookaside.  **
eb60: 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
eb70: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f    assert( db->lo
eb80: 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64  okaside.bEnabled
eb90: 3d 3d 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 6e  ==0 );.  pTab->n
eba0: 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d  Ref = 1;.  pTab-
ebb0: 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 54  >zName = 0;.  pT
ebc0: 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  ab->nRowLogEst =
ebd0: 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30   200; assert( 20
ebe0: 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
ebf0: 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 73  (1048576) );.  s
ec00: 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d  electColumnsFrom
ec10: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
ec20: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
ec30: 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26  , &pTab->nCol, &
ec40: 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73  pTab->aCol);.  s
ec50: 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
ec60: 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70  peAndCollation(p
ec70: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65  Parse, pTab, pSe
ec80: 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69  lect);.  pTab->i
ec90: 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28  PKey = -1;.  if(
eca0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
ecb0: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
ecc0: 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
ecd0: 70 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72  pTab);.    retur
ece0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
ecf0: 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
ed00: 20 47 65 74 20 61 20 56 44 42 45 20 66 6f 72 20   Get a VDBE for 
ed10: 74 68 65 20 67 69 76 65 6e 20 70 61 72 73 65 72  the given parser
ed20: 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74   context.  Creat
ed30: 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e  e a new one if n
ed40: 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20  ecessary..** If 
ed50: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
ed60: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64   return NULL and
ed70: 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67 65   leave a message
ed80: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56   in pParse..*/.V
ed90: 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56  dbe *sqlite3GetV
eda0: 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  dbe(Parse *pPars
edb0: 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  e){.  Vdbe *v = 
edc0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
edd0: 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20   if( v==0 ){.   
ede0: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
edf0: 62 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  be = sqlite3Vdbe
ee00: 43 72 65 61 74 65 28 70 50 61 72 73 65 29 3b 0a  Create(pParse);.
ee10: 20 20 20 20 69 66 28 20 76 20 29 20 73 71 6c 69      if( v ) sqli
ee20: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
ee30: 20 4f 50 5f 49 6e 69 74 29 3b 0a 20 20 20 20 69   OP_Init);.    i
ee40: 66 28 20 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c  f( pParse->pTopl
ee50: 65 76 65 6c 3d 3d 30 0a 20 20 20 20 20 26 26 20  evel==0.     && 
ee60: 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
ee70: 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 53  led(pParse->db,S
ee80: 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74 43  QLITE_FactorOutC
ee90: 6f 6e 73 74 29 0a 20 20 20 20 29 7b 0a 20 20 20  onst).    ){.   
eea0: 20 20 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e     pParse->okCon
eeb0: 73 74 46 61 63 74 6f 72 20 3d 20 31 3b 0a 20 20  stFactor = 1;.  
eec0: 20 20 7d 0a 0a 20 20 7d 0a 20 20 72 65 74 75 72    }..  }.  retur
eed0: 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  n v;.}.../*.** C
eee0: 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69  ompute the iLimi
eef0: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69  t and iOffset fi
ef00: 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45  elds of the SELE
ef10: 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a  CT based on the.
ef20: 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f  ** pLimit and pO
ef30: 66 66 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  ffset expression
ef40: 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20 70  s.  pLimit and p
ef50: 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65 20  Offset hold the 
ef60: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74  expressions.** t
ef70: 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74 68  hat appear in th
ef80: 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73  e original SQL s
ef90: 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74  tatement after t
efa0: 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
efb0: 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e  SET.** keywords.
efc0: 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f    Or NULL if tho
efd0: 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20  se keywords are 
efe0: 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20  omitted. iLimit 
eff0: 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20  and iOffset .** 
f000: 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20  are the integer 
f010: 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20  memory register 
f020: 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e  numbers for coun
f030: 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  ters used to com
f040: 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d  pute .** the lim
f050: 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20  it and offset.  
f060: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c  If there is no l
f070: 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73  imit and/or offs
f080: 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69  et, then .** iLi
f090: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
f0a0: 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  are negative..**
f0b0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
f0c0: 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c   changes the val
f0d0: 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e  ues of iLimit an
f0e0: 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69  d iOffset only i
f0f0: 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20  f.** a limit or 
f100: 6f 66 66 73 65 74 20 69 73 20 64 65 66 69 6e 65  offset is define
f110: 64 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64 20  d by pLimit and 
f120: 70 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74  pOffset.  iLimit
f130: 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20   and.** iOffset 
f140: 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
f150: 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f   preset to appro
f160: 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20 76  priate default v
f170: 61 6c 75 65 73 20 28 7a 65 72 6f 29 0a 2a 2a 20  alues (zero).** 
f180: 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
f190: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
f1a0: 2a 0a 2a 2a 20 54 68 65 20 69 4f 66 66 73 65 74  *.** The iOffset
f1b0: 20 72 65 67 69 73 74 65 72 20 28 69 66 20 69 74   register (if it
f1c0: 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 69 74   exists) is init
f1d0: 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76  ialized to the v
f1e0: 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 4f  alue.** of the O
f1f0: 46 46 53 45 54 2e 20 20 54 68 65 20 69 4c 69 6d  FFSET.  The iLim
f200: 69 74 20 72 65 67 69 73 74 65 72 20 69 73 20 69  it register is i
f210: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49  nitialized to LI
f220: 4d 49 54 2e 20 20 52 65 67 69 73 74 65 72 0a 2a  MIT.  Register.*
f230: 2a 20 69 4f 66 66 73 65 74 2b 31 20 69 73 20 69  * iOffset+1 is i
f240: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49  nitialized to LI
f250: 4d 49 54 2b 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a  MIT+OFFSET..**.*
f260: 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74  * Only if pLimit
f270: 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21 3d  !=0 or pOffset!=
f280: 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72  0 do the limit r
f290: 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20  egisters get.** 
f2a0: 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20  redefined.  The 
f2b0: 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
f2c0: 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f  or uses this pro
f2d0: 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a  perty to force.*
f2e0: 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74  * the reuse of t
f2f0: 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e  he same limit an
f300: 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65  d offset registe
f310: 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70  rs across multip
f320: 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  le.** SELECT sta
f330: 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  tements..*/.stat
f340: 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c  ic void computeL
f350: 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61  imitRegisters(Pa
f360: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
f370: 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65  ect *p, int iBre
f380: 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ak){.  Vdbe *v =
f390: 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74   0;.  int iLimit
f3a0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66   = 0;.  int iOff
f3b0: 73 65 74 3b 0a 20 20 69 6e 74 20 61 64 64 72 31  set;.  int addr1
f3c0: 2c 20 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  , n;.  if( p->iL
f3d0: 69 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a  imit ) return;..
f3e0: 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49    /* .  ** "LIMI
f3f0: 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f  T -1" always sho
f400: 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68  ws all rows.  Th
f410: 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a  ere is some.  **
f420: 20 63 6f 6e 74 72 6f 76 65 72 73 79 20 61 62 6f   controversy abo
f430: 75 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72  ut what the corr
f440: 65 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f  ect behavior sho
f450: 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65  uld be..  ** The
f460: 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
f470: 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65  ntation interpre
f480: 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20  ts "LIMIT 0" to 
f490: 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77  mean.  ** no row
f4a0: 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
f4b0: 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
f4c0: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
f4d0: 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30  t( p->pOffset==0
f4e0: 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74 21 3d 30   || p->pLimit!=0
f4f0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69   );.  if( p->pLi
f500: 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c  mit ){.    p->iL
f510: 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20  imit = iLimit = 
f520: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
f530: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
f540: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
f550: 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d 30      assert( v!=0
f560: 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   );.    if( sqli
f570: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
f580: 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 29 20  (p->pLimit, &n) 
f590: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
f5a0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f5b0: 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69  _Integer, n, iLi
f5c0: 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  mit);.      Vdbe
f5d0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d  Comment((v, "LIM
f5e0: 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  IT counter"));. 
f5f0: 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b       if( n==0 ){
f600: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f610: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f620: 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b  _Goto, 0, iBreak
f630: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
f640: 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d 3e 6e 53  f( n>=0 && p->nS
f650: 65 6c 65 63 74 52 6f 77 3e 28 75 36 34 29 6e 20  electRow>(u64)n 
f660: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53  ){.        p->nS
f670: 65 6c 65 63 74 52 6f 77 20 3d 20 6e 3b 0a 20 20  electRow = n;.  
f680: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
f690: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
f6a0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
f6b0: 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74  ->pLimit, iLimit
f6c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f6d0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
f6e0: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d  _MustBeInt, iLim
f6f0: 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  it); VdbeCoverag
f700: 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
f710: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d  Comment((v, "LIM
f720: 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  IT counter"));. 
f730: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f740: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a  AddOp2(v, OP_IfZ
f750: 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72  ero, iLimit, iBr
f760: 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
f770: 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ge(v);.    }.   
f780: 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20   if( p->pOffset 
f790: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  ){.      p->iOff
f7a0: 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d 20  set = iOffset = 
f7b0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
f7c0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
f7d0: 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63  em++;   /* Alloc
f7e0: 61 74 65 20 61 6e 20 65 78 74 72 61 20 72 65 67  ate an extra reg
f7f0: 69 73 74 65 72 20 66 6f 72 20 6c 69 6d 69 74 2b  ister for limit+
f800: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20  offset */.      
f810: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
f820: 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73  pParse, p->pOffs
f830: 65 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20  et, iOffset);.  
f840: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f850: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp1(v, OP_Must
f860: 42 65 49 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b  BeInt, iOffset);
f870: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
f880: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
f890: 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54 20  ent((v, "OFFSET 
f8a0: 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
f8b0: 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
f8c0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
f8d0: 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73 65 74  P_IfPos, iOffset
f8e0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
f8f0: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
f900: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f910: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 4f  P_Integer, 0, iO
f920: 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71  ffset);.      sq
f930: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
f940: 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20  e(v, addr1);.   
f950: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f960: 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20  dOp3(v, OP_Add, 
f970: 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2c  iLimit, iOffset,
f980: 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20   iOffset+1);.   
f990: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
f9a0: 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54  v, "LIMIT+OFFSET
f9b0: 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31  "));.      addr1
f9c0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
f9d0: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp1(v, OP_IfPos
f9e0: 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43  , iLimit); VdbeC
f9f0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
fa00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fa10: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
fa20: 72 2c 20 2d 31 2c 20 69 4f 66 66 73 65 74 2b 31  r, -1, iOffset+1
fa30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fa40: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
fa50: 61 64 64 72 31 29 3b 0a 20 20 20 20 7d 0a 20 20  addr1);.    }.  
fa60: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
fa70: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
fa80: 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52  D_SELECT./*.** R
fa90: 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70  eturn the approp
faa0: 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20  riate collating 
fab0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
fac0: 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20   iCol-th column 
fad0: 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  of.** the result
fae0: 20 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d   set for the com
faf0: 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61  pound-select sta
fb00: 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74  tement "p".  Ret
fb10: 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74  urn NULL if.** t
fb20: 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f  he column has no
fb30: 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
fb40: 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a  ng sequence..**.
fb50: 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** The collating
fb60: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
fb70: 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
fb80: 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  t is taken from 
fb90: 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74  the.** left-most
fba0: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c   term of the sel
fbb0: 65 63 74 20 74 68 61 74 20 68 61 73 20 61 20 63  ect that has a c
fbc0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
fbd0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c  e..*/.static Col
fbe0: 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63  lSeq *multiSelec
fbf0: 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  tCollSeq(Parse *
fc00: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
fc10: 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20  p, int iCol){.  
fc20: 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20  CollSeq *pRet;. 
fc30: 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
fc40: 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c  {.    pRet = mul
fc50: 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
fc60: 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f  pParse, p->pPrio
fc70: 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73  r, iCol);.  }els
fc80: 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b  e{.    pRet = 0;
fc90: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69  .  }.  assert( i
fca0: 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  Col>=0 );.  if( 
fcb0: 70 52 65 74 3d 3d 30 20 26 26 20 69 43 6f 6c 3c  pRet==0 && iCol<
fcc0: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
fcd0: 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73   ){.    pRet = s
fce0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
fcf0: 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c  q(pParse, p->pEL
fd00: 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78  ist->a[iCol].pEx
fd10: 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  pr);.  }.  retur
fd20: 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
fd30: 20 54 68 65 20 73 65 6c 65 63 74 20 73 74 61 74   The select stat
fd40: 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
fd50: 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
fd60: 65 74 65 72 20 69 73 20 61 20 63 6f 6d 70 6f 75  eter is a compou
fd70: 6e 64 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74  nd SELECT.** wit
fd80: 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  h an ORDER BY cl
fd90: 61 75 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74  ause. This funct
fda0: 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e  ion allocates an
fdb0: 64 20 72 65 74 75 72 6e 73 20 61 20 4b 65 79 49  d returns a KeyI
fdc0: 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nfo.** structure
fdd0: 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 69 6d   suitable for im
fde0: 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f  plementing the O
fdf0: 52 44 45 52 20 42 59 2e 0a 2a 2a 0a 2a 2a 20 53  RDER BY..**.** S
fe00: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
fe10: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
fe20: 72 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  re is obtained f
fe30: 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 54 68 65 20  rom malloc. The 
fe40: 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
fe50: 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ion is responsib
fe60: 6c 65 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20  le for ensuring 
fe70: 74 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74  that this struct
fe80: 75 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c  ure is eventuall
fe90: 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73  y.** freed..*/.s
fea0: 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6d  tatic KeyInfo *m
feb0: 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
fec0: 79 4b 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a  yKeyInfo(Parse *
fed0: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
fee0: 70 2c 20 69 6e 74 20 6e 45 78 74 72 61 29 7b 0a  p, int nExtra){.
fef0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
ff00: 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
ff10: 42 79 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72  By;.  int nOrder
ff20: 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
ff30: 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 71 6c 69 74  ->nExpr;.  sqlit
ff40: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
ff50: 3e 64 62 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  >db;.  KeyInfo *
ff60: 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 4b 65  pRet = sqlite3Ke
ff70: 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
ff80: 4f 72 64 65 72 42 79 2b 6e 45 78 74 72 61 2c 20  OrderBy+nExtra, 
ff90: 31 29 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29  1);.  if( pRet )
ffa0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
ffb0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
ffc0: 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
ffd0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
ffe0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
fff0: 26 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 3b  &pOrderBy->a[i];
10000 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65  .      Expr *pTe
10010 72 6d 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70  rm = pItem->pExp
10020 72 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  r;.      CollSeq
10030 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20   *pColl;..      
10040 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73  if( pTerm->flags
10050 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b   & EP_Collate ){
10060 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
10070 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
10080 53 65 71 28 70 50 61 72 73 65 2c 20 70 54 65 72  Seq(pParse, pTer
10090 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  m);.      }else{
100a0 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
100b0 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
100c0 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 70  Seq(pParse, p, p
100d0 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
100e0 42 79 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20  ByCol-1);.      
100f0 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29    if( pColl==0 )
10100 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
10110 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
10120 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
10130 45 78 70 72 20 3d 0a 20 20 20 20 20 20 20 20 20  Expr =.         
10140 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43   sqlite3ExprAddC
10150 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 70 50 61  ollateString(pPa
10160 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 43 6f 6c  rse, pTerm, pCol
10170 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
10180 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
10190 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
101a0 73 57 72 69 74 65 61 62 6c 65 28 70 52 65 74 29  sWriteable(pRet)
101b0 20 29 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e   );.      pRet->
101c0 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c  aColl[i] = pColl
101d0 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 61 53  ;.      pRet->aS
101e0 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f  ortOrder[i] = pO
101f0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
10200 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20  tOrder;.    }.  
10210 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
10220 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
10230 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a  ITE_OMIT_CTE./*.
10240 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
10250 67 65 6e 65 72 61 74 65 73 20 56 44 42 45 20 63  generates VDBE c
10260 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  ode to compute t
10270 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
10280 57 49 54 48 20 52 45 43 55 52 53 49 56 45 0a 2a  WITH RECURSIVE.*
10290 2a 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66  * query of the f
102a0 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 3c 72 65  orm:.**.**   <re
102b0 63 75 72 73 69 76 65 2d 74 61 62 6c 65 3e 20 41  cursive-table> A
102c0 53 20 28 3c 73 65 74 75 70 2d 71 75 65 72 79 3e  S (<setup-query>
102d0 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 3c 72 65   UNION [ALL] <re
102e0 63 75 72 73 69 76 65 2d 71 75 65 72 79 3e 29 0a  cursive-query>).
102f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
10300 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
10310 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20  _______/        
10320 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
10330 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20  _____/.**       
10340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10350 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 20 20      p->pPrior   
10360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10370 20 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68     p.**.**.** Th
10380 65 72 65 20 69 73 20 65 78 61 63 74 6c 79 20 6f  ere is exactly o
10390 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ne reference to 
103a0 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 74 61  the recursive-ta
103b0 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
103c0 63 6c 61 75 73 65 0a 2a 2a 20 6f 66 20 72 65 63  clause.** of rec
103d0 75 72 73 69 76 65 2d 71 75 65 72 79 2c 20 6d 61  ursive-query, ma
103e0 72 6b 65 64 20 77 69 74 68 20 74 68 65 20 53 72  rked with the Sr
103f0 63 4c 69 73 74 2d 3e 61 5b 5d 2e 69 73 52 65 63  cList->a[].isRec
10400 75 72 73 69 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a  ursive flag..**.
10410 2a 2a 20 54 68 65 20 73 65 74 75 70 2d 71 75 65  ** The setup-que
10420 72 79 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20  ry runs once to 
10430 67 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 69 74  generate an init
10440 69 61 6c 20 73 65 74 20 6f 66 20 72 6f 77 73 20  ial set of rows 
10450 74 68 61 74 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20  that go.** into 
10460 61 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20  a Queue table.  
10470 52 6f 77 73 20 61 72 65 20 65 78 74 72 61 63 74  Rows are extract
10480 65 64 20 66 72 6f 6d 20 74 68 65 20 51 75 65 75  ed from the Queu
10490 65 20 74 61 62 6c 65 20 6f 6e 65 20 62 79 0a 2a  e table one by.*
104a0 2a 20 6f 6e 65 2e 20 20 45 61 63 68 20 72 6f 77  * one.  Each row
104b0 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
104c0 51 75 65 75 65 20 69 73 20 6f 75 74 70 75 74 20  Queue is output 
104d0 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65 6e 20  to pDest.  Then 
104e0 74 68 65 20 73 69 6e 67 6c 65 0a 2a 2a 20 65 78  the single.** ex
104f0 74 72 61 63 74 65 64 20 72 6f 77 20 28 6e 6f 77  tracted row (now
10500 20 69 6e 20 74 68 65 20 69 43 75 72 72 65 6e 74   in the iCurrent
10510 20 74 61 62 6c 65 29 20 62 65 63 6f 6d 65 73 20   table) becomes 
10520 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
10530 68 65 0a 2a 2a 20 72 65 63 75 72 73 69 76 65 2d  he.** recursive-
10540 74 61 62 6c 65 20 66 6f 72 20 61 20 72 65 63 75  table for a recu
10550 72 73 69 76 65 2d 71 75 65 72 79 20 72 75 6e 2e  rsive-query run.
10560 20 20 54 68 65 20 6f 75 74 70 75 74 20 6f 66 20    The output of 
10570 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 71 75  the recursive-qu
10580 65 72 79 0a 2a 2a 20 69 73 20 61 64 64 65 64 20  ery.** is added 
10590 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 51 75  back into the Qu
105a0 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65 6e  eue table.  Then
105b0 20 61 6e 6f 74 68 65 72 20 72 6f 77 20 69 73 20   another row is 
105c0 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51  extracted from Q
105d0 75 65 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ueue.** and the 
105e0 69 74 65 72 61 74 69 6f 6e 20 63 6f 6e 74 69 6e  iteration contin
105f0 75 65 73 20 75 6e 74 69 6c 20 74 68 65 20 51 75  ues until the Qu
10600 65 75 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  eue table is emp
10610 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ty..**.** If the
10620 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
10630 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f  operator is UNIO
10640 4e 20 74 68 65 6e 20 6e 6f 20 64 75 70 6c 69 63  N then no duplic
10650 61 74 65 20 72 6f 77 73 20 61 72 65 20 65 76 65  ate rows are eve
10660 72 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e  r.** inserted in
10670 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61 62  to the Queue tab
10680 6c 65 2e 20 20 54 68 65 20 69 44 69 73 74 69 6e  le.  The iDistin
10690 63 74 20 74 61 62 6c 65 20 6b 65 65 70 73 20 61  ct table keeps a
106a0 20 63 6f 70 79 20 6f 66 20 61 6c 6c 20 72 6f 77   copy of all row
106b0 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 65  s.** that have e
106c0 76 65 72 20 62 65 65 6e 20 69 6e 73 65 72 74 65  ver been inserte
106d0 64 20 69 6e 74 6f 20 51 75 65 75 65 20 61 6e 64  d into Queue and
106e0 20 63 61 75 73 65 73 20 64 75 70 6c 69 63 61 74   causes duplicat
106f0 65 73 20 74 6f 20 62 65 0a 2a 2a 20 64 69 73 63  es to be.** disc
10700 61 72 64 65 64 2e 20 20 49 66 20 74 68 65 20 6f  arded.  If the o
10710 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e  perator is UNION
10720 20 41 4c 4c 2c 20 74 68 65 6e 20 64 75 70 6c 69   ALL, then dupli
10730 63 61 74 65 73 20 61 72 65 20 61 6c 6c 6f 77 65  cates are allowe
10740 64 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65  d..** .** If the
10750 20 71 75 65 72 79 20 68 61 73 20 61 6e 20 4f 52   query has an OR
10760 44 45 52 20 42 59 2c 20 74 68 65 6e 20 65 6e 74  DER BY, then ent
10770 72 69 65 73 20 69 6e 20 74 68 65 20 51 75 65 75  ries in the Queu
10780 65 20 74 61 62 6c 65 20 61 72 65 20 6b 65 70 74  e table are kept
10790 20 69 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20   in.** ORDER BY 
107a0 6f 72 64 65 72 20 61 6e 64 20 74 68 65 20 66 69  order and the fi
107b0 72 73 74 20 65 6e 74 72 79 20 69 73 20 65 78 74  rst entry is ext
107c0 72 61 63 74 65 64 20 66 6f 72 20 65 61 63 68 20  racted for each 
107d0 63 79 63 6c 65 2e 20 20 57 69 74 68 6f 75 74 0a  cycle.  Without.
107e0 2a 2a 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20  ** an ORDER BY, 
107f0 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
10800 69 73 20 6a 75 73 74 20 61 20 46 49 46 4f 2e 0a  is just a FIFO..
10810 2a 2a 0a 2a 2a 20 49 66 20 61 20 4c 49 4d 49 54  **.** If a LIMIT
10820 20 63 6c 61 75 73 65 20 69 73 20 70 72 6f 76 69   clause is provi
10830 64 65 64 2c 20 74 68 65 6e 20 74 68 65 20 69 74  ded, then the it
10840 65 72 61 74 69 6f 6e 20 73 74 6f 70 73 20 61 66  eration stops af
10850 74 65 72 20 4c 49 4d 49 54 20 72 6f 77 73 0a 2a  ter LIMIT rows.*
10860 2a 20 68 61 76 65 20 62 65 65 6e 20 6f 75 74 70  * have been outp
10870 75 74 20 74 6f 20 70 44 65 73 74 2e 20 20 41 20  ut to pDest.  A 
10880 4c 49 4d 49 54 20 6f 66 20 7a 65 72 6f 20 6d 65  LIMIT of zero me
10890 61 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 6e 6f  ans to output no
108a0 20 72 6f 77 73 20 61 6e 64 20 61 0a 2a 2a 20 6e   rows and a.** n
108b0 65 67 61 74 69 76 65 20 4c 49 4d 49 54 20 6d 65  egative LIMIT me
108c0 61 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 61 6c  ans to output al
108d0 6c 20 72 6f 77 73 2e 20 20 49 66 20 74 68 65 72  l rows.  If ther
108e0 65 20 69 73 20 61 6c 73 6f 20 61 6e 20 4f 46 46  e is also an OFF
108f0 53 45 54 20 63 6c 61 75 73 65 0a 2a 2a 20 77 69  SET clause.** wi
10900 74 68 20 61 20 70 6f 73 69 74 69 76 65 20 76 61  th a positive va
10910 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69  lue, then the fi
10920 72 73 74 20 4f 46 46 53 45 54 20 6f 75 74 70 75  rst OFFSET outpu
10930 74 73 20 61 72 65 20 64 69 73 63 61 72 64 65 64  ts are discarded
10940 20 72 61 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20   rather.** than 
10950 62 65 69 6e 67 20 73 65 6e 74 20 74 6f 20 70 44  being sent to pD
10960 65 73 74 2e 20 20 54 68 65 20 4c 49 4d 49 54 20  est.  The LIMIT 
10970 63 6f 75 6e 74 20 64 6f 65 73 20 6e 6f 74 20 62  count does not b
10980 65 67 69 6e 20 75 6e 74 69 6c 20 61 66 74 65 72  egin until after
10990 20 4f 46 46 53 45 54 0a 2a 2a 20 72 6f 77 73 20   OFFSET.** rows 
109a0 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65  have been skippe
109b0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
109c0 64 20 67 65 6e 65 72 61 74 65 57 69 74 68 52 65  d generateWithRe
109d0 63 75 72 73 69 76 65 51 75 65 72 79 28 0a 20 20  cursiveQuery(.  
109e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
109f0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
10a00 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
10a10 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
10a20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 75 72      /* The recur
10a30 73 69 76 65 20 53 45 4c 45 43 54 20 74 6f 20 62  sive SELECT to b
10a40 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
10a50 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
10a60 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
10a70 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
10a80 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c  lts */.){.  SrcL
10a90 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70  ist *pSrc = p->p
10aa0 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Src;      /* The
10ab0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
10ac0 74 68 65 20 72 65 63 75 72 73 69 76 65 20 71 75  the recursive qu
10ad0 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  ery */.  int nCo
10ae0 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  l = p->pEList->n
10af0 45 78 70 72 3b 20 20 2f 2a 20 4e 75 6d 62 65 72  Expr;  /* Number
10b00 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
10b10 68 65 20 72 65 63 75 72 73 69 76 65 20 74 61 62  he recursive tab
10b20 6c 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  le */.  Vdbe *v 
10b30 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
10b40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65        /* The pre
10b50 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
10b60 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
10b70 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
10b80 70 53 65 74 75 70 20 3d 20 70 2d 3e 70 50 72 69  pSetup = p->pPri
10b90 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 73 65 74  or;   /* The set
10ba0 75 70 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  up query */.  in
10bb0 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20  t addrTop;      
10bc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10bd0 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a  op of the loop *
10be0 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74  /.  int addrCont
10bf0 2c 20 61 64 64 72 42 72 65 61 6b 3b 20 20 20 20  , addrBreak;    
10c00 20 20 2f 2a 20 43 4f 4e 54 49 4e 55 45 20 61 6e    /* CONTINUE an
10c10 64 20 42 52 45 41 4b 20 61 64 64 72 65 73 73 65  d BREAK addresse
10c20 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 72  s */.  int iCurr
10c30 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ent = 0;        
10c40 20 20 20 20 20 2f 2a 20 54 68 65 20 43 75 72 72       /* The Curr
10c50 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ent table */.  i
10c60 6e 74 20 72 65 67 43 75 72 72 65 6e 74 3b 20 20  nt regCurrent;  
10c70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10c80 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
10c90 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a   Current table *
10ca0 2f 0a 20 20 69 6e 74 20 69 51 75 65 75 65 3b 20  /.  int iQueue; 
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cc0 20 20 2f 2a 20 54 68 65 20 51 75 65 75 65 20 74    /* The Queue t
10cd0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44  able */.  int iD
10ce0 69 73 74 69 6e 63 74 20 3d 20 30 3b 20 20 20 20  istinct = 0;    
10cf0 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 65 6e          /* To en
10d00 73 75 72 65 20 75 6e 69 71 75 65 20 72 65 73 75  sure unique resu
10d10 6c 74 73 20 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a  lts if UNION */.
10d20 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 53 52    int eDest = SR
10d30 54 5f 46 69 66 6f 3b 20 20 20 20 20 20 20 20 20  T_Fifo;         
10d40 2f 2a 20 48 6f 77 20 74 6f 20 77 72 69 74 65 20  /* How to write 
10d50 74 6f 20 51 75 65 75 65 20 2a 2f 0a 20 20 53 65  to Queue */.  Se
10d60 6c 65 63 74 44 65 73 74 20 64 65 73 74 51 75 65  lectDest destQue
10d70 75 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ue;         /* S
10d80 65 6c 65 63 74 44 65 73 74 20 74 61 72 67 65 74  electDest target
10d90 74 69 6e 67 20 74 68 65 20 51 75 65 75 65 20 74  ting the Queue t
10da0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  able */.  int i;
10db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10dc0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
10dd0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
10de0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
10df0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
10e00 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 45  sult code */.  E
10e10 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
10e20 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y;           /* 
10e30 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
10e40 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  use */.  Expr *p
10e50 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b  Limit, *pOffset;
10e60 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20         /* Saved 
10e70 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
10e80 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d   */.  int regLim
10e90 69 74 2c 20 72 65 67 4f 66 66 73 65 74 3b 20 20  it, regOffset;  
10ea0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73      /* Registers
10eb0 20 75 73 65 64 20 62 79 20 4c 49 4d 49 54 20 61   used by LIMIT a
10ec0 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 0a 20 20  nd OFFSET */..  
10ed0 2f 2a 20 4f 62 74 61 69 6e 20 61 75 74 68 6f 72  /* Obtain author
10ee0 69 7a 61 74 69 6f 6e 20 74 6f 20 64 6f 20 61 20  ization to do a 
10ef0 72 65 63 75 72 73 69 76 65 20 71 75 65 72 79 20  recursive query 
10f00 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
10f10 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
10f20 2c 20 53 51 4c 49 54 45 5f 52 45 43 55 52 53 49  , SQLITE_RECURSI
10f30 56 45 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72  VE, 0, 0, 0) ) r
10f40 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f  eturn;..  /* Pro
10f50 63 65 73 73 20 74 68 65 20 4c 49 4d 49 54 20 61  cess the LIMIT a
10f60 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  nd OFFSET clause
10f70 73 2c 20 69 66 20 74 68 65 79 20 65 78 69 73 74  s, if they exist
10f80 20 2a 2f 0a 20 20 61 64 64 72 42 72 65 61 6b 20   */.  addrBreak 
10f90 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
10fa0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d  eLabel(v);.  com
10fb0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
10fc0 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 61 64  rs(pParse, p, ad
10fd0 64 72 42 72 65 61 6b 29 3b 0a 20 20 70 4c 69 6d  drBreak);.  pLim
10fe0 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
10ff0 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70    pOffset = p->p
11000 4f 66 66 73 65 74 3b 0a 20 20 72 65 67 4c 69 6d  Offset;.  regLim
11010 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a  it = p->iLimit;.
11020 20 20 72 65 67 4f 66 66 73 65 74 20 3d 20 70 2d    regOffset = p-
11030 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70  >iOffset;.  p->p
11040 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4f 66 66 73  Limit = p->pOffs
11050 65 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 4c 69  et = 0;.  p->iLi
11060 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74  mit = p->iOffset
11070 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65 72 42 79   = 0;.  pOrderBy
11080 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
11090 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
110a0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
110b0 66 20 74 68 65 20 43 75 72 72 65 6e 74 20 74 61  f the Current ta
110c0 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ble */.  for(i=0
110d0 3b 20 41 4c 57 41 59 53 28 69 3c 70 53 72 63 2d  ; ALWAYS(i<pSrc-
110e0 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b 0a 20 20  >nSrc); i++){.  
110f0 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69 5d    if( pSrc->a[i]
11100 2e 69 73 52 65 63 75 72 73 69 76 65 20 29 7b 0a  .isRecursive ){.
11110 20 20 20 20 20 20 69 43 75 72 72 65 6e 74 20 3d        iCurrent =
11120 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72   pSrc->a[i].iCur
11130 73 6f 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  sor;.      break
11140 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
11150 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f  * Allocate curso
11160 72 73 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 51  rs numbers for Q
11170 75 65 75 65 20 61 6e 64 20 44 69 73 74 69 6e 63  ueue and Distinc
11180 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6e  t.  The cursor n
11190 75 6d 62 65 72 20 66 6f 72 0a 20 20 2a 2a 20 74  umber for.  ** t
111a0 68 65 20 44 69 73 74 69 6e 63 74 20 74 61 62 6c  he Distinct tabl
111b0 65 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c  e must be exactl
111c0 79 20 6f 6e 65 20 67 72 65 61 74 65 72 20 74 68  y one greater th
111d0 61 6e 20 51 75 65 75 65 20 69 6e 20 6f 72 64 65  an Queue in orde
111e0 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 53  r.  ** for the S
111f0 52 54 5f 44 69 73 74 46 69 66 6f 20 61 6e 64 20  RT_DistFifo and 
11200 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 64 65  SRT_DistQueue de
11210 73 74 69 6e 61 74 69 6f 6e 73 20 74 6f 20 77 6f  stinations to wo
11220 72 6b 2e 20 2a 2f 0a 20 20 69 51 75 65 75 65 20  rk. */.  iQueue 
11230 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
11240 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54  ;.  if( p->op==T
11250 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 65  K_UNION ){.    e
11260 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20  Dest = pOrderBy 
11270 3f 20 53 52 54 5f 44 69 73 74 51 75 65 75 65 20  ? SRT_DistQueue 
11280 3a 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3b 0a  : SRT_DistFifo;.
11290 20 20 20 20 69 44 69 73 74 69 6e 63 74 20 3d 20      iDistinct = 
112a0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
112b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 44 65    }else{.    eDe
112c0 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20  st = pOrderBy ? 
112d0 53 52 54 5f 51 75 65 75 65 20 3a 20 53 52 54 5f  SRT_Queue : SRT_
112e0 46 69 66 6f 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Fifo;.  }.  sqli
112f0 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
11300 74 28 26 64 65 73 74 51 75 65 75 65 2c 20 65 44  t(&destQueue, eD
11310 65 73 74 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20  est, iQueue);.. 
11320 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75 72   /* Allocate cur
11330 73 6f 72 73 20 66 6f 72 20 43 75 72 72 65 6e 74  sors for Current
11340 2c 20 51 75 65 75 65 2c 20 61 6e 64 20 44 69 73  , Queue, and Dis
11350 74 69 6e 63 74 2e 20 2a 2f 0a 20 20 72 65 67 43  tinct. */.  regC
11360 75 72 72 65 6e 74 20 3d 20 2b 2b 70 50 61 72 73  urrent = ++pPars
11370 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74  e->nMem;.  sqlit
11380 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
11390 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69  OP_OpenPseudo, i
113a0 43 75 72 72 65 6e 74 2c 20 72 65 67 43 75 72 72  Current, regCurr
113b0 65 6e 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 69 66  ent, nCol);.  if
113c0 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
113d0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
113e0 6e 66 6f 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  nfo = multiSelec
113f0 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28  tOrderByKeyInfo(
11400 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20  pParse, p, 1);. 
11410 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11420 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
11430 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65  phemeral, iQueue
11440 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
11450 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  r+2, 0,.        
11460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
11470 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
11480 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
11490 64 65 73 74 51 75 65 75 65 2e 70 4f 72 64 65 72  destQueue.pOrder
114a0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
114b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
114c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
114d0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
114e0 6c 2c 20 69 51 75 65 75 65 2c 20 6e 43 6f 6c 29  l, iQueue, nCol)
114f0 3b 0a 20 20 7d 0a 20 20 56 64 62 65 43 6f 6d 6d  ;.  }.  VdbeComm
11500 65 6e 74 28 28 76 2c 20 22 51 75 65 75 65 20 74  ent((v, "Queue t
11510 61 62 6c 65 22 29 29 3b 0a 20 20 69 66 28 20 69  able"));.  if( i
11520 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
11530 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
11540 30 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  0] = sqlite3Vdbe
11550 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
11560 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 44 69 73  nEphemeral, iDis
11570 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20 20 20 70  tinct, 0);.    p
11580 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
11590 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
115a0 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 61 63 68    }..  /* Detach
115b0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
115c0 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 63 6f  ause from the co
115d0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f  mpound SELECT */
115e0 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d  .  p->pOrderBy =
115f0 20 30 3b 0a 0a 20 20 2f 2a 20 53 74 6f 72 65 20   0;..  /* Store 
11600 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
11610 68 65 20 73 65 74 75 70 2d 71 75 65 72 79 20 69  he setup-query i
11620 6e 20 51 75 65 75 65 2e 20 2a 2f 0a 20 20 70 53  n Queue. */.  pS
11630 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  etup->pNext = 0;
11640 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53  .  rc = sqlite3S
11650 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
11660 65 74 75 70 2c 20 26 64 65 73 74 51 75 65 75 65  etup, &destQueue
11670 29 3b 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65  );.  pSetup->pNe
11680 78 74 20 3d 20 70 3b 0a 20 20 69 66 28 20 72 63  xt = p;.  if( rc
11690 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72   ) goto end_of_r
116a0 65 63 75 72 73 69 76 65 5f 71 75 65 72 79 3b 0a  ecursive_query;.
116b0 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e  .  /* Find the n
116c0 65 78 74 20 72 6f 77 20 69 6e 20 74 68 65 20 51  ext row in the Q
116d0 75 65 75 65 20 61 6e 64 20 6f 75 74 70 75 74 20  ueue and output 
116e0 74 68 61 74 20 72 6f 77 20 2a 2f 0a 20 20 61 64  that row */.  ad
116f0 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  drTop = sqlite3V
11700 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11710 52 65 77 69 6e 64 2c 20 69 51 75 65 75 65 2c 20  Rewind, iQueue, 
11720 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65  addrBreak); Vdbe
11730 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
11740 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20  /* Transfer the 
11750 6e 65 78 74 20 72 6f 77 20 69 6e 20 51 75 65 75  next row in Queu
11760 65 20 6f 76 65 72 20 74 6f 20 43 75 72 72 65 6e  e over to Curren
11770 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  t */.  sqlite3Vd
11780 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
11790 75 6c 6c 52 6f 77 2c 20 69 43 75 72 72 65 6e 74  ullRow, iCurrent
117a0 29 3b 20 2f 2a 20 54 6f 20 72 65 73 65 74 20 63  ); /* To reset c
117b0 6f 6c 75 6d 6e 20 63 61 63 68 65 20 2a 2f 0a 20  olumn cache */. 
117c0 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
117d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
117e0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
117f0 75 6d 6e 2c 20 69 51 75 65 75 65 2c 20 70 4f 72  umn, iQueue, pOr
11800 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20  derBy->nExpr+1, 
11810 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d  regCurrent);.  }
11820 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
11830 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11840 50 5f 52 6f 77 44 61 74 61 2c 20 69 51 75 65 75  P_RowData, iQueu
11850 65 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a  e, regCurrent);.
11860 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
11870 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65  eAddOp1(v, OP_De
11880 6c 65 74 65 2c 20 69 51 75 65 75 65 29 3b 0a 0a  lete, iQueue);..
11890 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
118a0 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75  single row in Cu
118b0 72 72 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 43  rrent */.  addrC
118c0 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
118d0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
118e0 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 72   codeOffset(v, r
118f0 65 67 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f  egOffset, addrCo
11900 6e 74 29 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e  nt);.  selectInn
11910 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
11920 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 43 75  , p->pEList, iCu
11930 72 72 65 6e 74 2c 0a 20 20 20 20 20 20 30 2c 20  rrent,.      0, 
11940 30 2c 20 70 44 65 73 74 2c 20 61 64 64 72 43 6f  0, pDest, addrCo
11950 6e 74 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  nt, addrBreak);.
11960 20 20 69 66 28 20 72 65 67 4c 69 6d 69 74 20 29    if( regLimit )
11970 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
11980 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
11990 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c 20  Zero, regLimit, 
119a0 61 64 64 72 42 72 65 61 6b 2c 20 2d 31 29 3b 0a  addrBreak, -1);.
119b0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
119c0 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (v);.  }.  sqlit
119d0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
119e0 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b  el(v, addrCont);
119f0 0a 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74  ..  /* Execute t
11a00 68 65 20 72 65 63 75 72 73 69 76 65 20 53 45 4c  he recursive SEL
11a10 45 43 54 20 74 61 6b 69 6e 67 20 74 68 65 20 73  ECT taking the s
11a20 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72  ingle row in Cur
11a30 72 65 6e 74 20 61 73 0a 20 20 2a 2a 20 74 68 65  rent as.  ** the
11a40 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 72   value for the r
11a50 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 2e 20  ecursive-table. 
11a60 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
11a70 73 20 69 6e 20 74 68 65 20 51 75 65 75 65 2e 0a  s in the Queue..
11a80 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72    */.  p->pPrior
11a90 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 53   = 0;.  sqlite3S
11aa0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
11ab0 20 26 64 65 73 74 51 75 65 75 65 29 3b 0a 20 20   &destQueue);.  
11ac0 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f  assert( p->pPrio
11ad0 72 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 50 72  r==0 );.  p->pPr
11ae0 69 6f 72 20 3d 20 70 53 65 74 75 70 3b 0a 0a 20  ior = pSetup;.. 
11af0 20 2f 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67   /* Keep running
11b00 20 74 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20   the loop until 
11b10 74 68 65 20 51 75 65 75 65 20 69 73 20 65 6d 70  the Queue is emp
11b20 74 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  ty */.  sqlite3V
11b30 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11b40 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 54 6f 70  Goto, 0, addrTop
11b50 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
11b60 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
11b70 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a 65 6e 64  addrBreak);..end
11b80 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75  _of_recursive_qu
11b90 65 72 79 3a 0a 20 20 73 71 6c 69 74 65 33 45 78  ery:.  sqlite3Ex
11ba0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
11bb0 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64  rse->db, p->pOrd
11bc0 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70 4f 72 64  erBy);.  p->pOrd
11bd0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
11be0 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  .  p->pLimit = p
11bf0 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 70 4f 66 66  Limit;.  p->pOff
11c00 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20  set = pOffset;. 
11c10 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69   return;.}.#endi
11c20 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
11c30 5f 43 54 45 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77  _CTE */../* Forw
11c40 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a  ard references *
11c50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
11c60 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
11c70 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
11c80 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
11c90 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
11ca0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
11cb0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
11cc0 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
11cd0 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
11ce0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
11cf0 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
11d00 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
11d10 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
11d20 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ;.../*.** This r
11d30 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
11d40 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 63 6f   to process a co
11d50 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 66 6f 72  mpound query for
11d60 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72  m from.** two or
11d70 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20 71   more separate q
11d80 75 65 72 69 65 73 20 75 73 69 6e 67 20 55 4e 49  ueries using UNI
11d90 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45  ON, UNION ALL, E
11da0 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54  XCEPT, or.** INT
11db0 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22  ERSECT.**.** "p"
11dc0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72   points to the r
11dd0 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65  ight-most of the
11de0 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74   two queries.  t
11df0 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a  he query on the.
11e00 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50  ** left is p->pP
11e10 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20  rior.  The left 
11e20 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f  query could also
11e30 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71   be a compound q
11e40 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68  uery.** in which
11e50 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69   case this routi
11e60 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  ne will be calle
11e70 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a  d recursively. .
11e80 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
11e90 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71  s of the total q
11ea0 75 65 72 79 20 61 72 65 20 74 6f 20 62 65 20 77  uery are to be w
11eb0 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65  ritten into a de
11ec0 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  stination.** of 
11ed0 74 79 70 65 20 65 44 65 73 74 20 77 69 74 68 20  type eDest with 
11ee0 70 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e  parameter iParm.
11ef0 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31  .**.** Example 1
11f00 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68  :  Consider a th
11f10 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64  ree-way compound
11f20 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
11f30 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
11f40 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e   a FROM t1 UNION
11f50 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74   SELECT b FROM t
11f60 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63  2 UNION SELECT c
11f70 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54   FROM t3.**.** T
11f80 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73  his statement is
11f90 20 70 61 72 73 65 64 20 75 70 20 61 73 20 66 6f   parsed up as fo
11fa0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
11fb0 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
11fc0 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20  3.**      |.**  
11fd0 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c      `----->  SEL
11fe0 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a  ECT b FROM t2.**
11ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12000 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
12010 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45      `------>  SE
12020 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a  LECT a FROM t1.*
12030 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20  *.** The arrows 
12040 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20 61  in the diagram a
12050 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20 74  bove represent t
12060 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72  he Select.pPrior
12070 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20   pointer..** So 
12080 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
12090 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70  is called with p
120a0 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33   equal to the t3
120b0 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20   query, then.** 
120c0 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74  pPrior will be t
120d0 68 65 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d  he t2 query.  p-
120e0 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55  >op will be TK_U
120f0 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73  NION in this cas
12100 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20  e..**.** Notice 
12110 74 68 61 74 20 62 65 63 61 75 73 65 20 6f 66 20  that because of 
12120 74 68 65 20 77 61 79 20 53 51 4c 69 74 65 20 70  the way SQLite p
12130 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53  arses compound S
12140 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69  ELECTs, the.** i
12150 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74  ndividual select
12160 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66  s always group f
12170 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
12180 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
12190 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20   multiSelect(.  
121a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
121b0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
121c0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
121d0 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
121e0 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
121f0 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
12200 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
12210 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
12220 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
12230 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
12240 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
12250 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12260 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73  _OK;   /* Succes
12270 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75  s code from a su
12280 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65  broutine */.  Se
12290 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20  lect *pPrior;   
122a0 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
122b0 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c  ELECT immediatel
122c0 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f  y to our left */
122d0 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
122e0 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
122f0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69  rate code to thi
12300 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65  s VDBE */.  Sele
12310 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20  ctDest dest;    
12320 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65    /* Alternative
12330 20 64 61 74 61 20 64 65 73 74 69 6e 61 74 69 6f   data destinatio
12340 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  n */.  Select *p
12350 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20  Delete = 0;  /* 
12360 43 68 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20  Chain of simple 
12370 73 65 6c 65 63 74 73 20 74 6f 20 64 65 6c 65 74  selects to delet
12380 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
12390 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  db;          /* 
123a0 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
123b0 69 6f 6e 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ion */.#ifndef S
123c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
123d0 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 20 3d  IN.  int iSub1 =
123e0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51   0;        /* EQ
123f0 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e  P id of left-han
12400 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  d query */.  int
12410 20 69 53 75 62 32 20 3d 20 30 3b 20 20 20 20 20   iSub2 = 0;     
12420 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20     /* EQP id of 
12430 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72 79  right-hand query
12440 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a   */.#endif..  /*
12450 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
12460 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
12470 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  or LIMIT clause 
12480 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73  on prior SELECTs
12490 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65  .  Only.  ** the
124a0 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f 73   last (right-mos
124b0 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65  t) SELECT in the
124c0 20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76 65   series may have
124d0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20   an ORDER BY or 
124e0 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 61 73  LIMIT..  */.  as
124f0 73 65 72 74 28 20 70 20 26 26 20 70 2d 3e 70 50  sert( p && p->pP
12500 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43 61 6c 6c  rior );  /* Call
12510 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 67 75 61  ing function gua
12520 72 61 6e 74 65 65 73 20 74 68 69 73 20 6d 75 63  rantees this muc
12530 68 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  h */.  assert( (
12540 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
12550 5f 52 65 63 75 72 73 69 76 65 29 3d 3d 30 20 7c  _Recursive)==0 |
12560 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  | p->op==TK_ALL 
12570 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  || p->op==TK_UNI
12580 4f 4e 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61  ON );.  db = pPa
12590 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72 69 6f  rse->db;.  pPrio
125a0 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
125b0 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a   dest = *pDest;.
125c0 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f    if( pPrior->pO
125d0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71  rderBy ){.    sq
125e0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
125f0 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59 20 63  arse,"ORDER BY c
12600 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d  lause should com
12610 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62  e after %s not b
12620 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65  efore",.      se
12630 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
12640 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
12650 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
12660 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
12670 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69   if( pPrior->pLi
12680 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
12690 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
126a0 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  e,"LIMIT clause 
126b0 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65  should come afte
126c0 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22  r %s not before"
126d0 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70  ,.      selectOp
126e0 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
126f0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
12700 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
12710 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20  end;.  }..  v = 
12720 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
12730 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
12740 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68  ( v!=0 );  /* Th
12750 65 20 56 44 42 45 20 61 6c 72 65 61 64 79 20 63  e VDBE already c
12760 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c 69 6e  reated by callin
12770 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20  g function */.. 
12780 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 64   /* Create the d
12790 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f  estination tempo
127a0 72 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65  rary table if ne
127b0 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69  cessary.  */.  i
127c0 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53  f( dest.eDest==S
127d0 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20  RT_EphemTab ){. 
127e0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
127f0 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c 69  List );.    sqli
12800 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12810 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
12820 6c 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c  l, dest.iSDParm,
12830 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
12840 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  r);.    sqlite3V
12850 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42  dbeChangeP5(v, B
12860 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b  TREE_UNORDERED);
12870 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20  .    dest.eDest 
12880 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d  = SRT_Table;.  }
12890 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
128a0 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20   all SELECTs in 
128b0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61  the statement ha
128c0 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
128d0 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20  er of elements. 
128e0 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73   ** in their res
128f0 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20  ult sets..  */. 
12900 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
12910 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45  st && pPrior->pE
12920 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d  List );.  if( p-
12930 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
12940 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e  pPrior->pEList->
12950 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 69 66 28  nExpr ){.    if(
12960 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
12970 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20 20 20 20  F_Values ){.    
12980 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
12990 67 28 70 50 61 72 73 65 2c 20 22 61 6c 6c 20 56  g(pParse, "all V
129a0 41 4c 55 45 53 20 6d 75 73 74 20 68 61 76 65 20  ALUES must have 
129b0 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
129c0 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20 20 20 20  of terms");.    
129d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
129e0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
129f0 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f  rse, "SELECTs to
12a00 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
12a10 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20  ght of %s".     
12a20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65     " do not have
12a30 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
12a40 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
12a50 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d  ns", selectOpNam
12a60 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 7d  e(p->op));.    }
12a70 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
12a80 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
12a90 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 23 69 66  ct_end;.  }..#if
12aa0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12ab0 5f 43 54 45 0a 20 20 69 66 28 20 70 2d 3e 73 65  _CTE.  if( p->se
12ac0 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
12ad0 72 73 69 76 65 20 29 7b 0a 20 20 20 20 67 65 6e  rsive ){.    gen
12ae0 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69  erateWithRecursi
12af0 76 65 51 75 65 72 79 28 70 50 61 72 73 65 2c 20  veQuery(pParse, 
12b00 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 7d 65 6c  p, &dest);.  }el
12b10 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  se.#endif..  /* 
12b20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  Compound SELECTs
12b30 20 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52   that have an OR
12b40 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
12b50 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61  e handled separa
12b60 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tely..  */.  if(
12b70 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
12b80 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69      return multi
12b90 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50  SelectOrderBy(pP
12ba0 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b  arse, p, pDest);
12bb0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 47  .  }else..  /* G
12bc0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
12bd0 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
12be0 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ght SELECT state
12bf0 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77  ments..  */.  sw
12c00 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
12c10 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
12c20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
12c30 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
12c40 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 61 73  nLimit;.      as
12c50 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70  sert( !pPrior->p
12c60 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 70  Limit );.      p
12c70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20  Prior->iLimit = 
12c80 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->iLimit;.     
12c90 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74   pPrior->iOffset
12ca0 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20   = p->iOffset;. 
12cb0 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69       pPrior->pLi
12cc0 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
12cd0 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70  .      pPrior->p
12ce0 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
12cf0 73 65 74 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  set;.      expla
12d00 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
12d10 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b1, pParse->iNex
12d20 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
12d30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
12d40 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
12d50 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  ior, &dest);.   
12d60 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
12d70 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
12d80 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  et = 0;.      if
12d90 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
12da0 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
12db0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
12dc0 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
12dd0 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69   0;.      p->iLi
12de0 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c  mit = pPrior->iL
12df0 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69  imit;.      p->i
12e00 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d  Offset = pPrior-
12e10 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >iOffset;.      
12e20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b  if( p->iLimit ){
12e30 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
12e40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12e50 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20  1(v, OP_IfZero, 
12e60 70 2d 3e 69 4c 69 6d 69 74 29 3b 20 56 64 62 65  p->iLimit); Vdbe
12e70 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
12e80 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
12e90 28 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64  ((v, "Jump ahead
12ea0 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65   if LIMIT reache
12eb0 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  d"));.      }.  
12ec0 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
12ed0 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61  teger(iSub2, pPa
12ee0 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
12ef0 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
12f00 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
12f10 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b  arse, p, &dest);
12f20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
12f30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12f40 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20  ;.      pDelete 
12f50 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
12f60 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
12f70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
12f80 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50  nSelectRow += pP
12f90 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
12fa0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69  ;.      if( pPri
12fb0 6f 72 2d 3e 70 4c 69 6d 69 74 0a 20 20 20 20 20  or->pLimit.     
12fc0 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
12fd0 49 73 49 6e 74 65 67 65 72 28 70 50 72 69 6f 72  IsInteger(pPrior
12fe0 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 4c 69 6d 69  ->pLimit, &nLimi
12ff0 74 29 0a 20 20 20 20 20 20 20 26 26 20 6e 4c 69  t).       && nLi
13000 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e 53 65 6c  mit>0 && p->nSel
13010 65 63 74 52 6f 77 20 3e 20 28 75 36 34 29 6e 4c  ectRow > (u64)nL
13020 69 6d 69 74 20 0a 20 20 20 20 20 20 29 7b 0a 20  imit .      ){. 
13030 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63         p->nSelec
13040 74 52 6f 77 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20  tRow = nLimit;. 
13050 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
13060 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20   addr ){.       
13070 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
13080 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
13090 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
130a0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
130b0 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20  se TK_EXCEPT:.  
130c0 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a    case TK_UNION:
130d0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69   {.      int uni
130e0 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72  onTab;    /* Cur
130f0 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
13100 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
13110 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  e holding result
13120 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 6f 70 20   */.      u8 op 
13130 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e  = 0;       /* On
13140 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70  e of the SRT_ op
13150 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c  erations to appl
13160 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20  y to self */.   
13170 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20     int priorOp; 
13180 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20      /* The SRT_ 
13190 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70  operation to app
131a0 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65  ly to prior sele
131b0 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  cts */.      Exp
131c0 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66  r *pLimit, *pOff
131d0 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61  set; /* Saved va
131e0 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69  lues of p->nLimi
131f0 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74  t and p->nOffset
13200 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
13210 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  dr;.      Select
13220 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a  Dest uniondest;.
13230 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
13240 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50   p->op==TK_EXCEP
13250 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
13260 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ase( p->op==TK_U
13270 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 72  NION );.      pr
13280 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f  iorOp = SRT_Unio
13290 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73  n;.      if( des
132a0 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70  t.eDest==priorOp
132b0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
132c0 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65  e can reuse a te
132d0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65  mporary table ge
132e0 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c  nerated by a SEL
132f0 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20  ECT to our.     
13300 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20     ** right..   
13310 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
13320 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69  assert( p->pLimi
13330 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20  t==0 );      /* 
13340 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c  Not allowed on l
13350 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73  eftward elements
13360 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
13370 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d  rt( p->pOffset==
13380 30 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20  0 );     /* Not 
13390 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77  allowed on leftw
133a0 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a  ard elements */.
133b0 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
133c0 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b   = dest.iSDParm;
133d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
133e0 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c        /* We will
133f0 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
13400 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72  our own temporar
13410 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  y table to hold 
13420 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  the.        ** i
13430 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
13440 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  lts..        */.
13450 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
13460 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
13470 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  +;.        asser
13480 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
13490 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64  0 );.        add
134a0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
134b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
134c0 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e  Ephemeral, union
134d0 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Tab, 0);.       
134e0 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
134f0 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d  OpenEphm[0] == -
13500 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  1 );.        p->
13510 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
13520 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20  = addr;.        
13530 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29  findRightmost(p)
13540 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
13550 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
13560 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13570 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
13580 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
13590 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ode the SELECT s
135a0 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72  tatements to our
135b0 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20   left.      */. 
135c0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
135d0 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
135e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
135f0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 75  electDestInit(&u
13600 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f  niondest, priorO
13610 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20  p, unionTab);.  
13620 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
13630 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61  teger(iSub1, pPa
13640 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
13650 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
13660 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
13670 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75  arse, pPrior, &u
13680 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20  niondest);.     
13690 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
136a0 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
136b0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
136c0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
136d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
136e0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ECT statement.  
136f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
13700 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50   p->op==TK_EXCEP
13710 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20  T ){.        op 
13720 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20  = SRT_Except;.  
13730 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13740 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
13750 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
13760 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55        op = SRT_U
13770 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nion;.      }.  
13780 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
13790 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20  0;.      pLimit 
137a0 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
137b0 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
137c0 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20  ;.      pOffset 
137d0 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
137e0 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
137f0 20 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64   0;.      uniond
13800 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a  est.eDest = op;.
13810 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
13820 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70  Integer(iSub2, p
13830 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
13840 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
13850 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
13860 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f  pParse, p, &unio
13870 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65  ndest);.      te
13880 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
13890 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f  TE_OK );.      /
138a0 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69  * Query flatteni
138b0 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c  ng in sqlite3Sel
138c0 65 63 74 28 29 20 6d 69 67 68 74 20 72 65 66 69  ect() might refi
138d0 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a  ll p->pOrderBy..
138e0 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65        ** Be sure
138f0 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f   to delete p->pO
13900 72 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72  rderBy, therefor
13910 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65  e, to avoid a me
13920 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20  mory leak. */.  
13930 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
13940 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
13950 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
13960 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
13970 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
13980 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
13990 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  .      p->pOrder
139a0 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  By = 0;.      if
139b0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
139c0 4e 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  N ) p->nSelectRo
139d0 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  w += pPrior->nSe
139e0 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73  lectRow;.      s
139f0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
13a00 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
13a10 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
13a20 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
13a30 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
13a40 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
13a50 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
13a60 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30    p->iOffset = 0
13a70 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  ;..      /* Conv
13a80 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20  ert the data in 
13a90 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
13aa0 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65  ble into whateve
13ab0 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20  r form.      ** 
13ac0 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75  it is that we cu
13ad0 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20  rrently need..  
13ae0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
13af0 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64  ert( unionTab==d
13b00 65 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64  est.iSDParm || d
13b10 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72  est.eDest!=prior
13b20 4f 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Op );.      if( 
13b30 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f  dest.eDest!=prio
13b40 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69  rOp ){.        i
13b50 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
13b60 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
13b70 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
13b80 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ist );.        i
13b90 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53  f( dest.eDest==S
13ba0 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
13bb0 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
13bc0 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20  First = p;.     
13bd0 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72       while( pFir
13be0 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69  st->pPrior ) pFi
13bf0 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50  rst = pFirst->pP
13c00 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rior;.          
13c10 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
13c20 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
13c30 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a  First->pEList);.
13c40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13c50 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74    iBreak = sqlit
13c60 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
13c70 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e  v);.        iCon
13c80 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
13c90 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
13ca0 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
13cb0 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
13cc0 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20  e, p, iBreak);. 
13cd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13ce0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
13cf0 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c  ewind, unionTab,
13d00 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
13d10 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
13d20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
13d30 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
13d40 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  dr(v);.        s
13d50 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
13d60 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
13d70 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 0a 20  ist, unionTab,. 
13d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d90 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65         0, 0, &de
13da0 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  st, iCont, iBrea
13db0 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
13dc0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
13dd0 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
13de0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13df0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
13e00 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ext, unionTab, i
13e10 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65  Start); VdbeCove
13e20 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
13e30 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
13e40 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
13e50 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
13e60 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13e70 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f  , OP_Close, unio
13e80 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
13e90 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
13ea0 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
13eb0 3a 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d  : assert( p->op=
13ec0 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b  =TK_INTERSECT );
13ed0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62   {.      int tab
13ee0 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69  1, tab2;.      i
13ef0 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
13f00 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
13f10 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70  Expr *pLimit, *p
13f20 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e  Offset;.      in
13f30 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65  t addr;.      Se
13f40 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72 73 65  lectDest interse
13f50 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e  ctdest;.      in
13f60 74 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  t r1;..      /* 
13f70 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66  INTERSECT is dif
13f80 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
13f90 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20  others since it 
13fa0 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a  requires.      *
13fb0 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20  * two temporary 
13fc0 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69  tables.  Hence i
13fd0 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61  t has its own ca
13fe0 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20  se.  Begin.     
13ff0 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e   ** by allocatin
14000 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20  g the tables we 
14010 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20  will need..     
14020 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d   */.      tab1 =
14030 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
14040 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50  .      tab2 = pP
14050 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
14060 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
14070 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20  OrderBy==0 );.. 
14080 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
14090 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
140a0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
140b0 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20  l, tab1, 0);.   
140c0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
140d0 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d  drOpenEphm[0] ==
140e0 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e   -1 );.      p->
140f0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
14100 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 66 69  = addr;.      fi
14110 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e  ndRightmost(p)->
14120 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55  selFlags |= SF_U
14130 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
14140 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
14150 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20  EList );..      
14160 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45  /* Code the SELE
14170 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  CTs to our left 
14180 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
14190 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20  able "tab1"..   
141a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
141b0 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
141c0 74 28 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  t(&intersectdest
141d0 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62  , SRT_Union, tab
141e0 31 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  1);.      explai
141f0 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
14200 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  1, pParse->iNext
14210 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
14220 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
14230 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
14240 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65  or, &intersectde
14250 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  st);.      if( r
14260 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
14270 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
14280 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  nd;.      }..   
14290 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
142a0 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e  urrent SELECT in
142b0 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
142c0 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20  le "tab2".      
142d0 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  */.      addr = 
142e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
142f0 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
14300 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b  meral, tab2, 0);
14310 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14320 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
14330 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
14340 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
14350 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [1] = addr;.    
14360 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
14370 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20  .      pLimit = 
14380 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
14390 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
143a0 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20        pOffset = 
143b0 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
143c0 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
143d0 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 73 65 63  ;.      intersec
143e0 74 64 65 73 74 2e 69 53 44 50 61 72 6d 20 3d 20  tdest.iSDParm = 
143f0 74 61 62 32 3b 0a 20 20 20 20 20 20 65 78 70 6c  tab2;.      expl
14400 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
14410 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub2, pParse->iNe
14420 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
14430 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
14440 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
14450 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29   &intersectdest)
14460 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14470 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14480 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65  );.      pDelete
14490 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
144a0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
144b0 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66  pPrior;.      if
144c0 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e  ( p->nSelectRow>
144d0 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
144e0 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ow ) p->nSelectR
144f0 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  ow = pPrior->nSe
14500 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73  lectRow;.      s
14510 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
14520 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
14530 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
14540 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
14550 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
14560 66 66 73 65 74 3b 0a 0a 20 20 20 20 20 20 2f 2a  ffset;..      /*
14570 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
14580 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72  o take the inter
14590 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  section of the t
145a0 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  wo temporary.   
145b0 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20     ** tables..  
145c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
145d0 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
145e0 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74  ;.      if( dest
145f0 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  .eDest==SRT_Outp
14600 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65  ut ){.        Se
14610 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70  lect *pFirst = p
14620 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
14630 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20   pFirst->pPrior 
14640 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73  ) pFirst = pFirs
14650 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  t->pPrior;.     
14660 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
14670 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30  nNames(pParse, 0
14680 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74  , pFirst->pEList
14690 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
146a0 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65   iBreak = sqlite
146b0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
146c0 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d  );.      iCont =
146d0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
146e0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
146f0 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
14700 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
14710 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
14720 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14730 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
14740 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 20 56  tab1, iBreak); V
14750 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
14760 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
14770 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
14780 72 73 65 29 3b 0a 20 20 20 20 20 20 69 53 74 61  rse);.      iSta
14790 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
147a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
147b0 4b 65 79 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a  Key, tab1, r1);.
147c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
147d0 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
147e0 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c  _NotFound, tab2,
147f0 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b 20   iCont, r1, 0); 
14800 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
14810 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
14820 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
14830 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
14840 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
14850 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
14860 4c 69 73 74 2c 20 74 61 62 31 2c 0a 20 20 20 20  List, tab1,.    
14870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14880 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69    0, 0, &dest, i
14890 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  Cont, iBreak);. 
148a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
148b0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
148c0 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  iCont);.      sq
148d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
148e0 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31  v, OP_Next, tab1
148f0 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62 65 43  , iStart); VdbeC
14900 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
14910 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
14920 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
14930 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
14940 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14950 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c   OP_Close, tab2,
14960 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
14970 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14980 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20  OP_Close, tab1, 
14990 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
149a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65 78  .    }.  }..  ex
149b0 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70  plainComposite(p
149c0 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53  Parse, p->op, iS
149d0 75 62 31 2c 20 69 53 75 62 32 2c 20 70 2d 3e 6f  ub1, iSub2, p->o
149e0 70 21 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20 2f  p!=TK_ALL);..  /
149f0 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74  * Compute collat
14a00 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75 73  ing sequences us
14a10 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70  ed by .  ** temp
14a20 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65  orary tables nee
14a30 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ded to implement
14a40 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
14a50 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63  lect..  ** Attac
14a60 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  h the KeyInfo st
14a70 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74  ructure to all t
14a80 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
14a90 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
14aa0 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62  section is run b
14ab0 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  y the right-most
14ac0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
14ad0 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c  t only..  ** SEL
14ae0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
14af0 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79  o the left alway
14b00 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74  s skip this part
14b10 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  .  The right-mos
14b20 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69  t.  ** SELECT mi
14b30 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68  ght also skip th
14b40 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68 61  is part if it ha
14b50 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
14b60 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f  ause and.  ** no
14b70 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65   temp tables are
14b80 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a   required..  */.
14b90 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
14ba0 73 20 26 20 53 46 5f 55 73 65 73 45 70 68 65 6d  s & SF_UsesEphem
14bb0 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  eral ){.    int 
14bc0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
14bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
14be0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
14bf0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
14c00 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  fo;            /
14c10 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
14c20 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65 73  ence for the res
14c30 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53  ult set */.    S
14c40 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20  elect *pLoop;   
14c50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14c60 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f  For looping thro
14c70 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74 65  ugh SELECT state
14c80 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c  ments */.    Col
14c90 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20  lSeq **apColl;  
14ca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
14cb0 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67  r looping throug
14cc0 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  h pKeyInfo->aCol
14cd0 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  l[] */.    int n
14ce0 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
14cf0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
14d00 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
14d10 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a   result set */..
14d20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
14d30 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e  Next==0 );.    n
14d40 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  Col = p->pEList-
14d50 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79  >nExpr;.    pKey
14d60 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
14d70 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
14d80 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  Col, 1);.    if(
14d90 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20   !pKeyInfo ){.  
14da0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14db0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
14dc0 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
14dd0 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  nd;.    }.    fo
14de0 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b  r(i=0, apColl=pK
14df0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69  eyInfo->aColl; i
14e00 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f  <nCol; i++, apCo
14e10 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70  ll++){.      *ap
14e20 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
14e30 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
14e40 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  , p, i);.      i
14e50 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b  f( 0==*apColl ){
14e60 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c  .        *apColl
14e70 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
14e80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14e90 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70  .    for(pLoop=p
14ea0 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
14eb0 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  Loop->pPrior){. 
14ec0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
14ed0 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  2; i++){.       
14ee0 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f   int addr = pLoo
14ef0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
14f00 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
14f10 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20  addr<0 ){.      
14f20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73      /* If [0] is
14f30 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d   unused then [1]
14f40 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e   is also unused.
14f50 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20    So we can.    
14f60 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
14f70 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20  safely abort as 
14f80 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73  soon as the firs
14f90 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73  t unused slot is
14fa0 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   found */.      
14fb0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
14fc0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
14fd0 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1]<0 );.        
14fe0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
14ff0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
15000 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
15010 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20  , addr, nCol);. 
15020 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15030 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
15040 64 72 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74  dr, (char*)sqlit
15050 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65  e3KeyInfoRef(pKe
15060 79 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20  yInfo),.        
15070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15080 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b      P4_KEYINFO);
15090 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
150a0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20  addrOpenEphm[i] 
150b0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = -1;.      }.  
150c0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4b    }.    sqlite3K
150d0 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
150e0 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74  Info);.  }..mult
150f0 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  i_select_end:.  
15100 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 64  pDest->iSdst = d
15110 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 70 44 65  est.iSdst;.  pDe
15120 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73 74  st->nSdst = dest
15130 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c 69 74 65  .nSdst;.  sqlite
15140 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
15150 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65  , pDelete);.  re
15160 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
15170 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
15180 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
15190 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20   */../*.** Code 
151a0 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  an output subrou
151b0 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75  tine for a corou
151c0 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tine implementat
151d0 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45  ion of a.** SELE
151e0 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a  CT statment..**.
151f0 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20 62  ** The data to b
15200 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74  e output is cont
15210 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53  ained in pIn->iS
15220 64 73 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a  dst.  There are.
15230 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f  ** pIn->nSdst co
15240 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70  lumns to be outp
15250 75 74 2e 20 20 70 44 65 73 74 20 69 73 20 77 68  ut.  pDest is wh
15260 65 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 73  ere the output s
15270 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74  hould.** be sent
15280 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72  ..**.** regRetur
15290 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
152a0 6f 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20  of the register 
152b0 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72  holding the subr
152c0 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
152d0 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
152e0 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65  If regPrev>0 the
152f0 6e 20 69 74 20 69 73 20 74 68 65 20 66 69 72 73  n it is the firs
15300 74 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20  t register in a 
15310 76 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72  vector that.** r
15320 65 63 6f 72 64 73 20 74 68 65 20 70 72 65 76 69  ecords the previ
15330 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d  ous output.  mem
15340 5b 72 65 67 50 72 65 76 5d 20 69 73 20 61 20 66  [regPrev] is a f
15350 6c 61 67 20 74 68 61 74 20 69 73 20 66 61 6c 73  lag that is fals
15360 65 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61  e.** if there ha
15370 73 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f  s been no previo
15380 75 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72  us output.  If r
15390 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f  egPrev>0 then co
153a0 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74  de is.** generat
153b0 65 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 64  ed to suppress d
153c0 75 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79  uplicates.  pKey
153d0 49 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72  Info is used for
153e0 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65   comparing.** ke
153f0 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ys..**.** If the
15400 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20   LIMIT found in 
15410 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61  p->iLimit is rea
15420 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64  ched, jump immed
15430 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72  iately to.** iBr
15440 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  eak..*/.static i
15450 6e 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75  nt generateOutpu
15460 74 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50  tSubroutine(.  P
15470 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
15480 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
15490 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
154a0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
154b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
154c0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
154d0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
154e0 70 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  pIn,        /* C
154f0 6f 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69  oroutine supplyi
15500 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c  ng data */.  Sel
15510 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
15520 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
15530 20 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a   send the data *
15540 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72  /.  int regRetur
15550 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  n,          /* T
15560 68 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  he return addres
15570 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  s register */.  
15580 69 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20 20  int regPrev,    
15590 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69          /* Previ
155a0 6f 75 73 20 72 65 73 75 6c 74 20 72 65 67 69 73  ous result regis
155b0 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e  ter.  No uniquen
155c0 65 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65  ess if 0 */.  Ke
155d0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
155e0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d        /* For com
155f0 70 61 72 69 6e 67 20 77 69 74 68 20 70 72 65 76  paring with prev
15600 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ious entry */.  
15610 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20  int iBreak      
15620 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
15630 68 65 72 65 20 69 66 20 77 65 20 68 69 74 20 74  here if we hit t
15640 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20  he LIMIT */.){. 
15650 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
15660 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
15670 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74  iContinue;.  int
15680 20 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d   addr;..  addr =
15690 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
156a0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43  entAddr(v);.  iC
156b0 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
156c0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
156d0 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73  );..  /* Suppres
156e0 73 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72  s duplicates for
156f0 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
15700 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20  and INTERSECT . 
15710 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65   */.  if( regPre
15720 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 2c  v ){.    int j1,
15730 20 6a 32 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71   j2;.    j1 = sq
15740 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
15750 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67  v, OP_IfNot, reg
15760 50 72 65 76 29 3b 20 56 64 62 65 43 6f 76 65 72  Prev); VdbeCover
15770 61 67 65 28 76 29 3b 0a 20 20 20 20 6a 32 20 3d  age(v);.    j2 =
15780 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15790 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p4(v, OP_Compare
157a0 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65  , pIn->iSdst, re
157b0 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53  gPrev+1, pIn->nS
157c0 64 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  dst,.           
157d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157e0 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65     (char*)sqlite
157f0 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79  3KeyInfoRef(pKey
15800 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46  Info), P4_KEYINF
15810 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  O);.    sqlite3V
15820 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
15830 4a 75 6d 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e  Jump, j2+2, iCon
15840 74 69 6e 75 65 2c 20 6a 32 2b 32 29 3b 20 56 64  tinue, j2+2); Vd
15850 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
15860 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
15870 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20  mpHere(v, j1);. 
15880 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15890 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
158a0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67   pIn->iSdst, reg
158b0 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64  Prev+1, pIn->nSd
158c0 73 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  st-1);.    sqlit
158d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
158e0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72  OP_Integer, 1, r
158f0 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69  egPrev);.  }.  i
15900 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
15910 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
15920 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75  turn 0;..  /* Su
15930 70 70 72 65 73 73 20 74 68 65 20 66 69 72 73 74  ppress the first
15940 20 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20   OFFSET entries 
15950 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  if there is an O
15960 46 46 53 45 54 20 63 6c 61 75 73 65 0a 20 20 2a  FFSET clause.  *
15970 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76  /.  codeOffset(v
15980 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43  , p->iOffset, iC
15990 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 73 77 69  ontinue);..  swi
159a0 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73  tch( pDest->eDes
159b0 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72  t ){.    /* Stor
159c0 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20  e the result as 
159d0 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69  data using a uni
159e0 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a  que key..    */.
159f0 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
15a00 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
15a10 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
15a20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
15a30 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
15a40 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74  arse);.      int
15a50 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
15a60 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
15a70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15a80 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
15a90 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  RT_Table );.    
15aa0 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65 73    testcase( pDes
15ab0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  t->eDest==SRT_Ep
15ac0 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20  hemTab );.      
15ad0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15ae0 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
15af0 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  rd, pIn->iSdst, 
15b00 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29 3b  pIn->nSdst, r1);
15b10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15b20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
15b30 65 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e  ewRowid, pDest->
15b40 69 53 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20  iSDParm, r2);.  
15b50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15b60 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
15b70 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  rt, pDest->iSDPa
15b80 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20  rm, r1, r2);.   
15b90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
15ba0 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
15bb0 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20  _APPEND);.      
15bc0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
15bd0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32  mpReg(pParse, r2
15be0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15bf0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
15c00 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
15c10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
15c20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15c30 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
15c40 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72   /* If we are cr
15c50 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72  eating a set for
15c60 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45   an "expr IN (SE
15c70 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74  LECT ...)" const
15c80 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ruct,.    ** the
15c90 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62  n there should b
15ca0 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20  e a single item 
15cb0 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57  on the stack.  W
15cc0 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  rite this.    **
15cd0 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73   item into the s
15ce0 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f  et table with bo
15cf0 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f  gus data..    */
15d00 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
15d10 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  t: {.      int r
15d20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
15d30 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 29   pIn->nSdst==1 )
15d40 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e 61  ;.      pDest->a
15d50 66 66 53 64 73 74 20 3d 20 0a 20 20 20 20 20 20  ffSdst = .      
15d60 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72     sqlite3Compar
15d70 65 41 66 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c  eAffinity(p->pEL
15d80 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
15d90 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29   pDest->affSdst)
15da0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
15db0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
15dc0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
15dd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
15de0 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
15df0 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31 2c  , pIn->iSdst, 1,
15e00 20 72 31 2c 20 26 70 44 65 73 74 2d 3e 61 66 66   r1, &pDest->aff
15e10 53 64 73 74 2c 31 29 3b 0a 20 20 20 20 20 20 73  Sdst,1);.      s
15e20 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
15e30 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
15e40 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
15e50 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
15e60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15e70 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
15e80 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
15e90 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
15ea0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
15eb0 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
15ec0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
15ed0 0a 23 69 66 20 30 20 20 2f 2a 20 4e 65 76 65 72  .#if 0  /* Never
15ee0 20 6f 63 63 75 72 73 20 6f 6e 20 61 6e 20 4f 52   occurs on an OR
15ef0 44 45 52 20 42 59 20 71 75 65 72 79 20 2a 2f 0a  DER BY query */.
15f00 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f      /* If any ro
15f10 77 20 65 78 69 73 74 20 69 6e 20 74 68 65 20 72  w exist in the r
15f20 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72  esult set, recor
15f30 64 20 74 68 61 74 20 66 61 63 74 20 61 6e 64 20  d that fact and 
15f40 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  abort..    */.  
15f50 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73 74    case SRT_Exist
15f60 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s: {.      sqlit
15f70 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15f80 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70  OP_Integer, 1, p
15f90 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
15fa0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
15fb0 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
15fc0 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
15fd0 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
15fe0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
15ff0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66  endif..    /* If
16000 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61   this is a scala
16010 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73  r select that is
16020 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
16030 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  ession, then.   
16040 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65   ** store the re
16050 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70  sults in the app
16060 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20  ropriate memory 
16070 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f  cell and break o
16080 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ut.    ** of the
16090 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
160a0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
160b0 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Mem: {.      ass
160c0 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d  ert( pIn->nSdst=
160d0 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
160e0 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
160f0 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64  pParse, pIn->iSd
16100 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  st, pDest->iSDPa
16110 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a  rm, 1);.      /*
16120 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
16130 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
16140 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
16150 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
16160 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
16170 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
16180 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
16190 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  */..    /* The r
161a0 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
161b0 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20  d in a sequence 
161c0 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20 20  of registers.   
161d0 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20   ** starting at 
161e0 70 44 65 73 74 2d 3e 69 53 64 73 74 2e 20 20 54  pDest->iSdst.  T
161f0 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69  hen the co-routi
16200 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a  ne yields..    *
16210 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  /.    case SRT_C
16220 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20  oroutine: {.    
16230 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64    if( pDest->iSd
16240 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  st==0 ){.       
16250 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
16260 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
16270 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  nge(pParse, pIn-
16280 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20  >nSdst);.       
16290 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20   pDest->nSdst = 
162a0 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20 20  pIn->nSdst;.    
162b0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
162c0 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
162d0 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
162e0 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20  , pDest->iSdst, 
162f0 70 44 65 73 74 2d 3e 6e 53 64 73 74 29 3b 0a 20  pDest->nSdst);. 
16300 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16310 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
16320 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ld, pDest->iSDPa
16330 72 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rm);.      break
16340 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
16350 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61  If none of the a
16360 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72  bove, then the r
16370 65 73 75 6c 74 20 64 65 73 74 69 6e 61 74 69 6f  esult destinatio
16380 6e 20 6d 75 73 74 20 62 65 0a 20 20 20 20 2a 2a  n must be.    **
16390 20 53 52 54 5f 4f 75 74 70 75 74 2e 20 20 54 68   SRT_Output.  Th
163a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
163b0 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20  ver called with 
163c0 61 6e 79 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  any other.    **
163d0 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68   destination oth
163e0 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 73  er than the ones
163f0 20 68 61 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f   handled above o
16400 72 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20  r SRT_Output..  
16410 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20    **.    ** For 
16420 53 52 54 5f 4f 75 74 70 75 74 2c 20 72 65 73 75  SRT_Output, resu
16430 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69  lts are stored i
16440 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  n a sequence of 
16450 72 65 67 69 73 74 65 72 73 2e 20 20 0a 20 20 20  registers.  .   
16460 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f 50 5f   ** Then the OP_
16470 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65  ResultRow opcode
16480 20 69 73 20 75 73 65 64 20 74 6f 20 63 61 75 73   is used to caus
16490 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
164a0 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75 72   to.    ** retur
164b0 6e 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f  n the next row o
164c0 66 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f  f result..    */
164d0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
164e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
164f0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
16500 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
16510 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16520 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
16530 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  w, pIn->iSdst, p
16540 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20  In->nSdst);.    
16550 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
16560 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
16570 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
16580 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
16590 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
165a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a     }.  }..  /* J
165b0 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ump to the end o
165c0 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68  f the loop if th
165d0 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68  e LIMIT is reach
165e0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
165f0 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
16600 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16610 33 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20  3(v, OP_IfZero, 
16620 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  p->iLimit, iBrea
16630 6b 2c 20 2d 31 29 3b 20 56 64 62 65 43 6f 76 65  k, -1); VdbeCove
16640 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20  rage(v);.  }..  
16650 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
16660 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72  subroutine retur
16670 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  n.  */.  sqlite3
16680 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
16690 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a  (v, iContinue);.
166a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
166b0 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
166c0 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20  , regReturn);.. 
166d0 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
166e0 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69  ./*.** Alternati
166f0 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  ve compound sele
16700 63 74 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  ct code generato
16710 72 20 66 6f 72 20 63 61 73 65 73 20 77 68 65 6e  r for cases when
16720 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20   there.** is an 
16730 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
16740 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65  .**.** We assume
16750 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20   a query of the 
16760 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a  following form:.
16770 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65  **.**      <sele
16780 63 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e  ctA>  <operator>
16790 20 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52 44    <selectB>  ORD
167a0 45 52 20 42 59 20 3c 6f 72 64 65 72 62 79 6c 69  ER BY <orderbyli
167b0 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61  st>.**.** <opera
167c0 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55  tor> is one of U
167d0 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c  NION ALL, UNION,
167e0 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45   EXCEPT, or INTE
167f0 52 53 45 43 54 2e 20 20 54 68 65 20 69 64 65 61  RSECT.  The idea
16800 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65 20 62  .** is to code b
16810 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e  oth <selectA> an
16820 64 20 3c 73 65 6c 65 63 74 42 3e 20 77 69 74 68  d <selectB> with
16830 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
16840 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f  ause as.** co-ro
16850 75 74 69 6e 65 73 2e 20 20 54 68 65 6e 20 72 75  utines.  Then ru
16860 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  n the co-routine
16870 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e  s in parallel an
16880 64 20 6d 65 72 67 65 20 74 68 65 20 72 65 73 75  d merge the resu
16890 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20  lts.** into the 
168a0 6f 75 74 70 75 74 2e 20 20 49 6e 20 61 64 64 69  output.  In addi
168b0 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f 20  tion to the two 
168c0 63 6f 72 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c  coroutines (call
168d0 65 64 20 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a  ed selectA and.*
168e0 2a 20 73 65 6c 65 63 74 42 29 20 74 68 65 72 65  * selectB) there
168f0 20 61 72 65 20 37 20 73 75 62 72 6f 75 74 69 6e   are 7 subroutin
16900 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74  es:.**.**    out
16910 41 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f  A:    Move the o
16920 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c  utput of the sel
16930 65 63 74 41 20 63 6f 72 6f 75 74 69 6e 65 20 69  ectA coroutine i
16940 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  nto the output.*
16950 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66  *             of
16960 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75   the compound qu
16970 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75  ery..**.**    ou
16980 74 42 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20  tB:    Move the 
16990 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65  output of the se
169a0 6c 65 63 74 42 20 63 6f 72 6f 75 74 69 6e 65 20  lectB coroutine 
169b0 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a  into the output.
169c0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  **             o
169d0 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71  f the compound q
169e0 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e  uery.  (Only gen
169f0 65 72 61 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e  erated for UNION
16a00 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
16a10 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20      UNION ALL.  
16a20 45 58 43 45 50 54 20 61 6e 64 20 49 4e 53 45 52  EXCEPT and INSER
16a30 54 53 45 43 54 20 6e 65 76 65 72 20 6f 75 74 70  TSECT never outp
16a40 75 74 20 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a  ut a row that.**
16a50 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70               app
16a60 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29  ears only in B.)
16a70 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20  .**.**    AltB: 
16a80 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
16a90 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
16aa0 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
16ab0 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a  s and A<B..**.**
16ac0 20 20 20 20 41 65 71 42 3a 20 20 20 20 43 61 6c      AeqB:    Cal
16ad0 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  led when there i
16ae0 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68  s data from both
16af0 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
16b00 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41  A==B..**.**    A
16b10 67 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  gtB:    Called w
16b20 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
16b30 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
16b40 75 74 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a  utines and A>B..
16b50 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20  **.**    EofA:  
16b60 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61    Called when da
16b70 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
16b80 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a  from selectA..**
16b90 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20 20 20  .**    EofB:    
16ba0 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61  Called when data
16bb0 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72   is exhausted fr
16bc0 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a  om selectB..**.*
16bd0 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  * The implementa
16be0 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74 74  tion of the latt
16bf0 65 72 20 66 69 76 65 20 73 75 62 72 6f 75 74 69  er five subrouti
16c00 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e 20 77 68  nes depend on wh
16c10 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f  ich .** <operato
16c20 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a  r> is used:.**.*
16c30 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
16c40 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20   UNION ALL      
16c50 20 20 20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20     UNION        
16c60 20 20 20 20 45 58 43 45 50 54 20 20 20 20 20 20      EXCEPT      
16c70 20 20 20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a      INTERSECT.**
16c80 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d            ------
16c90 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d  -------  -------
16ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ----------  ----
16cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ----------  ----
16cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
16cd0 20 20 20 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c     AltB:   outA,
16ce0 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41   nextA      outA
16cf0 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75  , nextA       ou
16d00 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
16d10 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20    nextA.**.**   
16d20 41 65 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65  AeqB:   outA, ne
16d30 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74  xtA         next
16d40 41 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  A             ne
16d50 78 74 41 20 20 20 20 20 20 20 20 20 6f 75 74 41  xtA         outA
16d60 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20  , nextA.**.**   
16d70 41 67 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65  AgtB:   outB, ne
16d80 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e  xtB      outB, n
16d90 65 78 74 42 20 20 20 20 20 20 20 20 20 20 6e 65  extB          ne
16da0 78 74 42 20 20 20 20 20 20 20 20 20 20 20 20 6e  xtB            n
16db0 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66  extB.**.**   Eof
16dc0 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42  A:   outB, nextB
16dd0 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74        outB, next
16de0 42 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 20  B          halt 
16df0 20 20 20 20 20 20 20 20 20 20 20 20 68 61 6c 74              halt
16e00 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20  .**.**   EofB:  
16e10 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
16e20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
16e30 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
16e40 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a          halt.**.
16e50 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20  ** In the AltB, 
16e60 41 65 71 42 2c 20 61 6e 64 20 41 67 74 42 20 73  AeqB, and AgtB s
16e70 75 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45  ubroutines, an E
16e80 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e  OF on A followin
16e90 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73 65  g nextA.** cause
16ea0 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a  s an immediate j
16eb0 75 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20  ump to EofA and 
16ec0 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c  an EOF on B foll
16ed0 6f 77 69 6e 67 20 6e 65 78 74 42 20 63 61 75 73  owing nextB caus
16ee0 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61  es.** an immedia
16ef0 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e  te jump to EofB.
16f00 20 20 57 69 74 68 69 6e 20 45 6f 66 41 20 61 6e    Within EofA an
16f10 64 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20  d EofB, and EOF 
16f20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66  on entry or.** f
16f30 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20 63  ollowing nextX c
16f40 61 75 73 65 73 20 61 20 6a 75 6d 70 20 74 6f 20  auses a jump to 
16f50 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73  the end of the s
16f60 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67  elect processing
16f70 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74  ..**.** Duplicat
16f80 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65  e removal in the
16f90 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
16fa0 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 63 61  and INTERSECT ca
16fb0 73 65 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a  ses is handled.*
16fc0 2a 20 77 69 74 68 69 6e 20 74 68 65 20 6f 75 74  * within the out
16fd0 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  put subroutine. 
16fe0 20 54 68 65 20 72 65 67 50 72 65 76 20 72 65 67   The regPrev reg
16ff0 69 73 74 65 72 20 73 65 74 20 68 6f 6c 64 73 20  ister set holds 
17000 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a  the previously.*
17010 2a 20 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 20  * output value. 
17020 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73   A comparison is
17030 20 6d 61 64 65 20 61 67 61 69 6e 73 74 20 74 68   made against th
17040 69 73 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  is value and the
17050 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b   output.** is sk
17060 69 70 70 65 64 20 69 66 20 74 68 65 20 6e 65 78  ipped if the nex
17070 74 20 72 65 73 75 6c 74 73 20 77 6f 75 6c 64 20  t results would 
17080 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
17090 68 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a  he previous..**.
170a0 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
170b0 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f  ation plan is to
170c0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74   implement the t
170d0 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  wo coroutines an
170e0 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f  d seven.** subro
170f0 75 74 69 6e 65 73 20 66 69 72 73 74 2c 20 74 68  utines first, th
17100 65 6e 20 70 75 74 20 74 68 65 20 63 6f 6e 74 72  en put the contr
17110 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74 68 65 20  ol logic at the 
17120 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68  bottom.  Like th
17130 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
17140 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20     goto Init.** 
17150 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69      coA: corouti
17160 6e 65 20 66 6f 72 20 6c 65 66 74 20 71 75 65 72  ne for left quer
17170 79 20 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42  y (A).**     coB
17180 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  : coroutine for 
17190 72 69 67 68 74 20 71 75 65 72 79 20 28 42 29 0a  right query (B).
171a0 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75 74 70  **    outA: outp
171b0 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a  ut one row of A.
171c0 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75 74 70  **    outB: outp
171d0 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20  ut one row of B 
171e0 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e  (UNION and UNION
171f0 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20   ALL only).**   
17200 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   EofA: ....**   
17210 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   EofB: ....**   
17220 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   AltB: ....**   
17230 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   AeqB: ....**   
17240 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   AgtB: ....**   
17250 20 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a   Init: initializ
17260 65 20 63 6f 72 6f 75 74 69 6e 65 20 72 65 67 69  e coroutine regi
17270 73 74 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20  sters.**        
17280 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20    yield coA.**  
17290 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 41          if eof(A
172a0 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20  ) goto EofA.**  
172b0 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f          yield co
172c0 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66  B.**          if
172d0 20 65 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f 66   eof(B) goto Eof
172e0 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f  B.**    Cmpr: Co
172f0 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20  mpare A, B.**   
17300 20 20 20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42         Jump AltB
17310 2c 20 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20  , AeqB, AgtB.** 
17320 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a      End: ....**.
17330 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c  ** We call AltB,
17340 20 41 65 71 42 2c 20 41 67 74 42 2c 20 45 6f 66   AeqB, AgtB, Eof
17350 41 2c 20 61 6e 64 20 45 6f 66 42 20 22 73 75 62  A, and EofB "sub
17360 72 6f 75 74 69 6e 65 73 22 20 62 75 74 20 74 68  routines" but th
17370 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63  ey are not.** ac
17380 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73  tually called us
17390 69 6e 67 20 47 6f 73 75 62 20 61 6e 64 20 74 68  ing Gosub and th
173a0 65 79 20 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e  ey do not Return
173b0 2e 20 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42  .  EofA and EofB
173c0 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61   loop.** until a
173d0 6c 6c 20 64 61 74 61 20 69 73 20 65 78 68 61 75  ll data is exhau
173e0 73 74 65 64 20 74 68 65 6e 20 6a 75 6d 70 20 74  sted then jump t
173f0 6f 20 74 68 65 20 22 65 6e 64 22 20 6c 61 62 65  o the "end" labe
17400 2e 20 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a  .  AltB, AeqB,.*
17410 2a 20 61 6e 64 20 41 67 74 42 20 6a 75 6d 70 20  * and AgtB jump 
17420 74 6f 20 65 69 74 68 65 72 20 4c 32 20 6f 72 20  to either L2 or 
17430 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f  to one of EofA o
17440 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64  r EofB..*/.#ifnd
17450 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
17460 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73  OMPOUND_SELECT.s
17470 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
17480 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20  electOrderBy(.  
17490 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
174a0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
174b0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
174c0 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
174d0 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
174e0 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
174f0 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
17500 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
17510 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
17520 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
17530 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
17540 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
17550 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
17560 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c  ounters */.  Sel
17570 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20  ect *pPrior;    
17580 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45     /* Another SE
17590 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79  LECT immediately
175a0 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a   to our left */.
175b0 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
175c0 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
175d0 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73  ate code to this
175e0 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63   VDBE */.  Selec
175f0 74 44 65 73 74 20 64 65 73 74 41 3b 20 20 20 20  tDest destA;    
17600 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20   /* Destination 
17610 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20  for coroutine A 
17620 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
17630 64 65 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65  destB;     /* De
17640 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f  stination for co
17650 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69  routine B */.  i
17660 6e 74 20 72 65 67 41 64 64 72 41 3b 20 20 20 20  nt regAddrA;    
17670 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
17680 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
17690 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20  ect-A coroutine 
176a0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72  */.  int regAddr
176b0 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
176c0 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
176d0 6f 72 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f  or select-B coro
176e0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
176f0 64 64 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20  ddrSelectA;     
17700 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
17710 68 65 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f  he select-A coro
17720 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
17730 64 64 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20  ddrSelectB;     
17740 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
17750 68 65 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f  he select-B coro
17760 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
17770 65 67 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20  egOutA;         
17780 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
17790 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74  ster for the out
177a0 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65  put-A subroutine
177b0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
177c0 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  B;          /* A
177d0 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
177e0 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42  for the output-B
177f0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
17800 20 69 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20   int addrOutA;  
17810 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
17820 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d  s of the output-
17830 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  A subroutine */.
17840 20 20 69 6e 74 20 61 64 64 72 4f 75 74 42 20 3d    int addrOutB =
17850 20 30 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65   0;     /* Addre
17860 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74  ss of the output
17870 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -B subroutine */
17880 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b  .  int addrEofA;
17890 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
178a0 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
178b0 74 2d 41 2d 65 78 68 61 75 73 74 65 64 20 73 75  t-A-exhausted su
178c0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
178d0 74 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 3b 20  t addrEofA_noB; 
178e0 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 65      /* Alternate
178f0 20 61 64 64 72 45 6f 66 41 20 69 66 20 42 20 69   addrEofA if B i
17900 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  s uninitialized 
17910 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66  */.  int addrEof
17920 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
17930 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
17940 65 63 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20  ect-B-exhausted 
17950 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
17960 69 6e 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20  int addrAltB;   
17970 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
17980 20 6f 66 20 74 68 65 20 41 3c 42 20 73 75 62 72   of the A<B subr
17990 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
179a0 61 64 64 72 41 65 71 42 3b 20 20 20 20 20 20 20  addrAeqB;       
179b0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
179c0 74 68 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74  the A==B subrout
179d0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
179e0 72 41 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f  rAgtB;         /
179f0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
17a00 20 41 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20   A>B subroutine 
17a10 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69  */.  int regLimi
17a20 74 41 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  tA;        /* Li
17a30 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72  mit register for
17a40 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69   select-A */.  i
17a50 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20  nt regLimitB;   
17a60 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65       /* Limit re
17a70 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
17a80 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  t-A */.  int reg
17a90 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f  Prev;          /
17aa0 2a 20 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67  * A range of reg
17ab0 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70  isters to hold p
17ac0 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a  revious output *
17ad0 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d  /.  int savedLim
17ae0 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76  it;       /* Sav
17af0 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69  ed value of p->i
17b00 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73  Limit */.  int s
17b10 61 76 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20  avedOffset;     
17b20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20   /* Saved value 
17b30 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f  of p->iOffset */
17b40 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72  .  int labelCmpr
17b50 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65  ;        /* Labe
17b60 6c 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20  l for the start 
17b70 6f 66 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67  of the merge alg
17b80 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20  orithm */.  int 
17b90 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20  labelEnd;       
17ba0 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74    /* Label for t
17bb0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76  he end of the ov
17bc0 65 72 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d  erall SELECT stm
17bd0 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 31 3b 20 20  t */.  int j1;  
17be0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17bf0 4a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e  Jump instruction
17c00 73 20 74 68 61 74 20 67 65 74 20 72 65 74 61 72  s that get retar
17c10 67 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  getted */.  int 
17c20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
17c30 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41    /* One of TK_A
17c40 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b  LL, TK_UNION, TK
17c50 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45  _EXCEPT, TK_INTE
17c60 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e  RSECT */.  KeyIn
17c70 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b  fo *pKeyDup = 0;
17c80 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69   /* Comparison i
17c90 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64  nformation for d
17ca0 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c  uplicate removal
17cb0 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
17cc0 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43  KeyMerge;   /* C
17cd0 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d  omparison inform
17ce0 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e  ation for mergin
17cf0 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69  g rows */.  sqli
17d00 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
17d10 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
17d20 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78  nnection */.  Ex
17d30 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
17d40 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ;   /* The ORDER
17d50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
17d60 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20  int nOrderBy;   
17d70 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
17d80 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  of terms in the 
17d90 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
17da0 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75  */.  int *aPermu
17db0 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  te;        /* Ma
17dc0 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52  pping from ORDER
17dd0 20 42 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73   BY terms to res
17de0 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20  ult set columns 
17df0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
17e00 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
17e10 20 69 6e 74 20 69 53 75 62 31 3b 20 20 20 20 20   int iSub1;     
17e20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64         /* EQP id
17e30 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75   of left-hand qu
17e40 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75  ery */.  int iSu
17e50 62 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  b2;            /
17e60 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69 67 68  * EQP id of righ
17e70 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a  t-hand query */.
17e80 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
17e90 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30  ( p->pOrderBy!=0
17ea0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b   );.  assert( pK
17eb0 65 79 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22  eyDup==0 ); /* "
17ec0 4d 61 6e 61 67 65 64 22 20 63 6f 64 65 20 6e 65  Managed" code ne
17ed0 65 64 73 20 74 68 69 73 2e 20 20 54 69 63 6b 65  eds this.  Ticke
17ee0 74 20 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62  t #3382. */.  db
17ef0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
17f00 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
17f10 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  be;.  assert( v!
17f20 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 41  =0 );       /* A
17f30 6c 72 65 61 64 79 20 74 68 72 6f 77 6e 20 74 68  lready thrown th
17f40 65 20 65 72 72 6f 72 20 69 66 20 56 44 42 45 20  e error if VDBE 
17f50 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a  alloc failed */.
17f60 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c    labelEnd = sql
17f70 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
17f80 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c 43 6d 70  l(v);.  labelCmp
17f90 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  r = sqlite3VdbeM
17fa0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a 20  akeLabel(v);... 
17fb0 20 2f 2a 20 50 61 74 63 68 20 75 70 20 74 68 65   /* Patch up the
17fc0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
17fd0 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e  .  */.  op = p->
17fe0 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f 72 20 3d  op;  .  pPrior =
17ff0 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73   p->pPrior;.  as
18000 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f  sert( pPrior->pO
18010 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 70  rderBy==0 );.  p
18020 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
18030 64 65 72 42 79 3b 0a 20 20 61 73 73 65 72 74 28  derBy;.  assert(
18040 20 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 6e   pOrderBy );.  n
18050 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
18060 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a  By->nExpr;..  /*
18070 20 46 6f 72 20 6f 70 65 72 61 74 6f 72 73 20 6f   For operators o
18080 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20  ther than UNION 
18090 41 4c 4c 20 77 65 20 68 61 76 65 20 74 6f 20 6d  ALL we have to m
180a0 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a 20 20  ake sure that.  
180b0 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ** the ORDER BY 
180c0 63 6c 61 75 73 65 20 63 6f 76 65 72 73 20 65 76  clause covers ev
180d0 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ery term of the 
180e0 72 65 73 75 6c 74 20 73 65 74 2e 20 20 41 64 64  result set.  Add
180f0 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74  .  ** terms to t
18100 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
18110 73 65 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  se as necessary.
18120 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d  .  */.  if( op!=
18130 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f  TK_ALL ){.    fo
18140 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f  r(i=1; db->mallo
18150 63 46 61 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c  cFailed==0 && i<
18160 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  =p->pEList->nExp
18170 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  r; i++){.      s
18180 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
18190 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
181a0 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d    for(j=0, pItem
181b0 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c  =pOrderBy->a; j<
181c0 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20 70  nOrderBy; j++, p
181d0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
181e0 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
181f0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e  u.x.iOrderByCol>
18200 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
18210 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
18220 65 72 42 79 43 6f 6c 3d 3d 69 20 29 20 62 72 65  erByCol==i ) bre
18230 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
18240 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42    if( j==nOrderB
18250 79 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  y ){.        Exp
18260 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
18270 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54  3Expr(db, TK_INT
18280 45 47 45 52 2c 20 30 29 3b 0a 20 20 20 20 20 20  EGER, 0);.      
18290 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
182a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
182b0 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  MEM;.        pNe
182c0 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49  w->flags |= EP_I
182d0 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20  ntValue;.       
182e0 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20   pNew->u.iValue 
182f0 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  = i;.        pOr
18300 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
18310 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
18320 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
18330 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69  pNew);.        i
18340 66 28 20 70 4f 72 64 65 72 42 79 20 29 20 70 4f  f( pOrderBy ) pO
18350 72 64 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72  rderBy->a[nOrder
18360 42 79 2b 2b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  By++].u.x.iOrder
18370 42 79 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a  ByCol = (u16)i;.
18380 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18390 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
183a0 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70  the comparison p
183b0 65 72 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b  ermutation and k
183c0 65 79 69 6e 66 6f 20 74 68 61 74 20 69 73 20 75  eyinfo that is u
183d0 73 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68  sed with.  ** th
183e0 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 75 73  e permutation us
183f0 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
18400 69 66 20 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a  if the next.  **
18410 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 73 20   row of results 
18420 63 6f 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65 63  comes from selec
18430 74 41 20 6f 72 20 73 65 6c 65 63 74 42 2e 20 20  tA or selectB.  
18440 41 6c 73 6f 20 61 64 64 20 65 78 70 6c 69 63 69  Also add explici
18450 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e  t.  ** collation
18460 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42  s to the ORDER B
18470 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 73  Y clause terms s
18480 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20  o that when the 
18490 73 75 62 71 75 65 72 69 65 73 0a 20 20 2a 2a 20  subqueries.  ** 
184a0 74 6f 20 74 68 65 20 72 69 67 68 74 20 61 6e 64  to the right and
184b0 20 74 68 65 20 6c 65 66 74 20 61 72 65 20 65 76   the left are ev
184c0 61 6c 75 61 74 65 64 2c 20 74 68 65 79 20 75 73  aluated, they us
184d0 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20  e the correct.  
184e0 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20  ** collation..  
184f0 2a 2f 0a 20 20 61 50 65 72 6d 75 74 65 20 3d 20  */.  aPermute = 
18500 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
18510 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e  aw(db, sizeof(in
18520 74 29 2a 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20  t)*nOrderBy);.  
18530 69 66 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a  if( aPermute ){.
18540 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
18550 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
18560 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49  .    for(i=0, pI
18570 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b  tem=pOrderBy->a;
18580 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
18590 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
185a0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
185b0 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
185c0 3e 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  >0.          && 
185d0 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
185e0 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73  rByCol<=p->pELis
185f0 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
18600 20 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20    aPermute[i] = 
18610 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
18620 72 42 79 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20  rByCol - 1;.    
18630 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20  }.    pKeyMerge 
18640 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  = multiSelectOrd
18650 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72  erByKeyInfo(pPar
18660 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 7d 65 6c  se, p, 1);.  }el
18670 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67  se{.    pKeyMerg
18680 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
18690 20 52 65 61 74 74 61 63 68 20 74 68 65 20 4f 52   Reattach the OR
186a0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f  DER BY clause to
186b0 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f   the query..  */
186c0 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d  .  p->pOrderBy =
186d0 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72   pOrderBy;.  pPr
186e0 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  ior->pOrderBy = 
186f0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
18700 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
18710 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20  OrderBy, 0);..  
18720 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61  /* Allocate a ra
18730 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79  nge of temporary
18740 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74   registers and t
18750 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65  he KeyInfo neede
18760 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c  d.  ** for the l
18770 6f 67 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65  ogic that remove
18780 73 20 64 75 70 6c 69 63 61 74 65 20 72 65 73 75  s duplicate resu
18790 6c 74 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65  lt rows when the
187a0 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69  .  ** operator i
187b0 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  s UNION, EXCEPT,
187c0 20 6f 72 20 49 4e 54 45 52 53 45 43 54 20 28 62   or INTERSECT (b
187d0 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c  ut not UNION ALL
187e0 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  )..  */.  if( op
187f0 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
18800 72 65 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d  regPrev = 0;.  }
18810 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45  else{.    int nE
18820 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
18830 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  >nExpr;.    asse
18840 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45  rt( nOrderBy>=nE
18850 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  xpr || db->mallo
18860 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72  cFailed );.    r
18870 65 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d  egPrev = pParse-
18880 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
18890 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78  rse->nMem += nEx
188a0 70 72 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  pr+1;.    sqlite
188b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
188c0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
188d0 67 50 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79  gPrev);.    pKey
188e0 44 75 70 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  Dup = sqlite3Key
188f0 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45  InfoAlloc(db, nE
18900 78 70 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  xpr, 1);.    if(
18910 20 70 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20   pKeyDup ){.    
18920 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
18930 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
18940 62 6c 65 28 70 4b 65 79 44 75 70 29 20 29 3b 0a  ble(pKeyDup) );.
18950 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
18960 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  <nExpr; i++){.  
18970 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61        pKeyDup->a
18980 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53  Coll[i] = multiS
18990 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
189a0 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20  rse, p, i);.    
189b0 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f      pKeyDup->aSo
189c0 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a  rtOrder[i] = 0;.
189d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
189e0 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72 61 74  }. .  /* Separat
189f0 65 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 74  e the left and t
18a00 68 65 20 72 69 67 68 74 20 71 75 65 72 79 20 66  he right query f
18a10 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a  rom one another.
18a20 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72    */.  p->pPrior
18a30 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e   = 0;.  pPrior->
18a40 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c  pNext = 0;.  sql
18a50 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72  ite3ResolveOrder
18a60 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20  GroupBy(pParse, 
18a70 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  p, p->pOrderBy, 
18a80 22 4f 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20  "ORDER");.  if( 
18a90 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d  pPrior->pPrior==
18aa0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
18ab0 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75  ResolveOrderGrou
18ac0 70 42 79 28 70 50 61 72 73 65 2c 20 70 50 72 69  pBy(pParse, pPri
18ad0 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  or, pPrior->pOrd
18ae0 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a  erBy, "ORDER");.
18af0 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
18b00 65 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69  e the limit regi
18b10 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75  sters */.  compu
18b20 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
18b30 28 70 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65  (pParse, p, labe
18b40 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e  lEnd);.  if( p->
18b50 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b  iLimit && op==TK
18b60 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c  _ALL ){.    regL
18b70 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65  imitA = ++pParse
18b80 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c  ->nMem;.    regL
18b90 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65  imitB = ++pParse
18ba0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
18bb0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18bc0 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66   OP_Copy, p->iOf
18bd0 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65  fset ? p->iOffse
18be0 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c  t+1 : p->iLimit,
18bf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c10 20 20 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20     regLimitA);. 
18c20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18c30 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
18c40 20 72 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c   regLimitA, regL
18c50 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b  imitB);.  }else{
18c60 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d  .    regLimitA =
18c70 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a   regLimitB = 0;.
18c80 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
18c90 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
18ca0 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69  Limit);.  p->pLi
18cb0 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  mit = 0;.  sqlit
18cc0 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
18cd0 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20   p->pOffset);.  
18ce0 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
18cf0 0a 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b  .  regAddrA = ++
18d00 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
18d10 72 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61  regAddrB = ++pPa
18d20 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
18d30 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  OutA = ++pParse-
18d40 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42  >nMem;.  regOutB
18d50 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
18d60 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  m;.  sqlite3Sele
18d70 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
18d80 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  A, SRT_Coroutine
18d90 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73  , regAddrA);.  s
18da0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
18db0 49 6e 69 74 28 26 64 65 73 74 42 2c 20 53 52 54  Init(&destB, SRT
18dc0 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  _Coroutine, regA
18dd0 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  ddrB);..  /* Gen
18de0 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e  erate a coroutin
18df0 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
18e00 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
18e10 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c  nt to the.  ** l
18e20 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  eft of the compo
18e30 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74  und operator - t
18e40 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20  he "A" select.. 
18e50 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74   */.  addrSelect
18e60 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  A = sqlite3VdbeC
18e70 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
18e80 31 3b 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74 65  1;.  j1 = sqlite
18e90 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
18ea0 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c  P_InitCoroutine,
18eb0 20 72 65 67 41 64 64 72 41 2c 20 30 2c 20 61 64   regAddrA, 0, ad
18ec0 64 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 56 64  drSelectA);.  Vd
18ed0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c  beComment((v, "l
18ee0 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20  eft SELECT"));. 
18ef0 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20   pPrior->iLimit 
18f00 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 65  = regLimitA;.  e
18f10 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
18f20 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e  (iSub1, pParse->
18f30 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
18f40 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
18f50 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
18f60 26 64 65 73 74 41 29 3b 0a 20 20 73 71 6c 69 74  &destA);.  sqlit
18f70 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
18f80 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c  OP_EndCoroutine,
18f90 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71   regAddrA);.  sq
18fa0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
18fb0 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20 2f 2a 20  e(v, j1);..  /* 
18fc0 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75  Generate a corou
18fd0 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65  tine to evaluate
18fe0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
18ff0 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74  ement on .  ** t
19000 68 65 20 72 69 67 68 74 20 2d 20 74 68 65 20 22  he right - the "
19010 42 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20  B" select.  */. 
19020 20 61 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73   addrSelectB = s
19030 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
19040 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20  tAddr(v) + 1;.  
19050 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
19060 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69  AddOp3(v, OP_Ini
19070 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  tCoroutine, regA
19080 64 64 72 42 2c 20 30 2c 20 61 64 64 72 53 65 6c  ddrB, 0, addrSel
19090 65 63 74 42 29 3b 0a 20 20 56 64 62 65 43 6f 6d  ectB);.  VdbeCom
190a0 6d 65 6e 74 28 28 76 2c 20 22 72 69 67 68 74 20  ment((v, "right 
190b0 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76  SELECT"));.  sav
190c0 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69  edLimit = p->iLi
190d0 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73  mit;.  savedOffs
190e0 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b  et = p->iOffset;
190f0 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72  .  p->iLimit = r
19100 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69  egLimitB;.  p->i
19110 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20  Offset = 0;  .  
19120 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
19130 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d  r(iSub2, pParse-
19140 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
19150 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
19160 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
19170 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74  tB);.  p->iLimit
19180 20 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20   = savedLimit;. 
19190 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61   p->iOffset = sa
191a0 76 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c  vedOffset;.  sql
191b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
191c0 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e  , OP_EndCoroutin
191d0 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20  e, regAddrB);.. 
191e0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
191f0 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
19200 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65  utputs the curre
19210 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 41 0a  nt row of the A.
19220 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74    ** select as t
19230 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72  he next output r
19240 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  ow of the compou
19250 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a  nd select..  */.
19260 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
19270 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f  t((v, "Output ro
19280 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a  utine for A"));.
19290 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67 65 6e    addrOutA = gen
192a0 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f  erateOutputSubro
192b0 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20  utine(pParse,.  
192c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
192d0 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73 74 2c  , &destA, pDest,
192e0 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20 20 20   regOutA,.      
192f0 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50 72             regPr
19300 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62  ev, pKeyDup, lab
19310 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20  elEnd);.  .  /* 
19320 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
19330 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
19340 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ts the current r
19350 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a  ow of the B.  **
19360 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e   select as the n
19370 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f  ext output row o
19380 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
19390 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  elect..  */.  if
193a0 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ( op==TK_ALL || 
193b0 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
193c0 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
193d0 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20  ent((v, "Output 
193e0 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29  routine for B"))
193f0 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d  ;.    addrOutB =
19400 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
19410 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65  ubroutine(pParse
19420 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19430 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44     p, &destB, pD
19440 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20  est, regOutB,.  
19450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
19460 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c  egPrev, pKeyDup,
19470 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a   labelEnd);.  }.
19480 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f    sqlite3KeyInfo
19490 55 6e 72 65 66 28 70 4b 65 79 44 75 70 29 3b 0a  Unref(pKeyDup);.
194a0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
194b0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72   subroutine to r
194c0 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75  un when the resu
194d0 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20  lts from select 
194e0 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75  A.  ** are exhau
194f0 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61  sted and only da
19500 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42 20 72  ta in select B r
19510 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  emains..  */.  i
19520 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  f( op==TK_EXCEPT
19530 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52   || op==TK_INTER
19540 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
19550 45 6f 66 41 5f 6e 6f 42 20 3d 20 61 64 64 72 45  EofA_noB = addrE
19560 6f 66 41 20 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a  ofA = labelEnd;.
19570 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56    }else{  .    V
19580 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
19590 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72 6f 75  v, "eof-A subrou
195a0 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64  tine"));.    add
195b0 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56  rEofA = sqlite3V
195c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
195d0 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20  Gosub, regOutB, 
195e0 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 61  addrOutB);.    a
195f0 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 73 71  ddrEofA_noB = sq
19600 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19610 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
19620 41 64 64 72 42 2c 20 6c 61 62 65 6c 45 6e 64 29  AddrB, labelEnd)
19630 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
19640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19650 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
19660 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
19670 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19680 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
19690 72 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e  rEofA);.    p->n
196a0 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72  SelectRow += pPr
196b0 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
196c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
196d0 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
196e0 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65   to run when the
196f0 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65   results from se
19700 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20  lect B.  ** are 
19710 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e  exhausted and on
19720 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63  ly data in selec
19730 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a  t A remains..  *
19740 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  /.  if( op==TK_I
19750 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
19760 61 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45  addrEofB = addrE
19770 6f 66 41 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ofA;.    if( p->
19780 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 70 50 72  nSelectRow > pPr
19790 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ior->nSelectRow 
197a0 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ) p->nSelectRow 
197b0 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  = pPrior->nSelec
197c0 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20  tRow;.  }else{  
197d0 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
197e0 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20  ment((v, "eof-B 
197f0 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
19800 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71     addrEofB = sq
19810 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19820 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
19830 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b  OutA, addrOutA);
19840 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19850 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
19860 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 6c 61  ld, regAddrA, la
19870 62 65 6c 45 6e 64 29 3b 20 56 64 62 65 43 6f 76  belEnd); VdbeCov
19880 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
19890 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
198a0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
198b0 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20  ddrEofB);.  }.. 
198c0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
198d0 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  e to handle the 
198e0 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f  case of A<B.  */
198f0 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
19900 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73  nt((v, "A-lt-B s
19910 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
19920 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74  addrAltB = sqlit
19930 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19940 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
19950 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20  A, addrOutA);.  
19960 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19970 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
19980 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66  egAddrA, addrEof
19990 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  A); VdbeCoverage
199a0 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
199b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
199c0 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70  oto, 0, labelCmp
199d0 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  r);..  /* Genera
199e0 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
199f0 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d  e the case of A=
19a00 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  =B.  */.  if( op
19a10 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
19a20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41  addrAeqB = addrA
19a30 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ltB;.  }else if(
19a40 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
19a50 54 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71  T ){.    addrAeq
19a60 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20  B = addrAltB;.  
19a70 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20    addrAltB++;.  
19a80 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e  }else{.    VdbeN
19a90 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
19aa0 41 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-eq-B subroutin
19ab0 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65  e"));.    addrAe
19ac0 71 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33  qB =.    sqlite3
19ad0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19ae0 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
19af0 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62  , addrEofA); Vdb
19b00 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
19b10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19b20 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
19b30 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20  0, labelCmpr);. 
19b40 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
19b50 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
19b60 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42   the case of A>B
19b70 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
19b80 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67  Comment((v, "A-g
19b90 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  t-B subroutine")
19ba0 29 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20  );.  addrAgtB = 
19bb0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
19bc0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28  ntAddr(v);.  if(
19bd0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f   op==TK_ALL || o
19be0 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
19bf0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19c00 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
19c10 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f  , regOutB, addrO
19c20 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  utB);.  }.  sqli
19c30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19c40 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
19c50 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20  drB, addrEofB); 
19c60 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
19c70 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
19c80 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
19c90 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a   0, labelCmpr);.
19ca0 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20  .  /* This code 
19cb0 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69  runs once to ini
19cc0 74 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69  tialize everythi
19cd0 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ng..  */.  sqlit
19ce0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
19cf0 2c 20 6a 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , j1);.  sqlite3
19d00 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19d10 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
19d20 2c 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b  , addrEofA_noB);
19d30 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
19d40 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
19d50 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
19d60 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64  d, regAddrB, add
19d70 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65  rEofB); VdbeCove
19d80 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49  rage(v);..  /* I
19d90 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69  mplement the mai
19da0 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a  n merge loop.  *
19db0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
19dc0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
19dd0 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c  abelCmpr);.  sql
19de0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
19df0 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e  , OP_Permutation
19e00 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72  , 0, 0, 0, (char
19e10 2a 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49  *)aPermute, P4_I
19e20 4e 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69  NTARRAY);.  sqli
19e30 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
19e40 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73   OP_Compare, des
19e50 74 41 2e 69 53 64 73 74 2c 20 64 65 73 74 42 2e  tA.iSdst, destB.
19e60 69 53 64 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c  iSdst, nOrderBy,
19e70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19e80 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
19e90 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b  )pKeyMerge, P4_K
19ea0 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74  EYINFO);.  sqlit
19eb0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
19ec0 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45  , OPFLAG_PERMUTE
19ed0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
19ee0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
19ef0 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64  p, addrAltB, add
19f00 72 41 65 71 42 2c 20 61 64 64 72 41 67 74 42 29  rAeqB, addrAgtB)
19f10 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
19f20 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f  );..  /* Jump to
19f30 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20   the this point 
19f40 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d  in order to term
19f50 69 6e 61 74 65 20 74 68 65 20 71 75 65 72 79 2e  inate the query.
19f60 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
19f70 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
19f80 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20  v, labelEnd);.. 
19f90 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62   /* Set the numb
19fa0 65 72 20 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c  er of output col
19fb0 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  umns.  */.  if( 
19fc0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
19fd0 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
19fe0 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d  Select *pFirst =
19ff0 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 77 68 69   pPrior;.    whi
1a000 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
1a010 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
1a020 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
1a030 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
1a040 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
1a050 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29   pFirst->pEList)
1a060 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73  ;.  }..  /* Reas
1a070 73 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f  sembly the compo
1a080 75 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68 61  und query so tha
1a090 74 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65  t it will be fre
1a0a0 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a  ed correctly.  *
1a0b0 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  * by the calling
1a0c0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69   function */.  i
1a0d0 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
1a0e0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
1a0f0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
1a100 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d  Prior);.  }.  p-
1a110 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
1a120 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78  ;.  pPrior->pNex
1a130 74 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a 20 54  t = p;..  /*** T
1a140 42 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72  BD:  Insert subr
1a150 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20  outine calls to 
1a160 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e  close cursors on
1a170 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a   incomplete.  **
1a180 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a  ** subqueries **
1a190 2a 2a 2f 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d  **/.  explainCom
1a1a0 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20 70  posite(pParse, p
1a1b0 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75  ->op, iSub1, iSu
1a1c0 62 32 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  b2, 0);.  return
1a1d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
1a1e0 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
1a1f0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
1a200 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
1a210 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1a220 5f 56 49 45 57 29 0a 2f 2a 20 46 6f 72 77 61 72  _VIEW)./* Forwar
1a230 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a  d Declarations *
1a240 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  /.static void su
1a250 62 73 74 45 78 70 72 4c 69 73 74 28 73 71 6c 69  bstExprList(sqli
1a260 74 65 33 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2c  te3*, ExprList*,
1a270 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a 29   int, ExprList*)
1a280 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  ;.static void su
1a290 62 73 74 53 65 6c 65 63 74 28 73 71 6c 69 74 65  bstSelect(sqlite
1a2a0 33 2a 2c 20 53 65 6c 65 63 74 20 2a 2c 20 69 6e  3*, Select *, in
1a2b0 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 29 3b 0a  t, ExprList *);.
1a2c0 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f  ./*.** Scan thro
1a2d0 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73 69  ugh the expressi
1a2e0 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61  on pExpr.  Repla
1a2f0 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65 6e  ce every referen
1a300 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d  ce to.** a colum
1a310 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65  n in table numbe
1a320 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61 20  r iTable with a 
1a330 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c  copy of the iCol
1a340 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20  umn-th.** entry 
1a350 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74  in pEList.  (But
1a360 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63 65   leave reference
1a370 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63  s to the ROWID c
1a380 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e  olumn .** unchan
1a390 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ged.).**.** This
1a3a0 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74   routine is part
1a3b0 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69   of the flatteni
1a3c0 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41  ng procedure.  A
1a3d0 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f   subquery.** who
1a3e0 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73  se result set is
1a3f0 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69   defined by pELi
1a400 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65 6e  st appears as en
1a410 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52  try in the.** FR
1a420 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
1a430 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74 20  ELECT such that 
1a440 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  the VDBE cursor 
1a450 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74  assigned to that
1a460 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20  .** FORM clause 
1a470 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e  entry is iTable.
1a480 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
1a490 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61 72  ake the necessar
1a4a0 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
1a4b0 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 69   pExpr so that i
1a4c0 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c  t refers directl
1a4d0 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20  y to the source 
1a4e0 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20  table.** of the 
1a4f0 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72 20  subquery rather 
1a500 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
1a510 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
1a520 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a  */.static Expr *
1a530 73 75 62 73 74 45 78 70 72 28 0a 20 20 73 71 6c  substExpr(.  sql
1a540 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
1a550 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f   /* Report mallo
1a560 63 20 65 72 72 6f 72 73 20 74 6f 20 74 68 69 73  c errors to this
1a570 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
1a580 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
1a590 20 20 20 20 20 2f 2a 20 45 78 70 72 20 69 6e 20       /* Expr in 
1a5a0 77 68 69 63 68 20 73 75 62 73 74 69 74 75 74 69  which substituti
1a5b0 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 69  on occurs */.  i
1a5c0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
1a5d0 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62     /* Table to b
1a5e0 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f  e substituted */
1a5f0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
1a600 69 73 74 20 20 20 20 2f 2a 20 53 75 62 73 74 69  ist    /* Substi
1a610 74 75 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73  tute expressions
1a620 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78   */.){.  if( pEx
1a630 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  pr==0 ) return 0
1a640 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
1a650 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
1a660 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pExpr->iTable==i
1a670 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28  Table ){.    if(
1a680 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
1a690 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  0 ){.      pExpr
1a6a0 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a  ->op = TK_NULL;.
1a6b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a6c0 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20   Expr *pNew;.   
1a6d0 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73     assert( pELis
1a6e0 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69  t!=0 && pExpr->i
1a6f0 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e  Column<pEList->n
1a700 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73  Expr );.      as
1a710 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
1a720 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  ft==0 && pExpr->
1a730 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
1a740 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
1a750 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 4c  3ExprDup(db, pEL
1a760 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43  ist->a[pExpr->iC
1a770 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 2c 20 30 29  olumn].pExpr, 0)
1a780 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1a790 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
1a7a0 78 70 72 29 3b 0a 20 20 20 20 20 20 70 45 78 70  xpr);.      pExp
1a7b0 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a  r = pNew;.    }.
1a7c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 45 78    }else{.    pEx
1a7d0 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73  pr->pLeft = subs
1a7e0 74 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d  tExpr(db, pExpr-
1a7f0 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20  >pLeft, iTable, 
1a800 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 45 78  pEList);.    pEx
1a810 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62  pr->pRight = sub
1a820 73 74 45 78 70 72 28 64 62 2c 20 70 45 78 70 72  stExpr(db, pExpr
1a830 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65  ->pRight, iTable
1a840 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69  , pEList);.    i
1a850 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
1a860 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
1a870 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
1a880 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c   substSelect(db,
1a890 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
1a8a0 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
1a8b0 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
1a8c0 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69       substExprLi
1a8d0 73 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e  st(db, pExpr->x.
1a8e0 70 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70  pList, iTable, p
1a8f0 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  EList);.    }.  
1a900 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72  }.  return pExpr
1a910 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
1a920 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20  substExprList(. 
1a930 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
1a940 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20        /* Report 
1a950 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65  malloc errors he
1a960 72 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  re */.  ExprList
1a970 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20   *pList,     /* 
1a980 4c 69 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64  List to scan and
1a990 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b   in which to mak
1a9a0 65 20 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f  e substitutes */
1a9b0 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1a9c0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
1a9d0 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74   to be substitut
1a9e0 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
1a9f0 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20   *pEList     /* 
1aa00 53 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65  Substitute value
1aa10 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
1aa20 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1aa30 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
1aa40 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
1aa50 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  xpr; i++){.    p
1aa60 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
1aa70 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
1aa80 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
1aa90 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  pr, iTable, pELi
1aaa0 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  st);.  }.}.stati
1aab0 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65  c void substSele
1aac0 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ct(.  sqlite3 *d
1aad0 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  b,         /* Re
1aae0 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  port malloc erro
1aaf0 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c  rs here */.  Sel
1ab00 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
1ab10 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74    /* SELECT stat
1ab20 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74  ement in which t
1ab30 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74  o make substitut
1ab40 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  ions */.  int iT
1ab50 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f  able,          /
1ab60 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 72 65  * Table to be re
1ab70 70 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78 70 72  placed */.  Expr
1ab80 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
1ab90 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76   /* Substitute v
1aba0 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 53 72  alues */.){.  Sr
1abb0 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73  cList *pSrc;.  s
1abc0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1abd0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
1abe0 20 69 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72   i;.  if( !p ) r
1abf0 65 74 75 72 6e 3b 0a 20 20 73 75 62 73 74 45 78  eturn;.  substEx
1ac00 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 45  prList(db, p->pE
1ac10 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  List, iTable, pE
1ac20 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78  List);.  substEx
1ac30 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 47  prList(db, p->pG
1ac40 72 6f 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20  roupBy, iTable, 
1ac50 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74  pEList);.  subst
1ac60 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e  ExprList(db, p->
1ac70 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65  pOrderBy, iTable
1ac80 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e  , pEList);.  p->
1ac90 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45  pHaving = substE
1aca0 78 70 72 28 64 62 2c 20 70 2d 3e 70 48 61 76 69  xpr(db, p->pHavi
1acb0 6e 67 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ng, iTable, pELi
1acc0 73 74 29 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65  st);.  p->pWhere
1acd0 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
1ace0 20 70 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62   p->pWhere, iTab
1acf0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73  le, pEList);.  s
1ad00 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70  ubstSelect(db, p
1ad10 2d 3e 70 50 72 69 6f 72 2c 20 69 54 61 62 6c 65  ->pPrior, iTable
1ad20 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 53 72  , pEList);.  pSr
1ad30 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61  c = p->pSrc;.  a
1ad40 73 73 65 72 74 28 20 70 53 72 63 20 29 3b 20 20  ssert( pSrc );  
1ad50 2f 2a 20 45 76 65 6e 20 66 6f 72 20 28 53 45 4c  /* Even for (SEL
1ad60 45 43 54 20 31 29 20 77 65 20 68 61 76 65 3a 20  ECT 1) we have: 
1ad70 70 53 72 63 21 3d 30 20 62 75 74 20 70 53 72 63  pSrc!=0 but pSrc
1ad80 2d 3e 6e 53 72 63 3d 3d 30 20 2a 2f 0a 20 20 69  ->nSrc==0 */.  i
1ad90 66 28 20 41 4c 57 41 59 53 28 70 53 72 63 29 20  f( ALWAYS(pSrc) 
1ada0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 72  ){.    for(i=pSr
1adb0 63 2d 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70  c->nSrc, pItem=p
1adc0 53 72 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d  Src->a; i>0; i--
1add0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1ade0 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62    substSelect(db
1adf0 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  , pItem->pSelect
1ae00 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1ae10 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
1ae20 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
1ae30 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
1ae40 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
1ae50 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1ae60 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64  VIEW) */..#if !d
1ae70 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1ae80 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
1ae90 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1aea0 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a  OMIT_VIEW)./*.**
1aeb0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
1aec0 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65  tempts to flatte
1aed0 6e 20 73 75 62 71 75 65 72 69 65 73 20 61 73 20  n subqueries as 
1aee0 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70  a performance op
1aef0 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54  timization..** T
1af00 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1af10 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65  rns 1 if it make
1af20 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20  s changes and 0 
1af30 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67  if no flattening
1af40 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54   occurs..**.** T
1af50 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65  o understand the
1af60 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74   concept of flat
1af70 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72  tening, consider
1af80 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
1af90 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  * query:.**.**  
1afa0 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
1afb0 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20   (SELECT x+y AS 
1afc0 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
1afd0 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35  z<100) WHERE a>5
1afe0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75  .**.** The defau
1aff0 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d  lt way of implem
1b000 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72  enting this quer
1b010 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20  y is to execute 
1b020 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  the.** subquery 
1b030 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20  first and store 
1b040 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61  the results in a
1b050 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1b060 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68  , then.** run th
1b070 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e  e outer query on
1b080 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20   that temporary 
1b090 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71  table.  This req
1b0a0 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73  uires two.** pas
1b0b0 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74  ses over the dat
1b0c0 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c  a.  Furthermore,
1b0d0 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d   because the tem
1b0e0 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20  porary table.** 
1b0f0 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20  has no indices, 
1b100 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1b110 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   on the outer qu
1b120 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  ery cannot be.**
1b130 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a   optimized..**.*
1b140 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
1b150 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69  ttempts to rewri
1b160 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20  te queries such 
1b170 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74  as the above int
1b180 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c  o.** a single fl
1b190 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20  at select, like 
1b1a0 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
1b1b0 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
1b1c0 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
1b1d0 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a  100 AND a>5.**.*
1b1e0 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
1b1f0 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69  ated for this si
1b200 6d 70 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65  mpification give
1b210 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c  s the same resul
1b220 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61  t.** but only ha
1b230 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61  s to scan the da
1b240 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65  ta once.  And be
1b250 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69  cause indices mi
1b260 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e  ght .** exist on
1b270 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61   the table t1, a
1b280 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f   complete scan o
1b290 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74  f the data might
1b2a0 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a   be.** avoided..
1b2b0 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67  **.** Flattening
1b2c0 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74   is only attempt
1b2d0 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ed if all of the
1b2e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
1b2f0 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  rue:.**.**   (1)
1b300 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
1b310 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
1b320 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75  ry do not both u
1b330 73 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a  se aggregates..*
1b340 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20  *.**   (2)  The 
1b350 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
1b360 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  an aggregate or 
1b370 74 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 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
1b390 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20  *.**   (3)  The 
1b3a0 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
1b3b0 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
1b3c0 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65  d of a left oute
1b3d0 72 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20  r join.**       
1b3e0 20 28 4f 72 69 67 69 6e 61 6c 6c 79 20 74 69 63   (Originally tic
1b3f0 6b 65 74 20 23 33 30 36 2e 20 20 53 74 72 65 6e  ket #306.  Stren
1b400 67 74 68 65 6e 65 64 20 62 79 20 74 69 63 6b 65  gthened by ticke
1b410 74 20 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20  t #3300).**.**  
1b420 20 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65   (4)  The subque
1b430 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e  ry is not DISTIN
1b440 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20  CT..**.**  (**) 
1b450 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 72 65   At one point re
1b460 73 74 72 69 63 74 69 6f 6e 73 20 28 34 29 20 61  strictions (4) a
1b470 6e 64 20 28 35 29 20 64 65 66 69 6e 65 64 20 61  nd (5) defined a
1b480 20 73 75 62 73 65 74 20 6f 66 20 44 49 53 54 49   subset of DISTI
1b490 4e 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 73 75  NCT.**        su
1b4a0 62 2d 71 75 65 72 69 65 73 20 74 68 61 74 20 77  b-queries that w
1b4b0 65 72 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f  ere excluded fro
1b4c0 6d 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  m this optimizat
1b4d0 69 6f 6e 2e 20 52 65 73 74 72 69 63 74 69 6f 6e  ion. Restriction
1b4e0 20 0a 2a 2a 20 20 20 20 20 20 20 20 28 34 29 20   .**        (4) 
1b4f0 68 61 73 20 73 69 6e 63 65 20 62 65 65 6e 20 65  has since been e
1b500 78 70 61 6e 64 65 64 20 74 6f 20 65 78 63 6c 75  xpanded to exclu
1b510 64 65 20 61 6c 6c 20 44 49 53 54 49 4e 43 54 20  de all DISTINCT 
1b520 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a  subqueries..**.*
1b530 2a 20 20 20 28 36 29 20 20 54 68 65 20 73 75 62  *   (6)  The sub
1b540 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1b550 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72  se aggregates or
1b560 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1b570 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20   is not.**      
1b580 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a    DISTINCT..**.*
1b590 2a 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62  *   (7)  The sub
1b5a0 71 75 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d  query has a FROM
1b5b0 20 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20   clause.  TODO: 
1b5c0 20 46 6f 72 20 73 75 62 71 75 65 72 69 65 73 20   For subqueries 
1b5d0 77 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20  without.**      
1b5e0 20 20 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c    A FROM clause,
1b5f0 20 63 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67   consider adding
1b600 20 61 20 46 52 4f 4d 20 63 6c 6f 73 65 20 77 69   a FROM close wi
1b610 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a  th the special.*
1b620 2a 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 73  *        table s
1b630 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74 20  qlite_once that 
1b640 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73 69  consists of a si
1b650 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e  ngle row contain
1b660 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  ing a.**        
1b670 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a  single NULL..**.
1b680 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75  **   (8)  The su
1b690 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
1b6a0 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
1b6b0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
1b6c0 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  not a join..**.*
1b6d0 2a 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62  *   (9)  The sub
1b6e0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1b6f0 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
1b700 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
1b710 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
1b720 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a     aggregates..*
1b730 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20  *.**  (10)  The 
1b740 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
1b750 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  t use aggregates
1b760 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
1b770 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ery does not.** 
1b780 20 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54         use LIMIT
1b790 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54  ..**.**  (11)  T
1b7a0 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
1b7b0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1b7c0 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65  do not both have
1b7d0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1b7e0 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  s..**.**  (**)  
1b7f0 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e  Not implemented.
1b800 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f 20    Subsumed into 
1b810 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29 2e  restriction (3).
1b820 20 20 57 61 73 20 70 72 65 76 69 6f 75 73 6c 79    Was previously
1b830 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73 65 70  .**        a sep
1b840 61 72 61 74 65 20 72 65 73 74 72 69 63 74 69 6f  arate restrictio
1b850 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f 6d 20  n deriving from 
1b860 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a  ticket #350..**.
1b870 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20 73 75  **  (13)  The su
1b880 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65 72  bquery and outer
1b890 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
1b8a0 74 68 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a  th use LIMIT..**
1b8b0 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20 73  .**  (14)  The s
1b8c0 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1b8d0 20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a   use OFFSET..**.
1b8e0 2a 2a 20 20 28 31 35 29 20 20 54 68 65 20 6f 75  **  (15)  The ou
1b8f0 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
1b900 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f   part of a compo
1b910 75 6e 64 20 73 65 6c 65 63 74 20 6f 72 20 74 68  und select or th
1b920 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71  e.**        subq
1b930 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 68 61  uery does not ha
1b940 76 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  ve a LIMIT claus
1b950 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65  e..**        (Se
1b960 65 20 74 69 63 6b 65 74 20 23 32 33 33 39 20 61  e ticket #2339 a
1b970 6e 64 20 74 69 63 6b 65 74 20 5b 30 32 61 38 65  nd ticket [02a8e
1b980 38 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20  81d44])..**.**  
1b990 28 31 36 29 20 20 54 68 65 20 6f 75 74 65 72 20  (16)  The outer 
1b9a0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20  query is not an 
1b9b0 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65  aggregate or the
1b9c0 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 0a 2a   subquery does.*
1b9d0 2a 20 20 20 20 20 20 20 20 6e 6f 74 20 63 6f 6e  *        not con
1b9e0 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2e 20 20  tain ORDER BY.  
1b9f0 28 54 69 63 6b 65 74 20 23 32 39 34 32 29 20 20  (Ticket #2942)  
1ba00 54 68 69 73 20 75 73 65 64 20 74 6f 20 6e 6f 74  This used to not
1ba10 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20 20 20   matter.**      
1ba20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f    until we intro
1ba30 64 75 63 65 64 20 74 68 65 20 67 72 6f 75 70 5f  duced the group_
1ba40 63 6f 6e 63 61 74 28 29 20 66 75 6e 63 74 69 6f  concat() functio
1ba50 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29  n.  .**.**  (17)
1ba60 20 20 54 68 65 20 73 75 62 2d 71 75 65 72 79 20    The sub-query 
1ba70 69 73 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e  is not a compoun
1ba80 64 20 73 65 6c 65 63 74 2c 20 6f 72 20 69 74 20  d select, or it 
1ba90 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a  is a UNION ALL .
1baa0 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75  **        compou
1bab0 6e 64 20 63 6c 61 75 73 65 20 6d 61 64 65 20 75  nd clause made u
1bac0 70 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 6e 6f  p entirely of no
1bad0 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n-aggregate quer
1bae0 69 65 73 2c 20 61 6e 64 20 0a 2a 2a 20 20 20 20  ies, and .**    
1baf0 20 20 20 20 74 68 65 20 70 61 72 65 6e 74 20 71      the parent q
1bb00 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  uery:.**.**     
1bb10 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 69 74       * is not it
1bb20 73 65 6c 66 20 70 61 72 74 20 6f 66 20 61 20 63  self part of a c
1bb30 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 0a  ompound select,.
1bb40 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73  **          * is
1bb50 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
1bb60 65 20 6f 72 20 44 49 53 54 49 4e 43 54 20 71 75  e or DISTINCT qu
1bb70 65 72 79 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20  ery, and.**     
1bb80 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 20       * is not a 
1bb90 6a 6f 69 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  join.**.**      
1bba0 20 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64    The parent and
1bbb0 20 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63   sub-query may c
1bbc0 6f 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61  ontain WHERE cla
1bbd0 75 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f  uses. Subject to
1bbe0 0a 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73  .**        rules
1bbf0 20 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20   (11), (13) and 
1bc00 28 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61  (14), they may a
1bc10 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45  lso contain ORDE
1bc20 52 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20  R BY,.**        
1bc30 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
1bc40 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20 73   clauses.  The s
1bc50 75 62 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 75  ubquery cannot u
1bc60 73 65 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a  se any compound.
1bc70 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61 74  **        operat
1bc80 6f 72 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e  or other than UN
1bc90 49 4f 4e 20 41 4c 4c 20 62 65 63 61 75 73 65 20  ION ALL because 
1bca0 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63 6f  all the other co
1bcb0 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20  mpound.**       
1bcc0 20 6f 70 65 72 61 74 6f 72 73 20 68 61 76 65 20   operators have 
1bcd0 61 6e 20 69 6d 70 6c 69 65 64 20 44 49 53 54 49  an implied DISTI
1bce0 4e 43 54 20 77 68 69 63 68 20 69 73 20 64 69 73  NCT which is dis
1bcf0 61 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 20 20  allowed by.**   
1bd00 20 20 20 20 20 72 65 73 74 72 69 63 74 69 6f 6e       restriction
1bd10 20 28 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20   (4)..**.**     
1bd20 20 20 20 41 6c 73 6f 2c 20 65 61 63 68 20 63 6f     Also, each co
1bd30 6d 70 6f 6e 65 6e 74 20 6f 66 20 74 68 65 20 73  mponent of the s
1bd40 75 62 2d 71 75 65 72 79 20 6d 75 73 74 20 72 65  ub-query must re
1bd50 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 6e 75  turn the same nu
1bd60 6d 62 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 6f  mber.**        o
1bd70 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
1bd80 2e 20 54 68 69 73 20 69 73 20 61 63 74 75 61 6c  . This is actual
1bd90 6c 79 20 61 20 72 65 71 75 69 72 65 6d 65 6e 74  ly a requirement
1bda0 20 66 6f 72 20 61 6e 79 20 63 6f 6d 70 6f 75 6e   for any compoun
1bdb0 64 0a 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45  d.**        SELE
1bdc0 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75  CT statement, bu
1bdd0 74 20 61 6c 6c 20 74 68 65 20 63 6f 64 65 20 68  t all the code h
1bde0 65 72 65 20 64 6f 65 73 20 69 73 20 6d 61 6b 65  ere does is make
1bdf0 20 73 75 72 65 20 74 68 61 74 20 6e 6f 0a 2a 2a   sure that no.**
1be00 20 20 20 20 20 20 20 20 73 75 63 68 20 28 69 6c          such (il
1be10 6c 65 67 61 6c 29 20 73 75 62 2d 71 75 65 72 79  legal) sub-query
1be20 20 69 73 20 66 6c 61 74 74 65 6e 65 64 2e 20 54   is flattened. T
1be30 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 64  he caller will d
1be40 65 74 65 63 74 20 74 68 65 0a 2a 2a 20 20 20 20  etect the.**    
1be50 20 20 20 20 73 79 6e 74 61 78 20 65 72 72 6f 72      syntax error
1be60 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65   and return a de
1be70 74 61 69 6c 65 64 20 6d 65 73 73 61 67 65 2e 0a  tailed message..
1be80 2a 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49 66 20  **.**  (18)  If 
1be90 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
1bea0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
1beb0 63 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 72  ct, then all ter
1bec0 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20  ms of the.**    
1bed0 20 20 20 20 4f 52 44 45 52 20 62 79 20 63 6c 61      ORDER by cla
1bee0 75 73 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e  use of the paren
1bef0 74 20 6d 75 73 74 20 62 65 20 73 69 6d 70 6c 65  t must be simple
1bf00 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 0a   references to .
1bf10 2a 2a 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  **        column
1bf20 73 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65  s of the sub-que
1bf30 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20  ry..**.**  (19) 
1bf40 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
1bf50 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
1bf60 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
1bf70 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ery does not.** 
1bf80 20 20 20 20 20 20 20 68 61 76 65 20 61 20 57 48         have a WH
1bf90 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ERE clause..**.*
1bfa0 2a 20 20 28 32 30 29 20 20 49 66 20 74 68 65 20  *  (20)  If the 
1bfb0 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
1bfc0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
1bfd0 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f 74  then it must not
1bfe0 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
1bff0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
1c000 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37 37 33  e.  Ticket #3773
1c010 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65 6c 61  .  We could rela
1c020 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  x this constrain
1c030 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d 65  t.**        some
1c040 77 68 61 74 20 62 79 20 73 61 79 69 6e 67 20 74  what by saying t
1c050 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 6f 66  hat the terms of
1c060 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1c070 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20 20  ause must.**    
1c080 20 20 20 20 61 70 70 65 61 72 20 61 73 20 75 6e      appear as un
1c090 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c 74 20  modified result 
1c0a0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f  columns in the o
1c0b0 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 75 74  uter query.  But
1c0c0 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 68 61   we.**        ha
1c0d0 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a  ve other optimiz
1c0e0 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20 74  ations in mind t
1c0f0 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 61 74  o deal with that
1c100 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32   case..**.**  (2
1c110 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
1c120 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
1c130 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
1c140 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a   query is not.**
1c150 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54          DISTINCT
1c160 2e 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 5b  .  (See ticket [
1c170 37 35 32 65 31 36 34 36 66 63 5d 29 2e 0a 2a 2a  752e1646fc])..**
1c180 0a 2a 2a 20 20 28 32 32 29 20 20 54 68 65 20 73  .**  (22)  The s
1c190 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  ubquery is not a
1c1a0 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2e 0a   recursive CTE..
1c1b0 2a 2a 0a 2a 2a 20 20 28 32 33 29 20 20 54 68 65  **.**  (23)  The
1c1c0 20 70 61 72 65 6e 74 20 69 73 20 6e 6f 74 20 61   parent is not a
1c1d0 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2c 20   recursive CTE, 
1c1e0 6f 72 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  or the sub-query
1c1f0 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 20 20 20   is not a.**    
1c200 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65      compound que
1c210 72 79 2e 20 54 68 69 73 20 72 65 73 74 72 69 63  ry. This restric
1c220 74 69 6f 6e 20 69 73 20 62 65 63 61 75 73 65 20  tion is because 
1c230 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65  transforming the
1c240 0a 2a 2a 20 20 20 20 20 20 20 20 70 61 72 65 6e  .**        paren
1c250 74 20 74 6f 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t to a compound 
1c260 71 75 65 72 79 20 63 6f 6e 66 75 73 65 73 20 74  query confuses t
1c270 68 65 20 63 6f 64 65 20 74 68 61 74 20 68 61 6e  he code that han
1c280 64 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 72  dles.**        r
1c290 65 63 75 72 73 69 76 65 20 71 75 65 72 69 65 73  ecursive queries
1c2a0 20 69 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28   in multiSelect(
1c2b0 29 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  )..**.**.** In t
1c2c0 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  his routine, the
1c2d0 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
1c2e0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
1c2f0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
1c300 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  ** The subquery 
1c310 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46  is p->pSrc->a[iF
1c320 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20  rom].  isAgg is 
1c330 74 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65  true if the oute
1c340 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20  r query.** uses 
1c350 61 67 67 72 65 67 61 74 65 73 20 61 6e 64 20 73  aggregates and s
1c360 75 62 71 75 65 72 79 49 73 41 67 67 20 69 73 20  ubqueryIsAgg is 
1c370 74 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  true if the subq
1c380 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
1c390 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66  ates..**.** If f
1c3a0 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74  lattening is not
1c3b0 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73   attempted, this
1c3c0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
1c3d0 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20  -op and returns 
1c3e0 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  0..** If flatten
1c3f0 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64  ing is attempted
1c400 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
1c410 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41  turns 1..**.** A
1c420 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ll of the expres
1c430 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75  sion analysis mu
1c440 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68  st occur on both
1c450 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1c460 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71   and.** the subq
1c470 75 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73  uery before this
1c480 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a   routine runs..*
1c490 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61  /.static int fla
1c4a0 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20  ttenSubquery(.  
1c4b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1c4c0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
1c4d0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
1c4e0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
1c4f0 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20    /* The parent 
1c500 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  or outer SELECT 
1c510 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
1c520 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20  nt iFrom,       
1c530 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
1c540 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20  p->pSrc->a[] of 
1c550 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65  the inner subque
1c560 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67  ry */.  int isAg
1c570 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  g,           /* 
1c580 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45  True if outer SE
1c590 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67  LECT uses aggreg
1c5a0 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
1c5b0 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49  .  int subqueryI
1c5c0 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20  sAgg    /* True 
1c5d0 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
1c5e0 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
1c5f0 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  unctions */.){. 
1c600 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61   const char *zSa
1c610 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  vedAuthContext =
1c620 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
1c630 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20  ntext;.  Select 
1c640 2a 70 50 61 72 65 6e 74 3b 0a 20 20 53 65 6c 65  *pParent;.  Sele
1c650 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20  ct *pSub;       
1c660 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65  /* The inner que
1c670 72 79 20 6f 72 20 22 73 75 62 71 75 65 72 79 22  ry or "subquery"
1c680 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
1c690 75 62 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69  ub1;      /* Poi
1c6a0 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69 67 68  nter to the righ
1c6b0 74 6d 6f 73 74 20 73 65 6c 65 63 74 20 69 6e 20  tmost select in 
1c6c0 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53  sub-query */.  S
1c6d0 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
1c6e0 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
1c6f0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
1c700 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72  er query */.  Sr
1c710 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20  cList *pSubSrc; 
1c720 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
1c730 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71  ause of the subq
1c740 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69  uery */.  ExprLi
1c750 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a  st *pList;    /*
1c760 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   The result set 
1c770 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
1c780 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ry */.  int iPar
1c790 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56  ent;        /* V
1c7a0 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
1c7b0 72 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65  r of the pSub re
1c7c0 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61  sult set temp ta
1c7d0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ble */.  int i; 
1c7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c7f0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
1c800 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
1c810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c820 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
1c830 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
1c840 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1c850 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20  *pSubitem;   /* 
1c860 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  The subquery */.
1c870 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1c880 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
1c890 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1c8a0 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
1c8b0 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75  permitted.  Retu
1c8c0 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a  rn 0 if not..  *
1c8d0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  /.  assert( p!=0
1c8e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
1c8f0 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 20 20 2f  >pPrior==0 );  /
1c900 2a 20 55 6e 61 62 6c 65 20 74 6f 20 66 6c 61 74  * Unable to flat
1c910 74 65 6e 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  ten compound que
1c920 72 69 65 73 20 2a 2f 0a 20 20 69 66 28 20 4f 70  ries */.  if( Op
1c930 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c  timizationDisabl
1c940 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75  ed(db, SQLITE_Qu
1c950 65 72 79 46 6c 61 74 74 65 6e 65 72 29 20 29 20  eryFlattener) ) 
1c960 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63  return 0;.  pSrc
1c970 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73   = p->pSrc;.  as
1c980 73 65 72 74 28 20 70 53 72 63 20 26 26 20 69 46  sert( pSrc && iF
1c990 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c  rom>=0 && iFrom<
1c9a0 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  pSrc->nSrc );.  
1c9b0 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63  pSubitem = &pSrc
1c9c0 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50  ->a[iFrom];.  iP
1c9d0 61 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d  arent = pSubitem
1c9e0 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75  ->iCursor;.  pSu
1c9f0 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53  b = pSubitem->pS
1ca00 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28  elect;.  assert(
1ca10 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66   pSub!=0 );.  if
1ca20 28 20 69 73 41 67 67 20 26 26 20 73 75 62 71 75  ( isAgg && subqu
1ca30 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75 72  eryIsAgg ) retur
1ca40 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1ca50 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1ca60 69 6f 6e 20 28 31 29 20 20 2a 2f 0a 20 20 69 66  ion (1)  */.  if
1ca70 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
1ca80 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  && pSrc->nSrc>1 
1ca90 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1caa0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1cab0 69 6f 6e 20 28 32 29 20 20 2a 2f 0a 20 20 70 53  ion (2)  */.  pS
1cac0 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
1cad0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
1cae0 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72  ubSrc );.  /* Pr
1caf0 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33  ior to version 3
1cb00 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54  .1.2, when LIMIT
1cb10 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20   and OFFSET had 
1cb20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e  to be simple con
1cb30 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74  stants,.  ** not
1cb40 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65   arbitrary expre
1cb50 73 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f  sssions, we allo
1cb60 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69  wed some combini
1cb70 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20  ng of LIMIT and 
1cb80 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61  OFFSET.  ** beca
1cb90 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62  use they could b
1cba0 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f  e computed at co
1cbb0 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74  mpile-time.  But
1cbc0 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20   when LIMIT and 
1cbd0 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61  OFFSET.  ** beca
1cbe0 6d 65 20 61 72 62 69 74 72 61 72 79 20 65 78 70  me arbitrary exp
1cbf0 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72  ressions, we wer
1cc00 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20  e forced to add 
1cc10 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33  restrictions (13
1cc20 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e  ).  ** and (14).
1cc30 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
1cc40 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69  pLimit && p->pLi
1cc50 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  mit ) return 0; 
1cc60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cc70 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29  Restriction (13)
1cc80 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
1cc90 70 4f 66 66 73 65 74 20 29 20 72 65 74 75 72 6e  pOffset ) return
1cca0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1ccb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ccc0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29  Restriction (14)
1ccd0 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65   */.  if( (p->se
1cce0 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70  lFlags & SF_Comp
1ccf0 6f 75 6e 64 29 21 3d 30 20 26 26 20 70 53 75 62  ound)!=0 && pSub
1cd00 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
1cd10 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1cd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd40 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1cd50 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a  ion (15) */.  }.
1cd60 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e    if( pSubSrc->n
1cd70 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Src==0 ) return 
1cd80 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1cd90 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1cda0 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a  riction (7)  */.
1cdb0 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46    if( pSub->selF
1cdc0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
1cdd0 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ct ) return 0;  
1cde0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1cdf0 72 69 63 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a  riction (5)  */.
1ce00 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
1ce10 69 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72  it && (pSrc->nSr
1ce20 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b  c>1 || isAgg) ){
1ce30 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
1ce40 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1ce50 69 63 74 69 6f 6e 73 20 28 38 29 28 39 29 20 2a  ictions (8)(9) *
1ce60 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  /.  }.  if( (p->
1ce70 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
1ce80 73 74 69 6e 63 74 29 21 3d 30 20 26 26 20 73 75  stinct)!=0 && su
1ce90 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20  bqueryIsAgg ){. 
1cea0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1ceb0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1cec0 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d  tion (6)  */.  }
1ced0 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
1cee0 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  By && pSub->pOrd
1cef0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74  erBy ){.     ret
1cf00 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1cf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf30 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1cf40 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (11) */.  }.  if
1cf50 28 20 69 73 41 67 67 20 26 26 20 70 53 75 62 2d  ( isAgg && pSub-
1cf60 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75  >pOrderBy ) retu
1cf70 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1cf80 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1cf90 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66  ion (16) */.  if
1cfa0 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
1cfb0 26 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65  & p->pWhere ) re
1cfc0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1cfd0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1cfe0 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69 66  ion (19) */.  if
1cff0 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
1d000 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
1d010 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
1d020 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
1d030 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;         /* Re
1d040 73 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20 2a  striction (21) *
1d050 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  /.  }.  if( pSub
1d060 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1d070 52 65 63 75 72 73 69 76 65 20 29 20 72 65 74 75  Recursive ) retu
1d080 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f  rn 0;          /
1d090 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32  * Restriction (2
1d0a0 32 29 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d  2)  */.  if( (p-
1d0b0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
1d0c0 65 63 75 72 73 69 76 65 29 20 26 26 20 70 53 75  ecursive) && pSu
1d0d0 62 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74 75  b->pPrior ) retu
1d0e0 72 6e 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 28  rn 0;       /* (
1d0f0 32 33 29 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 42  23)  */..  /* OB
1d100 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31  SOLETE COMMENT 1
1d110 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69  :.  ** Restricti
1d120 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73 75  on 3:  If the su
1d130 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e  bquery is a join
1d140 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
1d150 73 75 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a  subquery is .  *
1d160 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68  * not used as th
1d170 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
1d180 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e  of an outer join
1d190 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77  .  Examples of w
1d1a0 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20  hy this.  ** is 
1d1b0 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a  not allowed:.  *
1d1c0 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74  *.  **         t
1d1d0 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
1d1e0 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20  N (t2 JOIN t3). 
1d1f0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66   **.  ** If we f
1d200 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65  latten the above
1d210 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20  , we would get. 
1d220 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
1d230 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20   (t1 LEFT OUTER 
1d240 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33  JOIN t2) JOIN t3
1d250 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68  .  **.  ** which
1d260 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74   is not at all t
1d270 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20  he same thing.. 
1d280 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54   **.  ** OBSOLET
1d290 45 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a  E COMMENT 2:.  *
1d2a0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32  * Restriction 12
1d2b0 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  :  If the subque
1d2c0 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
1d2d0 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
1d2e0 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69  t outer.  ** joi
1d2f0 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  n, make sure the
1d300 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f   subquery has no
1d310 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20   WHERE clause.. 
1d320 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20   ** An examples 
1d330 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e  of why this is n
1d340 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
1d350 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
1d360 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1d370 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
1d380 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29  t2 WHERE t2.x>0)
1d390 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
1d3a0 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
1d3b0 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
1d3c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
1d3d0 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
1d3e0 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45  R JOIN t2) WHERE
1d3f0 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a   t2.x>0.  **.  *
1d400 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30  * But the t2.x>0
1d410 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79   test will alway
1d420 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c  s fail on a NULL
1d430 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63   row of t2, whic
1d440 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65  h.  ** effective
1d450 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20  ly converts the 
1d460 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20  OUTER JOIN into 
1d470 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20  an INNER JOIN.. 
1d480 20 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56   **.  ** THIS OV
1d490 45 52 52 49 44 45 53 20 4f 42 53 4f 4c 45 54 45  ERRIDES OBSOLETE
1d4a0 20 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20   COMMENTS 1 AND 
1d4b0 32 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69  2 ABOVE:.  ** Ti
1d4c0 63 6b 65 74 20 23 33 33 30 30 20 73 68 6f 77 73  cket #3300 shows
1d4d0 20 74 68 61 74 20 66 6c 61 74 74 65 6e 69 6e 67   that flattening
1d4e0 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20   the right term 
1d4f0 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20  of a LEFT JOIN. 
1d500 20 2a 2a 20 69 73 20 66 72 61 75 67 68 74 20 77   ** is fraught w
1d510 69 74 68 20 64 61 6e 67 65 72 2e 20 20 42 65 73  ith danger.  Bes
1d520 74 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 77  t to avoid the w
1d530 68 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49 66 20  hole thing.  If 
1d540 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
1d550 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  y is the right t
1d560 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  erm of a LEFT JO
1d570 49 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  IN, then do not 
1d580 66 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20  flatten..  */.  
1d590 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a  if( (pSubitem->j
1d5a0 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
1d5b0 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ER)!=0 ){.    re
1d5c0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
1d5d0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 37  * Restriction 17
1d5e0 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  : If the sub-que
1d5f0 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
1d600 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74   SELECT, then it
1d610 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f   must.  ** use o
1d620 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c  nly the UNION AL
1d630 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20  L operator. And 
1d640 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70  none of the simp
1d650 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65  le select querie
1d660 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65  s.  ** that make
1d670 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   up the compound
1d680 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f   SELECT are allo
1d690 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67  wed to be aggreg
1d6a0 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a  ate or distinct.
1d6b0 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20    ** queries..  
1d6c0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1d6d0 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  Prior ){.    if(
1d6e0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1d6f0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1d700 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  0;  /* Restricti
1d710 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a 20  on 20 */.    }. 
1d720 20 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20     if( isAgg || 
1d730 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1d740 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c  F_Distinct)!=0 |
1d750 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  | pSrc->nSrc!=1 
1d760 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1d770 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  0;.    }.    for
1d780 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75  (pSub1=pSub; pSu
1d790 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d  b1; pSub1=pSub1-
1d7a0 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20  >pPrior){.      
1d7b0 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31  testcase( (pSub1
1d7c0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
1d7d0 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
1d7e0 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73  regate))==SF_Dis
1d7f0 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74  tinct );.      t
1d800 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d  estcase( (pSub1-
1d810 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
1d820 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
1d830 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72  egate))==SF_Aggr
1d840 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20 61  egate );.      a
1d850 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 53 72  ssert( pSub->pSr
1d860 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  c!=0 );.      if
1d870 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61  ( (pSub1->selFla
1d880 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
1d890 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
1d8a0 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  !=0.       || (p
1d8b0 53 75 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20  Sub1->pPrior && 
1d8c0 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  pSub1->op!=TK_AL
1d8d0 4c 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 53  L) .       || pS
1d8e0 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c  ub1->pSrc->nSrc<
1d8f0 31 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62  1.       || pSub
1d900 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
1d910 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e  =pSub1->pEList->
1d920 6e 45 78 70 72 0a 20 20 20 20 20 20 29 7b 0a 20  nExpr.      ){. 
1d930 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
1d940 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
1d950 65 73 74 63 61 73 65 28 20 70 53 75 62 31 2d 3e  estcase( pSub1->
1d960 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a  pSrc->nSrc>1 );.
1d970 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
1d980 73 74 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f  striction 18. */
1d990 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64  .    if( p->pOrd
1d9a0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e  erBy ){.      in
1d9b0 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  t ii;.      for(
1d9c0 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64  ii=0; ii<p->pOrd
1d9d0 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b  erBy->nExpr; ii+
1d9e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1d9f0 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  p->pOrderBy->a[i
1da00 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  i].u.x.iOrderByC
1da10 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ol==0 ) return 0
1da20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1da30 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66    }..  /***** If
1da40 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
1da50 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67  oint, flattening
1da60 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a   is permitted. *
1da70 2a 2a 2a 2a 2f 0a 0a 20 20 2f 2a 20 41 75 74 68  ****/..  /* Auth
1da80 6f 72 69 7a 65 20 74 68 65 20 73 75 62 71 75 65  orize the subque
1da90 72 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e  ry */.  pParse->
1daa0 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  zAuthContext = p
1dab0 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a  Subitem->zName;.
1dac0 20 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20    TESTONLY(i =) 
1dad0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
1dae0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
1daf0 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
1db00 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 3d  ;.  testcase( i=
1db10 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a  =SQLITE_DENY );.
1db20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
1db30 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41  ontext = zSavedA
1db40 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f  uthContext;..  /
1db50 2a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  * If the sub-que
1db60 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
1db70 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1db80 74 2c 20 74 68 65 6e 20 28 62 79 20 72 65 73 74  t, then (by rest
1db90 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37  rictions.  ** 17
1dba0 20 61 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69   and 18 above) i
1dbb0 74 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f  t must be a UNIO
1dbc0 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61  N ALL and the pa
1dbd0 72 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20  rent query must 
1dbe0 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20  .  ** be of the 
1dbf0 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  form:.  **.  ** 
1dc00 20 20 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72      SELECT <expr
1dc10 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75  -list> FROM (<su
1dc20 62 2d 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65  b-query>) <where
1dc30 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20  -clause> .  **. 
1dc40 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20   ** followed by 
1dc50 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49  any ORDER BY, LI
1dc60 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45  MIT and/or OFFSE
1dc70 54 20 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20  T clauses. This 
1dc80 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74  block.  ** creat
1dc90 65 73 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66  es N-1 copies of
1dca0 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
1dcb0 79 20 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52  y without any OR
1dcc0 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72  DER BY, LIMIT or
1dcd0 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c   .  ** OFFSET cl
1dce0 61 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20  auses and joins 
1dcf0 74 68 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74  them to the left
1dd00 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68  -hand-side of th
1dd10 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  e original.  ** 
1dd20 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20  using UNION ALL 
1dd30 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68  operators. In th
1dd40 69 73 20 63 61 73 65 20 4e 20 69 73 20 74 68 65  is case N is the
1dd50 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c   number of simpl
1dd60 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74  e.  ** select st
1dd70 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  atements in the 
1dd80 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65  compound sub-que
1dd90 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78  ry..  **.  ** Ex
1dda0 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
1ddb0 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20       SELECT a+1 
1ddc0 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20  FROM (.  **     
1ddd0 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
1dde0 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20   tab.  **       
1ddf0 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
1de00 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 79 20         SELECT y 
1de10 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20  FROM tab.  **   
1de20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
1de30 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43   **        SELEC
1de40 54 20 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20  T abs(z*2) FROM 
1de50 74 61 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20  tab2.  **     ) 
1de60 57 48 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52  WHERE a!=5 ORDER
1de70 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20   BY 1.  **.  ** 
1de80 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  Transformed into
1de90 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
1dea0 53 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20  SELECT x+1 FROM 
1deb0 74 61 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35  tab WHERE x+1!=5
1dec0 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20  .  **     UNION 
1ded0 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c  ALL.  **     SEL
1dee0 45 43 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62  ECT y+1 FROM tab
1def0 20 57 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20   WHERE y+1!=5.  
1df00 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c  **     UNION ALL
1df10 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
1df20 20 61 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d   abs(z*2)+1 FROM
1df30 20 74 61 62 32 20 57 48 45 52 45 20 61 62 73 28   tab2 WHERE abs(
1df40 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  z*2)+1!=5.  **  
1df50 20 20 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20     ORDER BY 1.  
1df60 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20  **.  ** We call 
1df70 74 68 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75  this the "compou
1df80 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74  nd-subquery flat
1df90 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20  tening"..  */.  
1dfa0 66 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70  for(pSub=pSub->p
1dfb0 50 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75  Prior; pSub; pSu
1dfc0 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b  b=pSub->pPrior){
1dfd0 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  .    Select *pNe
1dfe0 77 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  w;.    ExprList 
1dff0 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70  *pOrderBy = p->p
1e000 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70  OrderBy;.    Exp
1e010 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  r *pLimit = p->p
1e020 4c 69 6d 69 74 3b 0a 20 20 20 20 45 78 70 72 20  Limit;.    Expr 
1e030 2a 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f  *pOffset = p->pO
1e040 66 66 73 65 74 3b 0a 20 20 20 20 53 65 6c 65 63  ffset;.    Selec
1e050 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  t *pPrior = p->p
1e060 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f  Prior;.    p->pO
1e070 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
1e080 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20  p->pSrc = 0;.   
1e090 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
1e0a0 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
1e0b0 30 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  0;.    p->pOffse
1e0c0 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20  t = 0;.    pNew 
1e0d0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
1e0e0 75 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20  up(db, p, 0);.  
1e0f0 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
1e100 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 2d 3e 70  Offset;.    p->p
1e110 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
1e120 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
1e130 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
1e140 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  p->pSrc = pSrc;.
1e150 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41      p->op = TK_A
1e160 4c 4c 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  LL;.    if( pNew
1e170 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
1e180 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
1e190 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e1a0 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d    pNew->pPrior =
1e1b0 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69   pPrior;.      i
1e1c0 66 28 20 70 50 72 69 6f 72 20 29 20 70 50 72 69  f( pPrior ) pPri
1e1d0 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77  or->pNext = pNew
1e1e0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4e  ;.      pNew->pN
1e1f0 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 70  ext = p;.      p
1e200 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b  ->pPrior = pNew;
1e210 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
1e220 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1e230 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
1e240 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74  .  /* Begin flat
1e250 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72 6f 6d  tening the iFrom
1e260 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65  -th entry of the
1e270 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20   FROM clause .  
1e280 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  ** in the outer 
1e290 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53  query..  */.  pS
1e2a0 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70 53 75  ub = pSub1 = pSu
1e2b0 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  bitem->pSelect;.
1e2c0 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65  .  /* Delete the
1e2d0 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65   transient table
1e2e0 20 73 74 72 75 63 74 75 72 65 20 61 73 73 6f 63   structure assoc
1e2f0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20  iated with the. 
1e300 20 2a 2a 20 73 75 62 71 75 65 72 79 0a 20 20 2a   ** subquery.  *
1e310 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  /.  sqlite3DbFre
1e320 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e  e(db, pSubitem->
1e330 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 73 71  zDatabase);.  sq
1e340 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1e350 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pSubitem->zName)
1e360 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1e370 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e  e(db, pSubitem->
1e380 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53 75 62 69  zAlias);.  pSubi
1e390 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
1e3a0 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
1e3b0 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75  zName = 0;.  pSu
1e3c0 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20  bitem->zAlias = 
1e3d0 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 70  0;.  pSubitem->p
1e3e0 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f  Select = 0;..  /
1e3f0 2a 20 44 65 66 65 72 20 64 65 6c 65 74 69 6e 67  * Defer deleting
1e400 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63   the Table objec
1e410 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
1e420 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75  h the.  ** subqu
1e430 65 72 79 20 75 6e 74 69 6c 20 63 6f 64 65 20 67  ery until code g
1e440 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a  eneration is.  *
1e450 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63  * complete, sinc
1e460 65 20 74 68 65 72 65 20 6d 61 79 20 73 74 69 6c  e there may stil
1e470 6c 20 65 78 69 73 74 20 45 78 70 72 2e 70 54 61  l exist Expr.pTa
1e480 62 20 65 6e 74 72 69 65 73 20 74 68 61 74 0a 20  b entries that. 
1e490 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 65   ** refer to the
1e4a0 20 73 75 62 71 75 65 72 79 20 65 76 65 6e 20 61   subquery even a
1e4b0 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e  fter flattening.
1e4c0 20 20 54 69 63 6b 65 74 20 23 33 33 34 36 2e 0a    Ticket #3346..
1e4d0 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74    **.  ** pSubit
1e4e0 65 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c 77 61  em->pTab is alwa
1e4f0 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74  ys non-NULL by t
1e500 65 73 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73  est restrictions
1e510 20 61 6e 64 20 74 65 73 74 73 20 61 62 6f 76 65   and tests above
1e520 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57  ..  */.  if( ALW
1e530 41 59 53 28 70 53 75 62 69 74 65 6d 2d 3e 70 54  AYS(pSubitem->pT
1e540 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 54 61  ab!=0) ){.    Ta
1e550 62 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d  ble *pTabToDel =
1e560 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b   pSubitem->pTab;
1e570 0a 20 20 20 20 69 66 28 20 70 54 61 62 54 6f 44  .    if( pTabToD
1e580 65 6c 2d 3e 6e 52 65 66 3d 3d 31 20 29 7b 0a 20  el->nRef==1 ){. 
1e590 20 20 20 20 20 50 61 72 73 65 20 2a 70 54 6f 70       Parse *pTop
1e5a0 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
1e5b0 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
1e5c0 72 73 65 29 3b 0a 20 20 20 20 20 20 70 54 61 62  rse);.      pTab
1e5d0 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62  ToDel->pNextZomb
1e5e0 69 65 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  ie = pToplevel->
1e5f0 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20 20 20 20  pZombieTab;.    
1e600 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f    pToplevel->pZo
1e610 6d 62 69 65 54 61 62 20 3d 20 70 54 61 62 54 6f  mbieTab = pTabTo
1e620 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Del;.    }else{.
1e630 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d        pTabToDel-
1e640 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20  >nRef--;.    }. 
1e650 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61     pSubitem->pTa
1e660 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  b = 0;.  }..  /*
1e670 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c   The following l
1e680 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f  oop runs once fo
1e690 72 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 61  r each term in a
1e6a0 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65   compound-subque
1e6b0 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69  ry.  ** flatteni
1e6c0 6e 67 20 28 61 73 20 64 65 73 63 72 69 62 65 64  ng (as described
1e6d0 20 61 62 6f 76 65 29 2e 20 20 49 66 20 77 65 20   above).  If we 
1e6e0 61 72 65 20 64 6f 69 6e 67 20 61 20 64 69 66 66  are doing a diff
1e6f0 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20  erent kind.  ** 
1e700 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20  of flattening - 
1e710 61 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68  a flattening oth
1e720 65 72 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75  er than a compou
1e730 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74  nd-subquery flat
1e740 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68  tening -.  ** th
1e750 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c  en this loop onl
1e760 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a  y runs once..  *
1e770 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70  *.  ** This loop
1e780 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74 68   moves all of th
1e790 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20  e FROM elements 
1e7a0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
1e7b0 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68  into the.  ** th
1e7c0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1e7d0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1e7e0 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20  .  Before doing 
1e7f0 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20  this, remember. 
1e800 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e   ** the cursor n
1e810 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72  umber for the or
1e820 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65  iginal outer que
1e830 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20  ry FROM element 
1e840 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e  in.  ** iParent.
1e850 20 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75    The iParent cu
1e860 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20  rsor will never 
1e870 62 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71  be used.  Subseq
1e880 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77  uent code.  ** w
1e890 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73  ill scan express
1e8a0 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  ions looking for
1e8b0 20 69 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e   iParent referen
1e8c0 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a  ces and replace.
1e8d0 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72    ** those refer
1e8e0 65 6e 63 65 73 20 77 69 74 68 20 65 78 70 72 65  ences with expre
1e8f0 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f  ssions that reso
1e900 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62 71 75  lve to the subqu
1e910 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c  ery FROM.  ** el
1e920 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f  ements we are no
1e930 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20  w copying in..  
1e940 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74  */.  for(pParent
1e950 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61  =p; pParent; pPa
1e960 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50  rent=pParent->pP
1e970 72 69 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d  rior, pSub=pSub-
1e980 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e  >pPrior){.    in
1e990 74 20 6e 53 75 62 53 72 63 3b 0a 20 20 20 20 75  t nSubSrc;.    u
1e9a0 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a  8 jointype = 0;.
1e9b0 20 20 20 20 70 53 75 62 53 72 63 20 3d 20 70 53      pSubSrc = pS
1e9c0 75 62 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a  ub->pSrc;     /*
1e9d0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1e9e0 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  subquery */.    
1e9f0 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72  nSubSrc = pSubSr
1ea00 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75 6d  c->nSrc;  /* Num
1ea10 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
1ea20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 20 63 6c  subquery FROM cl
1ea30 61 75 73 65 20 2a 2f 0a 20 20 20 20 70 53 72 63  ause */.    pSrc
1ea40 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63   = pParent->pSrc
1ea50 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ;     /* FROM cl
1ea60 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
1ea70 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20 20  r query */..    
1ea80 69 66 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20  if( pSrc ){.    
1ea90 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
1eaa0 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72 73  t==p );  /* Firs
1eab0 74 20 74 69 6d 65 20 74 68 72 6f 75 67 68 20 74  t time through t
1eac0 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  he loop */.     
1ead0 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62   jointype = pSub
1eae0 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a  item->jointype;.
1eaf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1eb00 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
1eb10 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64 20 61  !=p );  /* 2nd a
1eb20 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 74 69  nd subsequent ti
1eb30 6d 65 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  mes through the 
1eb40 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 70 53  loop */.      pS
1eb50 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53  rc = pParent->pS
1eb60 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
1eb70 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 30 2c  istAppend(db, 0,
1eb80 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
1eb90 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20  ( pSrc==0 ){.   
1eba0 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
1ebb0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
1ebc0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1ebd0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1ebe0 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65     /* The subque
1ebf0 72 79 20 75 73 65 73 20 61 20 73 69 6e 67 6c 65  ry uses a single
1ec00 20 73 6c 6f 74 20 6f 66 20 74 68 65 20 46 52 4f   slot of the FRO
1ec10 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1ec20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 71 75 65  outer.    ** que
1ec30 72 79 2e 20 20 49 66 20 74 68 65 20 73 75 62 71  ry.  If the subq
1ec40 75 65 72 79 20 68 61 73 20 6d 6f 72 65 20 74 68  uery has more th
1ec50 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 69  an one element i
1ec60 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73  n its FROM claus
1ec70 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 65  e,.    ** then e
1ec80 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  xpand the outer 
1ec90 71 75 65 72 79 20 74 6f 20 6d 61 6b 65 20 73 70  query to make sp
1eca0 61 63 65 20 66 6f 72 20 69 74 20 74 6f 20 68 6f  ace for it to ho
1ecb0 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a  ld all elements.
1ecc0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 75      ** of the su
1ecd0 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20  bquery..    **. 
1ece0 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20     ** Example:. 
1ecf0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1ed00 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61  SELECT * FROM ta
1ed10 62 41 2c 20 28 53 45 4c 45 43 54 20 2a 20 46 52  bA, (SELECT * FR
1ed20 4f 4d 20 73 75 62 31 2c 20 73 75 62 32 29 2c 20  OM sub1, sub2), 
1ed30 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  tabB;.    **.   
1ed40 20 2a 2a 20 54 68 65 20 6f 75 74 65 72 20 71 75   ** The outer qu
1ed50 65 72 79 20 68 61 73 20 33 20 73 6c 6f 74 73 20  ery has 3 slots 
1ed60 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75  in its FROM clau
1ed70 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20 6f 66  se.  One slot of
1ed80 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
1ed90 72 20 71 75 65 72 79 20 28 74 68 65 20 6d 69 64  r query (the mid
1eda0 64 6c 65 20 73 6c 6f 74 29 20 69 73 20 75 73 65  dle slot) is use
1edb0 64 20 62 79 20 74 68 65 20 73 75 62 71 75 65 72  d by the subquer
1edc0 79 2e 20 20 54 68 65 20 6e 65 78 74 0a 20 20 20  y.  The next.   
1edd0 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64   ** block of cod
1ede0 65 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 74 68  e will expand th
1edf0 65 20 6f 75 74 20 71 75 65 72 79 20 74 6f 20 34  e out query to 4
1ee00 20 73 6c 6f 74 73 2e 20 20 54 68 65 20 6d 69 64   slots.  The mid
1ee10 64 6c 65 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20  dle.    ** slot 
1ee20 69 73 20 65 78 70 61 6e 64 65 64 20 74 6f 20 74  is expanded to t
1ee30 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65  wo slots in orde
1ee40 72 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20  r to make space 
1ee50 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  for the.    ** t
1ee60 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  wo elements in t
1ee70 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1ee80 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
1ee90 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
1eea0 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20  SubSrc>1 ){.    
1eeb0 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20    pParent->pSrc 
1eec0 3d 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  = pSrc = sqlite3
1eed0 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64  SrcListEnlarge(d
1eee0 62 2c 20 70 53 72 63 2c 20 6e 53 75 62 53 72 63  b, pSrc, nSubSrc
1eef0 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20  -1,iFrom+1);.   
1ef00 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
1ef10 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
1ef20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1ef30 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1ef40 54 72 61 6e 73 66 65 72 20 74 68 65 20 46 52 4f  Transfer the FRO
1ef50 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66  M clause terms f
1ef60 72 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72 79  rom the subquery
1ef70 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a   into the.    **
1ef80 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
1ef90 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
1efa0 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b  ; i<nSubSrc; i++
1efb0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1efc0 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
1efd0 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d   pSrc->a[i+iFrom
1efe0 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 20  ].pUsing);.     
1eff0 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d   pSrc->a[i+iFrom
1f000 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69  ] = pSubSrc->a[i
1f010 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ];.      memset(
1f020 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20  &pSubSrc->a[i], 
1f030 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72  0, sizeof(pSubSr
1f040 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d  c->a[i]));.    }
1f050 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72  .    pSrc->a[iFr
1f060 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a  om].jointype = j
1f070 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20  ointype;.  .    
1f080 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62  /* Now begin sub
1f090 73 74 69 74 75 74 69 6e 67 20 73 75 62 71 75 65  stituting subque
1f0a0 72 79 20 72 65 73 75 6c 74 20 73 65 74 20 65 78  ry result set ex
1f0b0 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20  pressions for . 
1f0c0 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73     ** references
1f0d0 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20   to the iParent 
1f0e0 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
1f0f0 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20  ry..    ** .    
1f100 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20  ** Example:.    
1f110 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45  **.    **   SELE
1f120 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f  CT a+5, b*10 FRO
1f130 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53  M (SELECT x*3 AS
1f140 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52   a, y+10 AS b FR
1f150 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e 62  OM t1) WHERE a>b
1f160 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20  ;.    **   \    
1f170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f180 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20   \_____________ 
1f190 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  subquery _______
1f1a0 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a  ___/          /.
1f1b0 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f      **    \_____
1f1c0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1f1d0 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f   outer query ___
1f1e0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1f1f0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20  ___________/.   
1f200 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f   **.    ** We lo
1f210 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78 70 72  ok at every expr
1f220 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75  ession in the ou
1f230 74 65 72 20 71 75 65 72 79 20 61 6e 64 20 65 76  ter query and ev
1f240 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65  ery place we see
1f250 0a 20 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73  .    ** "a" we s
1f260 75 62 73 74 69 74 75 74 65 20 22 78 2a 33 22 20  ubstitute "x*3" 
1f270 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20  and every place 
1f280 77 65 20 73 65 65 20 22 62 22 20 77 65 20 73 75  we see "b" we su
1f290 62 73 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e  bstitute "y+10".
1f2a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c 69 73  .    */.    pLis
1f2b0 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c  t = pParent->pEL
1f2c0 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ist;.    for(i=0
1f2d0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
1f2e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
1f2f0 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  ( pList->a[i].zN
1f300 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
1f310 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
1f320 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
1f330 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  db, pList->a[i].
1f340 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20  zSpan);.        
1f350 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
1f360 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Name);.        p
1f370 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
1f380 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20   = zName;.      
1f390 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 75 62 73  }.    }.    subs
1f3a0 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50  tExprList(db, pP
1f3b0 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 2c 20 69  arent->pEList, i
1f3c0 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
1f3d0 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 69  List);.    if( i
1f3e0 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20 73 75  sAgg ){.      su
1f3f0 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
1f400 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42  pParent->pGroupB
1f410 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  y, iParent, pSub
1f420 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
1f430 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
1f440 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  g = substExpr(db
1f450 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69  , pParent->pHavi
1f460 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  ng, iParent, pSu
1f470 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
1f480 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  }.    if( pSub->
1f490 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
1f4a0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
1f4b0 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  t->pOrderBy==0 )
1f4c0 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
1f4d0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62  >pOrderBy = pSub
1f4e0 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
1f4f0 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79    pSub->pOrderBy
1f500 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
1f510 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72  if( pParent->pOr
1f520 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73  derBy ){.      s
1f530 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
1f540 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72   pParent->pOrder
1f550 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  By, iParent, pSu
1f560 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
1f570 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  }.    if( pSub->
1f580 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20  pWhere ){.      
1f590 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
1f5a0 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62  ExprDup(db, pSub
1f5b0 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20  ->pWhere, 0);.  
1f5c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1f5d0 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 7d  Where = 0;.    }
1f5e0 0a 20 20 20 20 69 66 28 20 73 75 62 71 75 65 72  .    if( subquer
1f5f0 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20  yIsAgg ){.      
1f600 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
1f610 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20  >pHaving==0 );. 
1f620 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48       pParent->pH
1f630 61 76 69 6e 67 20 3d 20 70 50 61 72 65 6e 74 2d  aving = pParent-
1f640 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70  >pWhere;.      p
1f650 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d  Parent->pWhere =
1f660 20 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70   pWhere;.      p
1f670 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20  Parent->pHaving 
1f680 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
1f690 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
1f6a0 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
1f6b0 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
1f6c0 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
1f6d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
1f6e0 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  d(db, pParent->p
1f6f0 48 61 76 69 6e 67 2c 20 0a 20 20 20 20 20 20 20  Having, .       
1f700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f710 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1f720 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53  e3ExprDup(db, pS
1f730 75 62 2d 3e 70 48 61 76 69 6e 67 2c 20 30 29 29  ub->pHaving, 0))
1f740 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f750 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42  pParent->pGroupB
1f760 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  y==0 );.      pP
1f770 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 20  arent->pGroupBy 
1f780 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
1f790 74 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  tDup(db, pSub->p
1f7a0 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20 20 20  GroupBy, 0);.   
1f7b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
1f7c0 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20  arent->pWhere = 
1f7d0 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50  substExpr(db, pP
1f7e0 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 69  arent->pWhere, i
1f7f0 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
1f800 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61  List);.      pPa
1f810 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73  rent->pWhere = s
1f820 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
1f830 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72  , pParent->pWher
1f840 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 20 20  e, pWhere);.    
1f850 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20  }.  .    /* The 
1f860 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79 20  flattened query 
1f870 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20 65  is distinct if e
1f880 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20  ither the inner 
1f890 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75  or the.    ** ou
1f8a0 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69 73  ter query is dis
1f8b0 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20  tinct. .    */. 
1f8c0 20 20 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46     pParent->selF
1f8d0 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65  lags |= pSub->se
1f8e0 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
1f8f0 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a  inct;.  .    /*.
1f900 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e      ** SELECT ..
1f910 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e  . FROM (SELECT .
1f920 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45  .. LIMIT a OFFSE
1f930 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46  T b) LIMIT x OFF
1f940 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20  SET y;.    **.  
1f950 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70    ** One is temp
1f960 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64  ted to try to ad
1f970 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d  d a and b to com
1f980 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e  bine the limits.
1f990 20 20 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a    But this.    *
1f9a0 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  * does not work 
1f9b0 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20  if either limit 
1f9c0 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20  is negative..   
1f9d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62   */.    if( pSub
1f9e0 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
1f9f0 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69    pParent->pLimi
1fa00 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  t = pSub->pLimit
1fa10 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c  ;.      pSub->pL
1fa20 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  imit = 0;.    }.
1fa30 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c    }..  /* Finial
1fa40 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20  ly, delete what 
1fa50 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73  is left of the s
1fa60 75 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75  ubquery and retu
1fa70 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e  rn.  ** success.
1fa80 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53  .  */.  sqlite3S
1fa90 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
1faa0 70 53 75 62 31 29 3b 0a 0a 20 20 72 65 74 75 72  pSub1);..  retur
1fab0 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
1fac0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1fad0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
1fae0 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
1faf0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f  TE_OMIT_VIEW) */
1fb00 0a 0a 2f 2a 0a 2a 2a 20 42 61 73 65 64 20 6f 6e  ../*.** Based on
1fb10 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1fb20 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72   the AggInfo str
1fb30 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64  ucture indicated
1fb40 20 62 79 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   by the first.**
1fb50 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 69 73 20   argument, this 
1fb60 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20  function checks 
1fb70 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
1fb80 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
1fb90 20 20 20 20 2a 20 74 68 65 20 71 75 65 72 79 20      * the query 
1fba0 63 6f 6e 74 61 69 6e 73 20 6a 75 73 74 20 61 20  contains just a 
1fbb0 73 69 6e 67 6c 65 20 61 67 67 72 65 67 61 74 65  single aggregate
1fbc0 20 66 75 6e 63 74 69 6f 6e 2c 0a 2a 2a 20 20 20   function,.**   
1fbd0 20 2a 20 74 68 65 20 61 67 67 72 65 67 61 74 65   * the aggregate
1fbe0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 69 74   function is eit
1fbf0 68 65 72 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  her min() or max
1fc00 28 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 2a 20  (), and.**    * 
1fc10 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
1fc20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75  the aggregate fu
1fc30 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  nction is a colu
1fc40 6d 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  mn value..**.** 
1fc50 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62  If all of the ab
1fc60 6f 76 65 20 61 72 65 20 74 72 75 65 2c 20 74 68  ove are true, th
1fc70 65 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  en WHERE_ORDERBY
1fc80 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52  _MIN or WHERE_OR
1fc90 44 45 52 42 59 5f 4d 41 58 0a 2a 2a 20 69 73 20  DERBY_MAX.** is 
1fca0 72 65 74 75 72 6e 65 64 20 61 73 20 61 70 70 72  returned as appr
1fcb0 6f 70 72 69 61 74 65 2e 20 41 6c 73 6f 2c 20 2a  opriate. Also, *
1fcc0 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20  ppMinMax is set 
1fcd0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
1fce0 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 61 72 67 75  .** list of argu
1fcf0 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
1fd00 74 68 65 20 61 67 67 72 65 67 61 74 65 20 62 65  the aggregate be
1fd10 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
1fd20 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  **.** Or, if the
1fd30 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76   conditions abov
1fd40 65 20 61 72 65 20 6e 6f 74 20 6d 65 74 2c 20 2a  e are not met, *
1fd50 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20  ppMinMax is set 
1fd60 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 57 48 45 52  to 0 and.** WHER
1fd70 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
1fd80 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1fd90 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e 4d 61  .static u8 minMa
1fda0 78 51 75 65 72 79 28 41 67 67 49 6e 66 6f 20 2a  xQuery(AggInfo *
1fdb0 70 41 67 67 49 6e 66 6f 2c 20 45 78 70 72 4c 69  pAggInfo, ExprLi
1fdc0 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a  st **ppMinMax){.
1fdd0 20 20 69 6e 74 20 65 52 65 74 20 3d 20 57 48 45    int eRet = WHE
1fde0 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41  RE_ORDERBY_NORMA
1fdf0 4c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  L;          /* R
1fe00 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a  eturn value */..
1fe10 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 30 3b    *ppMinMax = 0;
1fe20 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d  .  if( pAggInfo-
1fe30 3e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20  >nFunc==1 ){.   
1fe40 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
1fe50 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  AggInfo->aFunc[0
1fe60 5d 2e 70 45 78 70 72 3b 20 2f 2a 20 41 67 67 72  ].pExpr; /* Aggr
1fe70 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a  egate function *
1fe80 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  /.    ExprList *
1fe90 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
1fea0 78 2e 70 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a  x.pList;      /*
1feb0 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 67   Arguments to ag
1fec0 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20  g function */.. 
1fed0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1fee0 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
1fef0 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28  CTION );.    if(
1ff00 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
1ff10 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26 20 70  t->nExpr==1 && p
1ff20 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
1ff30 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
1ff40 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63 6f  LUMN ){.      co
1ff50 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 20  nst char *zFunc 
1ff60 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  = pExpr->u.zToke
1ff70 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  n;.      if( sql
1ff80 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e  ite3StrICmp(zFun
1ff90 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a  c, "min")==0 ){.
1ffa0 20 20 20 20 20 20 20 20 65 52 65 74 20 3d 20 57          eRet = W
1ffb0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
1ffc0 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69 6e  ;.        *ppMin
1ffd0 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  Max = pEList;.  
1ffe0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
1fff0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75  lite3StrICmp(zFu
20000 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29 7b  nc, "max")==0 ){
20010 0a 20 20 20 20 20 20 20 20 65 52 65 74 20 3d 20  .        eRet = 
20020 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
20030 58 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69  X;.        *ppMi
20040 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20  nMax = pEList;. 
20050 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
20060 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 70 4d  ..  assert( *ppM
20070 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 28 2a 70 70  inMax==0 || (*pp
20080 4d 69 6e 4d 61 78 29 2d 3e 6e 45 78 70 72 3d 3d  MinMax)->nExpr==
20090 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 52  1 );.  return eR
200a0 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  et;.}../*.** The
200b0 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
200c0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
200d0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
200e0 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71  s an aggregate q
200f0 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63  uery..** The sec
20100 6f 6e 64 20 61 72 67 6d 65 6e 74 20 69 73 20 74  ond argment is t
20110 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 61 67  he associated ag
20120 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a  gregate-info obj
20130 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75  ect. This .** fu
20140 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20  nction tests if 
20150 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66  the SELECT is of
20160 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
20170 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
20180 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a  *) FROM <tbl>.**
20190 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c 65 20  .** where table 
201a0 69 73 20 61 20 64 61 74 61 62 61 73 65 20 74 61  is a database ta
201b0 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73  ble, not a sub-s
201c0 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 49  elect or view. I
201d0 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 64  f the query.** d
201e0 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73 20 70  oes match this p
201f0 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61 20 70  attern, then a p
20200 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61  ointer to the Ta
20210 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70 72 65  ble object repre
20220 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e  senting.** <tbl>
20230 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
20240 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72 65  herwise, 0 is re
20250 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
20260 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c  c Table *isSimpl
20270 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a 70  eCount(Select *p
20280 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
20290 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  nfo){.  Table *p
202a0 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 78  Tab;.  Expr *pEx
202b0 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  pr;..  assert( !
202c0 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a  p->pGroupBy );..
202d0 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20    if( p->pWhere 
202e0 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  || p->pEList->nE
202f0 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d  xpr!=1 .   || p-
20300 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c  >pSrc->nSrc!=1 |
20310 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  | p->pSrc->a[0].
20320 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20  pSelect.  ){.   
20330 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
20340 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d   pTab = p->pSrc-
20350 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45  >a[0].pTab;.  pE
20360 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
20370 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61  >a[0].pExpr;.  a
20380 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20 21  ssert( pTab && !
20390 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26  pTab->pSelect &&
203a0 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69 66 28   pExpr );..  if(
203b0 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
203c0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
203d0 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
203e0 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20  _AGG_FUNCTION ) 
203f0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
20400 4e 45 56 45 52 28 70 41 67 67 49 6e 66 6f 2d 3e  NEVER(pAggInfo->
20410 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72 65 74 75  nFunc==0) ) retu
20420 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41 67  rn 0;.  if( (pAg
20430 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e  gInfo->aFunc[0].
20440 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73  pFunc->funcFlags
20450 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55  &SQLITE_FUNC_COU
20460 4e 54 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  NT)==0 ) return 
20470 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
20480 66 6c 61 67 73 26 45 50 5f 44 69 73 74 69 6e 63  flags&EP_Distinc
20490 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  t ) return 0;.. 
204a0 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
204b0 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f  ./*.** If the so
204c0 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d 20 70  urce-list item p
204d0 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
204e0 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65 6e 74  ment was augment
204f0 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e  ed with an.** IN
20500 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
20510 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63   then try to loc
20520 61 74 65 20 74 68 65 20 73 70 65 63 69 66 69 65  ate the specifie
20530 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 72  d index. If ther
20540 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20 61 20  e.** was such a 
20550 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6e  clause and the n
20560 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f  amed index canno
20570 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75  t be found, retu
20580 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52  rn .** SQLITE_ER
20590 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20 61 6e  ROR and leave an
205a0 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65   error in pParse
205b0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70 6f 70  . Otherwise, pop
205c0 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d  ulate .** pFrom-
205d0 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65 74 75  >pIndex and retu
205e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  rn SQLITE_OK..*/
205f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65  .int sqlite3Inde
20600 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73  xedByLookup(Pars
20610 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63  e *pParse, struc
20620 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
20630 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46  pFrom){.  if( pF
20640 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70 46 72  rom->pTab && pFr
20650 6f 6d 2d 3e 7a 49 6e 64 65 78 20 29 7b 0a 20 20  om->zIndex ){.  
20660 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
20670 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pFrom->pTab;.   
20680 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 20 3d 20   char *zIndex = 
20690 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 3b 0a 20  pFrom->zIndex;. 
206a0 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
206b0 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
206c0 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20 20  b->pIndex; .    
206d0 20 20 20 20 70 49 64 78 20 26 26 20 73 71 6c 69      pIdx && sqli
206e0 74 65 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d  te3StrICmp(pIdx-
206f0 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 29 3b  >zName, zIndex);
20700 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 3d 70   .        pIdx=p
20710 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29  Idx->pNext.    )
20720 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64 78 20  ;.    if( !pIdx 
20730 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
20740 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
20750 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a   "no such index:
20760 20 25 73 22 2c 20 7a 49 6e 64 65 78 2c 20 30 29   %s", zIndex, 0)
20770 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
20780 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
20790 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
207a0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
207b0 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49 6e  }.    pFrom->pIn
207c0 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a  dex = pIdx;.  }.
207d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
207e0 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65  OK;.}./*.** Dete
207f0 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  ct compound SELE
20800 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  CT statements th
20810 61 74 20 75 73 65 20 61 6e 20 4f 52 44 45 52 20  at use an ORDER 
20820 42 59 20 63 6c 61 75 73 65 20 77 69 74 68 20 0a  BY clause with .
20830 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  ** an alternativ
20840 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
20850 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53  ence..**.**    S
20860 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
20870 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20  1 EXCEPT SELECT 
20880 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52 44 45  ... FROM t2 ORDE
20890 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20  R BY .. COLLATE 
208a0 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ....**.** These 
208b0 61 72 65 20 72 65 77 72 69 74 74 65 6e 20 61 73  are rewritten as
208c0 20 61 20 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a   a subquery:.**.
208d0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
208e0 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20  ROM (SELECT ... 
208f0 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53  FROM t1 EXCEPT S
20900 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
20910 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45 52 20  2).**     ORDER 
20920 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e  BY ... COLLATE .
20930 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72  ...**.** This tr
20940 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20  ansformation is 
20950 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73  necessary becaus
20960 65 20 74 68 65 20 6d 75 6c 74 69 53 65 6c 65 63  e the multiSelec
20970 74 4f 72 64 65 72 42 79 28 29 20 72 6f 75 74 69  tOrderBy() routi
20980 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68 61 74  ne.** above that
20990 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
209a0 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75  ode for a compou
209b0 6e 64 20 53 45 4c 45 43 54 20 77 69 74 68 20 61  nd SELECT with a
209c0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
209d0 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65 72 67  e.** uses a merg
209e0 65 20 61 6c 67 6f 72 69 74 68 6d 20 74 68 61 74  e algorithm that
209f0 20 72 65 71 75 69 72 65 73 20 74 68 65 20 73 61   requires the sa
20a00 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  me collating seq
20a10 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20  uence on the.** 
20a20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61  result columns a
20a30 73 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s on the ORDER B
20a40 59 20 63 6c 61 75 73 65 2e 20 20 53 65 65 20 74  Y clause.  See t
20a50 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f  icket.** http://
20a60 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73  www.sqlite.org/s
20a70 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37 34 64  rc/info/6709574d
20a80 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72  2a.**.** This tr
20a90 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20  ansformation is 
20aa0 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f 72 20  only needed for 
20ab0 45 58 43 45 50 54 2c 20 49 4e 54 45 52 53 45 43  EXCEPT, INTERSEC
20ac0 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a  T, and UNION..**
20ad0 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   The UNION ALL o
20ae0 70 65 72 61 74 6f 72 20 77 6f 72 6b 73 20 66 69  perator works fi
20af0 6e 65 20 77 69 74 68 20 6d 75 6c 74 69 53 65 6c  ne with multiSel
20b00 65 63 74 4f 72 64 65 72 42 79 28 29 20 65 76 65  ectOrderBy() eve
20b10 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20  n when.** there 
20b20 61 72 65 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d  are COLLATE term
20b30 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
20b40 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  Y..*/.static int
20b50 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64   convertCompound
20b60 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79  SelectToSubquery
20b70 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
20b80 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
20b90 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63 74 20  int i;.  Select 
20ba0 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20  *pNew;.  Select 
20bb0 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *pX;.  sqlite3 *
20bc0 64 62 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  db;.  struct Exp
20bd0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20  rList_item *a;. 
20be0 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 53 72   SrcList *pNewSr
20bf0 63 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  c;.  Parse *pPar
20c00 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d  se;.  Token dumm
20c10 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  y;..  if( p->pPr
20c20 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ior==0 ) return 
20c30 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
20c40 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  if( p->pOrderBy=
20c50 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
20c60 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28  Continue;.  for(
20c70 70 58 3d 70 3b 20 70 58 20 26 26 20 28 70 58 2d  pX=p; pX && (pX-
20c80 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70  >op==TK_ALL || p
20c90 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  X->op==TK_SELECT
20ca0 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72  ); pX=pX->pPrior
20cb0 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d 30 20  ){}.  if( pX==0 
20cc0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
20cd0 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e  tinue;.  a = p->
20ce0 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66  pOrderBy->a;.  f
20cf0 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79  or(i=p->pOrderBy
20d00 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b  ->nExpr-1; i>=0;
20d10 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61   i--){.    if( a
20d20 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73  [i].pExpr->flags
20d30 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20   & EP_Collate ) 
20d40 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
20d50 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 57 52   i<0 ) return WR
20d60 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f  C_Continue;..  /
20d70 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
20d80 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d  is point, that m
20d90 65 61 6e 73 20 74 68 65 20 74 72 61 6e 73 66 6f  eans the transfo
20da0 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69  rmation is requi
20db0 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73  red. */..  pPars
20dc0 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
20dd0 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  rse;.  db = pPar
20de0 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d  se->db;.  pNew =
20df0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
20e00 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
20e10 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20  *pNew) );.  if( 
20e20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
20e30 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65   WRC_Abort;.  me
20e40 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20  mset(&dummy, 0, 
20e50 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a  sizeof(dummy));.
20e60 20 20 70 4e 65 77 53 72 63 20 3d 20 73 71 6c 69    pNewSrc = sqli
20e70 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
20e80 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c  FromTerm(pParse,
20e90 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65  0,0,0,&dummy,pNe
20ea0 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20 70 4e  w,0,0);.  if( pN
20eb0 65 77 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72  ewSrc==0 ) retur
20ec0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 2a  n WRC_Abort;.  *
20ed0 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e  pNew = *p;.  p->
20ee0 70 53 72 63 20 3d 20 70 4e 65 77 53 72 63 3b 0a  pSrc = pNewSrc;.
20ef0 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71    p->pEList = sq
20f00 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
20f10 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73  end(pParse, 0, s
20f20 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
20f30 4b 5f 41 4c 4c 2c 20 30 29 29 3b 0a 20 20 70 2d  K_ALL, 0));.  p-
20f40 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b  >op = TK_SELECT;
20f50 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 30  .  p->pWhere = 0
20f60 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70  ;.  pNew->pGroup
20f70 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  By = 0;.  pNew->
20f80 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20 20 70  pHaving = 0;.  p
20f90 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  New->pOrderBy = 
20fa0 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  0;.  p->pPrior =
20fb0 20 30 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d   0;.  p->pNext =
20fc0 20 30 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67   0;.  p->selFlag
20fd0 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e  s &= ~SF_Compoun
20fe0 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  d;.  assert( pNe
20ff0 77 2d 3e 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a  w->pPrior!=0 );.
21000 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 2d 3e    pNew->pPrior->
21010 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pNext = pNew;.  
21020 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  pNew->pLimit = 0
21030 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
21040 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
21050 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
21060 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21070 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41  OMIT_CTE./*.** A
21080 72 67 75 6d 65 6e 74 20 70 57 69 74 68 20 28 77  rgument pWith (w
21090 68 69 63 68 20 6d 61 79 20 62 65 20 4e 55 4c 4c  hich may be NULL
210a0 29 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c 69  ) points to a li
210b0 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e 65 73  nked list of nes
210c0 74 65 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f 6e  ted .** WITH con
210d0 74 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e 65  texts, from inne
210e0 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e 20  r to outermost. 
210f0 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 64 65  If the table ide
21100 6e 74 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 46  ntified by .** F
21110 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65  ROM clause eleme
21120 6e 74 20 70 49 74 65 6d 20 69 73 20 72 65 61 6c  nt pItem is real
21130 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c  ly a common-tabl
21140 65 2d 65 78 70 72 65 73 73 69 6f 6e 20 28 43 54  e-expression (CT
21150 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  E) .** then retu
21160 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
21170 74 68 65 20 43 54 45 20 64 65 66 69 6e 69 74 69  the CTE definiti
21180 6f 6e 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c  on for that tabl
21190 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  e. Otherwise.** 
211a0 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
211b0 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  ** If a non-NULL
211c0 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e   value is return
211d0 65 64 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74 65  ed, set *ppConte
211e0 78 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  xt to point to t
211f0 68 65 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65 63  he With.** objec
21200 74 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72  t that the retur
21210 6e 65 64 20 43 54 45 20 62 65 6c 6f 6e 67 73 20  ned CTE belongs 
21220 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  to..*/.static st
21230 72 75 63 74 20 43 74 65 20 2a 73 65 61 72 63 68  ruct Cte *search
21240 57 69 74 68 28 0a 20 20 57 69 74 68 20 2a 70 57  With(.  With *pW
21250 69 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ith,            
21260 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
21270 6e 74 20 6f 75 74 65 72 6d 6f 73 74 20 57 49 54  nt outermost WIT
21280 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  H clause */.  st
21290 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
212a0 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f 2a  m *pItem,     /*
212b0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65   FROM clause ele
212c0 6d 65 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65 20  ment to resolve 
212d0 2a 2f 0a 20 20 57 69 74 68 20 2a 2a 70 70 43 6f  */.  With **ppCo
212e0 6e 74 65 78 74 20 20 20 20 20 20 20 20 20 20 20  ntext           
212f0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49 54       /* OUT: WIT
21300 48 20 63 6c 61 75 73 65 20 72 65 74 75 72 6e 20  H clause return 
21310 76 61 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74 6f  value belongs to
21320 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
21330 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66  har *zName;.  if
21340 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  ( pItem->zDataba
21350 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65 20  se==0 && (zName 
21360 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21  = pItem->zName)!
21370 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a  =0 ){.    With *
21380 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 57 69  p;.    for(p=pWi
21390 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75 74  th; p; p=p->pOut
213a0 65 72 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  er){.      int i
213b0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
213c0 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29   i<p->nCte; i++)
213d0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
213e0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61  lite3StrICmp(zNa
213f0 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  me, p->a[i].zNam
21400 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
21410 20 20 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d 20     *ppContext = 
21420 70 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  p;.          ret
21430 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  urn &p->a[i];.  
21440 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
21450 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
21460 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  rn 0;.}../* The 
21470 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6d  code generator m
21480 61 69 6e 74 61 69 6e 73 20 61 20 73 74 61 63 6b  aintains a stack
21490 20 6f 66 20 61 63 74 69 76 65 20 57 49 54 48 20   of active WITH 
214a0 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74 68 20  clauses.** with 
214b0 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 57  the inner-most W
214c0 49 54 48 20 63 6c 61 75 73 65 20 62 65 69 6e 67  ITH clause being
214d0 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74   at the top of t
214e0 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  he stack..**.** 
214f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75 73  This routine pus
21500 68 65 73 20 74 68 65 20 57 49 54 48 20 63 6c 61  hes the WITH cla
21510 75 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68  use passed as th
21520 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
21530 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74 6f  t.** onto the to
21540 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20  p of the stack. 
21550 49 66 20 61 72 67 75 6d 65 6e 74 20 62 46 72 65  If argument bFre
21560 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  e is true, then 
21570 74 68 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c 61  this.** WITH cla
21580 75 73 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  use will never b
21590 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68  e popped from th
215a0 65 20 73 74 61 63 6b 2e 20 49 6e 20 74 68 69 73  e stack. In this
215b0 20 63 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f 75   case it.** shou
215c0 6c 64 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e  ld be freed alon
215d0 67 20 77 69 74 68 20 74 68 65 20 50 61 72 73 65  g with the Parse
215e0 20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68 65   object. In othe
215f0 72 20 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a 2a  r cases, when.**
21600 20 62 46 72 65 65 3d 3d 30 2c 20 74 68 65 20 57   bFree==0, the W
21610 69 74 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20  ith object will 
21620 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77  be freed along w
21630 69 74 68 20 74 68 65 20 53 45 4c 45 43 54 20 0a  ith the SELECT .
21640 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74  ** statement wit
21650 68 20 77 68 69 63 68 20 69 74 20 69 73 20 61 73  h which it is as
21660 73 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69  sociated..*/.voi
21670 64 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73  d sqlite3WithPus
21680 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  h(Parse *pParse,
21690 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 75 38   With *pWith, u8
216a0 20 62 46 72 65 65 29 7b 0a 20 20 61 73 73 65 72   bFree){.  asser
216b0 74 28 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20 70  t( bFree==0 || p
216c0 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 30 20  Parse->pWith==0 
216d0 29 3b 0a 20 20 69 66 28 20 70 57 69 74 68 20 29  );.  if( pWith )
216e0 7b 0a 20 20 20 20 70 57 69 74 68 2d 3e 70 4f 75  {.    pWith->pOu
216f0 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 70 57  ter = pParse->pW
21700 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ith;.    pParse-
21710 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a  >pWith = pWith;.
21720 20 20 20 20 70 50 61 72 73 65 2d 3e 62 46 72 65      pParse->bFre
21730 65 57 69 74 68 20 3d 20 62 46 72 65 65 3b 0a 20  eWith = bFree;. 
21740 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
21750 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73   function checks
21760 20 69 66 20 61 72 67 75 6d 65 6e 74 20 70 46 72   if argument pFr
21770 6f 6d 20 72 65 66 65 72 73 20 74 6f 20 61 20 43  om refers to a C
21780 54 45 20 64 65 63 6c 61 72 65 64 20 62 79 20 0a  TE declared by .
21790 2a 2a 20 61 20 57 49 54 48 20 63 6c 61 75 73 65  ** a WITH clause
217a0 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 63 75   on the stack cu
217b0 72 72 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e  rrently maintain
217c0 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
217d0 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72  . And,.** if cur
217e0 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e  rently processin
217f0 67 20 61 20 43 54 45 20 65 78 70 72 65 73 73 69  g a CTE expressi
21800 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 61 20 72  on, if it is a r
21810 65 63 75 72 73 69 76 65 0a 2a 2a 20 72 65 66 65  ecursive.** refe
21820 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 75 72  rence to the cur
21830 72 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20  rent CTE..**.** 
21840 49 66 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69  If pFrom falls i
21850 6e 74 6f 20 65 69 74 68 65 72 20 6f 66 20 74 68  nto either of th
21860 65 20 74 77 6f 20 63 61 74 65 67 6f 72 69 65 73  e two categories
21870 20 61 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70   above, pFrom->p
21880 54 61 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72  Tab.** and other
21890 20 66 69 65 6c 64 73 20 61 72 65 20 70 6f 70 75   fields are popu
218a0 6c 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c  lated accordingl
218b0 79 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68  y. The caller sh
218c0 6f 75 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70  ould check.** (p
218d0 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74  From->pTab!=0) t
218e0 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  o determine whet
218f0 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 75 63  her or not a suc
21900 63 65 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a  cessful match.**
21910 20 77 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   was found..**.*
21920 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * Whether or not
21930 20 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e   a match is foun
21940 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  d, SQLITE_OK is 
21950 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65  returned if no e
21960 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20  rror.** occurs. 
21970 49 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73  If an error does
21980 20 6f 63 63 75 72 2c 20 61 6e 20 65 72 72 6f 72   occur, an error
21990 20 6d 65 73 73 61 67 65 20 69 73 20 73 74 6f 72   message is stor
219a0 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72  ed in the.** par
219b0 73 65 72 20 61 6e 64 20 73 6f 6d 65 20 65 72 72  ser and some err
219c0 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 20 74 68  or code other th
219d0 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  an SQLITE_OK ret
219e0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
219f0 20 69 6e 74 20 77 69 74 68 45 78 70 61 6e 64 28   int withExpand(
21a00 0a 20 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  .  Walker *pWalk
21a10 65 72 2c 20 0a 20 20 73 74 72 75 63 74 20 53 72  er, .  struct Sr
21a20 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
21a30 6d 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  m.){.  Parse *pP
21a40 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
21a50 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65  pParse;.  sqlite
21a60 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
21a70 64 62 3b 0a 20 20 73 74 72 75 63 74 20 43 74 65  db;.  struct Cte
21a80 20 2a 70 43 74 65 3b 20 20 20 20 20 20 20 20 20   *pCte;         
21a90 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 65 64        /* Matched
21aa0 20 43 54 45 20 28 6f 72 20 4e 55 4c 4c 20 69 66   CTE (or NULL if
21ab0 20 6e 6f 20 6d 61 74 63 68 29 20 2a 2f 0a 20 20   no match) */.  
21ac0 57 69 74 68 20 2a 70 57 69 74 68 3b 20 20 20 20  With *pWith;    
21ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ae0 2f 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 74  /* WITH clause t
21af0 68 61 74 20 70 43 74 65 20 62 65 6c 6f 6e 67 73  hat pCte belongs
21b00 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74   to */..  assert
21b10 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
21b20 20 29 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73 65   );..  pCte = se
21b30 61 72 63 68 57 69 74 68 28 70 50 61 72 73 65 2d  archWith(pParse-
21b40 3e 70 57 69 74 68 2c 20 70 46 72 6f 6d 2c 20 26  >pWith, pFrom, &
21b50 70 57 69 74 68 29 3b 0a 20 20 69 66 28 20 70 43  pWith);.  if( pC
21b60 74 65 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  te ){.    Table 
21b70 2a 70 54 61 62 3b 0a 20 20 20 20 45 78 70 72 4c  *pTab;.    ExprL
21b80 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20  ist *pEList;.   
21b90 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20   Select *pSel;. 
21ba0 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 65 66 74     Select *pLeft
21bb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21bc0 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45   /* Left-most SE
21bd0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
21be0 2f 0a 20 20 20 20 69 6e 74 20 62 4d 61 79 52 65  /.    int bMayRe
21bf0 63 75 72 73 69 76 65 3b 20 20 20 20 20 20 20 20  cursive;        
21c00 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63      /* True if c
21c10 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65 64 20 62  ompound joined b
21c20 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f  y UNION [ALL] */
21c30 0a 20 20 20 20 57 69 74 68 20 2a 70 53 61 76 65  .    With *pSave
21c40 64 57 69 74 68 3b 20 20 20 20 20 20 20 20 20 20  dWith;          
21c50 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61     /* Initial va
21c60 6c 75 65 20 6f 66 20 70 50 61 72 73 65 2d 3e 70  lue of pParse->p
21c70 57 69 74 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  With */..    /* 
21c80 49 66 20 70 43 74 65 2d 3e 7a 45 72 72 20 69 73  If pCte->zErr is
21c90 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74 68 69   non-NULL at thi
21ca0 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68  s point, then th
21cb0 69 73 20 69 73 20 61 6e 20 69 6c 6c 65 67 61 6c  is is an illegal
21cc0 0a 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76  .    ** recursiv
21cd0 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 43  e reference to C
21ce0 54 45 20 70 43 74 65 2e 20 4c 65 61 76 65 20 61  TE pCte. Leave a
21cf0 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73  n error in pPars
21d00 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20  e and return.   
21d10 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20 70 43   ** early. If pC
21d20 74 65 2d 3e 7a 45 72 72 20 69 73 20 4e 55 4c 4c  te->zErr is NULL
21d30 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 6e  , then this is n
21d40 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20 72  ot a recursive r
21d50 65 66 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2a  eference..    **
21d60 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 70   In this case, p
21d70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20  roceed.  */.    
21d80 69 66 28 20 70 43 74 65 2d 3e 7a 45 72 72 20 29  if( pCte->zErr )
21d90 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
21da0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
21db0 70 43 74 65 2d 3e 7a 45 72 72 2c 20 70 43 74 65  pCte->zErr, pCte
21dc0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
21dd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
21de0 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
21df0 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
21e00 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46  Tab==0 );.    pF
21e10 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
21e20 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
21e30 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
21e40 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 69  f(Table));.    i
21e50 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74  f( pTab==0 ) ret
21e60 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
21e70 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20     pTab->nRef = 
21e80 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61  1;.    pTab->zNa
21e90 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
21ea0 72 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 7a  rDup(db, pCte->z
21eb0 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54 61 62 2d  Name);.    pTab-
21ec0 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20  >iPKey = -1;.   
21ed0 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
21ee0 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28  t = 200; assert(
21ef0 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67   200==sqlite3Log
21f00 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a  Est(1048576) );.
21f10 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
21f20 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72  gs |= TF_Ephemer
21f30 61 6c 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70  al;.    pFrom->p
21f40 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
21f50 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 43  SelectDup(db, pC
21f60 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b  te->pSelect, 0);
21f70 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
21f80 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
21f90 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
21fa0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
21fb0 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 0a  om->pSelect );..
21fc0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
21fd0 74 68 69 73 20 69 73 20 61 20 72 65 63 75 72 73  this is a recurs
21fe0 69 76 65 20 43 54 45 2e 20 2a 2f 0a 20 20 20 20  ive CTE. */.    
21ff0 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
22000 65 6c 65 63 74 3b 0a 20 20 20 20 62 4d 61 79 52  elect;.    bMayR
22010 65 63 75 72 73 69 76 65 20 3d 20 28 20 70 53 65  ecursive = ( pSe
22020 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  l->op==TK_ALL ||
22030 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e   pSel->op==TK_UN
22040 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 62  ION );.    if( b
22050 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a  MayRecursive ){.
22060 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
22070 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
22080 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
22090 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 66  t->pSrc;.      f
220a0 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
220b0 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
220c0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
220d0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
220e0 20 26 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20   &pSrc->a[i];.  
220f0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
22100 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 0a 20  >zDatabase==0 . 
22110 20 20 20 20 20 20 20 20 26 26 20 70 49 74 65 6d          && pItem
22120 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20 20 20 20  ->zName!=0 .    
22130 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74       && 0==sqlit
22140 65 33 53 74 72 49 43 6d 70 28 70 49 74 65 6d 2d  e3StrICmp(pItem-
22150 3e 7a 4e 61 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e  >zName, pCte->zN
22160 61 6d 65 29 0a 20 20 20 20 20 20 20 20 20 20 29  ame).          )
22170 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  {.          pIte
22180 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a  m->pTab = pTab;.
22190 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
221a0 3e 69 73 52 65 63 75 72 73 69 76 65 20 3d 20 31  >isRecursive = 1
221b0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62  ;.          pTab
221c0 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
221d0 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61      pSel->selFla
221e0 67 73 20 7c 3d 20 53 46 5f 52 65 63 75 72 73 69  gs |= SF_Recursi
221f0 76 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ve;.        }.  
22200 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
22210 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72 65 63   /* Only one rec
22220 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
22230 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a   is permitted. *
22240 2f 20 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  / .    if( pTab-
22250 3e 6e 52 65 66 3e 32 20 29 7b 0a 20 20 20 20 20  >nRef>2 ){.     
22260 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
22270 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72  (.          pPar
22280 73 65 2c 20 22 6d 75 6c 74 69 70 6c 65 20 72 65  se, "multiple re
22290 66 65 72 65 6e 63 65 73 20 74 6f 20 72 65 63 75  ferences to recu
222a0 72 73 69 76 65 20 74 61 62 6c 65 3a 20 25 73 22  rsive table: %s"
222b0 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20  , pCte->zName.  
222c0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 65 74      );.      ret
222d0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
222e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
222f0 72 74 28 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d  rt( pTab->nRef==
22300 31 20 7c 7c 20 28 28 70 53 65 6c 2d 3e 73 65 6c  1 || ((pSel->sel
22310 46 6c 61 67 73 26 53 46 5f 52 65 63 75 72 73 69  Flags&SF_Recursi
22320 76 65 29 20 26 26 20 70 54 61 62 2d 3e 6e 52 65  ve) && pTab->nRe
22330 66 3d 3d 32 20 29 29 3b 0a 0a 20 20 20 20 70 43  f==2 ));..    pC
22340 74 65 2d 3e 7a 45 72 72 20 3d 20 22 63 69 72 63  te->zErr = "circ
22350 75 6c 61 72 20 72 65 66 65 72 65 6e 63 65 3a 20  ular reference: 
22360 25 73 22 3b 0a 20 20 20 20 70 53 61 76 65 64 57  %s";.    pSavedW
22370 69 74 68 20 3d 20 70 50 61 72 73 65 2d 3e 70 57  ith = pParse->pW
22380 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ith;.    pParse-
22390 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a  >pWith = pWith;.
223a0 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
223b0 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 62  elect(pWalker, b
223c0 4d 61 79 52 65 63 75 72 73 69 76 65 20 3f 20 70  MayRecursive ? p
223d0 53 65 6c 2d 3e 70 50 72 69 6f 72 20 3a 20 70 53  Sel->pPrior : pS
223e0 65 6c 29 3b 0a 0a 20 20 20 20 66 6f 72 28 70 4c  el);..    for(pL
223f0 65 66 74 3d 70 53 65 6c 3b 20 70 4c 65 66 74 2d  eft=pSel; pLeft-
22400 3e 70 50 72 69 6f 72 3b 20 70 4c 65 66 74 3d 70  >pPrior; pLeft=p
22410 4c 65 66 74 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  Left->pPrior);. 
22420 20 20 20 70 45 4c 69 73 74 20 3d 20 70 4c 65 66     pEList = pLef
22430 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69  t->pEList;.    i
22440 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c 73 20 29  f( pCte->pCols )
22450 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c 69  {.      if( pELi
22460 73 74 2d 3e 6e 45 78 70 72 21 3d 70 43 74 65 2d  st->nExpr!=pCte-
22470 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 20 29 7b  >pCols->nExpr ){
22480 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22490 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
224a0 20 22 74 61 62 6c 65 20 25 73 20 68 61 73 20 25   "table %s has %
224b0 64 20 76 61 6c 75 65 73 20 66 6f 72 20 25 64 20  d values for %d 
224c0 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20 20 20 20  columns",.      
224d0 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 4e 61 6d        pCte->zNam
224e0 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  e, pEList->nExpr
224f0 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e  , pCte->pCols->n
22500 45 78 70 72 0a 20 20 20 20 20 20 20 20 29 3b 0a  Expr.        );.
22510 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
22520 70 57 69 74 68 20 3d 20 70 53 61 76 65 64 57 69  pWith = pSavedWi
22530 74 68 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  th;.        retu
22540 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
22550 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
22560 45 4c 69 73 74 20 3d 20 70 43 74 65 2d 3e 70 43  EList = pCte->pC
22570 6f 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ols;.    }..    
22580 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f  selectColumnsFro
22590 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
225a0 2c 20 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d  , pEList, &pTab-
225b0 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43  >nCol, &pTab->aC
225c0 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61  ol);.    if( bMa
225d0 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  yRecursive ){.  
225e0 20 20 20 20 69 66 28 20 70 53 65 6c 2d 3e 73 65      if( pSel->se
225f0 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
22600 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 20  rsive ){.       
22610 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20 22 6d   pCte->zErr = "m
22620 75 6c 74 69 70 6c 65 20 72 65 63 75 72 73 69 76  ultiple recursiv
22630 65 20 72 65 66 65 72 65 6e 63 65 73 3a 20 25 73  e references: %s
22640 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
22650 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 45          pCte->zE
22660 72 72 20 3d 20 22 72 65 63 75 72 73 69 76 65 20  rr = "recursive 
22670 72 65 66 65 72 65 6e 63 65 20 69 6e 20 61 20 73  reference in a s
22680 75 62 71 75 65 72 79 3a 20 25 73 22 3b 0a 20 20  ubquery: %s";.  
22690 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
226a0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
226b0 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20  alker, pSel);.  
226c0 20 20 7d 0a 20 20 20 20 70 43 74 65 2d 3e 7a 45    }.    pCte->zE
226d0 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 72  rr = 0;.    pPar
226e0 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76  se->pWith = pSav
226f0 65 64 57 69 74 68 3b 0a 20 20 7d 0a 0a 20 20 72  edWith;.  }..  r
22700 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
22710 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
22720 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
22730 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  TE./*.** If the 
22740 53 45 4c 45 43 54 20 70 61 73 73 65 64 20 61 73  SELECT passed as
22750 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
22760 6d 65 6e 74 20 68 61 73 20 61 6e 20 61 73 73 6f  ment has an asso
22770 63 69 61 74 65 64 20 57 49 54 48 20 0a 2a 2a 20  ciated WITH .** 
22780 63 6c 61 75 73 65 2c 20 70 6f 70 20 69 74 20 66  clause, pop it f
22790 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 73 74  rom the stack st
227a0 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ored as part of 
227b0 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
227c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
227d0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61 73  ction is used as
227e0 20 74 68 65 20 78 53 65 6c 65 63 74 43 61 6c 6c   the xSelectCall
227f0 62 61 63 6b 32 28 29 20 63 61 6c 6c 62 61 63 6b  back2() callback
22800 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65   by.** sqlite3Se
22810 6c 65 63 74 45 78 70 61 6e 64 28 29 20 77 68 65  lectExpand() whe
22820 6e 20 77 61 6c 6b 69 6e 67 20 61 20 53 45 4c 45  n walking a SELE
22830 43 54 20 74 72 65 65 20 74 6f 20 72 65 73 6f 6c  CT tree to resol
22840 76 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65  ve table.** name
22850 73 20 61 6e 64 20 6f 74 68 65 72 20 46 52 4f 4d  s and other FROM
22860 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 73   clause elements
22870 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
22880 64 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 28  d selectPopWith(
22890 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
228a0 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50   Select *p){.  P
228b0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
228c0 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
228d0 20 20 57 69 74 68 20 2a 70 57 69 74 68 20 3d 20    With *pWith = 
228e0 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29  findRightmost(p)
228f0 2d 3e 70 57 69 74 68 3b 0a 20 20 69 66 28 20 70  ->pWith;.  if( p
22900 57 69 74 68 21 3d 30 20 29 7b 0a 20 20 20 20 61  With!=0 ){.    a
22910 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
22920 57 69 74 68 3d 3d 70 57 69 74 68 20 29 3b 0a 20  With==pWith );. 
22930 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68     pParse->pWith
22940 20 3d 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72   = pWith->pOuter
22950 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64  ;.  }.}.#else.#d
22960 65 66 69 6e 65 20 73 65 6c 65 63 74 50 6f 70 57  efine selectPopW
22970 69 74 68 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ith 0.#endif../*
22980 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
22990 20 69 73 20 61 20 57 61 6c 6b 65 72 20 63 61 6c   is a Walker cal
229a0 6c 62 61 63 6b 20 66 6f 72 20 22 65 78 70 61 6e  lback for "expan
229b0 64 69 6e 67 22 20 61 20 53 45 4c 45 43 54 20 73  ding" a SELECT s
229c0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78  tatement..** "Ex
229d0 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20 74  panding" means t
229e0 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  o do the followi
229f0 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  ng:.**.**    (1)
22a00 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45    Make sure VDBE
22a10 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
22a20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e  have been assign
22a30 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20  ed to every.**  
22a40 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f         element o
22a50 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
22a60 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  e..**.**    (2) 
22a70 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61   Fill in the pTa
22a80 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20  bList->a[].pTab 
22a90 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72  fields in the Sr
22aa0 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20  cList that .**  
22ab0 20 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 46         defines F
22ac0 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65  ROM clause.  Whe
22ad0 6e 20 76 69 65 77 73 20 61 70 70 65 61 72 20 69  n views appear i
22ae0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
22af0 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69  e,.**         fi
22b00 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d  ll pTabList->a[]
22b10 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20 61 20  .pSelect with a 
22b20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  copy of the SELE
22b30 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  CT statement.** 
22b40 20 20 20 20 20 20 20 20 74 68 61 74 20 69 6d 70          that imp
22b50 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77  lements the view
22b60 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64  .  A copy is mad
22b70 65 20 6f 66 20 74 68 65 20 76 69 65 77 27 73 20  e of the view's 
22b80 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20  SELECT.**       
22b90 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74    statement so t
22ba0 68 61 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c  hat we can freel
22bb0 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65  y modify or dele
22bc0 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e  te that statemen
22bd0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74  t.**         wit
22be0 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62  hout worrying ab
22bf0 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74  out messing up t
22c00 68 65 20 70 72 65 73 69 73 74 65 6e 74 20 72 65  he presistent re
22c10 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20  presentation.** 
22c20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 76          of the v
22c30 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33  iew..**.**    (3
22c40 29 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20  )  Add terms to 
22c50 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
22c60 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74   to accomodate t
22c70 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
22c80 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e  rd.**         on
22c90 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f   joins and the O
22ca0 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
22cb0 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a  se of joins..**.
22cc0 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e 20  **    (4)  Scan 
22cd0 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  the list of colu
22ce0 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
22cf0 74 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c  t set (pEList) l
22d00 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  ooking.**       
22d10 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20    for instances 
22d20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61  of the "*" opera
22d30 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45  tor or the TABLE
22d40 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  .* operator..** 
22d50 20 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64          If found
22d60 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a  , expand each "*
22d70 22 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  " to be every co
22d80 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61  lumn in every ta
22d90 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61  ble.**         a
22da0 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65  nd TABLE.* to be
22db0 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
22dc0 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74   TABLE..**.*/.st
22dd0 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45  atic int selectE
22de0 78 70 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a  xpander(Walker *
22df0 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
22e00 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
22e10 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
22e20 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c  pParse;.  int i,
22e30 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74   j, k;.  SrcList
22e40 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78   *pTabList;.  Ex
22e50 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
22e60 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
22e70 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20  _item *pFrom;.  
22e80 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
22e90 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
22ea0 20 2a 70 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a   *pE, *pRight, *
22eb0 70 45 78 70 72 3b 0a 20 20 75 31 36 20 73 65 6c  pExpr;.  u16 sel
22ec0 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c  Flags = p->selFl
22ed0 61 67 73 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c  ags;..  p->selFl
22ee0 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64  ags |= SF_Expand
22ef0 65 64 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ed;.  if( db->ma
22f00 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20  llocFailed  ){. 
22f10 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
22f20 6f 72 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e  ort;.  }.  if( N
22f30 45 56 45 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29  EVER(p->pSrc==0)
22f40 20 7c 7c 20 28 73 65 6c 46 6c 61 67 73 20 26 20   || (selFlags & 
22f50 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20  SF_Expanded)!=0 
22f60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
22f70 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70  C_Prune;.  }.  p
22f80 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
22f90 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  c;.  pEList = p-
22fa0 3e 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74  >pEList;.  sqlit
22fb0 65 33 57 69 74 68 50 75 73 68 28 70 50 61 72 73  e3WithPush(pPars
22fc0 65 2c 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74  e, findRightmost
22fd0 28 70 29 2d 3e 70 57 69 74 68 2c 20 30 29 3b 0a  (p)->pWith, 0);.
22fe0 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
22ff0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
23000 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
23010 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73  d to all entries
23020 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f   in.  ** the FRO
23030 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
23040 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
23050 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
23060 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
23070 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54 61  sors(pParse, pTa
23080 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  bList);..  /* Lo
23090 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c  ok up every tabl
230a0 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46  e named in the F
230b0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
230c0 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20  e select.  If.  
230d0 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  ** an entry of t
230e0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
230f0 73 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73  s a subquery ins
23100 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20  tead of a table 
23110 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68  or view,.  ** th
23120 65 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e  en create a tran
23130 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  sient table stru
23140 63 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62  cture to describ
23150 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  e the subquery..
23160 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
23170 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
23180 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
23190 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
231a0 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
231b0 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Tab;.    assert(
231c0 20 70 46 72 6f 6d 2d 3e 69 73 52 65 63 75 72 73   pFrom->isRecurs
231d0 69 76 65 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d  ive==0 || pFrom-
231e0 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 69 66 28  >pTab );.    if(
231f0 20 70 46 72 6f 6d 2d 3e 69 73 52 65 63 75 72 73   pFrom->isRecurs
23200 69 76 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ive ) continue;.
23210 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70      if( pFrom->p
23220 54 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab!=0 ){.      
23230 2f 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e  /* This statemen
23240 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
23250 65 6e 20 70 72 65 70 61 72 65 64 2e 20 20 54 68  en prepared.  Th
23260 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20  ere is no need. 
23270 20 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75       ** to go fu
23280 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  rther. */.      
23290 61 73 73 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a  assert( i==0 );.
232a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
232b0 4d 49 54 5f 43 54 45 0a 20 20 20 20 20 20 73 65  MIT_CTE.      se
232c0 6c 65 63 74 50 6f 70 57 69 74 68 28 70 57 61 6c  lectPopWith(pWal
232d0 6b 65 72 2c 20 70 29 3b 0a 23 65 6e 64 69 66 0a  ker, p);.#endif.
232e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
232f0 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 23 69  _Prune;.    }.#i
23300 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
23310 54 5f 43 54 45 0a 20 20 20 20 69 66 28 20 77 69  T_CTE.    if( wi
23320 74 68 45 78 70 61 6e 64 28 70 57 61 6c 6b 65 72  thExpand(pWalker
23330 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72  , pFrom) ) retur
23340 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
23350 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
23360 20 29 20 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69   ) {} else.#endi
23370 66 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  f.    if( pFrom-
23380 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66  >zName==0 ){.#if
23390 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
233a0 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20  _SUBQUERY.      
233b0 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70  Select *pSel = p
233c0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
233d0 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75       /* A sub-qu
233e0 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ery in the FROM 
233f0 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
23400 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  CT */.      asse
23410 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20  rt( pSel!=0 );. 
23420 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
23430 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20  om->pTab==0 );. 
23440 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
23450 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
23460 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 70 46 72  pSel);.      pFr
23470 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
23480 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
23490 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
234a0 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20  (Table));.      
234b0 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
234c0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
234d0 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66        pTab->nRef
234e0 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 61 62   = 1;.      pTab
234f0 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
23500 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71  3MPrintf(db, "sq
23510 6c 69 74 65 5f 73 71 5f 25 70 22 2c 20 28 76 6f  lite_sq_%p", (vo
23520 69 64 2a 29 70 54 61 62 29 3b 0a 20 20 20 20 20  id*)pTab);.     
23530 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50   while( pSel->pP
23540 72 69 6f 72 20 29 7b 20 70 53 65 6c 20 3d 20 70  rior ){ pSel = p
23550 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20  Sel->pPrior; }. 
23560 20 20 20 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d       selectColum
23570 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  nsFromExprList(p
23580 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c  Parse, pSel->pEL
23590 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c  ist, &pTab->nCol
235a0 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  , &pTab->aCol);.
235b0 20 20 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65        pTab->iPKe
235c0 79 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 54  y = -1;.      pT
235d0 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  ab->nRowLogEst =
235e0 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30   200; assert( 20
235f0 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
23600 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 20  (1048576) );.   
23610 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67     pTab->tabFlag
23620 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61  s |= TF_Ephemera
23630 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  l;.#endif.    }e
23640 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  lse{.      /* An
23650 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20   ordinary table 
23660 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20  or view name in 
23670 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
23680 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
23690 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
236a0 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  );.      pFrom->
236b0 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71  pTab = pTab = sq
236c0 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
236d0 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20  Item(pParse, 0, 
236e0 70 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20 69 66  pFrom);.      if
236f0 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
23700 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
23710 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 52      if( pTab->nR
23720 65 66 3d 3d 30 78 66 66 66 66 20 29 7b 0a 20 20  ef==0xffff ){.  
23730 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
23740 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
23750 6f 6f 20 6d 61 6e 79 20 72 65 66 65 72 65 6e 63  oo many referenc
23760 65 73 20 74 6f 20 5c 22 25 73 5c 22 3a 20 6d 61  es to \"%s\": ma
23770 78 20 36 35 35 33 35 22 2c 0a 20 20 20 20 20 20  x 65535",.      
23780 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
23790 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d  );.        pFrom
237a0 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  ->pTab = 0;.    
237b0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
237c0 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bort;.      }.  
237d0 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b      pTab->nRef++
237e0 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
237f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
23800 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51   || !defined (SQ
23810 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
23820 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66  LTABLE).      if
23830 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
23840 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  || IsVirtual(pTa
23850 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  b) ){.        /*
23860 20 57 65 20 72 65 61 63 68 20 68 65 72 65 20 69   We reach here i
23870 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  f the named tabl
23880 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20 61 20  e is a really a 
23890 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 20 20  view */.        
238a0 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47  if( sqlite3ViewG
238b0 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
238c0 61 72 73 65 2c 20 70 54 61 62 29 20 29 20 72 65  arse, pTab) ) re
238d0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
238e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
238f0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d  pFrom->pSelect==
23900 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72  0 );.        pFr
23910 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  om->pSelect = sq
23920 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
23930 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  b, pTab->pSelect
23940 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
23950 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
23960 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e  pWalker, pFrom->
23970 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
23980 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  }.#endif.    }..
23990 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68      /* Locate th
239a0 65 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 62 79  e index named by
239b0 20 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20   the INDEXED BY 
239c0 63 6c 61 75 73 65 2c 20 69 66 20 61 6e 79 2e 20  clause, if any. 
239d0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
239e0 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75  e3IndexedByLooku
239f0 70 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29  p(pParse, pFrom)
23a00 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
23a10 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
23a20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63  }.  }..  /* Proc
23a30 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  ess NATURAL keyw
23a40 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64  ords, and ON and
23a50 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
23a60 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  f joins..  */.  
23a70 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
23a80 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65 50 72  iled || sqlitePr
23a90 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65  ocessJoin(pParse
23aa0 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , p) ){.    retu
23ab0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
23ac0 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72  }..  /* For ever
23ad0 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72  y "*" that occur
23ae0 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  s in the column 
23af0 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65  list, insert the
23b00 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61   names of.  ** a
23b10 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c  ll columns in al
23b20 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66  l tables.  And f
23b30 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a  or every TABLE.*
23b40 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65   insert the name
23b50 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f  s.  ** of all co
23b60 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20  lumns in TABLE. 
23b70 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 73 65   The parser inse
23b80 72 74 65 64 20 61 20 73 70 65 63 69 61 6c 20 65  rted a special e
23b90 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77  xpression.  ** w
23ba0 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f  ith the TK_ALL o
23bb0 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68  perator for each
23bc0 20 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75   "*" that it fou
23bd0 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  nd in the column
23be0 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20   list..  ** The 
23bf0 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a  following code j
23c00 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74  ust has to locat
23c10 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70  e the TK_ALL exp
23c20 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70  ressions and exp
23c30 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e  and.  ** each on
23c40 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  e to the list of
23c50 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
23c60 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a  all tables..  **
23c70 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
23c80 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73  loop just checks
23c90 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
23ca0 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65   are any "*" ope
23cb0 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74  rators.  ** that
23cc0 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e   need expanding.
23cd0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b  .  */.  for(k=0;
23ce0 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
23cf0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 70 45 20 3d  ; k++){.    pE =
23d00 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45   pEList->a[k].pE
23d10 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  xpr;.    if( pE-
23d20 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72  >op==TK_ALL ) br
23d30 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  eak;.    assert(
23d40 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20   pE->op!=TK_DOT 
23d50 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30  || pE->pRight!=0
23d60 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
23d70 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
23d80 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20  | (pE->pLeft!=0 
23d90 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70  && pE->pLeft->op
23da0 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20  ==TK_ID) );.    
23db0 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44  if( pE->op==TK_D
23dc0 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74  OT && pE->pRight
23dd0 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62  ->op==TK_ALL ) b
23de0 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
23df0 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  k<pEList->nExpr 
23e00 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
23e10 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20   If we get here 
23e20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73  it means the res
23e30 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73  ult set contains
23e40 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22   one or more "*"
23e50 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  .    ** operator
23e60 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
23e70 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f  e expanded.  Loo
23e80 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
23e90 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
23ea0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
23eb0 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68  et and expand th
23ec0 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  em one by one.. 
23ed0 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74     */.    struct
23ee0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
23ef0 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  a = pEList->a;. 
23f00 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65     ExprList *pNe
23f10 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66  w = 0;.    int f
23f20 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64  lags = pParse->d
23f30 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e  b->flags;.    in
23f40 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66  t longNames = (f
23f50 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
23f60 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20  llColNames)!=0. 
23f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f80 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 20 26       && (flags &
23f90 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
23fa0 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20  Names)==0;..    
23fb0 2f 2a 20 57 68 65 6e 20 70 72 6f 63 65 73 73 69  /* When processi
23fc0 6e 67 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ng FROM-clause s
23fd0 75 62 71 75 65 72 69 65 73 2c 20 69 74 20 69 73  ubqueries, it is
23fe0 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65   always the case
23ff0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 66 75 6c  .    ** that ful
24000 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 3d 4f  l_column_names=O
24010 46 46 20 61 6e 64 20 73 68 6f 72 74 5f 63 6f 6c  FF and short_col
24020 75 6d 6e 5f 6e 61 6d 65 73 3d 4f 4e 2e 20 20 54  umn_names=ON.  T
24030 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  he.    ** sqlite
24040 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
24050 63 74 28 29 20 72 6f 75 74 69 6e 65 20 6d 61 6b  ct() routine mak
24060 65 73 20 69 74 20 73 6f 2e 20 2a 2f 0a 20 20 20  es it so. */.   
24070 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c   assert( (p->sel
24080 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65  Flags & SF_Neste
24090 64 46 72 6f 6d 29 3d 3d 30 0a 20 20 20 20 20 20  dFrom)==0.      
240a0 20 20 20 20 7c 7c 20 28 28 66 6c 61 67 73 20 26      || ((flags &
240b0 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e   SQLITE_FullColN
240c0 61 6d 65 73 29 3d 3d 30 20 26 26 0a 20 20 20 20  ames)==0 &&.    
240d0 20 20 20 20 20 20 20 20 20 20 28 66 6c 61 67 73            (flags
240e0 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43   & SQLITE_ShortC
240f0 6f 6c 4e 61 6d 65 73 29 21 3d 30 29 20 29 3b 0a  olNames)!=0) );.
24100 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  .    for(k=0; k<
24110 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b  pEList->nExpr; k
24120 2b 2b 29 7b 0a 20 20 20 20 20 20 70 45 20 3d 20  ++){.      pE = 
24130 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[k].pExpr;.    
24140 20 20 70 52 69 67 68 74 20 3d 20 70 45 2d 3e 70    pRight = pE->p
24150 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73  Right;.      ass
24160 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f  ert( pE->op!=TK_
24170 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 21 3d 30  DOT || pRight!=0
24180 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   );.      if( pE
24190 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 20  ->op!=TK_ALL && 
241a0 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20  (pE->op!=TK_DOT 
241b0 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54  || pRight->op!=T
241c0 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  K_ALL) ){.      
241d0 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63    /* This partic
241e0 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ular expression 
241f0 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
24200 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20   be expanded..  
24210 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
24220 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
24230 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
24240 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d  arse, pNew, a[k]
24250 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
24260 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
24270 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70         pNew->a[p
24280 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e  New->nExpr-1].zN
24290 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65  ame = a[k].zName
242a0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  ;.          pNew
242b0 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d  ->a[pNew->nExpr-
242c0 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e  1].zSpan = a[k].
242d0 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 20  zSpan;.         
242e0 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b   a[k].zName = 0;
242f0 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e  .          a[k].
24300 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20  zSpan = 0;.     
24310 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b     }.        a[k
24320 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20  ].pExpr = 0;.   
24330 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24340 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73    /* This expres
24350 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72  sion is a "*" or
24360 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64   a "TABLE.*" and
24370 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
24380 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64       ** expanded
24390 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  . */.        int
243a0 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20   tableSeen = 0; 
243b0 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31       /* Set to 1
243c0 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63   when TABLE matc
243d0 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  hes */.        c
243e0 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b  har *zTName = 0;
243f0 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f         /* text o
24400 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20  f name of TABLE 
24410 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
24420 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b  E->op==TK_DOT ){
24430 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
24440 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20  t( pE->pLeft!=0 
24450 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
24460 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
24470 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c  perty(pE->pLeft,
24480 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
24490 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d  .          zTNam
244a0 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75  e = pE->pLeft->u
244b0 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  .zToken;.       
244c0 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69   }.        for(i
244d0 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
244e0 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
244f0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
24500 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  rom++){.        
24510 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
24520 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pFrom->pTab;.   
24530 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
24540 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sub = pFrom->pSe
24550 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 20 20  lect;.          
24560 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d  char *zTabName =
24570 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a   pFrom->zAlias;.
24580 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
24590 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61 6d  char *zSchemaNam
245a0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
245b0 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20   int iDb;.      
245c0 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65      if( zTabName
245d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
245e0 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54     zTabName = pT
245f0 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
24600 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
24610 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
24620 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20  ailed ) break;. 
24630 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75           if( pSu
24640 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e 73  b==0 || (pSub->s
24650 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73  elFlags & SF_Nes
24660 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20  tedFrom)==0 ){. 
24670 20 20 20 20 20 20 20 20 20 20 20 70 53 75 62 20             pSub 
24680 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
24690 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73   if( zTName && s
246a0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
246b0 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21  Name, zTabName)!
246c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
246d0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
246e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
246f0 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 73 71          iDb = sq
24700 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
24710 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
24720 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20  hema);.         
24730 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d     zSchemaName =
24740 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61 44   iDb>=0 ? db->aD
24750 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 3a 20 22  b[iDb].zName : "
24760 2a 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  *";.          }.
24770 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
24780 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; j<pTab->nCol;
24790 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
247a0 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
247b0 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
247c0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
247d0 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65    char *zColname
247e0 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74  ;  /* The comput
247f0 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  ed column name *
24800 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  /.            ch
24810 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f  ar *zToFree;   /
24820 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e  * Malloced strin
24830 67 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20  g that needs to 
24840 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20  be freed */.    
24850 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 73 43          Token sC
24860 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70  olname;  /* Comp
24870 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  uted column name
24880 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a   as a token */..
24890 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
248a0 72 74 28 20 7a 4e 61 6d 65 20 29 3b 0a 20 20 20  rt( zName );.   
248b0 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
248c0 61 6d 65 20 26 26 20 70 53 75 62 0a 20 20 20 20  ame && pSub.    
248d0 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
248e0 74 65 33 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65  te3MatchSpanName
248f0 28 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61  (pSub->pEList->a
24900 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a 54  [j].zSpan, 0, zT
24910 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a 20 20 20 20  Name, 0)==0.    
24920 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
24930 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
24940 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
24950 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ..            /*
24960 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20   If a column is 
24970 6d 61 72 6b 65 64 20 61 73 20 27 68 69 64 64 65  marked as 'hidde
24980 6e 27 20 28 63 75 72 72 65 6e 74 6c 79 20 6f 6e  n' (currently on
24990 6c 79 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20  ly possible.    
249a0 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 76          ** for v
249b0 69 72 74 75 61 6c 20 74 61 62 6c 65 73 29 2c 20  irtual tables), 
249c0 64 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 69  do not include i
249d0 74 20 69 6e 20 74 68 65 20 65 78 70 61 6e 64 65  t in the expande
249e0 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  d.            **
249f0 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74   result-set list
24a00 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
24a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
24a20 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28   IsHiddenColumn(
24a30 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20  &pTab->aCol[j]) 
24a40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
24a50 20 61 73 73 65 72 74 28 49 73 56 69 72 74 75 61   assert(IsVirtua
24a60 6c 28 70 54 61 62 29 29 3b 0a 20 20 20 20 20 20  l(pTab));.      
24a70 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
24a80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
24a90 20 20 20 20 20 20 20 20 20 20 20 20 74 61 62 6c              tabl
24aa0 65 53 65 65 6e 20 3d 20 31 3b 0a 0a 20 20 20 20  eSeen = 1;..    
24ab0 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20          if( i>0 
24ac0 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a  && zTName==0 ){.
24ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
24ae0 28 20 28 70 46 72 6f 6d 2d 3e 6a 6f 69 6e 74 79  ( (pFrom->jointy
24af0 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29  pe & JT_NATURAL)
24b00 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  !=0.            
24b10 20 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43      && tableAndC
24b20 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c  olumnIndex(pTabL
24b30 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30  ist, i, zName, 0
24b40 2c 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  , 0).           
24b50 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
24b60 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41        /* In a NA
24b70 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74  TURAL join, omit
24b80 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e   the join column
24b90 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20  s from the .    
24ba0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
24bb0 61 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68  able to the righ
24bc0 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  t of the join */
24bd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24be0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
24bf0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24c00 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
24c10 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28  ite3IdListIndex(
24c20 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a  pFrom->pUsing, z
24c30 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  Name)>=0 ){.    
24c40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
24c50 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20  n a join with a 
24c60 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d  USING clause, om
24c70 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  it columns in th
24c80 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
24c90 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73    ** using claus
24ca0 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65  e from the table
24cb0 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a   on the right. *
24cc0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
24cd0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
24ce0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
24cf0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24d00 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73        pRight = s
24d10 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
24d20 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  K_ID, zName);.  
24d30 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61            zColna
24d40 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20  me = zName;.    
24d50 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20          zToFree 
24d60 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
24d70 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c   if( longNames |
24d80 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  | pTabList->nSrc
24d90 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >1 ){.          
24da0 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b      Expr *pLeft;
24db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
24dc0 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
24dd0 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54  pr(db, TK_ID, zT
24de0 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  abName);.       
24df0 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
24e00 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
24e10 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66  se, TK_DOT, pLef
24e20 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20  t, pRight, 0);. 
24e30 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
24e40 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a   zSchemaName ){.
24e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e60 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
24e70 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a  xpr(db, TK_ID, z
24e80 53 63 68 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20  SchemaName);.   
24e90 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
24ea0 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
24eb0 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54  r(pParse, TK_DOT
24ec0 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72 2c 20  , pLeft, pExpr, 
24ed0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
24ee0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
24ef0 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20    if( longNames 
24f00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
24f10 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71     zColname = sq
24f20 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
24f30 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61   "%s.%s", zTabNa
24f40 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  me, zName);.    
24f50 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46              zToF
24f60 72 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a  ree = zColname;.
24f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
24f80 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
24f90 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
24fa0 20 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b   pExpr = pRight;
24fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
24fc0 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20             pNew 
24fd0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
24fe0 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
24ff0 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20  pNew, pExpr);.  
25000 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61            sColna
25010 6d 65 2e 7a 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b  me.z = zColname;
25020 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 43 6f  .            sCo
25030 6c 6e 61 6d 65 2e 6e 20 3d 20 73 71 6c 69 74 65  lname.n = sqlite
25040 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6e 61  3Strlen30(zColna
25050 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
25060 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
25070 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  SetName(pParse, 
25080 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c  pNew, &sColname,
25090 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
250a0 20 69 66 28 20 70 4e 65 77 20 26 26 20 28 70 2d   if( pNew && (p-
250b0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e  >selFlags & SF_N
250c0 65 73 74 65 64 46 72 6f 6d 29 21 3d 30 20 29 7b  estedFrom)!=0 ){
250d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
250e0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
250f0 74 65 6d 20 2a 70 58 20 3d 20 26 70 4e 65 77 2d  tem *pX = &pNew-
25100 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
25110 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
25120 20 69 66 28 20 70 53 75 62 20 29 7b 0a 20 20 20   if( pSub ){.   
25130 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d               pX-
25140 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33  >zSpan = sqlite3
25150 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 53 75  DbStrDup(db, pSu
25160 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  b->pEList->a[j].
25170 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20  zSpan);.        
25180 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
25190 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29  ( pX->zSpan==0 )
251a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
251b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
251c0 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e         pX->zSpan
251d0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
251e0 66 28 64 62 2c 20 22 25 73 2e 25 73 2e 25 73 22  f(db, "%s.%s.%s"
251f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25210 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63               zSc
25220 68 65 6d 61 4e 61 6d 65 2c 20 7a 54 61 62 4e 61  hemaName, zTabNa
25230 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20  me, zColname);. 
25240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
25250 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70  estcase( pX->zSp
25260 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  an==0 );.       
25270 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25280 20 20 20 20 20 20 20 70 58 2d 3e 62 53 70 61 6e         pX->bSpan
25290 49 73 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 20  IsTab = 1;.     
252a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
252b0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
252c0 65 65 28 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b  ee(db, zToFree);
252d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
252e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
252f0 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b  f( !tableSeen ){
25300 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
25310 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  TName ){.       
25320 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
25330 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
25340 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22   such table: %s"
25350 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20  , zTName);.     
25360 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
25370 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
25380 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
25390 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69  "no tables speci
253a0 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20  fied");.        
253b0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
253c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
253d0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
253e0 65 6c 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74  elete(db, pEList
253f0 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74  );.    p->pEList
25400 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 23 69 66   = pNew;.  }.#if
25410 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
25420 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  MN.  if( p->pELi
25430 73 74 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d  st && p->pEList-
25440 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69  >nExpr>db->aLimi
25450 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
25460 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71  OLUMN] ){.    sq
25470 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
25480 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
25490 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c  columns in resul
254a0 74 20 73 65 74 22 29 3b 0a 20 20 7d 0a 23 65 6e  t set");.  }.#en
254b0 64 69 66 0a 20 20 72 65 74 75 72 6e 20 57 52 43  dif.  return WRC
254c0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
254d0 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e  .** No-op routin
254e0 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d  e for the parse-
254f0 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a  tree walker..**.
25500 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75  ** When this rou
25510 74 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b  tine is the Walk
25520 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  er.xExprCallback
25530 20 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e   then expression
25540 20 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61   trees.** are wa
25550 6c 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79  lked without any
25560 20 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74   actions being t
25570 61 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64  aken at each nod
25580 65 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a  e.  Presumably,.
25590 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ** when this rou
255a0 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
255b0 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c   Walker.xExprCal
255c0 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57  lback then .** W
255d0 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c  alker.xSelectCal
255e0 6c 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20  lback is set to 
255f0 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65  do something use
25600 66 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a  ful for every .*
25610 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20 74 68  * subquery in th
25620 65 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a  e parser tree..*
25630 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
25640 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72  rWalkNoop(Walker
25650 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70 72 20   *NotUsed, Expr 
25660 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e  *NotUsed2){.  UN
25670 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
25680 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
25690 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43  2);.  return WRC
256a0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
256b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
256c0 20 22 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c   "expands" a SEL
256d0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e  ECT statement an
256e0 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62  d all of its sub
256f0 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20  queries..** For 
25700 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
25710 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69  mation on what i
25720 74 20 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61  t means to "expa
25730 6e 64 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20  nd" a SELECT.** 
25740 73 74 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74  statement, see t
25750 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  he comment on th
25760 65 20 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77  e selectExpand w
25770 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61  orker callback a
25780 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61  bove..**.** Expa
25790 6e 64 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73  nding a SELECT s
257a0 74 61 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20  tatement is the 
257b0 66 69 72 73 74 20 73 74 65 70 20 69 6e 20 70 72  first step in pr
257c0 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45  ocessing a.** SE
257d0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
257e0 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
257f0 65 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78  ement must be ex
25800 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a  panded before.**
25810 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
25820 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a   is performed..*
25830 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67  *.** If anything
25840 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20   goes wrong, an 
25850 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
25860 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50   written into pP
25870 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c  arse..** The cal
25880 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61  ling function ca
25890 6e 20 64 65 74 65 63 74 20 74 68 65 20 70 72 6f  n detect the pro
258a0 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20  blem by looking 
258b0 61 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a  at pParse->nErr.
258c0 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65  ** and/or pParse
258d0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
258e0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
258f0 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
25900 45 78 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50  Expand(Parse *pP
25910 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
25920 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72  elect){.  Walker
25930 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c   w;.  memset(&w,
25940 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a   0, sizeof(w));.
25950 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
25960 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70  k = exprWalkNoop
25970 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
25980 50 61 72 73 65 3b 0a 20 20 69 66 28 20 70 50 61  Parse;.  if( pPa
25990 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64  rse->hasCompound
259a0 20 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63   ){.    w.xSelec
259b0 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e 76  tCallback = conv
259c0 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63  ertCompoundSelec
259d0 74 54 6f 53 75 62 71 75 65 72 79 3b 0a 20 20 20  tToSubquery;.   
259e0 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
259f0 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b  ct(&w, pSelect);
25a00 0a 20 20 7d 0a 20 20 77 2e 78 53 65 6c 65 63 74  .  }.  w.xSelect
25a10 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63  Callback = selec
25a20 74 45 78 70 61 6e 64 65 72 3b 0a 20 20 77 2e 78  tExpander;.  w.x
25a30 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
25a40 3d 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 3b  = selectPopWith;
25a50 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65  .  sqlite3WalkSe
25a60 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74  lect(&w, pSelect
25a70 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  );.}...#ifndef S
25a80 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
25a90 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  ERY./*.** This i
25aa0 73 20 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65  s a Walker.xSele
25ab0 63 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62  ctCallback callb
25ac0 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69  ack for the sqli
25ad0 74 65 33 53 65 6c 65 63 74 54 79 70 65 49 6e 66  te3SelectTypeInf
25ae0 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  o().** interface
25af0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68  ..**.** For each
25b00 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
25b10 71 75 65 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d  query, add Colum
25b20 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c 75  n.zType and Colu
25b30 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f  mn.zColl.** info
25b40 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 54  rmation to the T
25b50 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
25b60 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74  hat represents t
25b70 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a  he result set.**
25b80 20 6f 66 20 74 68 61 74 20 73 75 62 71 75 65 72   of that subquer
25b90 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62  y..**.** The Tab
25ba0 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
25bb0 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65  t represents the
25bc0 20 72 65 73 75 6c 74 20 73 65 74 20 77 61 73 20   result set was 
25bd0 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20 62  constructed.** b
25be0 79 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  y selectExpander
25bf0 28 29 20 62 75 74 20 74 68 65 20 74 79 70 65 20  () but the type 
25c00 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e  and collation in
25c10 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d  formation was om
25c20 69 74 74 65 64 0a 2a 2a 20 61 74 20 74 68 61 74  itted.** at that
25c30 20 70 6f 69 6e 74 20 62 65 63 61 75 73 65 20 69   point because i
25c40 64 65 6e 74 69 66 69 65 72 73 20 68 61 64 20 6e  dentifiers had n
25c50 6f 74 20 79 65 74 20 62 65 65 6e 20 72 65 73 6f  ot yet been reso
25c60 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72  lved.  This.** r
25c70 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
25c80 20 61 66 74 65 72 20 69 64 65 6e 74 69 66 69 65   after identifie
25c90 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f  r resolution..*/
25ca0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
25cb0 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79  ectAddSubqueryTy
25cc0 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70  peInfo(Walker *p
25cd0 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
25ce0 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  p){.  Parse *pPa
25cf0 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  rse;.  int i;.  
25d00 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
25d10 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  t;.  struct SrcL
25d20 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b  ist_item *pFrom;
25d30 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ..  assert( p->s
25d40 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73  elFlags & SF_Res
25d50 6f 6c 76 65 64 20 29 3b 0a 20 20 69 66 28 20 28  olved );.  if( (
25d60 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
25d70 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30  _HasTypeInfo)==0
25d80 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c   ){.    p->selFl
25d90 61 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70  ags |= SF_HasTyp
25da0 65 49 6e 66 6f 3b 0a 20 20 20 20 70 50 61 72 73  eInfo;.    pPars
25db0 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
25dc0 72 73 65 3b 0a 20 20 20 20 70 54 61 62 4c 69 73  rse;.    pTabLis
25dd0 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  t = p->pSrc;.   
25de0 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
25df0 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
25e00 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
25e10 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
25e20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
25e30 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
25e40 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
25e50 70 54 61 62 21 3d 30 29 20 26 26 20 28 70 54 61  pTab!=0) && (pTa
25e60 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
25e70 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 29  _Ephemeral)!=0 )
25e80 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73  {.        /* A s
25e90 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20  ub-query in the 
25ea0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
25eb0 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20   SELECT */.     
25ec0 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20     Select *pSel 
25ed0 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
25ee0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
25ef0 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  el ){.          
25f00 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72  while( pSel->pPr
25f10 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65  ior ) pSel = pSe
25f20 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  l->pPrior;.     
25f30 20 20 20 20 20 73 65 6c 65 63 74 41 64 64 43 6f       selectAddCo
25f40 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
25f50 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61  tion(pParse, pTa
25f60 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20  b, pSel);.      
25f70 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
25f80 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
25f90 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
25fa0 69 6e 65 20 61 64 64 73 20 64 61 74 61 74 79 70  ine adds datatyp
25fb0 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20  e and collating 
25fc0 73 65 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61  sequence informa
25fd0 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54  tion to.** the T
25fe0 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 73 20  able structures 
25ff0 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  of all FROM-clau
26000 73 65 20 73 75 62 71 75 65 72 69 65 73 20 69 6e  se subqueries in
26010 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61   a.** SELECT sta
26020 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73  tement..**.** Us
26030 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  e this routine a
26040 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75  fter name resolu
26050 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
26060 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
26070 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 50 61  ctAddTypeInfo(Pa
26080 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
26090 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23  ect *pSelect){.#
260a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
260b0 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 57 61  IT_SUBQUERY.  Wa
260c0 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74  lker w;.  memset
260d0 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  (&w, 0, sizeof(w
260e0 29 29 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  ));.  w.xSelectC
260f0 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63  allback2 = selec
26100 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65  tAddSubqueryType
26110 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43  Info;.  w.xExprC
26120 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57 61  allback = exprWa
26130 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72  lkNoop;.  w.pPar
26140 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73  se = pParse;.  s
26150 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
26160 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23  (&w, pSelect);.#
26170 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
26180 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
26190 73 20 75 70 20 61 20 53 45 4c 45 43 54 20 73 74  s up a SELECT st
261a0 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63  atement for proc
261b0 65 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20  essing.  The.** 
261c0 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63 63  following is acc
261d0 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a  omplished:.**.**
261e0 20 20 20 20 20 2a 20 20 56 44 42 45 20 43 75 72       *  VDBE Cur
261f0 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20  sor numbers are 
26200 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20  assigned to all 
26210 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d  FROM-clause term
26220 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70 68  s..**     *  Eph
26230 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a  emeral Table obj
26240 65 63 74 73 20 61 72 65 20 63 72 65 61 74 65 64  ects are created
26250 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c   for all FROM-cl
26260 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73 2e  ause subqueries.
26270 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e  .**     *  ON an
26280 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
26290 61 72 65 20 73 68 69 66 74 65 64 20 69 6e 74 6f  are shifted into
262a0 20 57 48 45 52 45 20 73 74 61 74 65 6d 65 6e 74   WHERE statement
262b0 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c 64  s.**     *  Wild
262c0 63 61 72 64 73 20 22 2a 22 20 61 6e 64 20 22 54  cards "*" and "T
262d0 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c  ABLE.*" in resul
262e0 74 20 73 65 74 73 20 61 72 65 20 65 78 70 61 6e  t sets are expan
262f0 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49  ded..**     *  I
26300 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20 65 78  dentifiers in ex
26310 70 72 65 73 73 69 6f 6e 20 61 72 65 20 6d 61 74  pression are mat
26320 63 68 65 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a  ched to tables..
26330 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
26340 6e 65 20 61 63 74 73 20 72 65 63 75 72 73 69 76  ne acts recursiv
26350 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75  ely on all subqu
26360 65 72 69 65 73 20 77 69 74 68 69 6e 20 74 68 65  eries within the
26370 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64   SELECT..*/.void
26380 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72   sqlite3SelectPr
26390 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ep(.  Parse *pPa
263a0 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
263b0 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
263c0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
263d0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
263e0 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
263f0 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
26400 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  ed. */.  NameCon
26410 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20  text *pOuterNC  
26420 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20  /* Name context 
26430 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f  for container */
26440 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
26450 62 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  b;.  if( NEVER(p
26460 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ==0) ) return;. 
26470 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
26480 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
26490 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
264a0 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  n;.  if( p->selF
264b0 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70  lags & SF_HasTyp
264c0 65 49 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a  eInfo ) return;.
264d0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45    sqlite3SelectE
264e0 78 70 61 6e 64 28 70 50 61 72 73 65 2c 20 70 29  xpand(pParse, p)
264f0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
26500 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
26510 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
26520 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f  n;.  sqlite3Reso
26530 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 70  lveSelectNames(p
26540 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65 72  Parse, p, pOuter
26550 4e 43 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  NC);.  if( pPars
26560 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
26570 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
26580 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53  turn;.  sqlite3S
26590 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f  electAddTypeInfo
265a0 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a  (pParse, p);.}..
265b0 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20  /*.** Reset the 
265c0 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
265d0 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lator..**.** The
265e0 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
265f0 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74 20  ulator is a set 
26600 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  of memory cells 
26610 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74  that hold.** int
26620 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
26630 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74  s while calculat
26640 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74 65  ing an aggregate
26650 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
26660 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
26670 65 20 74 68 61 74 20 73 74 6f 72 65 73 20 4e 55  e that stores NU
26680 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68  LLs in all of th
26690 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65  ose memory.** ce
266a0 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  lls..*/.static v
266b0 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c  oid resetAccumul
266c0 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  ator(Parse *pPar
266d0 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
266e0 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
266f0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
26700 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
26710 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
26720 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 6e 74 20  c *pFunc;.  int 
26730 6e 52 65 67 20 3d 20 70 41 67 67 49 6e 66 6f 2d  nReg = pAggInfo-
26740 3e 6e 46 75 6e 63 20 2b 20 70 41 67 67 49 6e 66  >nFunc + pAggInf
26750 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66  o->nColumn;.  if
26760 28 20 6e 52 65 67 3d 3d 30 20 29 20 72 65 74 75  ( nReg==0 ) retu
26770 72 6e 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  rn;.#ifdef SQLIT
26780 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72  E_DEBUG.  /* Ver
26790 69 66 79 20 74 68 61 74 20 61 6c 6c 20 41 67 67  ify that all Agg
267a0 49 6e 66 6f 20 72 65 67 69 73 74 65 72 73 20 61  Info registers a
267b0 72 65 20 77 69 74 68 69 6e 20 74 68 65 20 72 61  re within the ra
267c0 6e 67 65 20 73 70 65 63 69 66 69 65 64 20 62 79  nge specified by
267d0 0a 20 20 2a 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e  .  ** AggInfo.mn
267e0 52 65 67 2e 2e 41 67 67 49 6e 66 6f 2e 6d 78 52  Reg..AggInfo.mxR
267f0 65 67 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  eg */.  assert( 
26800 6e 52 65 67 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e  nReg==pAggInfo->
26810 6d 78 52 65 67 2d 70 41 67 67 49 6e 66 6f 2d 3e  mxReg-pAggInfo->
26820 6d 6e 52 65 67 2b 31 20 29 3b 0a 20 20 66 6f 72  mnReg+1 );.  for
26830 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
26840 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
26850 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67  .    assert( pAg
26860 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  gInfo->aCol[i].i
26870 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Mem>=pAggInfo->m
26880 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26  nReg.         &&
26890 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
268a0 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66  i].iMem<=pAggInf
268b0 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a  o->mxReg );.  }.
268c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67    for(i=0; i<pAg
268d0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
268e0 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
268f0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
26900 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66  i].iMem>=pAggInf
26910 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20  o->mnReg.       
26920 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61    && pAggInfo->a
26930 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41  Func[i].iMem<=pA
26940 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b  ggInfo->mxReg );
26950 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
26960 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
26970 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70  v, OP_Null, 0, p
26980 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20  AggInfo->mnReg, 
26990 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 29  pAggInfo->mxReg)
269a0 3b 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41  ;.  for(pFunc=pA
269b0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69  ggInfo->aFunc, i
269c0 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
269d0 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e  nFunc; i++, pFun
269e0 63 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46  c++){.    if( pF
269f0 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d  unc->iDistinct>=
26a00 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  0 ){.      Expr 
26a10 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78  *pE = pFunc->pEx
26a20 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
26a30 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
26a40 74 79 28 70 45 2c 20 45 50 5f 78 49 73 53 65 6c  ty(pE, EP_xIsSel
26a50 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66  ect) );.      if
26a60 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30  ( pE->x.pList==0
26a70 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d   || pE->x.pList-
26a80 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20  >nExpr!=1 ){.   
26a90 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
26aa0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44 49  rMsg(pParse, "DI
26ab0 53 54 49 4e 43 54 20 61 67 67 72 65 67 61 74 65  STINCT aggregate
26ac0 73 20 6d 75 73 74 20 68 61 76 65 20 65 78 61 63  s must have exac
26ad0 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20 20 20  tly one ".      
26ae0 20 20 20 20 20 22 61 72 67 75 6d 65 6e 74 22 29       "argument")
26af0 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d  ;.        pFunc-
26b00 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b  >iDistinct = -1;
26b10 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
26b20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
26b30 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
26b40 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
26b50 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c 69 73  arse, pE->x.pLis
26b60 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
26b70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
26b80 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
26b90 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e  hemeral, pFunc->
26ba0 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c  iDistinct, 0, 0,
26bb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26bc0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
26bd0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
26be0 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d  EYINFO);.      }
26bf0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
26c00 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f  .** Invoke the O
26c10 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70  P_AggFinalize op
26c20 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 61  code for every a
26c30 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
26c40 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49  n.** in the AggI
26c50 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  nfo structure..*
26c60 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69  /.static void fi
26c70 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f  nalizeAggFunctio
26c80 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ns(Parse *pParse
26c90 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
26ca0 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
26cb0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
26cc0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
26cd0 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
26ce0 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  *pF;.  for(i=0, 
26cf0 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  pF=pAggInfo->aFu
26d00 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  nc; i<pAggInfo->
26d10 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b  nFunc; i++, pF++
26d20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
26d30 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78  *pList = pF->pEx
26d40 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
26d50 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
26d60 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45  sProperty(pF->pE
26d70 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
26d80 74 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t) );.    sqlite
26d90 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
26da0 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e  P_AggFinal, pF->
26db0 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c  iMem, pList ? pL
26dc0 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20  ist->nExpr : 0, 
26dd0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
26de0 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
26df0 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55  pF->pFunc, P4_FU
26e00 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  NCDEF);.  }.}../
26e10 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20  *.** Update the 
26e20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f  accumulator memo
26e30 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20  ry cells for an 
26e40 61 67 67 72 65 67 61 74 65 20 62 61 73 65 64 20  aggregate based 
26e50 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  on.** the curren
26e60 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
26e70 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
26e80 64 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61  d updateAccumula
26e90 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  tor(Parse *pPars
26ea0 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
26eb0 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
26ec0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
26ed0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
26ee0 20 72 65 67 48 69 74 20 3d 20 30 3b 0a 20 20 69   regHit = 0;.  i
26ef0 6e 74 20 61 64 64 72 48 69 74 54 65 73 74 20 3d  nt addrHitTest =
26f00 20 30 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   0;.  struct Agg
26f10 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20  Info_func *pF;. 
26f20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
26f30 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67  col *pC;..  pAgg
26f40 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
26f50 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   = 1;.  for(i=0,
26f60 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46   pF=pAggInfo->aF
26f70 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  unc; i<pAggInfo-
26f80 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b  >nFunc; i++, pF+
26f90 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67  +){.    int nArg
26fa0 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65  ;.    int addrNe
26fb0 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  xt = 0;.    int 
26fc0 72 65 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72  regAgg;.    Expr
26fd0 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46  List *pList = pF
26fe0 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ->pExpr->x.pList
26ff0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
27000 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
27010 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73  F->pExpr, EP_xIs
27020 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69  Select) );.    i
27030 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
27040 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e    nArg = pList->
27050 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67  nExpr;.      reg
27060 41 67 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Agg = sqlite3Get
27070 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
27080 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73  , nArg);.      s
27090 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
270a0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
270b0 4c 69 73 74 2c 20 72 65 67 41 67 67 2c 20 53 51  List, regAgg, SQ
270c0 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 3b 0a  LITE_ECEL_DUP);.
270d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
270e0 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20   nArg = 0;.     
270f0 20 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20   regAgg = 0;.   
27100 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69   }.    if( pF->i
27110 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20  Distinct>=0 ){. 
27120 20 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20       addrNext = 
27130 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
27140 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61  abel(v);.      a
27150 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29  ssert( nArg==1 )
27160 3b 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74  ;.      codeDist
27170 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d  inct(pParse, pF-
27180 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72  >iDistinct, addr
27190 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29  Next, 1, regAgg)
271a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
271b0 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46  pF->pFunc->funcF
271c0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
271d0 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20  NC_NEEDCOLL ){. 
271e0 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
271f0 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  oll = 0;.      s
27200 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
27210 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
27220 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61    int j;.      a
27230 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
27240 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20  );  /* pList!=0 
27250 69 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73  if pF->pFunc has
27260 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20   NEEDCOLL */.   
27270 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65     for(j=0, pIte
27280 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f  m=pList->a; !pCo
27290 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b  ll && j<nArg; j+
272a0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
272b0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
272c0 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
272d0 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
272e0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
272f0 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
27300 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
27310 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
27320 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
27330 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 67 48  }.      if( regH
27340 69 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e 66  it==0 && pAggInf
27350 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20  o->nAccumulator 
27360 29 20 72 65 67 48 69 74 20 3d 20 2b 2b 70 50 61  ) regHit = ++pPa
27370 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
27380 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
27390 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71  p4(v, OP_CollSeq
273a0 2c 20 72 65 67 48 69 74 2c 20 30 2c 20 30 2c 20  , regHit, 0, 0, 
273b0 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50  (char *)pColl, P
273c0 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
273d0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
273e0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67  eAddOp4(v, OP_Ag
273f0 67 53 74 65 70 2c 20 30 2c 20 72 65 67 41 67 67  gStep, 0, regAgg
27400 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20  , pF->iMem,.    
27410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27420 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75    (void*)pF->pFu
27430 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
27440 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
27450 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29  ChangeP5(v, (u8)
27460 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  nArg);.    sqlit
27470 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
27480 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
27490 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b  , regAgg, nArg);
274a0 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
274b0 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
274c0 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72  rse, regAgg, nAr
274d0 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72  g);.    if( addr
274e0 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71  Next ){.      sq
274f0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
27500 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78  Label(v, addrNex
27510 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
27520 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
27530 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20  pParse);.    }. 
27540 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20   }..  /* Before 
27550 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 20 61  populating the a
27560 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73  ccumulator regis
27570 74 65 72 73 2c 20 63 6c 65 61 72 20 74 68 65 20  ters, clear the 
27580 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20  column cache..  
27590 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
275a0 20 61 6e 79 20 6f 66 20 74 68 65 20 72 65 71 75   any of the requ
275b0 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ired column valu
275c0 65 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 70  es are already p
275d0 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69 6e 20  resent .  ** in 
275e0 72 65 67 69 73 74 65 72 73 2c 20 73 71 6c 69 74  registers, sqlit
275f0 65 33 45 78 70 72 43 6f 64 65 28 29 20 6d 61 79  e3ExprCode() may
27600 20 75 73 65 20 4f 50 5f 53 43 6f 70 79 20 74 6f   use OP_SCopy to
27610 20 63 6f 70 79 20 74 68 65 20 76 61 6c 75 65 0a   copy the value.
27620 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d 65 6d    ** to pC->iMem
27630 2e 20 42 75 74 20 62 79 20 74 68 65 20 74 69 6d  . But by the tim
27640 65 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 75  e the value is u
27650 73 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  sed, the origina
27660 6c 20 72 65 67 69 73 74 65 72 0a 20 20 2a 2a 20  l register.  ** 
27670 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 73  may have been us
27680 65 64 2c 20 69 6e 76 61 6c 69 64 61 74 69 6e 67  ed, invalidating
27690 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
276a0 62 75 66 66 65 72 20 68 6f 6c 64 69 6e 67 20 74  buffer holding t
276b0 68 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f 72 20  he.  ** text or 
276c0 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65 65 20  blob value. See 
276d0 74 69 63 6b 65 74 20 5b 38 38 33 30 33 34 64 63  ticket [883034dc
276e0 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  b5]..  **.  ** A
276f0 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e 20  nother solution 
27700 77 6f 75 6c 64 20 62 65 20 74 6f 20 63 68 61 6e  would be to chan
27710 67 65 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 20  ge the OP_SCopy 
27720 75 73 65 64 20 74 6f 20 63 6f 70 79 20 63 61 63  used to copy cac
27730 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20  hed.  ** values 
27740 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20  to an OP_Copy.. 
27750 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 48 69 74   */.  if( regHit
27760 20 29 7b 0a 20 20 20 20 61 64 64 72 48 69 74 54   ){.    addrHitT
27770 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  est = sqlite3Vdb
27780 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
27790 2c 20 72 65 67 48 69 74 29 3b 20 56 64 62 65 43  , regHit); VdbeC
277a0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
277b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
277c0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
277d0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70  .  for(i=0, pC=p
277e0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69  AggInfo->aCol; i
277f0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75  <pAggInfo->nAccu
27800 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43  mulator; i++, pC
27810 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
27820 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
27830 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e   pC->pExpr, pC->
27840 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67  iMem);.  }.  pAg
27850 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
27860 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  e = 0;.  sqlite3
27870 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
27880 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 61 64  Parse);.  if( ad
27890 64 72 48 69 74 54 65 73 74 20 29 7b 0a 20 20 20  drHitTest ){.   
278a0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
278b0 48 65 72 65 28 76 2c 20 61 64 64 72 48 69 74 54  Here(v, addrHitT
278c0 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  est);.  }.}../*.
278d0 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20  ** Add a single 
278e0 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72  OP_Explain instr
278f0 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 56 44  uction to the VD
27900 42 45 20 74 6f 20 65 78 70 6c 61 69 6e 20 61 20  BE to explain a 
27910 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28  simple.** count(
27920 2a 29 20 71 75 65 72 79 20 28 22 53 45 4c 45 43  *) query ("SELEC
27930 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
27940 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64  pTab")..*/.#ifnd
27950 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
27960 58 50 4c 41 49 4e 0a 73 74 61 74 69 63 20 76 6f  XPLAIN.static vo
27970 69 64 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65  id explainSimple
27980 43 6f 75 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  Count(.  Parse *
27990 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
279a0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
279b0 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  e context */.  T
279c0 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
279d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
279e0 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75  * Table being qu
279f0 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  eried */.  Index
27a00 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20   *pIdx          
27a10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
27a20 64 65 78 20 75 73 65 64 20 74 6f 20 6f 70 74 69  dex used to opti
27a30 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55  mize scan, or NU
27a40 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  LL */.){.  if( p
27a50 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
27a60 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 43 6f  2 ){.    int bCo
27a70 76 65 72 20 3d 20 28 70 49 64 78 21 3d 30 20 26  ver = (pIdx!=0 &
27a80 26 20 28 48 61 73 52 6f 77 69 64 28 70 54 61 62  & (HasRowid(pTab
27a90 29 20 7c 7c 20 21 49 73 50 72 69 6d 61 72 79 4b  ) || !IsPrimaryK
27aa0 65 79 49 6e 64 65 78 28 70 49 64 78 29 29 29 3b  eyIndex(pIdx)));
27ab0 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 71 70 20  .    char *zEqp 
27ac0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
27ad0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 53 43  (pParse->db, "SC
27ae0 41 4e 20 54 41 42 4c 45 20 25 73 25 73 25 73 22  AN TABLE %s%s%s"
27af0 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  ,.        pTab->
27b00 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 62  zName,.        b
27b10 43 6f 76 65 72 20 3f 20 22 20 55 53 49 4e 47 20  Cover ? " USING 
27b20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20 22  COVERING INDEX "
27b30 20 3a 20 22 22 2c 0a 20 20 20 20 20 20 20 20 62   : "",.        b
27b40 43 6f 76 65 72 20 3f 20 70 49 64 78 2d 3e 7a 4e  Cover ? pIdx->zN
27b50 61 6d 65 20 3a 20 22 22 0a 20 20 20 20 29 3b 0a  ame : "".    );.
27b60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
27b70 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 70  ddOp4(.        p
27b80 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
27b90 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65  _Explain, pParse
27ba0 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20  ->iSelectId, 0, 
27bb0 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44 59 4e 41  0, zEqp, P4_DYNA
27bc0 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d  MIC.    );.  }.}
27bd0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
27be0 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75  explainSimpleCou
27bf0 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66  nt(a,b,c).#endif
27c00 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
27c10 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45   code for the SE
27c20 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67  LECT statement g
27c30 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72  iven in the p ar
27c40 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  gument.  .**.** 
27c50 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
27c60 72 65 74 75 72 6e 65 64 20 61 63 63 6f 72 64 69  returned accordi
27c70 6e 67 20 74 6f 20 74 68 65 20 53 65 6c 65 63 74  ng to the Select
27c80 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a  Dest structure..
27c90 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  ** See comments 
27ca0 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 66  in sqliteInt.h f
27cb0 6f 72 20 66 75 72 74 68 65 72 20 69 6e 66 6f 72  or further infor
27cc0 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  mation..**.** Th
27cd0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
27ce0 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
27cf0 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79   errors.  If any
27d00 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65   errors are.** e
27d10 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
27d20 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
27d30 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
27d40 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72   left in.** pPar
27d50 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
27d60 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
27d70 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68  does NOT free th
27d80 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  e Select structu
27d90 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54  re passed in.  T
27da0 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75  he.** calling fu
27db0 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  nction needs to 
27dc0 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20  do that..*/.int 
27dd0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20  sqlite3Select(. 
27de0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
27df0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
27e00 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
27e10 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
27e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
27e30 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
27e40 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
27e50 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
27e60 70 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57 68  pDest      /* Wh
27e70 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68  at to do with th
27e80 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  e query results 
27e90 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
27ea0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
27eb0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
27ec0 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
27ed0 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52  pWInfo;     /* R
27ee0 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74  eturn from sqlit
27ef0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a  e3WhereBegin() *
27f00 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
27f10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
27f20 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
27f30 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
27f40 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  tion */.  int is
27f50 41 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Agg;            
27f60 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c   /* True for sel
27f70 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22  ect lists like "
27f80 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45  count(*)" */.  E
27f90 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
27fa0 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
27fb0 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72   columns to extr
27fc0 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73  act. */.  SrcLis
27fd0 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20  t *pTabList;    
27fe0 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
27ff0 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f  es to select fro
28000 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  m */.  Expr *pWh
28010 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ere;          /*
28020 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
28030 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
28040 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
28050 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54  GroupBy;    /* T
28060 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
28070 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
28080 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76   */.  Expr *pHav
28090 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ing;         /* 
280a0 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  The HAVING claus
280b0 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
280c0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b  */.  int rc = 1;
280d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
280e0 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66  alue to return f
280f0 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
28100 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43  n */.  DistinctC
28110 74 78 20 73 44 69 73 74 69 6e 63 74 3b 20 2f 2a  tx sDistinct; /*
28120 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20   Info on how to 
28130 63 6f 64 65 20 74 68 65 20 44 49 53 54 49 4e 43  code the DISTINC
28140 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 53  T keyword */.  S
28150 6f 72 74 43 74 78 20 73 53 6f 72 74 3b 20 20 20  ortCtx sSort;   
28160 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e        /* Info on
28170 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65   how to code the
28180 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
28190 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41   */.  AggInfo sA
281a0 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20  ggInfo;      /* 
281b0 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64  Information used
281c0 20 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75   by aggregate qu
281d0 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  eries */.  int i
281e0 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
281f0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
28200 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71  the end of the q
28210 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  uery */.  sqlite
28220 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
28230 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
28240 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a   connection */..
28250 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28260 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e  MIT_EXPLAIN.  in
28270 74 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74  t iRestoreSelect
28280 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65  Id = pParse->iSe
28290 6c 65 63 74 49 64 3b 0a 20 20 70 50 61 72 73 65  lectId;.  pParse
282a0 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d 20 70 50  ->iSelectId = pP
282b0 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
282c0 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  tId++;.#endif.. 
282d0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
282e0 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
282f0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
28300 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
28310 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
28320 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
28330 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
28340 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45  rse, SQLITE_SELE
28350 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72  CT, 0, 0, 0) ) r
28360 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65  eturn 1;.  memse
28370 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20  t(&sAggInfo, 0, 
28380 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29  sizeof(sAggInfo)
28390 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  );..  assert( p-
283a0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
283b0 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
283c0 54 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20  T_DistFifo );.  
283d0 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
283e0 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d  rBy==0 || pDest-
283f0 3e 65 44 65 73 74 21 3d 53 52 54 5f 46 69 66 6f  >eDest!=SRT_Fifo
28400 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
28410 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
28420 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
28430 54 5f 44 69 73 74 51 75 65 75 65 20 29 3b 0a 20  T_DistQueue );. 
28440 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
28450 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74  erBy==0 || pDest
28460 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 51 75 65  ->eDest!=SRT_Que
28470 75 65 20 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f  ue );.  if( Igno
28480 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65  rableOrderby(pDe
28490 73 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  st) ){.    asser
284a0 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  t(pDest->eDest==
284b0 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44  SRT_Exists || pD
284c0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
284d0 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20  Union || .      
284e0 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73       pDest->eDes
284f0 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c  t==SRT_Except ||
28500 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
28510 52 54 5f 44 69 73 63 61 72 64 20 7c 7c 0a 20 20  RT_Discard ||.  
28520 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e           pDest->
28530 65 44 65 73 74 3d 3d 53 52 54 5f 51 75 65 75 65  eDest==SRT_Queue
28540 20 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73    || pDest->eDes
28550 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
28560 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70 44  ||.           pD
28570 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
28580 44 69 73 74 51 75 65 75 65 20 7c 7c 20 70 44 65  DistQueue || pDe
28590 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46  st->eDest==SRT_F
285a0 69 66 6f 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20  ifo);.    /* If 
285b0 4f 52 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e  ORDER BY makes n
285c0 6f 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20  o difference in 
285d0 74 68 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20  the output then 
285e0 6e 65 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20  neither does.   
285f0 20 2a 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20   ** DISTINCT so 
28600 69 74 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65  it can be remove
28610 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71  d too. */.    sq
28620 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
28630 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ete(db, p->pOrde
28640 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  rBy);.    p->pOr
28650 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70  derBy = 0;.    p
28660 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
28670 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a  F_Distinct;.  }.
28680 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50    sqlite3SelectP
28690 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30  rep(pParse, p, 0
286a0 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 6f  );.  memset(&sSo
286b0 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53  rt, 0, sizeof(sS
286c0 6f 72 74 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70  ort));.  sSort.p
286d0 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
286e0 64 65 72 42 79 3b 0a 20 20 70 54 61 62 4c 69 73  derBy;.  pTabLis
286f0 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  t = p->pSrc;.  p
28700 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
28710 74 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  t;.  if( pParse-
28720 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
28730 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
28740 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
28750 3b 0a 20 20 7d 0a 20 20 69 73 41 67 67 20 3d 20  ;.  }.  isAgg = 
28760 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
28770 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b  F_Aggregate)!=0;
28780 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73  .  assert( pELis
28790 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65  t!=0 );..  /* Be
287a0 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63  gin generating c
287b0 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  ode..  */.  v = 
287c0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
287d0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
287e0 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
287f0 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  _end;..  /* If w
28800 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79  riting to memory
28810 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61   or generating a
28820 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61   set.  ** only a
28830 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d   single column m
28840 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20  ay be output..  
28850 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
28860 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
28870 20 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75    if( checkForMu
28880 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45  ltiColumnSelectE
28890 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65  rror(pParse, pDe
288a0 73 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  st, pEList->nExp
288b0 72 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  r) ){.    goto s
288c0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23  elect_end;.  }.#
288d0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65  endif..  /* Gene
288e0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c  rate code for al
288f0 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e  l sub-queries in
28900 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
28910 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  .  */.#if !defin
28920 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
28930 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
28940 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
28950 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30  _VIEW).  for(i=0
28960 3b 20 21 70 2d 3e 70 50 72 69 6f 72 20 26 26 20  ; !p->pPrior && 
28970 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
28980 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
28990 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
289a0 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  *pItem = &pTabLi
289b0 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65  st->a[i];.    Se
289c0 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20  lectDest dest;. 
289d0 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20     Select *pSub 
289e0 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  = pItem->pSelect
289f0 3b 0a 20 20 20 20 69 6e 74 20 69 73 41 67 67 53  ;.    int isAggS
28a00 75 62 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 75  ub;..    if( pSu
28a10 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  b==0 ) continue;
28a20 0a 0a 20 20 20 20 2f 2a 20 53 6f 6d 65 74 69 6d  ..    /* Sometim
28a30 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20  es the code for 
28a40 61 20 73 75 62 71 75 65 72 79 20 77 69 6c 6c 20  a subquery will 
28a50 62 65 20 67 65 6e 65 72 61 74 65 64 20 6d 6f 72  be generated mor
28a60 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e  e than.    ** on
28a70 63 65 2c 20 69 66 20 74 68 65 20 73 75 62 71 75  ce, if the subqu
28a80 65 72 79 20 69 73 20 70 61 72 74 20 6f 66 20 74  ery is part of t
28a90 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
28aa0 69 6e 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a  in a LEFT JOIN,.
28ab0 20 20 20 20 2a 2a 20 66 6f 72 20 65 78 61 6d 70      ** for examp
28ac0 6c 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  le.  In that cas
28ad0 65 2c 20 64 6f 20 6e 6f 74 20 72 65 67 65 6e 65  e, do not regene
28ae0 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f  rate the code to
28af0 20 6d 61 6e 69 66 65 73 74 0a 20 20 20 20 2a 2a   manifest.    **
28b00 20 61 20 76 69 65 77 20 6f 72 20 74 68 65 20 63   a view or the c
28b10 6f 2d 72 6f 75 74 69 6e 65 20 74 6f 20 69 6d 70  o-routine to imp
28b20 6c 65 6d 65 6e 74 20 61 20 76 69 65 77 2e 20 20  lement a view.  
28b30 54 68 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e  The first instan
28b40 63 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 75 66  ce.    ** is suf
28b50 66 69 63 69 65 6e 74 2c 20 74 68 6f 75 67 68 20  ficient, though 
28b60 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74  the subroutine t
28b70 6f 20 6d 61 6e 69 66 65 73 74 20 74 68 65 20 76  o manifest the v
28b80 69 65 77 20 64 6f 65 73 20 6e 65 65 64 0a 20 20  iew does need.  
28b90 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 6f 6b    ** to be invok
28ba0 65 64 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20  ed again. */.   
28bb0 20 69 66 28 20 70 49 74 65 6d 2d 3e 61 64 64 72   if( pItem->addr
28bc0 46 69 6c 6c 53 75 62 20 29 7b 0a 20 20 20 20 20  FillSub ){.     
28bd0 20 69 66 28 20 70 49 74 65 6d 2d 3e 76 69 61 43   if( pItem->viaC
28be0 6f 72 6f 75 74 69 6e 65 3d 3d 30 20 29 7b 0a 20  oroutine==0 ){. 
28bf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
28c00 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
28c10 6f 73 75 62 2c 20 70 49 74 65 6d 2d 3e 72 65 67  osub, pItem->reg
28c20 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 61  Return, pItem->a
28c30 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20  ddrFillSub);.   
28c40 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69     }.      conti
28c50 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nue;.    }..    
28c60 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72  /* Increment Par
28c70 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74 68  se.nHeight by th
28c80 65 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 20  e height of the 
28c90 6c 61 72 67 65 73 74 20 65 78 70 72 65 73 73 69  largest expressi
28ca0 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 72  on.    ** tree r
28cb0 65 66 65 72 72 65 64 20 74 6f 20 62 79 20 74 68  eferred to by th
28cc0 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73  is, the parent s
28cd0 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64  elect. The child
28ce0 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d   select.    ** m
28cf0 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65  ay contain expre
28d00 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61  ssion trees of a
28d10 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53  t most.    ** (S
28d20 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
28d30 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67  EPTH-Parse.nHeig
28d40 68 74 29 20 68 65 69 67 68 74 2e 20 54 68 69 73  ht) height. This
28d50 20 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a   is a bit.    **
28d60 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69   more conservati
28d70 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72  ve than necessar
28d80 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73 69  y, but much easi
28d90 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e  er than enforcin
28da0 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63  g.    ** an exac
28db0 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a  t limit..    */.
28dc0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69      pParse->nHei
28dd0 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65  ght += sqlite3Se
28de0 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70  lectExprHeight(p
28df0 29 3b 0a 0a 20 20 20 20 69 73 41 67 67 53 75 62  );..    isAggSub
28e00 20 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61   = (pSub->selFla
28e10 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
28e20 65 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 66  e)!=0;.    if( f
28e30 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70  lattenSubquery(p
28e40 50 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41  Parse, p, i, isA
28e50 67 67 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b  gg, isAggSub) ){
28e60 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73  .      /* This s
28e70 75 62 71 75 65 72 79 20 63 61 6e 20 62 65 20 61  ubquery can be a
28e80 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 69 74 73  bsorbed into its
28e90 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20   parent. */.    
28ea0 20 20 69 66 28 20 69 73 41 67 67 53 75 62 20 29    if( isAggSub )
28eb0 7b 0a 20 20 20 20 20 20 20 20 69 73 41 67 67 20  {.        isAgg 
28ec0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 1;.        p->
28ed0 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41  selFlags |= SF_A
28ee0 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20 20 20  ggregate;.      
28ef0 7d 0a 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a  }.      i = -1;.
28f00 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
28f10 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a  abList->nSrc==1.
28f20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 4f 70             && Op
28f30 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
28f40 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 75 62  d(db, SQLITE_Sub
28f50 71 43 6f 72 6f 75 74 69 6e 65 29 0a 20 20 20 20  qCoroutine).    
28f60 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6d 70 6c  ){.      /* Impl
28f70 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f 75 74 69  ement a co-routi
28f80 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 74  ne that will ret
28f90 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  urn a single row
28fa0 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20   of the result. 
28fb0 20 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e 20 65       ** set on e
28fc0 61 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a  ach invocation..
28fd0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
28fe0 6e 74 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c  nt addrTop = sql
28ff0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
29000 64 64 72 28 76 29 2b 31 3b 0a 20 20 20 20 20 20  ddr(v)+1;.      
29010 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
29020 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
29030 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
29040 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
29050 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20  _InitCoroutine, 
29060 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
29070 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20  , 0, addrTop);. 
29080 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
29090 28 28 76 2c 20 22 25 73 22 2c 20 70 49 74 65 6d  ((v, "%s", pItem
290a0 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
290b0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64  .      pItem->ad
290c0 64 72 46 69 6c 6c 53 75 62 20 3d 20 61 64 64 72  drFillSub = addr
290d0 54 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Top;.      sqlit
290e0 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
290f0 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f  (&dest, SRT_Coro
29100 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65  utine, pItem->re
29110 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
29120 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
29130 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74  r(pItem->iSelect
29140 49 64 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e  Id, (u8)pParse->
29150 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
29160 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
29170 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62  ect(pParse, pSub
29180 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
29190 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f  pItem->pTab->nRo
291a0 77 4c 6f 67 45 73 74 20 3d 20 73 71 6c 69 74 65  wLogEst = sqlite
291b0 33 4c 6f 67 45 73 74 28 70 53 75 62 2d 3e 6e 53  3LogEst(pSub->nS
291c0 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20  electRow);.     
291d0 20 70 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75   pItem->viaCorou
291e0 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  tine = 1;.      
291f0 70 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74  pItem->regResult
29200 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20   = dest.iSdst;. 
29210 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
29220 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64  AddOp1(v, OP_End
29230 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d  Coroutine, pItem
29240 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
29250 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
29260 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
29270 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  op-1);.      sql
29280 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67  ite3ClearTempReg
29290 43 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20  Cache(pParse);. 
292a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
292b0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
292c0 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  broutine that wi
292d0 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d  ll fill an ephem
292e0 65 72 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a  eral table with.
292f0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e        ** the con
29300 74 65 6e 74 20 6f 66 20 74 68 69 73 20 73 75 62  tent of this sub
29310 71 75 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61  query.  pItem->a
29320 64 64 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20  ddrFillSub will 
29330 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74  point.      ** t
29340 6f 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  o the address of
29350 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 73   the generated s
29360 75 62 72 6f 75 74 69 6e 65 2e 20 20 70 49 74 65  ubroutine.  pIte
29370 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20 20 20  m->regReturn.   
29380 20 20 20 2a 2a 20 69 73 20 61 20 72 65 67 69 73     ** is a regis
29390 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f  ter allocated to
293a0 20 68 6f 6c 64 20 74 68 65 20 73 75 62 72 6f 75   hold the subrou
293b0 74 69 6e 65 20 72 65 74 75 72 6e 20 61 64 64 72  tine return addr
293c0 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ess.      */.   
293d0 20 20 20 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a     int topAddr;.
293e0 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 41 64        int onceAd
293f0 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  dr = 0;.      in
29400 74 20 72 65 74 41 64 64 72 3b 0a 20 20 20 20 20  t retAddr;.     
29410 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
29420 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30 20 29  addrFillSub==0 )
29430 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  ;.      pItem->r
29440 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
29450 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
29460 20 74 6f 70 41 64 64 72 20 3d 20 73 71 6c 69 74   topAddr = sqlit
29470 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
29480 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
29490 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
294a0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61  ;.      pItem->a
294b0 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 74 6f 70  ddrFillSub = top
294c0 41 64 64 72 2b 31 3b 0a 20 20 20 20 20 20 69 66  Addr+1;.      if
294d0 28 20 70 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65  ( pItem->isCorre
294e0 6c 61 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  lated==0 ){.    
294f0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75      /* If the su
29500 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 63 6f  bquery is not co
29510 72 72 65 6c 61 74 65 64 20 61 6e 64 20 69 66 20  rrelated and if 
29520 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 73 69 64  we are not insid
29530 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  e of.        ** 
29540 61 20 74 72 69 67 67 65 72 2c 20 74 68 65 6e 20  a trigger, then 
29550 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20  we only need to 
29560 63 6f 6d 70 75 74 65 20 74 68 65 20 76 61 6c 75  compute the valu
29570 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
29580 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63  y.        ** onc
29590 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 6e  e. */.        on
295a0 63 65 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33  ceAddr = sqlite3
295b0 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29  CodeOnce(pParse)
295c0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
295d0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
295e0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65  omment((v, "mate
295f0 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c  rialize \"%s\"",
29600 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
29610 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ame));.      }el
29620 73 65 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65  se{.        Vdbe
29630 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
29640 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25  "materialize \"%
29650 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61  s\"", pItem->pTa
29660 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
29670 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
29680 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
29690 26 64 65 73 74 2c 20 53 52 54 5f 45 70 68 65 6d  &dest, SRT_Ephem
296a0 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  Tab, pItem->iCur
296b0 73 6f 72 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  sor);.      expl
296c0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 49  ainSetInteger(pI
296d0 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  tem->iSelectId, 
296e0 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e 65 78  (u8)pParse->iNex
296f0 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
29700 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
29710 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64  pParse, pSub, &d
29720 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65  est);.      pIte
29730 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67  m->pTab->nRowLog
29740 45 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Est = sqlite3Log
29750 45 73 74 28 70 53 75 62 2d 3e 6e 53 65 6c 65 63  Est(pSub->nSelec
29760 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 69 66 28  tRow);.      if(
29770 20 6f 6e 63 65 41 64 64 72 20 29 20 73 71 6c 69   onceAddr ) sqli
29780 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
29790 76 2c 20 6f 6e 63 65 41 64 64 72 29 3b 0a 20 20  v, onceAddr);.  
297a0 20 20 20 20 72 65 74 41 64 64 72 20 3d 20 73 71      retAddr = sq
297b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
297c0 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 49  v, OP_Return, pI
297d0 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b  tem->regReturn);
297e0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
297f0 6e 74 28 28 76 2c 20 22 65 6e 64 20 25 73 22 2c  nt((v, "end %s",
29800 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
29810 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ame));.      sql
29820 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
29830 28 76 2c 20 74 6f 70 41 64 64 72 2c 20 72 65 74  (v, topAddr, ret
29840 41 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Addr);.      sql
29850 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67  ite3ClearTempReg
29860 43 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20  Cache(pParse);. 
29870 20 20 20 7d 0a 20 20 20 20 69 66 28 20 2f 2a 70     }.    if( /*p
29880 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 2a 2f  Parse->nErr ||*/
29890 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
298a0 64 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  d ){.      goto 
298b0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
298c0 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48  }.    pParse->nH
298d0 65 69 67 68 74 20 2d 3d 20 73 71 6c 69 74 65 33  eight -= sqlite3
298e0 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74  SelectExprHeight
298f0 28 70 29 3b 0a 20 20 20 20 70 54 61 62 4c 69 73  (p);.    pTabLis
29900 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  t = p->pSrc;.   
29910 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f   if( !IgnorableO
29920 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b  rderby(pDest) ){
29930 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72  .      sSort.pOr
29940 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
29950 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rBy;.    }.  }. 
29960 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
29970 69 73 74 3b 0a 23 65 6e 64 69 66 0a 20 20 70 57  ist;.#endif.  pW
29980 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65  here = p->pWhere
29990 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70  ;.  pGroupBy = p
299a0 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48  ->pGroupBy;.  pH
299b0 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69  aving = p->pHavi
299c0 6e 67 3b 0a 20 20 73 44 69 73 74 69 6e 63 74 2e  ng;.  sDistinct.
299d0 69 73 54 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c  isTnct = (p->sel
299e0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
299f0 6e 63 74 29 21 3d 30 3b 0a 0a 23 69 66 6e 64 65  nct)!=0;..#ifnde
29a00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
29a10 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
29a20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
29a30 72 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  re a sequence of
29a40 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65   queries, do the
29a50 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69   earlier ones fi
29a60 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rst..  */.  if( 
29a70 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
29a80 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63   rc = multiSelec
29a90 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65  t(pParse, p, pDe
29aa0 73 74 29 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e  st);.    explain
29ab0 53 65 74 49 6e 74 65 67 65 72 28 70 50 61 72 73  SetInteger(pPars
29ac0 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52  e->iSelectId, iR
29ad0 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b  estoreSelectId);
29ae0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
29af0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
29b00 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73   If the query is
29b10 20 44 49 53 54 49 4e 43 54 20 77 69 74 68 20 61   DISTINCT with a
29b20 6e 20 4f 52 44 45 52 20 42 59 20 62 75 74 20 69  n ORDER BY but i
29b30 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
29b40 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66  te, and .  ** if
29b50 20 74 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74   the select-list
29b60 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
29b70 74 68 65 20 4f 52 44 45 52 20 42 59 20 6c 69 73  the ORDER BY lis
29b80 74 2c 20 74 68 65 6e 20 74 68 69 73 20 71 75 65  t, then this que
29b90 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 72  ry.  ** can be r
29ba0 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 47 52  ewritten as a GR
29bb0 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74 68 65 72  OUP BY. In other
29bc0 20 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20 20   words, this:.  
29bd0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
29be0 43 54 20 44 49 53 54 49 4e 43 54 20 78 79 7a 20  CT DISTINCT xyz 
29bf0 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42  FROM ... ORDER B
29c00 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Y xyz.  **.  ** 
29c10 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74  is transformed t
29c20 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
29c30 20 53 45 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d   SELECT xyz FROM
29c40 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20 78 79   ... GROUP BY xy
29c50 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  z.  **.  ** The 
29c60 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73 20 70  second form is p
29c70 72 65 66 65 72 72 65 64 20 61 73 20 61 20 73 69  referred as a si
29c80 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f 72 20 74  ngle index (or t
29c90 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79 20 62  emp-table) may b
29ca0 65 20 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f 72  e .  ** used for
29cb0 20 62 6f 74 68 20 74 68 65 20 4f 52 44 45 52 20   both the ORDER 
29cc0 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20  BY and DISTINCT 
29cd0 70 72 6f 63 65 73 73 69 6e 67 2e 20 41 73 20 6f  processing. As o
29ce0 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20  riginally .  ** 
29cf0 77 72 69 74 74 65 6e 20 74 68 65 20 71 75 65 72  written the quer
29d00 79 20 6d 75 73 74 20 75 73 65 20 61 20 74 65 6d  y must use a tem
29d10 70 2d 74 61 62 6c 65 20 66 6f 72 20 61 74 20 6c  p-table for at l
29d20 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  east one of the 
29d30 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42 59 20 61  ORDER .  ** BY a
29d40 6e 64 20 44 49 53 54 49 4e 43 54 2c 20 61 6e 64  nd DISTINCT, and
29d50 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 73 65 70   an index or sep
29d60 61 72 61 74 65 20 74 65 6d 70 2d 74 61 62 6c 65  arate temp-table
29d70 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72 2e 0a   for the other..
29d80 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73    */.  if( (p->s
29d90 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
29da0 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
29db0 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e  ate))==SF_Distin
29dc0 63 74 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65  ct .   && sqlite
29dd0 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
29de0 28 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c  (sSort.pOrderBy,
29df0 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 29 3d   p->pEList, -1)=
29e00 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 73  =0.  ){.    p->s
29e10 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44  elFlags &= ~SF_D
29e20 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 70 2d 3e  istinct;.    p->
29e30 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
29e40 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
29e50 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 29 3b  , p->pEList, 0);
29e60 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20  .    pGroupBy = 
29e70 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
29e80 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
29e90 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 4e 6f 74 69  = 0;.    /* Noti
29ea0 63 65 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f  ce that even tho
29eb0 75 67 68 74 20 53 46 5f 44 69 73 74 69 6e 63 74  ught SF_Distinct
29ec0 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65   has been cleare
29ed0 64 20 66 72 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61  d from p->selFla
29ee0 67 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  gs,.    ** the s
29ef0 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
29f00 69 73 20 73 74 69 6c 6c 20 73 65 74 2e 20 20 48  is still set.  H
29f10 65 6e 63 65 2c 20 69 73 54 6e 63 74 20 72 65 70  ence, isTnct rep
29f20 72 65 73 65 6e 74 73 20 74 68 65 0a 20 20 20 20  resents the.    
29f30 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 73 65 74 74  ** original sett
29f40 69 6e 67 20 6f 66 20 74 68 65 20 53 46 5f 44 69  ing of the SF_Di
29f50 73 74 69 6e 63 74 20 66 6c 61 67 2c 20 6e 6f 74  stinct flag, not
29f60 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74   the current set
29f70 74 69 6e 67 20 2a 2f 0a 20 20 20 20 61 73 73 65  ting */.    asse
29f80 72 74 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73  rt( sDistinct.is
29f90 54 6e 63 74 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Tnct );.  }..  /
29fa0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
29fb0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
29fc0 2c 20 74 68 65 6e 20 74 68 69 73 20 73 6f 72 74  , then this sort
29fd0 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d  ing.  ** index m
29fe0 69 67 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e  ight end up bein
29ff0 67 20 75 6e 75 73 65 64 20 69 66 20 74 68 65 20  g unused if the 
2a000 64 61 74 61 20 63 61 6e 20 62 65 20 0a 20 20 2a  data can be .  *
2a010 2a 20 65 78 74 72 61 63 74 65 64 20 69 6e 20 70  * extracted in p
2a020 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e  re-sorted order.
2a030 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65    If that is the
2a040 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 0a   case, then the.
2a050 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65    ** OP_OpenEphe
2a060 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
2a070 6e 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65  n will be change
2a080 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20  d to an OP_Noop 
2a090 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66 69 67  once.  ** we fig
2a0a0 75 72 65 20 6f 75 74 20 74 68 61 74 20 74 68 65  ure out that the
2a0b0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69   sorting index i
2a0c0 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54  s not needed.  T
2a0d0 68 65 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  he addrSortIndex
2a0e0 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69  .  ** variable i
2a0f0 73 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69  s used to facili
2a100 74 61 74 65 20 74 68 61 74 20 63 68 61 6e 67 65  tate that change
2a110 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f  ..  */.  if( sSo
2a120 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  rt.pOrderBy ){. 
2a130 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
2a140 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e  Info;.    pKeyIn
2a150 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
2a160 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
2a170 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c   sSort.pOrderBy,
2a180 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 53 6f 72   0, 0);.    sSor
2a190 74 2e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61  t.iECursor = pPa
2a1a0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
2a1b0 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
2a1c0 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c  ndex =.      sql
2a1d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2a1e0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
2a1f0 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 73 53  al,.          sS
2a200 6f 72 74 2e 69 45 43 75 72 73 6f 72 2c 20 73 53  ort.iECursor, sS
2a210 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ort.pOrderBy->nE
2a220 78 70 72 2b 31 2b 70 45 4c 69 73 74 2d 3e 6e 45  xpr+1+pEList->nE
2a230 78 70 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  xpr, 0,.        
2a240 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
2a250 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 0a 20 20  o, P4_KEYINFO.  
2a260 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a      );.  }else{.
2a270 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f      sSort.addrSo
2a280 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20  rtIndex = -1;.  
2a290 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  }..  /* If the o
2a2a0 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65  utput is destine
2a2b0 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72  d for a temporar
2a2c0 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68  y table, open th
2a2d0 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  at table..  */. 
2a2e0 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73   if( pDest->eDes
2a2f0 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
2a300 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
2a310 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
2a320 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44  penEphemeral, pD
2a330 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70 45  est->iSDParm, pE
2a340 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
2a350 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
2a360 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  limiter..  */.  
2a370 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  iEnd = sqlite3Vd
2a380 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
2a390 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
2a3a0 3d 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 3b  = LARGEST_INT64;
2a3b0 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
2a3c0 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
2a3d0 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20 69 66 28   p, iEnd);.  if(
2a3e0 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20 26 26   p->iLimit==0 &&
2a3f0 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
2a400 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20 20 20 73  ndex>=0 ){.    s
2a410 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
2a420 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  v, sSort.addrSor
2a430 74 49 6e 64 65 78 29 2d 3e 6f 70 63 6f 64 65 20  tIndex)->opcode 
2a440 3d 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 3b  = OP_SorterOpen;
2a450 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f 72 74 46  .    sSort.sortF
2a460 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46 4c 41 47  lags |= SORTFLAG
2a470 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20 20 7d 0a  _UseSorter;.  }.
2a480 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69 72  .  /* Open a vir
2a490 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73  tual index to us
2a4a0 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e  e for the distin
2a4b0 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ct set..  */.  i
2a4c0 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
2a4d0 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a   SF_Distinct ){.
2a4e0 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61      sDistinct.ta
2a4f0 62 54 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e  bTnct = pParse->
2a500 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 44 69 73  nTab++;.    sDis
2a510 74 69 6e 63 74 2e 61 64 64 72 54 6e 63 74 20 3d  tinct.addrTnct =
2a520 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2a530 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
2a540 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20  emeral,.        
2a550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a560 20 20 20 20 20 20 20 20 73 44 69 73 74 69 6e 63          sDistinc
2a570 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c 20 30 2c  t.tabTnct, 0, 0,
2a580 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5a0 20 28 63 68 61 72 2a 29 6b 65 79 49 6e 66 6f 46   (char*)keyInfoF
2a5b0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
2a5c0 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 30 2c  se, p->pEList,0,
2a5d0 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0),.            
2a5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5f0 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b      P4_KEYINFO);
2a600 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2a610 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45  ChangeP5(v, BTRE
2a620 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20  E_UNORDERED);.  
2a630 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63    sDistinct.eTnc
2a640 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49  tType = WHERE_DI
2a650 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
2a660 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
2a670 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
2a680 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  pe = WHERE_DISTI
2a690 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20  NCT_NOOP;.  }.. 
2a6a0 20 69 66 28 20 21 69 73 41 67 67 20 26 26 20 70   if( !isAgg && p
2a6b0 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20  GroupBy==0 ){.  
2a6c0 20 20 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61 74    /* No aggregat
2a6d0 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  e functions and 
2a6e0 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  no GROUP BY clau
2a6f0 73 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 77 63  se */.    u16 wc
2a700 74 72 6c 46 6c 61 67 73 20 3d 20 28 73 44 69 73  trlFlags = (sDis
2a710 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20 57  tinct.isTnct ? W
2a720 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
2a730 43 54 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  CT : 0);..    /*
2a740 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62   Begin the datab
2a750 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20  ase scan. */.   
2a760 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
2a770 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
2a780 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
2a790 68 65 72 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64  here, sSort.pOrd
2a7a0 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20  erBy,.          
2a7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7c0 20 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 2c 20       p->pEList, 
2a7d0 77 63 74 72 6c 46 6c 61 67 73 2c 20 30 29 3b 0a  wctrlFlags, 0);.
2a7e0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d      if( pWInfo==
2a7f0 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
2a800 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  end;.    if( sql
2a810 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52  ite3WhereOutputR
2a820 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 20  owCount(pWInfo) 
2a830 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  < p->nSelectRow 
2a840 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  ){.      p->nSel
2a850 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
2a860 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f  WhereOutputRowCo
2a870 75 6e 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  unt(pWInfo);.   
2a880 20 7d 0a 20 20 20 20 69 66 28 20 73 44 69 73 74   }.    if( sDist
2a890 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20 73  inct.isTnct && s
2a8a0 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73  qlite3WhereIsDis
2a8b0 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 20 29 7b  tinct(pWInfo) ){
2a8c0 0a 20 20 20 20 20 20 73 44 69 73 74 69 6e 63 74  .      sDistinct
2a8d0 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 73 71 6c  .eTnctType = sql
2a8e0 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69  ite3WhereIsDisti
2a8f0 6e 63 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  nct(pWInfo);.   
2a900 20 7d 0a 20 20 20 20 69 66 28 20 73 53 6f 72 74   }.    if( sSort
2a910 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  .pOrderBy ){.   
2a920 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 20     sSort.nOBSat 
2a930 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  = sqlite3WhereIs
2a940 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3b  Ordered(pWInfo);
2a950 0a 20 20 20 20 20 20 69 66 28 20 73 53 6f 72 74  .      if( sSort
2a960 2e 6e 4f 42 53 61 74 3d 3d 73 53 6f 72 74 2e 70  .nOBSat==sSort.p
2a970 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29  OrderBy->nExpr )
2a980 7b 0a 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e  {.        sSort.
2a990 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
2a9a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
2a9b0 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20 69   /* If sorting i
2a9c0 6e 64 65 78 20 74 68 61 74 20 77 61 73 20 63 72  ndex that was cr
2a9d0 65 61 74 65 64 20 62 79 20 61 20 70 72 69 6f 72  eated by a prior
2a9e0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
2a9f0 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75  l .    ** instru
2aa00 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e  ction ended up n
2aa10 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64 2c  ot being needed,
2aa20 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65   then change the
2aa30 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
2aa40 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e  l.    ** into an
2aa50 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f   OP_Noop..    */
2aa60 0a 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e 61  .    if( sSort.a
2aa70 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20  ddrSortIndex>=0 
2aa80 26 26 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  && sSort.pOrderB
2aa90 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  y==0 ){.      sq
2aaa0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
2aab0 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61  oNoop(v, sSort.a
2aac0 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20  ddrSortIndex);. 
2aad0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65     }..    /* Use
2aae0 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e   the standard in
2aaf0 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20  ner loop. */.   
2ab00 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
2ab10 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69  (pParse, p, pELi
2ab20 73 74 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 20  st, -1, &sSort, 
2ab30 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73  &sDistinct, pDes
2ab40 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
2ab50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
2ab60 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c  ereContinueLabel
2ab70 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20  (pWInfo),.      
2ab80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2ab90 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c  lite3WhereBreakL
2aba0 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 0a  abel(pWInfo));..
2abb0 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64      /* End the d
2abc0 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f  atabase scan loo
2abd0 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  p..    */.    sq
2abe0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
2abf0 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Info);.  }else{.
2ac00 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
2ac10 20 77 68 65 6e 20 74 68 65 72 65 20 65 78 69 73   when there exis
2ac20 74 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  t aggregate func
2ac30 74 69 6f 6e 73 20 6f 72 20 61 20 47 52 4f 55 50  tions or a GROUP
2ac40 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20 2a   BY clause.    *
2ac50 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a 20 20 20  * or both */.   
2ac60 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
2ac70 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e  ;    /* Name con
2ac80 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73  text for process
2ac90 69 6e 67 20 61 67 67 72 65 67 61 74 65 20 69 6e  ing aggregate in
2aca0 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  formation */.   
2acb0 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20   int iAMem;     
2acc0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
2acd0 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 73 74  m address for st
2ace0 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52  oring current GR
2acf0 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e  OUP BY */.    in
2ad00 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20  t iBMem;        
2ad10 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61    /* First Mem a
2ad20 64 64 72 65 73 73 20 66 6f 72 20 70 72 65 76 69  ddress for previ
2ad30 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a  ous GROUP BY */.
2ad40 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67      int iUseFlag
2ad50 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61  ;       /* Mem a
2ad60 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66  ddress holding f
2ad70 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74  lag indicating t
2ad80 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20  hat at least.   
2ad90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ada0 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20       ** one row 
2adb0 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20  of the input to 
2adc0 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 20 68  the aggregator h
2add0 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20  as been.        
2ade0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2adf0 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  ** processed */.
2ae00 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c      int iAbortFl
2ae10 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61  ag;     /* Mem a
2ae20 64 64 72 65 73 73 20 77 68 69 63 68 20 63 61 75  ddress which cau
2ae30 73 65 73 20 71 75 65 72 79 20 61 62 6f 72 74 20  ses query abort 
2ae40 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20  if positive */. 
2ae50 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f     int groupBySo
2ae60 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63  rt;    /* Rows c
2ae70 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20  ome from source 
2ae80 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65  in GROUP BY orde
2ae90 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  r */.    int add
2aea0 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  rEnd;        /* 
2aeb0 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73 69 6e  End of processin
2aec0 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43  g for this SELEC
2aed0 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72  T */.    int sor
2aee0 74 50 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20  tPTab = 0;   /* 
2aef0 50 73 65 75 64 6f 74 61 62 6c 65 20 75 73 65 64  Pseudotable used
2af00 20 74 6f 20 64 65 63 6f 64 65 20 73 6f 72 74 69   to decode sorti
2af10 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  ng results */.  
2af20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74 20 3d 20    int sortOut = 
2af30 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20  0;    /* Output 
2af40 72 65 67 69 73 74 65 72 20 66 72 6f 6d 20 74 68  register from th
2af50 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20  e sorter */.    
2af60 69 6e 74 20 6f 72 64 65 72 42 79 47 72 70 20 3d  int orderByGrp =
2af70 20 30 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 74   0; /* True if t
2af80 68 65 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20  he GROUP BY and 
2af90 4f 52 44 45 52 20 42 59 20 61 72 65 20 74 68 65  ORDER BY are the
2afa0 20 73 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a   same */..    /*
2afb0 20 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20   Remove any and 
2afc0 61 6c 6c 20 61 6c 69 61 73 65 73 20 62 65 74 77  all aliases betw
2afd0 65 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73  een the result s
2afe0 65 74 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  et and the.    *
2aff0 2a 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  * GROUP BY claus
2b000 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
2b010 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
2b020 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20      int k;      
2b030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b040 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2b050 72 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63  r */.      struc
2b060 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
2b070 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20  *pItem;  /* For 
2b080 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 70  looping over exp
2b090 72 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73  ression in a lis
2b0a0 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28  t */..      for(
2b0b0 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  k=p->pEList->nEx
2b0c0 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c  pr, pItem=p->pEL
2b0d0 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d  ist->a; k>0; k--
2b0e0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
2b0f0 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69      pItem->u.x.i
2b100 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20  Alias = 0;.     
2b110 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70   }.      for(k=p
2b120 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20  GroupBy->nExpr, 
2b130 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e  pItem=pGroupBy->
2b140 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74  a; k>0; k--, pIt
2b150 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
2b160 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73  Item->u.x.iAlias
2b170 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
2b180 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65      if( p->nSele
2b190 63 74 52 6f 77 3e 31 30 30 20 29 20 70 2d 3e 6e  ctRow>100 ) p->n
2b1a0 53 65 6c 65 63 74 52 6f 77 20 3d 20 31 30 30 3b  SelectRow = 100;
2b1b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2b1c0 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
2b1d0 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20  = 1;.    }...   
2b1e0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
2b1f0 62 6f 74 68 20 61 20 47 52 4f 55 50 20 42 59 20  both a GROUP BY 
2b200 61 6e 64 20 61 6e 20 4f 52 44 45 52 20 42 59 20  and an ORDER BY 
2b210 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 79 20  clause and they 
2b220 61 72 65 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74  are.    ** ident
2b230 69 63 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 61  ical, then it ma
2b240 79 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  y be possible to
2b250 20 64 69 73 61 62 6c 65 20 74 68 65 20 4f 52 44   disable the ORD
2b260 45 52 20 42 59 20 63 6c 61 75 73 65 20 0a 20 20  ER BY clause .  
2b270 20 20 2a 2a 20 6f 6e 20 74 68 65 20 67 72 6f 75    ** on the grou
2b280 6e 64 73 20 74 68 61 74 20 74 68 65 20 47 52 4f  nds that the GRO
2b290 55 50 20 42 59 20 77 69 6c 6c 20 63 61 75 73 65  UP BY will cause
2b2a0 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d   elements to com
2b2b0 65 20 6f 75 74 20 0a 20 20 20 20 2a 2a 20 69 6e  e out .    ** in
2b2c0 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64   the correct ord
2b2d0 65 72 2e 20 49 74 20 61 6c 73 6f 20 6d 61 79 20  er. It also may 
2b2e0 6e 6f 74 20 2d 20 74 68 65 20 47 52 4f 55 50 20  not - the GROUP 
2b2f0 42 59 20 6d 61 79 20 75 73 65 20 61 0a 20 20 20  BY may use a.   
2b300 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6e 64   ** database ind
2b310 65 78 20 74 68 61 74 20 63 61 75 73 65 73 20 72  ex that causes r
2b320 6f 77 73 20 74 6f 20 62 65 20 67 72 6f 75 70 65  ows to be groupe
2b330 64 20 74 6f 67 65 74 68 65 72 20 61 73 20 72 65  d together as re
2b340 71 75 69 72 65 64 0a 20 20 20 20 2a 2a 20 62 75  quired.    ** bu
2b350 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 73  t not actually s
2b360 6f 72 74 65 64 2e 20 45 69 74 68 65 72 20 77 61  orted. Either wa
2b370 79 2c 20 72 65 63 6f 72 64 20 74 68 65 20 66 61  y, record the fa
2b380 63 74 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  ct that the.    
2b390 2a 2a 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20  ** ORDER BY and 
2b3a0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 73  GROUP BY clauses
2b3b0 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 62 79   are the same by
2b3c0 20 73 65 74 74 69 6e 67 20 74 68 65 20 6f 72 64   setting the ord
2b3d0 65 72 42 79 47 72 70 0a 20 20 20 20 2a 2a 20 76  erByGrp.    ** v
2b3e0 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20  ariable.  */.   
2b3f0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
2b400 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 47 72 6f  ListCompare(pGro
2b410 75 70 42 79 2c 20 73 53 6f 72 74 2e 70 4f 72 64  upBy, sSort.pOrd
2b420 65 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a  erBy, -1)==0 ){.
2b430 20 20 20 20 20 20 6f 72 64 65 72 42 79 47 72 70        orderByGrp
2b440 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 0a 20 20   = 1;.    }. .  
2b450 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 61    /* Create a la
2b460 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77  bel to jump to w
2b470 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 61  hen we want to a
2b480 62 6f 72 74 20 74 68 65 20 71 75 65 72 79 20 2a  bort the query *
2b490 2f 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20  /.    addrEnd = 
2b4a0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
2b4b0 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a  abel(v);..    /*
2b4c0 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55   Convert TK_COLU
2b4d0 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b  MN nodes into TK
2b4e0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20  _AGG_COLUMN and 
2b4f0 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a  make entries in.
2b500 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20      ** sAggInfo 
2b510 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46  for all TK_AGG_F
2b520 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e  UNCTION nodes in
2b530 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   expressions of 
2b540 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43  the.    ** SELEC
2b550 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  T statement..   
2b560 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
2b570 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
2b580 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50  NC));.    sNC.pP
2b590 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
2b5a0 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
2b5b0 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20  = pTabList;.    
2b5c0 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26  sNC.pAggInfo = &
2b5d0 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41  sAggInfo;.    sA
2b5e0 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20 70  ggInfo.mnReg = p
2b5f0 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
2b600 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72     sAggInfo.nSor
2b610 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72  tingColumn = pGr
2b620 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79  oupBy ? pGroupBy
2b630 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20  ->nExpr : 0;.   
2b640 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70   sAggInfo.pGroup
2b650 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20  By = pGroupBy;. 
2b660 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
2b670 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
2b680 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  C, pEList);.    
2b690 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2b6a0 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
2b6b0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 29 3b  sSort.pOrderBy);
2b6c0 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67  .    if( pHaving
2b6d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2b6e0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
2b6f0 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61  egates(&sNC, pHa
2b700 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ving);.    }.   
2b710 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d   sAggInfo.nAccum
2b720 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66  ulator = sAggInf
2b730 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66  o.nColumn;.    f
2b740 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
2b750 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a  fo.nFunc; i++){.
2b760 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
2b770 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 73  xprHasProperty(s
2b780 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d  AggInfo.aFunc[i]
2b790 2e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  .pExpr, EP_xIsSe
2b7a0 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73  lect) );.      s
2b7b0 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43  NC.ncFlags |= NC
2b7c0 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20  _InAggFunc;.    
2b7d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
2b7e0 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
2b7f0 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
2b800 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  [i].pExpr->x.pLi
2b810 73 74 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e  st);.      sNC.n
2b820 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 49 6e  cFlags &= ~NC_In
2b830 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 7d 0a 20  AggFunc;.    }. 
2b840 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 78 52 65     sAggInfo.mxRe
2b850 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  g = pParse->nMem
2b860 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
2b870 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
2b880 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
2b890 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67     /* Processing
2b8a0 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 73 20   for aggregates 
2b8b0 77 69 74 68 20 47 52 4f 55 50 20 42 59 20 69 73  with GROUP BY is
2b8c0 20 76 65 72 79 20 64 69 66 66 65 72 65 6e 74 20   very different 
2b8d0 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20  and.    ** much 
2b8e0 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61  more complex tha
2b8f0 6e 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74  n aggregates wit
2b900 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e  hout a GROUP BY.
2b910 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2b920 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
2b930 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
2b940 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20  nfo;  /* Keying 
2b950 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
2b960 74 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61  the group by cla
2b970 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  use */.      int
2b980 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   j1;            
2b990 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61   /* A-vs-B compa
2b9a0 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20  rision jump */. 
2b9b0 20 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75 74       int addrOut
2b9c0 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72  putRow;  /* Star
2b9d0 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20  t of subroutine 
2b9e0 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 72  that outputs a r
2b9f0 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20  esult row */.   
2ba00 20 20 20 69 6e 74 20 72 65 67 4f 75 74 70 75 74     int regOutput
2ba10 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e  Row;   /* Return
2ba20 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
2ba30 72 20 66 6f 72 20 6f 75 74 70 75 74 20 73 75 62  r for output sub
2ba40 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20  routine */.     
2ba50 20 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72   int addrSetAbor
2ba60 74 3b 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  t;   /* Set the 
2ba70 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72  abort flag and r
2ba80 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69  eturn */.      i
2ba90 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70  nt addrTopOfLoop
2baa0 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65  ;  /* Top of the
2bab0 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20   input loop */. 
2bac0 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72       int addrSor
2bad0 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65 20  tingIdx; /* The 
2bae0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
2baf0 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67   for the sorting
2bb00 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
2bb10 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20 20  int addrReset;  
2bb20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e      /* Subroutin
2bb30 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20  e for resetting 
2bb40 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
2bb50 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  */.      int reg
2bb60 52 65 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20  Reset;       /* 
2bb70 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72  Return address r
2bb80 65 67 69 73 74 65 72 20 66 6f 72 20 72 65 73 65  egister for rese
2bb90 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  t subroutine */.
2bba0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
2bbb0 72 65 20 69 73 20 61 20 47 52 4f 55 50 20 42 59  re is a GROUP BY
2bbc0 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74   clause we might
2bbd0 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20   need a sorting 
2bbe0 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a  index to.      *
2bbf0 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20  * implement it. 
2bc00 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73   Allocate that s
2bc10 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77  orting index now
2bc20 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f  .  If it turns o
2bc30 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ut.      ** that
2bc40 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20   we do not need 
2bc50 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68  it after all, th
2bc60 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20  e OP_SorterOpen 
2bc70 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20  instruction.    
2bc80 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e    ** will be con
2bc90 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f  verted into a No
2bca0 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20  op.  .      */. 
2bcb0 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f       sAggInfo.so
2bcc0 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73  rtingIdx = pPars
2bcd0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
2bce0 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49   pKeyInfo = keyI
2bcf0 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
2bd00 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
2bd10 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  , 0, 0);.      a
2bd20 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 20  ddrSortingIdx = 
2bd30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2bd40 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70  4(v, OP_SorterOp
2bd50 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  en, .          s
2bd60 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
2bd70 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f  dx, sAggInfo.nSo
2bd80 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20  rtingColumn, .  
2bd90 20 20 20 20 20 20 20 20 30 2c 20 28 63 68 61 72          0, (char
2bda0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
2bdb0 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20 20 20 20  EYINFO);..      
2bdc0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65  /* Initialize me
2bdd0 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75  mory locations u
2bde0 73 65 64 20 62 79 20 47 52 4f 55 50 20 42 59 20  sed by GROUP BY 
2bdf0 61 67 67 72 65 67 61 74 65 20 70 72 6f 63 65 73  aggregate proces
2be00 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sing.      */.  
2be10 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b      iUseFlag = +
2be20 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2be30 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20       iAbortFlag 
2be40 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2be50 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74 70 75  ;.      regOutpu
2be60 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d  tRow = ++pParse-
2be70 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64  >nMem;.      add
2be80 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c  rOutputRow = sql
2be90 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
2bea0 6c 28 76 29 3b 0a 20 20 20 20 20 20 72 65 67 52  l(v);.      regR
2beb0 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  eset = ++pParse-
2bec0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64  >nMem;.      add
2bed0 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33  rReset = sqlite3
2bee0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
2bef0 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20  ;.      iAMem = 
2bf00 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
2bf10 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
2bf20 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79  nMem += pGroupBy
2bf30 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ->nExpr;.      i
2bf40 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  BMem = pParse->n
2bf50 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  Mem + 1;.      p
2bf60 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
2bf70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
2bf80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2bf90 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
2bfa0 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74  teger, 0, iAbort
2bfb0 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
2bfc0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c  eComment((v, "cl
2bfd0 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29  ear abort flag")
2bfe0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2bff0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2c000 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 55 73  _Integer, 0, iUs
2c010 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  eFlag);.      Vd
2c020 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
2c030 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61  ndicate accumula
2c040 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a 20 20  tor empty"));.  
2c050 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2c060 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp3(v, OP_Null
2c070 2c 20 30 2c 20 69 41 4d 65 6d 2c 20 69 41 4d 65  , 0, iAMem, iAMe
2c080 6d 2b 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  m+pGroupBy->nExp
2c090 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r-1);..      /* 
2c0a0 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61  Begin a loop tha
2c0b0 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 61  t will extract a
2c0c0 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73 20 69  ll source rows i
2c0d0 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72  n GROUP BY order
2c0e0 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  ..      ** This 
2c0f0 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20 74 77  might involve tw
2c100 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 70 73  o separate loops
2c110 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74   with an OP_Sort
2c120 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a   in between, or.
2c130 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68        ** it migh
2c140 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f  t be a single lo
2c150 6f 70 20 74 68 61 74 20 75 73 65 73 20 61 6e 20  op that uses an 
2c160 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61 63 74  index to extract
2c170 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20   information.   
2c180 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 69 67     ** in the rig
2c190 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65 67 69  ht order to begi
2c1a0 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f  n with..      */
2c1b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2c1c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
2c1d0 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20  osub, regReset, 
2c1e0 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
2c1f0 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
2c200 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
2c210 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
2c220 57 68 65 72 65 2c 20 70 47 72 6f 75 70 42 79 2c  Where, pGroupBy,
2c230 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 57 48   0,.          WH
2c240 45 52 45 5f 47 52 4f 55 50 42 59 20 7c 20 28 6f  ERE_GROUPBY | (o
2c250 72 64 65 72 42 79 47 72 70 20 3f 20 57 48 45 52  rderByGrp ? WHER
2c260 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 3a 20  E_SORTBYGROUP : 
2c270 30 29 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20  0), 0.      );. 
2c280 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d       if( pWInfo=
2c290 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
2c2a0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20  _end;.      if( 
2c2b0 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72  sqlite3WhereIsOr
2c2c0 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3d 3d 70  dered(pWInfo)==p
2c2d0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 29  GroupBy->nExpr )
2c2e0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
2c2f0 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62   optimizer is ab
2c300 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f  le to deliver ro
2c310 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f  ws in group by o
2c320 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20  rder so.        
2c330 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76  ** we do not hav
2c340 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20  e to sort.  The 
2c350 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
2c360 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20   table will be. 
2c370 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c         ** cancel
2c380 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61 75 73  led later becaus
2c390 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20  e we still need 
2c3a0 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79 49  to use the pKeyI
2c3b0 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  nfo.        */. 
2c3c0 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f         groupBySo
2c3d0 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  rt = 0;.      }e
2c3e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
2c3f0 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20  Rows are coming 
2c400 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69  out in undetermi
2c410 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68  ned order.  We h
2c420 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20  ave to push.    
2c430 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20      ** each row 
2c440 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69  into a sorting i
2c450 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20  ndex, terminate 
2c460 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a  the first loop,.
2c470 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
2c480 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f  loop over the so
2c490 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f  rting index in o
2c4a0 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20  rder to get the 
2c4b0 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a  output.        *
2c4c0 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  * in sorted orde
2c4d0 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  r.        */.   
2c4e0 20 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65       int regBase
2c4f0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  ;.        int re
2c500 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20  gRecord;.       
2c510 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   int nCol;.     
2c520 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b     int nGroupBy;
2c530 0a 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69  ..        explai
2c540 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73  nTempTable(pPars
2c550 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
2c560 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63  (sDistinct.isTnc
2c570 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67  t && (p->selFlag
2c580 73 26 53 46 5f 44 69 73 74 69 6e 63 74 29 3d 3d  s&SF_Distinct)==
2c590 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  0) ?.           
2c5a0 20 20 20 20 20 20 20 20 20 22 44 49 53 54 49 4e           "DISTIN
2c5b0 43 54 22 20 3a 20 22 47 52 4f 55 50 20 42 59 22  CT" : "GROUP BY"
2c5c0 29 3b 0a 0a 20 20 20 20 20 20 20 20 67 72 6f 75  );..        grou
2c5d0 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20  pBySort = 1;.   
2c5e0 20 20 20 20 20 6e 47 72 6f 75 70 42 79 20 3d 20       nGroupBy = 
2c5f0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
2c600 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20  .        nCol = 
2c610 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  nGroupBy;.      
2c620 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a    j = nGroupBy;.
2c630 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2c640 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   i<sAggInfo.nCol
2c650 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
2c660 20 20 20 20 20 69 66 28 20 73 41 67 67 49 6e 66       if( sAggInf
2c670 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65  o.aCol[i].iSorte
2c680 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20  rColumn>=j ){.  
2c690 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b            nCol++
2c6a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b  ;.            j+
2c6b0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
2c6c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c6d0 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74   regBase = sqlit
2c6e0 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
2c6f0 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  Parse, nCol);.  
2c700 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2c710 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
2c720 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
2c730 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
2c740 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72  List(pParse, pGr
2c750 6f 75 70 42 79 2c 20 72 65 67 42 61 73 65 2c 20  oupBy, regBase, 
2c760 30 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  0);.        j = 
2c770 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  nGroupBy;.      
2c780 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
2c790 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
2c7a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
2c7b0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
2c7c0 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49  l *pCol = &sAggI
2c7d0 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20  nfo.aCol[i];.   
2c7e0 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
2c7f0 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d  >iSorterColumn>=
2c800 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  j ){.           
2c810 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65   int r1 = j + re
2c820 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20  gBase;.         
2c830 20 20 20 69 6e 74 20 72 32 3b 0a 0a 20 20 20 20     int r2;..    
2c840 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c          r2 = sql
2c850 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
2c860 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 0a 20  olumn(pParse, . 
2c870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2c890 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e  ol->pTab, pCol->
2c8a0 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69  iColumn, pCol->i
2c8b0 54 61 62 6c 65 2c 20 72 31 2c 20 30 29 3b 0a 20  Table, r1, 0);. 
2c8c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
2c8d0 31 21 3d 72 32 20 29 7b 0a 20 20 20 20 20 20 20  1!=r2 ){.       
2c8e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2c8f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
2c900 43 6f 70 79 2c 20 72 32 2c 20 72 31 29 3b 0a 20  Copy, r2, r1);. 
2c910 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2c920 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20           j++;.  
2c930 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c940 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52    }.        regR
2c950 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
2c960 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
2c970 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2c980 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2c990 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
2c9a0 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65  egBase, nCol, re
2c9b0 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
2c9c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2c9d0 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
2c9e0 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f  Insert, sAggInfo
2c9f0 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72 65 67  .sortingIdx, reg
2ca00 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  Record);.       
2ca10 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
2ca20 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
2ca30 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
2ca40 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
2ca50 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
2ca60 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c  e, regBase, nCol
2ca70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2ca80 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
2ca90 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67  o);.        sAgg
2caa0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 50  Info.sortingIdxP
2cab0 54 61 62 20 3d 20 73 6f 72 74 50 54 61 62 20 3d  Tab = sortPTab =
2cac0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
2cad0 0a 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74  .        sortOut
2cae0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
2caf0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
2cb00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2cb10 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
2cb20 65 6e 50 73 65 75 64 6f 2c 20 73 6f 72 74 50 54  enPseudo, sortPT
2cb30 61 62 2c 20 73 6f 72 74 4f 75 74 2c 20 6e 43 6f  ab, sortOut, nCo
2cb40 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
2cb50 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2cb60 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20   OP_SorterSort, 
2cb70 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
2cb80 49 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  Idx, addrEnd);. 
2cb90 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
2cba0 6e 74 28 28 76 2c 20 22 47 52 4f 55 50 20 42 59  nt((v, "GROUP BY
2cbb0 20 73 6f 72 74 22 29 29 3b 20 56 64 62 65 43 6f   sort")); VdbeCo
2cbc0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
2cbd0 20 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53     sAggInfo.useS
2cbe0 6f 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20  ortingIdx = 1;. 
2cbf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
2cc00 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
2cc10 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 7d 0a 0a  rse);..      }..
2cc20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
2cc30 69 6e 64 65 78 20 6f 72 20 74 65 6d 70 6f 72 61  index or tempora
2cc40 72 79 20 74 61 62 6c 65 20 75 73 65 64 20 62 79  ry table used by
2cc50 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 73 6f   the GROUP BY so
2cc60 72 74 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  rt.      ** will
2cc70 20 6e 61 74 75 72 61 6c 6c 79 20 64 65 6c 69 76   naturally deliv
2cc80 65 72 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6f  er rows in the o
2cc90 72 64 65 72 20 72 65 71 75 69 72 65 64 20 62 79  rder required by
2cca0 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20   the ORDER BY.  
2ccb0 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 2c 20 63      ** clause, c
2ccc0 61 6e 63 65 6c 20 74 68 65 20 65 70 68 65 6d 65  ancel the epheme
2ccd0 72 61 6c 20 74 61 62 6c 65 20 6f 70 65 6e 20 63  ral table open c
2cce0 6f 64 65 64 20 65 61 72 6c 69 65 72 2e 0a 20 20  oded earlier..  
2ccf0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2cd00 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
2cd10 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f  ization - the co
2cd20 72 72 65 63 74 20 61 6e 73 77 65 72 20 73 68 6f  rrect answer sho
2cd30 75 6c 64 20 72 65 73 75 6c 74 20 72 65 67 61 72  uld result regar
2cd40 64 6c 65 73 73 2e 0a 20 20 20 20 20 20 2a 2a 20  dless..      ** 
2cd50 55 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f 47  Use the SQLITE_G
2cd60 72 6f 75 70 42 79 4f 72 64 65 72 20 66 6c 61 67  roupByOrder flag
2cd70 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53   with SQLITE_TES
2cd80 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 45 52 20  TCTRL_OPTIMIZER 
2cd90 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 64 69 73  to .      ** dis
2cda0 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6d 69  able this optimi
2cdb0 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65 73 74 69  zation for testi
2cdc0 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 2a 2f  ng purposes.  */
2cdd0 0a 20 20 20 20 20 20 69 66 28 20 6f 72 64 65 72  .      if( order
2cde0 42 79 47 72 70 20 26 26 20 4f 70 74 69 6d 69 7a  ByGrp && Optimiz
2cdf0 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
2ce00 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f   SQLITE_GroupByO
2ce10 72 64 65 72 29 20 0a 20 20 20 20 20 20 20 26 26  rder) .       &&
2ce20 20 28 67 72 6f 75 70 42 79 53 6f 72 74 20 7c 7c   (groupBySort ||
2ce30 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 53   sqlite3WhereIsS
2ce40 6f 72 74 65 64 28 70 57 49 6e 66 6f 29 29 0a 20  orted(pWInfo)). 
2ce50 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2ce60 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
2ce70 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
2ce80 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
2ce90 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64  oop(v, sSort.add
2cea0 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20  rSortIndex);.   
2ceb0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45     }..      /* E
2cec0 76 61 6c 75 61 74 65 20 74 68 65 20 63 75 72 72  valuate the curr
2ced0 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72  ent GROUP BY ter
2cee0 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20  ms and store in 
2cef0 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20  b0, b1, b2....  
2cf00 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65      ** (b0 is me
2cf10 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42  mory location iB
2cf20 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d  Mem+0, b1 is iBM
2cf30 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72  em+1, and so for
2cf40 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  th).      ** The
2cf50 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75  n compare the cu
2cf60 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74  rrent GROUP BY t
2cf70 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65  erms against the
2cf80 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a   GROUP BY terms.
2cf90 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
2cfa0 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63  e previous row c
2cfb0 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
2cfc0 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e  in a0, a1, a2...
2cfd0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2cfe0 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20  addrTopOfLoop = 
2cff0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2d000 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
2d010 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
2d020 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
2d030 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42        if( groupB
2d040 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  ySort ){.       
2d050 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2d060 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44  p2(v, OP_SorterD
2d070 61 74 61 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ata, sAggInfo.so
2d080 72 74 69 6e 67 49 64 78 2c 20 73 6f 72 74 4f 75  rtingIdx, sortOu
2d090 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
2d0a0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72    for(j=0; j<pGr
2d0b0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b  oupBy->nExpr; j+
2d0c0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
2d0d0 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20  groupBySort ){. 
2d0e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2d0f0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2d100 5f 43 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50 54 61  _Column, sortPTa
2d110 62 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a  b, j, iBMem+j);.
2d120 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d            if( j=
2d130 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  =0 ) sqlite3Vdbe
2d140 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
2d150 41 47 5f 43 4c 45 41 52 43 41 43 48 45 29 3b 0a  AG_CLEARCACHE);.
2d160 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2d170 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66           sAggInf
2d180 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31  o.directMode = 1
2d190 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
2d1a0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
2d1b0 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  se, pGroupBy->a[
2d1c0 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b  j].pExpr, iBMem+
2d1d0 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  j);.        }.  
2d1e0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
2d1f0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
2d200 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d   OP_Compare, iAM
2d210 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75  em, iBMem, pGrou
2d220 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20  pBy->nExpr,.    
2d230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d240 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c        (char*)sql
2d250 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70  ite3KeyInfoRef(p
2d260 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59  KeyInfo), P4_KEY
2d270 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20  INFO);.      j1 
2d280 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
2d290 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
2d2a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2d2b0 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
2d2c0 20 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b   j1+1, 0, j1+1);
2d2d0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2d2e0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
2d2f0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 72  rate code that r
2d300 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68 65  uns whenever the
2d310 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65   GROUP BY change
2d320 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e  s..      ** Chan
2d330 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50  ges in the GROUP
2d340 20 42 59 20 61 72 65 20 64 65 74 65 63 74 65 64   BY are detected
2d350 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
2d360 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62   code.      ** b
2d370 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20  lock.  If there 
2d380 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c  were no changes,
2d390 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73   this block is s
2d3a0 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a  kipped..      **
2d3b0 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63  .      ** This c
2d3c0 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72 72 65  ode copies curre
2d3d0 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d  nt group by term
2d3e0 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e  s in b0,b1,b2,..
2d3f0 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20  ..      ** over 
2d400 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74  to a0,a1,a2.  It
2d410 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20   then calls the 
2d420 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
2d430 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72  e.      ** and r
2d440 65 73 65 74 73 20 74 68 65 20 61 67 67 72 65 67  esets the aggreg
2d450 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
2d460 72 65 67 69 73 74 65 72 73 20 69 6e 20 70 72 65  registers in pre
2d470 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  paration.      *
2d480 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47  * for the next G
2d490 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20  ROUP BY batch.. 
2d4a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
2d4b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
2d4c0 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c  e(pParse, iBMem,
2d4d0 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79   iAMem, pGroupBy
2d4e0 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
2d4f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2d500 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
2d510 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64  egOutputRow, add
2d520 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
2d530 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2d540 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72  v, "output one r
2d550 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ow"));.      sql
2d560 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2d570 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f  , OP_IfPos, iAbo
2d580 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29  rtFlag, addrEnd)
2d590 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
2d5a0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2d5b0 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20  ment((v, "check 
2d5c0 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
2d5d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2d5e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
2d5f0 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64  ub, regReset, ad
2d600 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
2d610 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2d620 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74  "reset accumulat
2d630 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
2d640 20 55 70 64 61 74 65 20 74 68 65 20 61 67 67 72   Update the aggr
2d650 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
2d660 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  rs based on the 
2d670 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20  content of.     
2d680 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
2d690 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  row.      */.   
2d6a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
2d6b0 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20  mpHere(v, j1);. 
2d6c0 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d       updateAccum
2d6d0 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
2d6e0 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
2d6f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2d700 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
2d710 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a  , 1, iUseFlag);.
2d720 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2d730 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20  t((v, "indicate 
2d740 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61  data in accumula
2d750 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
2d760 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  * End of the loo
2d770 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  p.      */.     
2d780 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
2d790 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2d7a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2d7b0 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20   OP_SorterNext, 
2d7c0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
2d7d0 49 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f  Idx, addrTopOfLo
2d7e0 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  op);.        Vdb
2d7f0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
2d800 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d810 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
2d820 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
2d830 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2d840 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61  hangeToNoop(v, a
2d850 64 64 72 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a  ddrSortingIdx);.
2d860 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
2d870 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e  * Output the fin
2d880 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74  al row of result
2d890 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2d8a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2d8b0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
2d8c0 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64  egOutputRow, add
2d8d0 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
2d8e0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2d8f0 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c  v, "output final
2d900 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20 20   row"));..      
2d910 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68 65  /* Jump over the
2d920 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20 20   subroutines.   
2d930 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
2d940 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2d950 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
2d960 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  rEnd);..      /*
2d970 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
2d980 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
2d990 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  uts a single row
2d9a0 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20   of the result. 
2d9b0 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68       ** set.  Th
2d9c0 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69  is subroutine fi
2d9d0 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65  rst looks at the
2d9e0 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69   iUseFlag.  If i
2d9f0 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a  UseFlag.      **
2da00 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
2da10 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20   equal to zero, 
2da20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69  the subroutine i
2da30 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20  s a no-op.  If. 
2da40 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63       ** the proc
2da50 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72  essing calls for
2da60 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 61 62   the query to ab
2da70 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75  ort, this subrou
2da80 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e  tine.      ** in
2da90 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62  crements the iAb
2daa0 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c  ortFlag memory l
2dab0 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72  ocation before r
2dac0 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20  eturning in.    
2dad0 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69    ** order to si
2dae0 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20  gnal the caller 
2daf0 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20  to abort..      
2db00 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65 74  */.      addrSet
2db10 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Abort = sqlite3V
2db20 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2db30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2db40 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2db50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41 62  _Integer, 1, iAb
2db60 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  ortFlag);.      
2db70 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2db80 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22  "set abort flag"
2db90 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
2dba0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2dbb0 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74  P_Return, regOut
2dbc0 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 73  putRow);.      s
2dbd0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
2dbe0 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f 75  eLabel(v, addrOu
2dbf0 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
2dc00 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20  addrOutputRow = 
2dc10 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2dc20 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
2dc30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2dc40 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p2(v, OP_IfPos, 
2dc50 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75  iUseFlag, addrOu
2dc60 74 70 75 74 52 6f 77 2b 32 29 3b 20 56 64 62 65  tputRow+2); Vdbe
2dc70 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
2dc80 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2dc90 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73 75  v, "Groupby resu
2dca0 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74  lt generator ent
2dcb0 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20  ry point"));.   
2dcc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2dcd0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
2dce0 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29  n, regOutputRow)
2dcf0 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65  ;.      finalize
2dd00 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61  AggFunctions(pPa
2dd10 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
2dd20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2dd30 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
2dd40 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f  , pHaving, addrO
2dd50 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49  utputRow+1, SQLI
2dd60 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
2dd70 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
2dd80 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
2dd90 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 2c 20   p->pEList, -1, 
2dda0 26 73 53 6f 72 74 2c 0a 20 20 20 20 20 20 20 20  &sSort,.        
2ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73                &s
2ddc0 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c  Distinct, pDest,
2ddd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2dde0 20 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75         addrOutpu
2ddf0 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41  tRow+1, addrSetA
2de00 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  bort);.      sql
2de10 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
2de20 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
2de30 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
2de40 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2de50 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72  , "end groupby r
2de60 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22  esult generator"
2de70 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  ));..      /* Ge
2de80 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
2de90 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ine that will re
2dea0 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79  set the group-by
2deb0 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20   accumulator.   
2dec0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
2ded0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
2dee0 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73 65 74  bel(v, addrReset
2def0 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41 63  );.      resetAc
2df00 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
2df10 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
2df20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2df30 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
2df40 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a 20  rn, regReset);. 
2df50 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e      .    } /* en
2df60 64 69 66 20 70 47 72 6f 75 70 42 79 2e 20 20 42  dif pGroupBy.  B
2df70 65 67 69 6e 20 61 67 67 72 65 67 61 74 65 20 71  egin aggregate q
2df80 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 20 47  ueries without G
2df90 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20  ROUP BY: */.    
2dfa0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 45 78 70  else {.      Exp
2dfb0 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b  rList *pDel = 0;
2dfc0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2dfd0 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a  OMIT_BTREECOUNT.
2dfe0 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
2dff0 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  b;.      if( (pT
2e000 61 62 20 3d 20 69 73 53 69 6d 70 6c 65 43 6f 75  ab = isSimpleCou
2e010 6e 74 28 70 2c 20 26 73 41 67 67 49 6e 66 6f 29  nt(p, &sAggInfo)
2e020 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
2e030 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c 65 43 6f  /* If isSimpleCo
2e040 75 6e 74 28 29 20 72 65 74 75 72 6e 73 20 61 20  unt() returns a 
2e050 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 61 62  pointer to a Tab
2e060 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 74 68  le structure, th
2e070 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  en.        ** th
2e080 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
2e090 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
2e0a0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2e0b0 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 63     **   SELECT c
2e0c0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62  ount(*) FROM <tb
2e0d0 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  l>.        **.  
2e0e0 20 20 20 20 20 20 2a 2a 20 77 68 65 72 65 20 74        ** where t
2e0f0 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
2e100 72 65 20 72 65 74 75 72 6e 65 64 20 72 65 70 72  re returned repr
2e110 65 73 65 6e 74 73 20 74 61 62 6c 65 20 3c 74 62  esents table <tb
2e120 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  l>..        **. 
2e130 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 73         ** This s
2e140 74 61 74 65 6d 65 6e 74 20 69 73 20 73 6f 20 63  tatement is so c
2e150 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20 69 73  ommon that it is
2e160 20 6f 70 74 69 6d 69 7a 65 64 20 73 70 65 63 69   optimized speci
2e170 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20 20 20  ally. The.      
2e180 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20 69 6e    ** OP_Count in
2e190 73 74 72 75 63 74 69 6f 6e 20 69 73 20 65 78 65  struction is exe
2e1a0 63 75 74 65 64 20 65 69 74 68 65 72 20 6f 6e 20  cuted either on 
2e1b0 74 68 65 20 69 6e 74 6b 65 79 20 74 61 62 6c 65  the intkey table
2e1c0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
2e1d0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
2e1e0 74 61 20 66 6f 72 20 74 61 62 6c 65 20 3c 74 62  ta for table <tb
2e1f0 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66 20  l> or on one of 
2e200 69 74 73 20 69 6e 64 65 78 65 73 2e 20 49 74 0a  its indexes. It.
2e210 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 62 65          ** is be
2e220 74 74 65 72 20 74 6f 20 65 78 65 63 75 74 65 20  tter to execute 
2e230 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64  the op on an ind
2e240 65 78 2c 20 61 73 20 69 6e 64 65 78 65 73 20 61  ex, as indexes a
2e250 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20 20 20  re almost.      
2e260 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 70 72 65    ** always spre
2e270 61 64 20 61 63 72 6f 73 73 20 6c 65 73 73 20 70  ad across less p
2e280 61 67 65 73 20 74 68 61 6e 20 74 68 65 69 72 20  ages than their 
2e290 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
2e2a0 62 6c 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bles..        */
2e2b0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69  .        const i
2e2c0 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
2e2d0 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
2e2e0 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
2e2f0 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
2e300 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 73 72    const int iCsr
2e310 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
2e320 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  +;     /* Cursor
2e330 20 74 6f 20 73 63 61 6e 20 62 2d 74 72 65 65 20   to scan b-tree 
2e340 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  */.        Index
2e350 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
2e360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e370 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
2e380 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
2e390 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
2e3a0 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  o = 0;          
2e3b0 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20       /* Keyinfo 
2e3c0 66 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e 64 65  for scanned inde
2e3d0 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64  x */.        Ind
2e3e0 65 78 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 20  ex *pBest = 0;  
2e3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e400 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65 78 20    /* Best index 
2e410 66 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a  found so far */.
2e420 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 6f          int iRoo
2e430 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 20  t = pTab->tnum; 
2e440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e450 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 73 63 61  Root page of sca
2e460 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f 0a 0a  nned b-tree */..
2e470 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
2e480 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
2e490 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
2e4a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62        sqlite3Tab
2e4b0 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
2e4c0 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
2e4d0 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  0, pTab->zName);
2e4e0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61  ..        /* Sea
2e4f0 72 63 68 20 66 6f 72 20 74 68 65 20 69 6e 64 65  rch for the inde
2e500 78 20 74 68 61 74 20 68 61 73 20 74 68 65 20 6c  x that has the l
2e510 6f 77 65 73 74 20 73 63 61 6e 20 63 6f 73 74 2e  owest scan cost.
2e520 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2e530 20 20 20 20 2a 2a 20 28 32 30 31 31 2d 30 34 2d      ** (2011-04-
2e540 31 35 29 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20  15) Do not do a 
2e550 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20 61 6e 20  full scan of an 
2e560 75 6e 6f 72 64 65 72 65 64 20 69 6e 64 65 78 2e  unordered index.
2e570 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2e580 20 20 20 20 2a 2a 20 28 32 30 31 33 2d 31 30 2d      ** (2013-10-
2e590 30 33 29 20 44 6f 20 6e 6f 74 20 63 6f 75 6e 74  03) Do not count
2e5a0 20 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e 20   the entries in 
2e5b0 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2e  a partial index.
2e5c0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2e5d0 20 20 20 20 2a 2a 20 49 6e 20 70 72 61 63 74 69      ** In practi
2e5e0 63 65 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ce the KeyInfo s
2e5f0 74 72 75 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f  tructure will no
2e600 74 20 62 65 20 75 73 65 64 2e 20 49 74 20 69 73  t be used. It is
2e610 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20 20 20 2a   only .        *
2e620 2a 20 70 61 73 73 65 64 20 74 6f 20 6b 65 65 70  * passed to keep
2e630 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 68 61 70   OP_OpenRead hap
2e640 70 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  py..        */. 
2e650 20 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52         if( !HasR
2e660 6f 77 69 64 28 70 54 61 62 29 20 29 20 70 42 65  owid(pTab) ) pBe
2e670 73 74 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  st = sqlite3Prim
2e680 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
2e690 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  );.        for(p
2e6a0 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
2e6b0 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
2e6c0 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
2e6d0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 62       if( pIdx->b
2e6e0 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20  Unordered==0.   
2e6f0 20 20 20 20 20 20 20 20 26 26 20 70 49 64 78 2d          && pIdx-
2e700 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e  >szIdxRow<pTab->
2e710 73 7a 54 61 62 52 6f 77 0a 20 20 20 20 20 20 20  szTabRow.       
2e720 20 20 20 20 26 26 20 70 49 64 78 2d 3e 70 50 61      && pIdx->pPa
2e730 72 74 49 64 78 57 68 65 72 65 3d 3d 30 0a 20 20  rtIdxWhere==0.  
2e740 20 20 20 20 20 20 20 20 20 26 26 20 28 21 70 42           && (!pB
2e750 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e 73 7a 49  est || pIdx->szI
2e760 64 78 52 6f 77 3c 70 42 65 73 74 2d 3e 73 7a 49  dxRow<pBest->szI
2e770 64 78 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20  dxRow).         
2e780 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2e790 70 42 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20  pBest = pIdx;.  
2e7a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e7b0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2e7c0 70 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20  pBest ){.       
2e7d0 20 20 20 69 52 6f 6f 74 20 3d 20 70 42 65 73 74     iRoot = pBest
2e7e0 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20  ->tnum;.        
2e7f0 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
2e800 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64  ite3KeyInfoOfInd
2e810 65 78 28 70 50 61 72 73 65 2c 20 70 42 65 73 74  ex(pParse, pBest
2e820 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
2e830 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20        /* Open a 
2e840 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
2e850 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 4f 50  , execute the OP
2e860 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68  _Count, close th
2e870 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20  e cursor. */.   
2e880 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2e890 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
2e8a0 4f 70 65 6e 52 65 61 64 2c 20 69 43 73 72 2c 20  OpenRead, iCsr, 
2e8b0 69 52 6f 6f 74 2c 20 69 44 62 2c 20 31 29 3b 0a  iRoot, iDb, 1);.
2e8c0 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79          if( pKey
2e8d0 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
2e8e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2e8f0 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68  ngeP4(v, -1, (ch
2e900 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  ar *)pKeyInfo, P
2e910 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
2e920 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
2e930 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2e940 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73  v, OP_Count, iCs
2e950 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  r, sAggInfo.aFun
2e960 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20  c[0].iMem);.    
2e970 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2e980 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
2e990 65 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20  e, iCsr);.      
2e9a0 20 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43    explainSimpleC
2e9b0 6f 75 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61  ount(pParse, pTa
2e9c0 62 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20  b, pBest);.     
2e9d0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
2e9e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52   SQLITE_OMIT_BTR
2e9f0 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20  EECOUNT */.     
2ea00 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68   {.        /* Ch
2ea10 65 63 6b 20 69 66 20 74 68 65 20 71 75 65 72 79  eck if the query
2ea20 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68   is of one of th
2ea30 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d  e following form
2ea40 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  s:.        **.  
2ea50 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
2ea60 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e  T min(x) FROM ..
2ea70 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  ..        **   S
2ea80 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f  ELECT max(x) FRO
2ea90 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  M ....        **
2eaa0 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 69  .        ** If i
2eab0 74 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74  t is, then ask t
2eac0 68 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65  he code in where
2ead0 2e 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  .c to attempt to
2eae0 20 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20   sort results.  
2eaf0 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74        ** as if t
2eb00 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44  here was an "ORD
2eb10 45 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44  ER ON x" or "ORD
2eb20 45 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c  ER ON x DESC" cl
2eb30 61 75 73 65 2e 20 0a 20 20 20 20 20 20 20 20 2a  ause. .        *
2eb40 2a 20 49 66 20 77 68 65 72 65 2e 63 20 69 73 20  * If where.c is 
2eb50 61 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20  able to produce 
2eb60 72 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69  results sorted i
2eb70 6e 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68  n this order, th
2eb80 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64  en.        ** ad
2eb90 64 20 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62  d vdbe code to b
2eba0 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
2ebb0 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20  processing loop 
2ebc0 61 66 74 65 72 20 74 68 65 20 0a 20 20 20 20 20  after the .     
2ebd0 20 20 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72     ** first iter
2ebe0 61 74 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65  ation (since the
2ebf0 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
2ec00 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20   of the loop is 
2ec10 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72  .        ** guar
2ec20 61 6e 74 65 65 64 20 74 6f 20 6f 70 65 72 61 74  anteed to operat
2ec30 65 20 6f 6e 20 74 68 65 20 72 6f 77 20 77 69 74  e on the row wit
2ec40 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72  h the minimum or
2ec50 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20 20 20   maximum .      
2ec60 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c    ** value of x,
2ec70 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65   the only row re
2ec80 71 75 69 72 65 64 29 2e 0a 20 20 20 20 20 20 20  quired)..       
2ec90 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41   **.        ** A
2eca0 20 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75   special flag mu
2ecb0 73 74 20 62 65 20 70 61 73 73 65 64 20 74 6f 20  st be passed to 
2ecc0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2ecd0 6e 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a  n() to slightly.
2ece0 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66          ** modif
2ecf0 79 20 62 65 68 61 76 69 6f 72 20 61 73 20 66 6f  y behavior as fo
2ed00 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20 20 2a  llows:.        *
2ed10 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b  *.        **   +
2ed20 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73   If the query is
2ed30 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78   a "SELECT min(x
2ed40 29 22 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f  )", then the loo
2ed50 70 20 63 6f 64 65 64 20 62 79 0a 20 20 20 20 20  p coded by.     
2ed60 20 20 20 2a 2a 20 20 20 20 20 77 68 65 72 65 2e     **     where.
2ed70 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65  c should not ite
2ed80 72 61 74 65 20 6f 76 65 72 20 61 6e 79 20 76 61  rate over any va
2ed90 6c 75 65 73 20 77 69 74 68 20 61 20 4e 55 4c 4c  lues with a NULL
2eda0 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a   value.        *
2edb0 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a 20 20 20  *     for x..   
2edc0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2edd0 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70 74 69 6d  **   + The optim
2ede0 69 7a 65 72 20 63 6f 64 65 20 69 6e 20 77 68 65  izer code in whe
2edf0 72 65 2e 63 20 28 74 68 65 20 74 68 69 6e 67 20  re.c (the thing 
2ee00 74 68 61 74 20 64 65 63 69 64 65 73 20 77 68 69  that decides whi
2ee10 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ch.        **   
2ee20 20 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69 63    index or indic
2ee30 65 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c  es to use) shoul
2ee40 64 20 70 6c 61 63 65 20 61 20 64 69 66 66 65 72  d place a differ
2ee50 65 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e 20  ent priority on 
2ee60 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
2ee70 73 61 74 69 73 66 79 69 6e 67 20 74 68 65 20 27  satisfying the '
2ee80 4f 52 44 45 52 20 42 59 27 20 63 6c 61 75 73 65  ORDER BY' clause
2ee90 20 74 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e   than it does in
2eea0 20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20   other cases..  
2eeb0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65 66        **     Ref
2eec0 65 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63  er to code and c
2eed0 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72 65  omments in where
2eee0 2e 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  .c for details..
2eef0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2ef00 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69     ExprList *pMi
2ef10 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  nMax = 0;.      
2ef20 20 20 75 38 20 66 6c 61 67 20 3d 20 57 48 45 52    u8 flag = WHER
2ef30 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
2ef40 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  ;.        .     
2ef50 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47     assert( p->pG
2ef60 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20  roupBy==0 );.   
2ef70 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61       assert( fla
2ef80 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  g==0 );.        
2ef90 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d  if( p->pHaving==
2efa0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  0 ){.          f
2efb0 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72  lag = minMaxQuer
2efc0 79 28 26 73 41 67 67 49 6e 66 6f 2c 20 26 70 4d  y(&sAggInfo, &pM
2efd0 69 6e 4d 61 78 29 3b 0a 20 20 20 20 20 20 20 20  inMax);.        
2efe0 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
2eff0 28 20 66 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 4d  ( flag==0 || (pM
2f000 69 6e 4d 61 78 21 3d 30 20 26 26 20 70 4d 69 6e  inMax!=0 && pMin
2f010 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 29 20 29  Max->nExpr==1) )
2f020 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  ;..        if( f
2f030 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lag ){.         
2f040 20 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74   pMinMax = sqlit
2f050 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
2f060 2c 20 70 4d 69 6e 4d 61 78 2c 20 30 29 3b 0a 20  , pMinMax, 0);. 
2f070 20 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20           pDel = 
2f080 70 4d 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20  pMinMax;.       
2f090 20 20 20 69 66 28 20 70 4d 69 6e 4d 61 78 20 26     if( pMinMax &
2f0a0 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
2f0b0 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  led ){.         
2f0c0 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d     pMinMax->a[0]
2f0d0 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61  .sortOrder = fla
2f0e0 67 21 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59  g!=WHERE_ORDERBY
2f0f0 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20  _MIN ?1:0;.     
2f100 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e         pMinMax->
2f110 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d  a[0].pExpr->op =
2f120 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20   TK_COLUMN;.    
2f130 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f140 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  }.  .        /* 
2f150 54 68 69 73 20 63 61 73 65 20 72 75 6e 73 20 69  This case runs i
2f160 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
2f170 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  has no GROUP BY 
2f180 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20  clause.  The.   
2f190 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69       ** processi
2f1a0 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c  ng is much simpl
2f1b0 65 72 20 73 69 6e 63 65 20 74 68 65 72 65 20 69  er since there i
2f1c0 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  s only a single 
2f1d0 72 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  row.        ** o
2f1e0 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20  f output..      
2f1f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73    */.        res
2f200 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  etAccumulator(pP
2f210 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
2f220 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  ;.        pWInfo
2f230 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
2f240 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
2f250 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70  bList, pWhere, p
2f260 4d 69 6e 4d 61 78 2c 30 2c 66 6c 61 67 2c 30 29  MinMax,0,flag,0)
2f270 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57  ;.        if( pW
2f280 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Info==0 ){.     
2f290 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2f2a0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
2f2b0 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Del);.          
2f2c0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
2f2d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2f2e0 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c     updateAccumul
2f2f0 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
2f300 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ggInfo);.       
2f310 20 61 73 73 65 72 74 28 20 70 4d 69 6e 4d 61 78   assert( pMinMax
2f320 3d 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e  ==0 || pMinMax->
2f330 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20  nExpr==1 );.    
2f340 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
2f350 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
2f360 49 6e 66 6f 29 3e 30 20 29 7b 0a 20 20 20 20 20  Info)>0 ){.     
2f370 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2f380 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
2f390 6f 2c 20 30 2c 20 73 71 6c 69 74 65 33 57 68 65  o, 0, sqlite3Whe
2f3a0 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49  reBreakLabel(pWI
2f3b0 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 20  nfo));.         
2f3c0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2f3d0 20 22 25 73 28 29 20 62 79 20 69 6e 64 65 78 22   "%s() by index"
2f3e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2f3f0 20 20 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f 4f    (flag==WHERE_O
2f400 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22  RDERBY_MIN?"min"
2f410 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20 20 20 20  :"max")));.     
2f420 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
2f430 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
2f440 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 66 69  nfo);.        fi
2f450 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f  nalizeAggFunctio
2f460 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  ns(pParse, &sAgg
2f470 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  Info);.      }..
2f480 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64        sSort.pOrd
2f490 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
2f4a0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
2f4b0 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  se(pParse, pHavi
2f4c0 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 53 51 4c  ng, addrEnd, SQL
2f4d0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
2f4e0 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
2f4f0 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
2f500 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 2c  , p->pEList, -1,
2f510 20 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20   0, 0, .        
2f520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44                pD
2f530 65 73 74 2c 20 61 64 64 72 45 6e 64 2c 20 61 64  est, addrEnd, ad
2f540 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 73 71  drEnd);.      sq
2f550 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
2f560 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20  ete(db, pDel);. 
2f570 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2f580 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
2f590 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  (v, addrEnd);.  
2f5a0 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20    .  } /* endif 
2f5b0 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20  aggregate query 
2f5c0 2a 2f 0a 0a 20 20 69 66 28 20 73 44 69 73 74 69  */..  if( sDisti
2f5d0 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 3d 3d 57  nct.eTnctType==W
2f5e0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
2f5f0 4f 52 44 45 52 45 44 20 29 7b 0a 20 20 20 20 65  ORDERED ){.    e
2f600 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
2f610 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43  pParse, "DISTINC
2f620 54 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  T");.  }..  /* I
2f630 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
2f640 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
2f650 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73  hen we need to s
2f660 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ort the results.
2f670 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68    ** and send th
2f680 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  em to the callba
2f690 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  ck one by one.. 
2f6a0 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e   */.  if( sSort.
2f6b0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
2f6c0 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
2f6d0 28 70 50 61 72 73 65 2c 20 73 53 6f 72 74 2e 6e  (pParse, sSort.n
2f6e0 4f 42 53 61 74 3e 30 20 3f 20 22 52 49 47 48 54  OBSat>0 ? "RIGHT
2f6f0 20 50 41 52 54 20 4f 46 20 4f 52 44 45 52 20 42   PART OF ORDER B
2f700 59 22 3a 22 4f 52 44 45 52 20 42 59 22 29 3b 0a  Y":"ORDER BY");.
2f710 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74      generateSort
2f720 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20  Tail(pParse, p, 
2f730 26 73 53 6f 72 74 2c 20 70 45 4c 69 73 74 2d 3e  &sSort, pEList->
2f740 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b 0a 20  nExpr, pDest);. 
2f750 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65   }..  /* Jump he
2f760 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20  re to skip this 
2f770 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c  query.  */.  sql
2f780 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
2f790 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a  abel(v, iEnd);..
2f7a0 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
2f7b0 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
2f7c0 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68   coded.   Set th
2f7d0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f  e return code to
2f7e0 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63   0.  ** to indic
2f7f0 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20  ate no errors.. 
2f800 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20   */.  rc = 0;.. 
2f810 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70   /* Control jump
2f820 73 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20  s to here if an 
2f830 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
2f840 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75  ered above, or u
2f850 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  pon.  ** success
2f860 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68  ful coding of th
2f870 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73  e SELECT..  */.s
2f880 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65 78 70  elect_end:.  exp
2f890 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70  lainSetInteger(p
2f8a0 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
2f8b0 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74  , iRestoreSelect
2f8c0 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74  Id);..  /* Ident
2f8d0 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ify column names
2f8e0 20 69 66 20 72 65 73 75 6c 74 73 20 6f 66 20 74   if results of t
2f8f0 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 74 6f  he SELECT are to
2f900 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f   be output..  */
2f910 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2f920 45 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e 65  E_OK && pDest->e
2f930 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
2f940 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65   ){.    generate
2f950 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
2f960 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
2f970 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  List);.  }..  sq
2f980 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2f990 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a  sAggInfo.aCol);.
2f9a0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2f9b0 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  db, sAggInfo.aFu
2f9c0 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  nc);.  return rc
2f9d0 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
2f9e0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54  (SQLITE_ENABLE_T
2f9f0 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a 0a  REE_EXPLAIN)./*.
2fa00 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68 75  ** Generate a hu
2fa10 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 64 65 73  man-readable des
2fa20 63 72 69 70 74 69 6f 6e 20 6f 66 20 61 20 74 68  cription of a th
2fa30 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 2e  e Select object.
2fa40 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2fa50 65 78 70 6c 61 69 6e 4f 6e 65 53 65 6c 65 63 74  explainOneSelect
2fa60 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53 65  (Vdbe *pVdbe, Se
2fa70 6c 65 63 74 20 2a 70 29 7b 0a 20 20 73 71 6c 69  lect *p){.  sqli
2fa80 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2fa90 28 70 56 64 62 65 2c 20 22 53 45 4c 45 43 54 20  (pVdbe, "SELECT 
2faa0 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c  ");.  if( p->sel
2fab0 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
2fac0 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
2fad0 65 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  e) ){.    if( p-
2fae0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
2faf0 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
2fb00 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2fb10 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 44 49  rintf(pVdbe, "DI
2fb20 53 54 49 4e 43 54 20 22 29 3b 0a 20 20 20 20 7d  STINCT ");.    }
2fb30 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  .    if( p->selF
2fb40 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
2fb50 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ate ){.      sql
2fb60 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
2fb70 66 28 70 56 64 62 65 2c 20 22 61 67 67 5f 66 6c  f(pVdbe, "agg_fl
2fb80 61 67 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ag ");.    }.   
2fb90 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
2fba0 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20 73 71  L(pVdbe);.    sq
2fbb0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2fbc0 74 66 28 70 56 64 62 65 2c 20 22 20 20 20 22 29  tf(pVdbe, "   ")
2fbd0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
2fbe0 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70  xplainExprList(p
2fbf0 56 64 62 65 2c 20 70 2d 3e 70 45 4c 69 73 74 29  Vdbe, p->pEList)
2fc00 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61  ;.  sqlite3Expla
2fc10 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 69  inNL(pVdbe);.  i
2fc20 66 28 20 70 2d 3e 70 53 72 63 20 26 26 20 70 2d  f( p->pSrc && p-
2fc30 3e 70 53 72 63 2d 3e 6e 53 72 63 20 29 7b 0a 20  >pSrc->nSrc ){. 
2fc40 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 71     int i;.    sq
2fc50 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2fc60 74 66 28 70 56 64 62 65 2c 20 22 46 52 4f 4d 20  tf(pVdbe, "FROM 
2fc70 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ");.    sqlite3E
2fc80 78 70 6c 61 69 6e 50 75 73 68 28 70 56 64 62 65  xplainPush(pVdbe
2fc90 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
2fca0 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b  i<p->pSrc->nSrc;
2fcb0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
2fcc0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2fcd0 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53   *pItem = &p->pS
2fce0 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
2fcf0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2fd00 69 6e 74 66 28 70 56 64 62 65 2c 20 22 7b 25 64  intf(pVdbe, "{%d
2fd10 2c 2a 7d 20 3d 20 22 2c 20 70 49 74 65 6d 2d 3e  ,*} = ", pItem->
2fd20 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
2fd30 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  if( pItem->pSele
2fd40 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
2fd50 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65 6c 65  lite3ExplainSele
2fd60 63 74 28 70 56 64 62 65 2c 20 70 49 74 65 6d 2d  ct(pVdbe, pItem-
2fd70 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
2fd80 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 54     if( pItem->pT
2fd90 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ab ){.          
2fda0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2fdb0 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 28 74  intf(pVdbe, " (t
2fdc0 61 62 6e 61 6d 65 3d 25 73 29 22 2c 20 70 49 74  abname=%s)", pIt
2fdd0 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
2fde0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2fdf0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65    }else if( pIte
2fe00 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  m->zName ){.    
2fe10 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2fe20 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
2fe30 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61  "%s", pItem->zNa
2fe40 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
2fe50 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41     if( pItem->zA
2fe60 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20  lias ){.        
2fe70 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2fe80 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 28 41  intf(pVdbe, " (A
2fe90 53 20 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e 7a  S %s)", pItem->z
2fea0 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a  Alias);.      }.
2feb0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
2fec0 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  >jointype & JT_L
2fed0 45 46 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73  EFT ){.        s
2fee0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2fef0 6e 74 66 28 70 56 64 62 65 2c 20 22 20 4c 45 46  ntf(pVdbe, " LEF
2ff00 54 2d 4a 4f 49 4e 22 29 3b 0a 20 20 20 20 20 20  T-JOIN");.      
2ff10 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
2ff20 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b  xplainNL(pVdbe);
2ff30 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2ff40 65 33 45 78 70 6c 61 69 6e 50 6f 70 28 70 56 64  e3ExplainPop(pVd
2ff50 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  be);.  }.  if( p
2ff60 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20  ->pWhere ){.    
2ff70 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2ff80 69 6e 74 66 28 70 56 64 62 65 2c 20 22 57 48 45  intf(pVdbe, "WHE
2ff90 52 45 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  RE ");.    sqlit
2ffa0 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56  e3ExplainExpr(pV
2ffb0 64 62 65 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b  dbe, p->pWhere);
2ffc0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2ffd0 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20  ainNL(pVdbe);.  
2ffe0 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75  }.  if( p->pGrou
2fff0 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pBy ){.    sqlit
30000 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
30010 70 56 64 62 65 2c 20 22 47 52 4f 55 50 42 59 20  pVdbe, "GROUPBY 
30020 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ");.    sqlite3E
30030 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70  xplainExprList(p
30040 56 64 62 65 2c 20 70 2d 3e 70 47 72 6f 75 70 42  Vdbe, p->pGroupB
30050 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  y);.    sqlite3E
30060 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b  xplainNL(pVdbe);
30070 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 48  .  }.  if( p->pH
30080 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 73 71 6c  aving ){.    sql
30090 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
300a0 66 28 70 56 64 62 65 2c 20 22 48 41 56 49 4e 47  f(pVdbe, "HAVING
300b0 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
300c0 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62  ExplainExpr(pVdb
300d0 65 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  e, p->pHaving);.
300e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
300f0 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d  inNL(pVdbe);.  }
30100 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
30110 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
30120 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
30130 56 64 62 65 2c 20 22 4f 52 44 45 52 42 59 20 22  Vdbe, "ORDERBY "
30140 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
30150 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70 56  plainExprList(pV
30160 64 62 65 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  dbe, p->pOrderBy
30170 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
30180 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a  plainNL(pVdbe);.
30190 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69    }.  if( p->pLi
301a0 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
301b0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
301c0 70 56 64 62 65 2c 20 22 4c 49 4d 49 54 20 22 29  pVdbe, "LIMIT ")
301d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
301e0 6c 61 69 6e 45 78 70 72 28 70 56 64 62 65 2c 20  lainExpr(pVdbe, 
301f0 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->pLimit);.    
30200 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c  sqlite3ExplainNL
30210 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69  (pVdbe);.  }.  i
30220 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b  f( p->pOffset ){
30230 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
30240 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
30250 20 22 4f 46 46 53 45 54 20 22 29 3b 0a 20 20 20   "OFFSET ");.   
30260 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
30270 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70 4f  xpr(pVdbe, p->pO
30280 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69  ffset);.    sqli
30290 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64  te3ExplainNL(pVd
302a0 62 65 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20  be);.  }.}.void 
302b0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65  sqlite3ExplainSe
302c0 6c 65 63 74 28 56 64 62 65 20 2a 70 56 64 62 65  lect(Vdbe *pVdbe
302d0 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
302e0 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
302f0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
30300 69 6e 74 66 28 70 56 64 62 65 2c 20 22 28 6e 75  intf(pVdbe, "(nu
30310 6c 6c 2d 73 65 6c 65 63 74 29 22 29 3b 0a 20 20  ll-select)");.  
30320 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
30330 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75  sqlite3ExplainPu
30340 73 68 28 70 56 64 62 65 29 3b 0a 20 20 77 68 69  sh(pVdbe);.  whi
30350 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 65 78 70  le( p ){.    exp
30360 6c 61 69 6e 4f 6e 65 53 65 6c 65 63 74 28 70 56  lainOneSelect(pV
30370 64 62 65 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d  dbe, p);.    p =
30380 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69   p->pNext;.    i
30390 66 28 20 70 3d 3d 30 20 29 20 62 72 65 61 6b 3b  f( p==0 ) break;
303a0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
303b0 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20  ainNL(pVdbe);.  
303c0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
303d0 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 25  Printf(pVdbe, "%
303e0 73 5c 6e 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61  s\n", selectOpNa
303f0 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a  me(p->op));.  }.
30400 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
30410 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 45  Printf(pVdbe, "E
30420 4e 44 22 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ND");.  sqlite3E
30430 78 70 6c 61 69 6e 50 6f 70 28 70 56 64 62 65 29  xplainPop(pVdbe)
30440 3b 0a 7d 0a 0a 2f 2a 20 45 6e 64 20 6f 66 20 74  ;.}../* End of t
30450 68 65 20 73 74 72 75 63 74 75 72 65 20 64 65 62  he structure deb
30460 75 67 20 70 72 69 6e 74 69 6e 67 20 63 6f 64 65  ug printing code
30470 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
30480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
304a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
304b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
304c0 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
304d0 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
304e0 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 20 2a 2f  TREE_EXPLAIN) */
304f0 0a                                               .