/ Hex Artifact Content
Login

Artifact 1a229278810ac02b9cb58687c3aa8cdc304d4dcf:


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 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
4120: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 20  empReg(pParse); 
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 73 71 6c     regBase = sql
4290: 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
42a0: 28 70 50 61 72 73 65 2c 20 6e 42 61 73 65 29 3b  (pParse, nBase);
42b0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
42c0: 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
42d0: 50 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f  Parse, pSort->pO
42e0: 72 64 65 72 42 79 2c 20 72 65 67 42 61 73 65 2c  rderBy, regBase,
42f0: 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
4300: 29 3b 0a 20 20 69 66 28 20 62 53 65 71 20 29 7b  );.  if( bSeq ){
4310: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4320: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71  AddOp2(v, OP_Seq
4330: 75 65 6e 63 65 2c 20 70 53 6f 72 74 2d 3e 69 45  uence, pSort->iE
4340: 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73 65 2b  Cursor, regBase+
4350: 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 69 66  nExpr);.  }.  if
4360: 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 30 20  ( nPrefixReg==0 
4370: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
4380: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
4390: 6f 76 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65  ove, regData, re
43a0: 67 42 61 73 65 2b 6e 45 78 70 72 2b 62 53 65 71  gBase+nExpr+bSeq
43b0: 2c 20 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 20  , nData);.  }.. 
43c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
43d0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
43e0: 6f 72 64 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42  ord, regBase+nOB
43f0: 53 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61  Sat, nBase-nOBSa
4400: 74 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  t, regRecord);. 
4410: 20 69 66 28 20 6e 4f 42 53 61 74 3e 30 20 29 7b   if( nOBSat>0 ){
4420: 0a 20 20 20 20 69 6e 74 20 72 65 67 50 72 65 76  .    int regPrev
4430: 4b 65 79 3b 20 20 20 2f 2a 20 54 68 65 20 66 69  Key;   /* The fi
4440: 72 73 74 20 6e 4f 42 53 61 74 20 63 6f 6c 75 6d  rst nOBSat colum
4450: 6e 73 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f  ns of the previo
4460: 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e  us row */.    in
4470: 74 20 61 64 64 72 46 69 72 73 74 3b 20 20 20 20  t addrFirst;    
4480: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
4490: 65 20 4f 50 5f 49 66 4e 6f 74 20 6f 70 63 6f 64  e OP_IfNot opcod
44a0: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  e */.    int add
44b0: 72 4a 6d 70 3b 20 20 20 20 20 20 2f 2a 20 41 64  rJmp;      /* Ad
44c0: 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f  dress of the OP_
44d0: 4a 75 6d 70 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  Jump opcode */. 
44e0: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20     VdbeOp *pOp; 
44f0: 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74       /* Opcode t
4500: 68 61 74 20 6f 70 65 6e 73 20 74 68 65 20 73 6f  hat opens the so
4510: 72 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rter */.    int 
4520: 6e 4b 65 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  nKey;         /*
4530: 20 4e 75 6d 62 65 72 20 6f 66 20 73 6f 72 74 69   Number of sorti
4540: 6e 67 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20  ng key columns, 
4550: 69 6e 63 6c 75 64 69 6e 67 20 4f 50 5f 53 65 71  including OP_Seq
4560: 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20 4b 65 79  uence */.    Key
4570: 49 6e 66 6f 20 2a 70 4b 49 3b 20 20 20 20 20 2f  Info *pKI;     /
4580: 2a 20 4f 72 69 67 69 6e 61 6c 20 4b 65 79 49 6e  * Original KeyIn
4590: 66 6f 20 6f 6e 20 74 68 65 20 73 6f 72 74 65 72  fo on the sorter
45a0: 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 72   table */..    r
45b0: 65 67 50 72 65 76 4b 65 79 20 3d 20 70 50 61 72  egPrevKey = pPar
45c0: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
45d0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
45e0: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20  pSort->nOBSat;. 
45f0: 20 20 20 6e 4b 65 79 20 3d 20 6e 45 78 70 72 20     nKey = nExpr 
4600: 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 20  - pSort->nOBSat 
4610: 2b 20 62 53 65 71 3b 0a 20 20 20 20 69 66 28 20  + bSeq;.    if( 
4620: 62 53 65 71 20 29 7b 0a 20 20 20 20 20 20 61 64  bSeq ){.      ad
4630: 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65  drFirst = sqlite
4640: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
4650: 50 5f 49 66 4e 6f 74 2c 20 72 65 67 42 61 73 65  P_IfNot, regBase
4660: 2b 6e 45 78 70 72 29 3b 20 0a 20 20 20 20 7d 65  +nExpr); .    }e
4670: 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 46  lse{.      addrF
4680: 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  irst = sqlite3Vd
4690: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53  beAddOp1(v, OP_S
46a0: 65 71 75 65 6e 63 65 54 65 73 74 2c 20 70 53 6f  equenceTest, pSo
46b0: 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20  rt->iECursor);. 
46c0: 20 20 20 7d 0a 20 20 20 20 56 64 62 65 43 6f 76     }.    VdbeCov
46d0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
46e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
46f0: 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72  v, OP_Compare, r
4700: 65 67 50 72 65 76 4b 65 79 2c 20 72 65 67 42 61  egPrevKey, regBa
4710: 73 65 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  se, pSort->nOBSa
4720: 74 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20 73 71  t);.    pOp = sq
4730: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
4740: 2c 20 70 53 6f 72 74 2d 3e 61 64 64 72 53 6f 72  , pSort->addrSor
4750: 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28  tIndex);.    if(
4760: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
4770: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
4780: 72 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20  rn;.    pOp->p2 
4790: 3d 20 6e 4b 65 79 20 2b 20 31 3b 0a 20 20 20 20  = nKey + 1;.    
47a0: 70 4b 49 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b  pKI = pOp->p4.pK
47b0: 65 79 49 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73  eyInfo;.    mems
47c0: 65 74 28 70 4b 49 2d 3e 61 53 6f 72 74 4f 72 64  et(pKI->aSortOrd
47d0: 65 72 2c 20 30 2c 20 70 4b 49 2d 3e 6e 46 69 65  er, 0, pKI->nFie
47e0: 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50  ld); /* Makes OP
47f0: 5f 4a 75 6d 70 20 62 65 6c 6f 77 20 74 65 73 74  _Jump below test
4800: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69  able */.    sqli
4810: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
4820: 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 4b  v, -1, (char*)pK
4830: 49 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  I, P4_KEYINFO);.
4840: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79      pOp->p4.pKey
4850: 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
4860: 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
4870: 65 2c 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72  e, pSort->pOrder
4880: 42 79 2c 20 6e 4f 42 53 61 74 2c 20 31 29 3b 0a  By, nOBSat, 1);.
4890: 20 20 20 20 61 64 64 72 4a 6d 70 20 3d 20 73 71      addrJmp = sq
48a0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
48b0: 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c  Addr(v);.    sql
48c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
48d0: 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 4a  , OP_Jump, addrJ
48e0: 6d 70 2b 31 2c 20 30 2c 20 61 64 64 72 4a 6d 70  mp+1, 0, addrJmp
48f0: 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +1); VdbeCoverag
4900: 65 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d  e(v);.    pSort-
4910: 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 3d 20 73 71  >labelBkOut = sq
4920: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
4930: 65 6c 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74  el(v);.    pSort
4940: 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  ->regReturn = ++
4950: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
4960: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4970: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
4980: 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72   pSort->regRetur
4990: 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42  n, pSort->labelB
49a0: 6b 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  kOut);.    sqlit
49b0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
49c0: 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20  OP_ResetSorter, 
49d0: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29  pSort->iECursor)
49e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
49f0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
4a00: 72 46 69 72 73 74 29 3b 0a 20 20 20 20 73 71 6c  rFirst);.    sql
4a10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
4a20: 2c 20 4f 50 5f 4d 6f 76 65 2c 20 72 65 67 42 61  , OP_Move, regBa
4a30: 73 65 2c 20 72 65 67 50 72 65 76 4b 65 79 2c 20  se, regPrevKey, 
4a40: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a  pSort->nOBSat);.
4a50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
4a60: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4a  umpHere(v, addrJ
4a70: 6d 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  mp);.  }.  if( p
4a80: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
4a90: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
4aa0: 72 74 65 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d  rter ){.    op =
4ab0: 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74   OP_SorterInsert
4ac0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
4ad0: 70 20 3d 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  p = OP_IdxInsert
4ae0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
4af0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
4b00: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
4b10: 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
4b20: 69 66 28 20 6e 4f 42 53 61 74 3d 3d 30 20 29 7b  if( nOBSat==0 ){
4b30: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
4b40: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
4b50: 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  e, regRecord);. 
4b60: 20 20 20 69 66 28 20 6e 50 72 65 66 69 78 52 65     if( nPrefixRe
4b70: 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  g==0 ){.      sq
4b80: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
4b90: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
4ba0: 67 42 61 73 65 2c 20 6e 42 61 73 65 29 3b 0a 20  gBase, nBase);. 
4bb0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
4bc0: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 29  Select->iLimit )
4bd0: 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c  {.    int addr1,
4be0: 20 61 64 64 72 32 3b 0a 20 20 20 20 69 6e 74 20   addr2;.    int 
4bf0: 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69 66 28 20  iLimit;.    if( 
4c00: 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74  pSelect->iOffset
4c10: 20 29 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74   ){.      iLimit
4c20: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66   = pSelect->iOff
4c30: 73 65 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  set+1;.    }else
4c40: 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d  {.      iLimit =
4c50: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
4c60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72  ;.    }.    addr
4c70: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
4c80: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65  ddOp1(v, OP_IfZe
4c90: 72 6f 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64 62  ro, iLimit); Vdb
4ca0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
4cb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4cc0: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
4cd0: 2c 20 69 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20  , iLimit, -1);. 
4ce0: 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74     addr2 = sqlit
4cf0: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
4d00: 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 73 71  OP_Goto);.    sq
4d10: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
4d20: 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20  e(v, addr1);.   
4d30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4d40: 70 31 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70  p1(v, OP_Last, p
4d50: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b  Sort->iECursor);
4d60: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4d70: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c  AddOp1(v, OP_Del
4d80: 65 74 65 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75  ete, pSort->iECu
4d90: 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  rsor);.    sqlit
4da0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
4db0: 2c 20 61 64 64 72 32 29 3b 0a 20 20 7d 0a 7d 0a  , addr2);.  }.}.
4dc0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20  ./*.** Add code 
4dd0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
4de0: 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69   OFFSET.*/.stati
4df0: 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65  c void codeOffse
4e00: 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  t(.  Vdbe *v,   
4e10: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
4e20: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
4e30: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  s VM */.  int iO
4e40: 66 66 73 65 74 2c 20 20 20 20 20 20 2f 2a 20 52  ffset,      /* R
4e50: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
4e60: 74 68 65 20 6f 66 66 73 65 74 20 63 6f 75 6e 74  the offset count
4e70: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e  er */.  int iCon
4e80: 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d  tinue     /* Jum
4e90: 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74  p here to skip t
4ea0: 68 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72  he current recor
4eb0: 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 4f  d */.){.  if( iO
4ec0: 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 69  ffset>0 ){.    i
4ed0: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 73 71 6c  nt addr;.    sql
4ee0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
4ef0: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 69 4f 66  , OP_AddImm, iOf
4f00: 66 73 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61  fset, -1);.    a
4f10: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
4f20: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
4f30: 4e 65 67 2c 20 69 4f 66 66 73 65 74 29 3b 20 56  Neg, iOffset); V
4f40: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
4f50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4f60: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
4f70: 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  , 0, iContinue);
4f80: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
4f90: 28 28 76 2c 20 22 73 6b 69 70 20 4f 46 46 53 45  ((v, "skip OFFSE
4fa0: 54 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20  T records"));.  
4fb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
4fc0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
4fd0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
4fe0: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
4ff0: 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  check to make su
5000: 72 65 20 74 68 65 20 4e 20 72 65 67 69 73 74 65  re the N registe
5010: 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 69  rs starting at i
5020: 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69  Mem.** form a di
5030: 73 74 69 6e 63 74 20 65 6e 74 72 79 2e 20 20 69  stinct entry.  i
5040: 54 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67  Tab is a sorting
5050: 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64   index that hold
5060: 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  s previously.** 
5070: 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  seen combination
5080: 73 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65  s of the N value
5090: 73 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20  s.  A new entry 
50a0: 69 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a  is made in iTab.
50b0: 2a 2a 20 69 66 20 74 68 65 20 63 75 72 72 65 6e  ** if the curren
50c0: 74 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e  t N values are n
50d0: 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70  ew..**.** A jump
50e0: 20 74 6f 20 61 64 64 72 52 65 70 65 61 74 20 69   to addrRepeat i
50f0: 73 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4e  s made and the N
5100: 2b 31 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f  +1 values are po
5110: 70 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  pped from the.**
5120: 20 73 74 61 63 6b 20 69 66 20 74 68 65 20 74 6f   stack if the to
5130: 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65  p N elements are
5140: 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a   not distinct..*
5150: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
5160: 64 65 44 69 73 74 69 6e 63 74 28 0a 20 20 50 61  deDistinct(.  Pa
5170: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
5180: 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
5190: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
51a0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
51b0: 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20   iTab,          
51c0: 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64  /* A sorting ind
51d0: 65 78 20 75 73 65 64 20 74 6f 20 74 65 73 74 20  ex used to test 
51e0: 66 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73  for distinctness
51f0: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65   */.  int addrRe
5200: 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70  peat,    /* Jump
5210: 20 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20   to here if not 
5220: 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e  distinct */.  in
5230: 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t N,            
5240: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c   /* Number of el
5250: 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  ements */.  int 
5260: 69 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 2f  iMem           /
5270: 2a 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74 20  * First element 
5280: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  */.){.  Vdbe *v;
5290: 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20  .  int r1;..  v 
52a0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
52b0: 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  .  r1 = sqlite3G
52c0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
52d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
52e0: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
52f0: 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61 64 64  Found, iTab, add
5300: 72 52 65 70 65 61 74 2c 20 69 4d 65 6d 2c 20 4e  rRepeat, iMem, N
5310: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
5320: 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
5330: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
5340: 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20  keRecord, iMem, 
5350: 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  N, r1);.  sqlite
5360: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
5370: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61  P_IdxInsert, iTa
5380: 62 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  b, r1);.  sqlite
5390: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
53a0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a  pParse, r1);.}..
53b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
53c0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
53d0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 65  ** Generate an e
53e0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65  rror message whe
53f0: 6e 20 61 20 53 45 4c 45 43 54 20 69 73 20 75 73  n a SELECT is us
5400: 65 64 20 77 69 74 68 69 6e 20 61 20 73 75 62 65  ed within a sube
5410: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 28 65 78  xpression.** (ex
5420: 61 6d 70 6c 65 3a 20 20 22 61 20 49 4e 20 28 53  ample:  "a IN (S
5430: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62  ELECT * FROM tab
5440: 6c 65 29 22 29 20 62 75 74 20 69 74 20 68 61 73  le)") but it has
5450: 20 6d 6f 72 65 20 74 68 61 6e 20 31 20 72 65 73   more than 1 res
5460: 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20  ult.** column.  
5470: 57 65 20 64 6f 20 74 68 69 73 20 69 6e 20 61 20  We do this in a 
5480: 73 75 62 72 6f 75 74 69 6e 65 20 62 65 63 61 75  subroutine becau
5490: 73 65 20 74 68 65 20 65 72 72 6f 72 20 75 73 65  se the error use
54a0: 64 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 69 6e  d to occur.** in
54b0: 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73   multiple places
54c0: 2e 20 20 28 54 68 65 20 65 72 72 6f 72 20 6f 6e  .  (The error on
54d0: 6c 79 20 6f 63 63 75 72 73 20 69 6e 20 6f 6e 65  ly occurs in one
54e0: 20 70 6c 61 63 65 20 6e 6f 77 2c 20 62 75 74 20   place now, but 
54f0: 77 65 0a 2a 2a 20 72 65 74 61 69 6e 20 74 68 65  we.** retain the
5500: 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d   subroutine to m
5510: 69 6e 69 6d 69 7a 65 20 63 6f 64 65 20 64 69 73  inimize code dis
5520: 72 75 70 74 69 6f 6e 2e 29 0a 2a 2f 0a 73 74 61  ruption.).*/.sta
5530: 74 69 63 20 69 6e 74 20 63 68 65 63 6b 46 6f 72  tic int checkFor
5540: 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63  MultiColumnSelec
5550: 74 45 72 72 6f 72 28 0a 20 20 50 61 72 73 65 20  tError(.  Parse 
5560: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
5570: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 2e  * Parse context.
5580: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
5590: 20 2a 70 44 65 73 74 2c 20 20 20 2f 2a 20 44 65   *pDest,   /* De
55a0: 73 74 69 6e 61 74 69 6f 6e 20 6f 66 20 53 45 4c  stination of SEL
55b0: 45 43 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ECT results */. 
55c0: 20 69 6e 74 20 6e 45 78 70 72 20 20 20 20 20 20   int nExpr      
55d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
55e0: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
55f0: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 45  s returned by SE
5600: 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  LECT */.){.  int
5610: 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e   eDest = pDest->
5620: 65 44 65 73 74 3b 0a 20 20 69 66 28 20 6e 45 78  eDest;.  if( nEx
5630: 70 72 3e 31 20 26 26 20 28 65 44 65 73 74 3d 3d  pr>1 && (eDest==
5640: 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74  SRT_Mem || eDest
5650: 3d 3d 53 52 54 5f 53 65 74 29 20 29 7b 0a 20 20  ==SRT_Set) ){.  
5660: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
5670: 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20  g(pParse, "only 
5680: 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20  a single result 
5690: 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20  allowed for ".  
56a0: 20 20 20 20 20 22 61 20 53 45 4c 45 43 54 20 74       "a SELECT t
56b0: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
56c0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a  n expression");.
56d0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
56e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
56f0: 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  n 0;.  }.}.#endi
5700: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
5710: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
5720: 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  the code for the
5730: 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69   inside of the i
5740: 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20  nner loop.** of 
5750: 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20  a SELECT..**.** 
5760: 49 66 20 73 72 63 54 61 62 20 69 73 20 6e 65 67  If srcTab is neg
5770: 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20  ative, then the 
5780: 70 45 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f  pEList expressio
5790: 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61  ns.** are evalua
57a0: 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ted in order to 
57b0: 67 65 74 20 74 68 65 20 64 61 74 61 20 66 6f 72  get the data for
57c0: 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20 73   this row.  If s
57d0: 72 63 54 61 62 20 69 73 0a 2a 2a 20 7a 65 72 6f  rcTab is.** zero
57e0: 20 6f 72 20 6d 6f 72 65 2c 20 74 68 65 6e 20 64   or more, then d
57f0: 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72  ata is pulled fr
5800: 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70 45  om srcTab and pE
5810: 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c  List is used onl
5820: 79 20 0a 2a 2a 20 74 6f 20 67 65 74 20 6e 75 6d  y .** to get num
5830: 62 65 72 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20  ber columns and 
5840: 74 68 65 20 64 61 74 61 74 79 70 65 20 66 6f 72  the datatype for
5850: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f   each column..*/
5860: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
5870: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20  ectInnerLoop(.  
5880: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
5890: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
58a0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
58b0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
58c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
58d0: 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63  e complete selec
58e0: 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  t statement bein
58f0: 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70  g coded */.  Exp
5900: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
5910: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
5920: 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74  values being ext
5930: 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  racted */.  int 
5940: 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20  srcTab,         
5950: 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61      /* Pull data
5960: 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65   from this table
5970: 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70   */.  SortCtx *p
5980: 53 6f 72 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  Sort,         /*
5990: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e   If not NULL, in
59a0: 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f  fo on how to pro
59b0: 63 65 73 73 20 4f 52 44 45 52 20 42 59 20 2a 2f  cess ORDER BY */
59c0: 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 2a  .  DistinctCtx *
59d0: 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20 49 66  pDistinct, /* If
59e0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20   not NULL, info 
59f0: 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73  on how to proces
5a00: 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  s DISTINCT */.  
5a10: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
5a20: 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74  t,      /* How t
5a30: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
5a40: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
5a50: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
5a60: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
5a70: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
5a80: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
5a90: 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20    int iBreak    
5aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
5ab0: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
5ac0: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
5ad0: 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64   loop */.){.  Vd
5ae0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
5af0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
5b00: 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63    int hasDistinc
5b10: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  t;        /* Tru
5b20: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
5b30: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
5b40: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65  sent */.  int re
5b50: 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  gResult;        
5b60: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
5b70: 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67  f memory holding
5b80: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
5b90: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
5ba0: 73 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20  st->eDest;   /* 
5bb0: 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f  How to dispose o
5bc0: 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  f results */.  i
5bd0: 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74  nt iParm = pDest
5be0: 2d 3e 69 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69  ->iSDParm; /* Fi
5bf0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
5c00: 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20  disposal method 
5c10: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74  */.  int nResult
5c20: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
5c30: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
5c40: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  sult columns */.
5c50: 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67    int nPrefixReg
5c60: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
5c70: 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
5c80: 20 72 65 67 69 73 74 65 72 73 20 62 65 66 6f 72   registers befor
5c90: 65 20 72 65 67 52 65 73 75 6c 74 20 2a 2f 0a 0a  e regResult */..
5ca0: 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20    assert( v );. 
5cb0: 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
5cc0: 3d 30 20 29 3b 0a 20 20 68 61 73 44 69 73 74 69  =0 );.  hasDisti
5cd0: 6e 63 74 20 3d 20 70 44 69 73 74 69 6e 63 74 20  nct = pDistinct 
5ce0: 3f 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e  ? pDistinct->eTn
5cf0: 63 74 54 79 70 65 20 3a 20 57 48 45 52 45 5f 44  ctType : WHERE_D
5d00: 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20  ISTINCT_NOOP;.  
5d10: 69 66 28 20 70 53 6f 72 74 20 26 26 20 70 53 6f  if( pSort && pSo
5d20: 72 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  rt->pOrderBy==0 
5d30: 29 20 70 53 6f 72 74 20 3d 20 30 3b 0a 20 20 69  ) pSort = 0;.  i
5d40: 66 28 20 70 53 6f 72 74 3d 3d 30 20 26 26 20 21  f( pSort==0 && !
5d50: 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  hasDistinct ){. 
5d60: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6e 74     assert( iCont
5d70: 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20 20 20 63  inue!=0 );.    c
5d80: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e  odeOffset(v, p->
5d90: 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e  iOffset, iContin
5da0: 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50  ue);.  }..  /* P
5db0: 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65  ull the requeste
5dc0: 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a  d columns..  */.
5dd0: 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70    nResultCol = p
5de0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20  EList->nExpr;.. 
5df0: 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73   if( pDest->iSds
5e00: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  t==0 ){.    if( 
5e10: 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 6e  pSort ){.      n
5e20: 50 72 65 66 69 78 52 65 67 20 3d 20 70 53 6f 72  PrefixReg = pSor
5e30: 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  t->pOrderBy->nEx
5e40: 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 21 28  pr;.      if( !(
5e50: 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73  pSort->sortFlags
5e60: 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53   & SORTFLAG_UseS
5e70: 6f 72 74 65 72 29 20 29 20 6e 50 72 65 66 69 78  orter) ) nPrefix
5e80: 52 65 67 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61  Reg++;.      pPa
5e90: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 72  rse->nMem += nPr
5ea0: 65 66 69 78 52 65 67 3b 0a 20 20 20 20 7d 0a 20  efixReg;.    }. 
5eb0: 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20     pDest->iSdst 
5ec0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
5ed0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
5ee0: 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  em += nResultCol
5ef0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44  ;.  }else if( pD
5f00: 65 73 74 2d 3e 69 53 64 73 74 2b 6e 52 65 73 75  est->iSdst+nResu
5f10: 6c 74 43 6f 6c 20 3e 20 70 50 61 72 73 65 2d 3e  ltCol > pParse->
5f20: 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 54  nMem ){.    /* T
5f30: 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72 20  his is an error 
5f40: 63 6f 6e 64 69 74 69 6f 6e 20 74 68 61 74 20 63  condition that c
5f50: 61 6e 20 72 65 73 75 6c 74 2c 20 66 6f 72 20 65  an result, for e
5f60: 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 53  xample, when a S
5f70: 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 6f 6e 20  ELECT.    ** on 
5f80: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
5f90: 69 64 65 20 6f 66 20 61 6e 20 49 4e 53 45 52 54  ide of an INSERT
5fa0: 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 72   contains more r
5fb0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68  esult columns th
5fc0: 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20  an.    ** there 
5fd0: 61 72 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  are columns in t
5fe0: 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  he table on the 
5ff0: 6c 65 66 74 2e 20 20 54 68 65 20 65 72 72 6f 72  left.  The error
6000: 20 77 69 6c 6c 20 62 65 20 63 61 75 67 68 74 0a   will be caught.
6010: 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72      ** and repor
6020: 74 65 64 20 6c 61 74 65 72 2e 20 20 42 75 74 20  ted later.  But 
6030: 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20  we need to make 
6040: 73 75 72 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f  sure enough memo
6050: 72 79 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 0a  ry is allocated.
6060: 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20      ** to avoid 
6070: 6f 74 68 65 72 20 73 70 75 72 69 6f 75 73 20 65  other spurious e
6080: 72 72 6f 72 73 20 69 6e 20 74 68 65 20 6d 65 61  rrors in the mea
6090: 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20 20 20 70 50  ntime. */.    pP
60a0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
60b0: 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 0a 20 20  esultCol;.  }.  
60c0: 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 6e  pDest->nSdst = n
60d0: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 72 65 67  ResultCol;.  reg
60e0: 52 65 73 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e  Result = pDest->
60f0: 69 53 64 73 74 3b 0a 20 20 69 66 28 20 73 72 63  iSdst;.  if( src
6100: 54 61 62 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f  Tab>=0 ){.    fo
6110: 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74  r(i=0; i<nResult
6120: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
6130: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6140: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
6150: 20 73 72 63 54 61 62 2c 20 69 2c 20 72 65 67 52   srcTab, i, regR
6160: 65 73 75 6c 74 2b 69 29 3b 0a 20 20 20 20 20 20  esult+i);.      
6170: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
6180: 22 25 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  "%s", pEList->a[
6190: 69 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  i].zName));.    
61a0: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44  }.  }else if( eD
61b0: 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20  est!=SRT_Exists 
61c0: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
61d0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20   destination is 
61e0: 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29 20 65  an EXISTS(...) e
61f0: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 61  xpression, the a
6200: 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c  ctual.    ** val
6210: 75 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ues returned by 
6220: 74 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 6e  the SELECT are n
6230: 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  ot required..   
6240: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
6250: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
6260: 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20  pParse, pEList, 
6270: 72 65 67 52 65 73 75 6c 74 2c 0a 20 20 20 20 20  regResult,.     
6280: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 65 44               (eD
6290: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 7c  est==SRT_Output|
62a0: 7c 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f  |eDest==SRT_Coro
62b0: 75 74 69 6e 65 29 3f 53 51 4c 49 54 45 5f 45 43  utine)?SQLITE_EC
62c0: 45 4c 5f 44 55 50 3a 30 29 3b 0a 20 20 7d 0a 0a  EL_DUP:0);.  }..
62d0: 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54    /* If the DIST
62e0: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73  INCT keyword was
62f0: 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20   present on the 
6300: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
6310: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72  .  ** and this r
6320: 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e  ow has been seen
6330: 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f   before, then do
6340: 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72   not make this r
6350: 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20  ow.  ** part of 
6360: 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f  the result..  */
6370: 0a 20 20 69 66 28 20 68 61 73 44 69 73 74 69 6e  .  if( hasDistin
6380: 63 74 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68  ct ){.    switch
6390: 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e  ( pDistinct->eTn
63a0: 63 74 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20  ctType ){.      
63b0: 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
63c0: 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20  NCT_ORDERED: {. 
63d0: 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70         VdbeOp *p
63e0: 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Op;            /
63f0: 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75  * No longer requ
6400: 69 72 65 64 20 4f 70 65 6e 45 70 68 65 6d 65 72  ired OpenEphemer
6410: 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20 20 20  al instr. */.   
6420: 20 20 20 20 20 69 6e 74 20 69 4a 75 6d 70 3b 20       int iJump; 
6430: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6440: 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e  Jump destination
6450: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
6460: 72 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20  regPrev;        
6470: 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
6480: 72 6f 77 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a  row content */..
6490: 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63          /* Alloc
64a0: 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ate space for th
64b0: 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 2a  e previous row *
64c0: 2f 0a 20 20 20 20 20 20 20 20 72 65 67 50 72 65  /.        regPre
64d0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  v = pParse->nMem
64e0: 2b 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  +1;.        pPar
64f0: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73  se->nMem += nRes
6500: 75 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20  ultCol;..       
6510: 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20 4f   /* Change the O
6520: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
6530: 63 6f 64 65 64 20 65 61 72 6c 69 65 72 20 74 6f  coded earlier to
6540: 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20 20 20   an OP_Null.    
6550: 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20      ** sets the 
6560: 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62 69 74 20  MEM_Cleared bit 
6570: 6f 6e 20 74 68 65 20 66 69 72 73 74 20 72 65 67  on the first reg
6580: 69 73 74 65 72 20 6f 66 20 74 68 65 0a 20 20 20  ister of the.   
6590: 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73       ** previous
65a0: 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20 77 69   value.  This wi
65b0: 6c 6c 20 63 61 75 73 65 20 74 68 65 20 4f 50 5f  ll cause the OP_
65c0: 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c 77 61  Ne below to alwa
65d0: 79 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 61  ys.        ** fa
65e0: 69 6c 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20  il on the first 
65f0: 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
6600: 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20 74 68   loop even if th
6610: 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 20 20  e first.        
6620: 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20 4e 55  ** row is all NU
6630: 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  LLs..        */.
6640: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
6650: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
6660: 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64  v, pDistinct->ad
6670: 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20  drTnct);.       
6680: 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
6690: 62 65 47 65 74 4f 70 28 76 2c 20 70 44 69 73 74  beGetOp(v, pDist
66a0: 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b  inct->addrTnct);
66b0: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70  .        pOp->op
66c0: 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a  code = OP_Null;.
66d0: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
66e0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  = 1;.        pOp
66f0: 2d 3e 70 32 20 3d 20 72 65 67 50 72 65 76 3b 0a  ->p2 = regPrev;.
6700: 0a 20 20 20 20 20 20 20 20 69 4a 75 6d 70 20 3d  .        iJump =
6710: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
6720: 65 6e 74 41 64 64 72 28 76 29 20 2b 20 6e 52 65  entAddr(v) + nRe
6730: 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 20 20 20  sultCol;.       
6740: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73   for(i=0; i<nRes
6750: 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ultCol; i++){.  
6760: 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
6770: 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *pColl = sqlite3
6780: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
6790: 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  se, pEList->a[i]
67a0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
67b0: 20 20 20 69 66 28 20 69 3c 6e 52 65 73 75 6c 74     if( i<nResult
67c0: 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  Col-1 ){.       
67d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
67e0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 2c  AddOp3(v, OP_Ne,
67f0: 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 4a   regResult+i, iJ
6800: 75 6d 70 2c 20 72 65 67 50 72 65 76 2b 69 29 3b  ump, regPrev+i);
6810: 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62  .            Vdb
6820: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
6830: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
6840: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
6850: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6860: 4f 50 5f 45 71 2c 20 72 65 67 52 65 73 75 6c 74  OP_Eq, regResult
6870: 2b 69 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 72  +i, iContinue, r
6880: 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20  egPrev+i);.     
6890: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
68a0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
68b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
68c0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
68d0: 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e 73 74  P4(v, -1, (const
68e0: 20 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50   char *)pColl, P
68f0: 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
6900: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6910: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c  eChangeP5(v, SQL
6920: 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
6930: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
6940: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
6950: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
6960: 3d 3d 69 4a 75 6d 70 20 29 3b 0a 20 20 20 20 20  ==iJump );.     
6970: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6980: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
6990: 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50   regResult, regP
69a0: 72 65 76 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2d  rev, nResultCol-
69b0: 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  1);.        brea
69c0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
69d0: 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
69e0: 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a  TINCT_UNIQUE: {.
69f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
6a00: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
6a10: 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64  v, pDistinct->ad
6a20: 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20  drTnct);.       
6a30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
6a40: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
6a50: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
6a60: 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e  ( pDistinct->eTn
6a70: 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49  ctType==WHERE_DI
6a80: 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
6a90: 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   );.        code
6aa0: 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c  Distinct(pParse,
6ab0: 20 70 44 69 73 74 69 6e 63 74 2d 3e 74 61 62 54   pDistinct->tabT
6ac0: 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  nct, iContinue, 
6ad0: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 65 67 52  nResultCol, regR
6ae0: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20  esult);.        
6af0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
6b00: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 6f     }.    if( pSo
6b10: 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  rt==0 ){.      c
6b20: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e  odeOffset(v, p->
6b30: 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e  iOffset, iContin
6b40: 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ue);.    }.  }..
6b50: 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
6b60: 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  ){.    /* In thi
6b70: 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61  s mode, write ea
6b80: 63 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 20  ch query result 
6b90: 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68  to the key of th
6ba0: 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  e temporary.    
6bb0: 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  ** table iParm..
6bc0: 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
6bd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
6be0: 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 63  UND_SELECT.    c
6bf0: 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b  ase SRT_Union: {
6c00: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  .      int r1;. 
6c10: 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
6c20: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
6c30: 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
6c40: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6c50: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
6c60: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
6c70: 74 43 6f 6c 2c 20 72 31 29 3b 0a 20 20 20 20 20  tCol, r1);.     
6c80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6c90: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
6ca0: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a  rt, iParm, r1);.
6cb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
6cc0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
6cd0: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
6ce0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
6cf0: 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20   /* Construct a 
6d00: 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20  record from the 
6d10: 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75  query result, bu
6d20: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20  t instead of.   
6d30: 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20   ** saving that 
6d40: 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61  record, use it a
6d50: 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74  s a key to delet
6d60: 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a  e elements from.
6d70: 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f      ** the tempo
6d80: 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
6d90: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
6da0: 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a  e SRT_Except: {.
6db0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6dc0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64  eAddOp3(v, OP_Id
6dd0: 78 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20  xDelete, iParm, 
6de0: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
6df0: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72  ltCol);.      br
6e00: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
6e10: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
6e20: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
6e30: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72   */..    /* Stor
6e40: 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20  e the result as 
6e50: 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69  data using a uni
6e60: 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a  que key..    */.
6e70: 20 20 20 20 63 61 73 65 20 53 52 54 5f 46 69 66      case SRT_Fif
6e80: 6f 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  o:.    case SRT_
6e90: 44 69 73 74 46 69 66 6f 3a 0a 20 20 20 20 63 61  DistFifo:.    ca
6ea0: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
6eb0: 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
6ec0: 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Tab: {.      int
6ed0: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
6ee0: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
6ef0: 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b  , nPrefixReg+1);
6f00: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
6f10: 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c   eDest==SRT_Tabl
6f20: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
6f30: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
6f40: 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20  EphemTab );.    
6f50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6f60: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
6f70: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
6f80: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 2b   nResultCol, r1+
6f90: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 23 69 66  nPrefixReg);.#if
6fa0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6fb0: 5f 43 54 45 0a 20 20 20 20 20 20 69 66 28 20 65  _CTE.      if( e
6fc0: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69  Dest==SRT_DistFi
6fd0: 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  fo ){.        /*
6fe0: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
6ff0: 69 6f 6e 20 69 73 20 44 69 73 74 46 69 66 6f 2c  ion is DistFifo,
7000: 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50   then cursor (iP
7010: 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20  arm+1) is open. 
7020: 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 6e 20         ** on an 
7030: 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 2e  ephemeral index.
7040: 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
7050: 72 6f 77 20 69 73 20 61 6c 72 65 61 64 79 20 70  row is already p
7060: 72 65 73 65 6e 74 0a 20 20 20 20 20 20 20 20 2a  resent.        *
7070: 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20  * in the index, 
7080: 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74 20  do not write it 
7090: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 49  to the output. I
70a0: 66 20 6e 6f 74 2c 20 61 64 64 20 74 68 65 0a 20  f not, add the. 
70b0: 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e         ** curren
70c0: 74 20 72 6f 77 20 74 6f 20 74 68 65 20 69 6e 64  t row to the ind
70d0: 65 78 20 61 6e 64 20 70 72 6f 63 65 65 64 20 77  ex and proceed w
70e0: 69 74 68 20 77 72 69 74 69 6e 67 20 69 74 20 74  ith writing it t
70f0: 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
7100: 20 6f 75 74 70 75 74 20 74 61 62 6c 65 20 61 73   output table as
7110: 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20   well.  */.     
7120: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71     int addr = sq
7130: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
7140: 41 64 64 72 28 76 29 20 2b 20 34 3b 0a 20 20 20  Addr(v) + 4;.   
7150: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7160: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
7170: 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20  Found, iParm+1, 
7180: 61 64 64 72 2c 20 72 31 2c 20 30 29 3b 20 56 64  addr, r1, 0); Vd
7190: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
71a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
71b0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
71c0: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b  dxInsert, iParm+
71d0: 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  1, r1);.        
71e0: 61 73 73 65 72 74 28 20 70 53 6f 72 74 3d 3d 30  assert( pSort==0
71f0: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
7200: 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f  if.      if( pSo
7210: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  rt ){.        pu
7220: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
7230: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72  rse, pSort, p, r
7240: 31 2b 6e 50 72 65 66 69 78 52 65 67 2c 20 31 2c  1+nPrefixReg, 1,
7250: 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20   nPrefixReg);.  
7260: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7270: 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69     int r2 = sqli
7280: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
7290: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
72a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
72b0: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
72c0: 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20   iParm, r2);.   
72d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
72e0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
72f0: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20  ert, iParm, r1, 
7300: 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r2);.        sql
7310: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
7320: 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
7330: 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  D);.        sqli
7340: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
7350: 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
7360: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
7370: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
7380: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c  ange(pParse, r1,
7390: 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a   nPrefixReg+1);.
73a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
73b0: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
73c0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
73d0: 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
73e0: 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74  e creating a set
73f0: 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e   for an "expr IN
7400: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63   (SELECT ...)" c
7410: 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a  onstruct,.    **
7420: 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75   then there shou
7430: 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69  ld be a single i
7440: 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  tem on the stack
7450: 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20  .  Write this.  
7460: 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74    ** item into t
7470: 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74  he set table wit
7480: 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20  h bogus data..  
7490: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
74a0: 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61  T_Set: {.      a
74b0: 73 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f  ssert( nResultCo
74c0: 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 44  l==1 );.      pD
74d0: 65 73 74 2d 3e 61 66 66 53 64 73 74 20 3d 0a 20  est->affSdst =. 
74e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74f0: 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
7500: 66 66 69 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e  ffinity(pEList->
7510: 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73  a[0].pExpr, pDes
7520: 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20 20 20  t->affSdst);.   
7530: 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a     if( pSort ){.
7540: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 66 69          /* At fi
7550: 72 73 74 20 67 6c 61 6e 63 65 20 79 6f 75 20 77  rst glance you w
7560: 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65 20 63 6f  ould think we co
7570: 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74  uld optimize out
7580: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
7590: 4f 52 44 45 52 20 42 59 20 69 6e 20 74 68 69 73  ORDER BY in this
75a0: 20 63 61 73 65 20 73 69 6e 63 65 20 74 68 65 20   case since the 
75b0: 6f 72 64 65 72 20 6f 66 20 65 6e 74 72 69 65 73  order of entries
75c0: 20 69 6e 20 74 68 65 20 73 65 74 0a 20 20 20 20   in the set.    
75d0: 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20      ** does not 
75e0: 6d 61 74 74 65 72 2e 20 20 42 75 74 20 74 68 65  matter.  But the
75f0: 72 65 20 6d 69 67 68 74 20 62 65 20 61 20 4c 49  re might be a LI
7600: 4d 49 54 20 63 6c 61 75 73 65 2c 20 69 6e 20 77  MIT clause, in w
7610: 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20  hich.        ** 
7620: 63 61 73 65 20 74 68 65 20 6f 72 64 65 72 20 64  case the order d
7630: 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20  oes matter */.  
7640: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
7650: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f  rter(pParse, pSo
7660: 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74  rt, p, regResult
7670: 2c 20 31 2c 20 6e 50 72 65 66 69 78 52 65 67 29  , 1, nPrefixReg)
7680: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7690: 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
76a0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
76b0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
76c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
76d0: 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
76e0: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
76f0: 2c 31 2c 72 31 2c 20 26 70 44 65 73 74 2d 3e 61  ,1,r1, &pDest->a
7700: 66 66 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20  ffSdst, 1);.    
7710: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
7720: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
7730: 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  ge(pParse, regRe
7740: 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  sult, 1);.      
7750: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7760: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
7770: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b  ert, iParm, r1);
7780: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7790: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
77a0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
77b0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
77c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
77d0: 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20  f any row exist 
77e0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
77f0: 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66  t, record that f
7800: 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20  act and abort.. 
7810: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
7820: 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20  RT_Exists: {.   
7830: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7840: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
7850: 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20  er, 1, iParm);. 
7860: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
7870: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
7880: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
7890: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
78a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
78b0: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
78c0: 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74   a scalar select
78d0: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
78e0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   an expression, 
78f0: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72  then.    ** stor
7900: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
7910: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
7920: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
7930: 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a   break out.    *
7940: 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f  * of the scan lo
7950: 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  op..    */.    c
7960: 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
7970: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65       assert( nRe
7980: 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20  sultCol==1 );.  
7990: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b      if( pSort ){
79a0: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
79b0: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
79c0: 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73  pSort, p, regRes
79d0: 75 6c 74 2c 20 31 2c 20 6e 50 72 65 66 69 78 52  ult, 1, nPrefixR
79e0: 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
79f0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7a00: 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
7a10: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
7a20: 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20   iParm, 1);.    
7a30: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
7a40: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
7a50: 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
7a60: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
7a70: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
7a80: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
7a90: 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
7aa0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
7ab0: 0a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  ..    case SRT_C
7ac0: 6f 72 6f 75 74 69 6e 65 3a 20 20 20 20 20 20 20  oroutine:       
7ad0: 2f 2a 20 53 65 6e 64 20 64 61 74 61 20 74 6f 20  /* Send data to 
7ae0: 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a  a co-routine */.
7af0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75 74      case SRT_Out
7b00: 70 75 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  put: {        /*
7b10: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
7b20: 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  lts */.      tes
7b30: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
7b40: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20  T_Coroutine );. 
7b50: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
7b60: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
7b70: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53   );.      if( pS
7b80: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ort ){.        p
7b90: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
7ba0: 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20  arse, pSort, p, 
7bb0: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
7bc0: 6c 74 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52 65  ltCol, nPrefixRe
7bd0: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  g);.      }else 
7be0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
7bf0: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
7c00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7c10: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
7c20: 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
7c30: 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  m);.      }else{
7c40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7c50: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7c60: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52  _ResultRow, regR
7c70: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
7c80: 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
7c90: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
7ca0: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
7cb0: 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  e, regResult, nR
7cc0: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
7cd0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
7ce0: 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
7cf0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20  QLITE_OMIT_CTE. 
7d00: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
7d10: 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 20 70  results into a p
7d20: 72 69 6f 72 69 74 79 20 71 75 65 75 65 20 74 68  riority queue th
7d30: 61 74 20 69 73 20 6f 72 64 65 72 20 61 63 63 6f  at is order acco
7d40: 72 64 69 6e 67 20 74 6f 0a 20 20 20 20 2a 2a 20  rding to.    ** 
7d50: 70 44 65 73 74 2d 3e 70 4f 72 64 65 72 42 79 20  pDest->pOrderBy 
7d60: 28 69 6e 20 70 53 4f 29 2e 20 20 70 44 65 73 74  (in pSO).  pDest
7d70: 2d 3e 69 53 44 50 61 72 6d 20 28 69 6e 20 69 50  ->iSDParm (in iP
7d80: 61 72 6d 29 20 69 73 20 74 68 65 20 63 75 72 73  arm) is the curs
7d90: 6f 72 20 66 6f 72 20 61 6e 0a 20 20 20 20 2a 2a  or for an.    **
7da0: 20 69 6e 64 65 78 20 77 69 74 68 20 70 53 4f 2d   index with pSO-
7db0: 3e 6e 45 78 70 72 2b 32 20 63 6f 6c 75 6d 6e 73  >nExpr+2 columns
7dc0: 2e 20 20 42 75 69 6c 64 20 61 20 6b 65 79 20 75  .  Build a key u
7dd0: 73 69 6e 67 20 70 53 4f 20 66 6f 72 20 74 68 65  sing pSO for the
7de0: 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 70 53   first.    ** pS
7df0: 4f 2d 3e 6e 45 78 70 72 20 63 6f 6c 75 6d 6e 73  O->nExpr columns
7e00: 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
7e10: 20 61 6c 6c 20 6b 65 79 73 20 61 72 65 20 75 6e   all keys are un
7e20: 69 71 75 65 20 62 79 20 61 64 64 69 6e 67 20 61  ique by adding a
7e30: 0a 20 20 20 20 2a 2a 20 66 69 6e 61 6c 20 4f 50  .    ** final OP
7e40: 5f 53 65 71 75 65 6e 63 65 20 63 6f 6c 75 6d 6e  _Sequence column
7e50: 2e 20 20 54 68 65 20 6c 61 73 74 20 63 6f 6c 75  .  The last colu
7e60: 6d 6e 20 69 73 20 74 68 65 20 72 65 63 6f 72 64  mn is the record
7e70: 20 61 73 20 61 20 62 6c 6f 62 2e 0a 20 20 20 20   as a blob..    
7e80: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
7e90: 44 69 73 74 51 75 65 75 65 3a 0a 20 20 20 20 63  DistQueue:.    c
7ea0: 61 73 65 20 53 52 54 5f 51 75 65 75 65 3a 20 7b  ase SRT_Queue: {
7eb0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b  .      int nKey;
7ec0: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72  .      int r1, r
7ed0: 32 2c 20 72 33 3b 0a 20 20 20 20 20 20 69 6e 74  2, r3;.      int
7ee0: 20 61 64 64 72 54 65 73 74 20 3d 20 30 3b 0a 20   addrTest = 0;. 
7ef0: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
7f00: 53 4f 3b 0a 20 20 20 20 20 20 70 53 4f 20 3d 20  SO;.      pSO = 
7f10: 70 44 65 73 74 2d 3e 70 4f 72 64 65 72 42 79 3b  pDest->pOrderBy;
7f20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
7f30: 53 4f 20 29 3b 0a 20 20 20 20 20 20 6e 4b 65 79  SO );.      nKey
7f40: 20 3d 20 70 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20   = pSO->nExpr;. 
7f50: 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
7f60: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
7f70: 73 65 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  se);.      r2 = 
7f80: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
7f90: 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 4b 65 79  nge(pParse, nKey
7fa0: 2b 32 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20  +2);.      r3 = 
7fb0: 72 32 2b 6e 4b 65 79 2b 31 3b 0a 20 20 20 20 20  r2+nKey+1;.     
7fc0: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
7fd0: 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20  DistQueue ){.   
7fe0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
7ff0: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69  estination is Di
8000: 73 74 51 75 65 75 65 2c 20 74 68 65 6e 20 63 75  stQueue, then cu
8010: 72 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69  rsor (iParm+1) i
8020: 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a  s open.        *
8030: 2a 20 6f 6e 20 61 20 73 65 63 6f 6e 64 20 65 70  * on a second ep
8040: 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 68  hemeral index th
8050: 61 74 20 68 6f 6c 64 73 20 61 6c 6c 20 76 61 6c  at holds all val
8060: 75 65 73 20 65 76 65 72 79 20 70 72 65 76 69 6f  ues every previo
8070: 75 73 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  usly.        ** 
8080: 61 64 64 65 64 20 74 6f 20 74 68 65 20 71 75 65  added to the que
8090: 75 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ue. */.        a
80a0: 64 64 72 54 65 73 74 20 3d 20 73 71 6c 69 74 65  ddrTest = sqlite
80b0: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
80c0: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72  , OP_Found, iPar
80d0: 6d 2b 31 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  m+1, 0, .       
80e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8100: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
8110: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  ultCol);.       
8120: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
8130: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8140: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8150: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
8160: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
8170: 52 65 73 75 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a  ResultCol, r3);.
8180: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
8190: 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 29  =SRT_DistQueue )
81a0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
81b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
81c0: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
81d0: 72 6d 2b 31 2c 20 72 33 29 3b 0a 20 20 20 20 20  rm+1, r3);.     
81e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
81f0: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
8200: 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b  _USESEEKRESULT);
8210: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
8220: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20  or(i=0; i<nKey; 
8230: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
8240: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8250: 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 0a 20 20 20  v, OP_SCopy,.   
8260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8270: 20 20 20 20 20 20 20 72 65 67 52 65 73 75 6c 74         regResult
8280: 20 2b 20 70 53 4f 2d 3e 61 5b 69 5d 2e 75 2e 78   + pSO->a[i].u.x
8290: 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31  .iOrderByCol - 1
82a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
82b0: 20 20 20 20 20 20 20 20 20 20 20 20 72 32 2b 69              r2+i
82c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
82d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
82e0: 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  p2(v, OP_Sequenc
82f0: 65 2c 20 69 50 61 72 6d 2c 20 72 32 2b 6e 4b 65  e, iParm, r2+nKe
8300: 79 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  y);.      sqlite
8310: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
8320: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 32  P_MakeRecord, r2
8330: 2c 20 6e 4b 65 79 2b 32 2c 20 72 31 29 3b 0a 20  , nKey+2, r1);. 
8340: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8350: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
8360: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
8370: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 64  1);.      if( ad
8380: 64 72 54 65 73 74 20 29 20 73 71 6c 69 74 65 33  drTest ) sqlite3
8390: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
83a0: 61 64 64 72 54 65 73 74 29 3b 0a 20 20 20 20 20  addrTest);.     
83b0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
83c0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
83d0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
83e0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
83f0: 65 28 70 50 61 72 73 65 2c 20 72 32 2c 20 6e 4b  e(pParse, r2, nK
8400: 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 62 72 65  ey+2);.      bre
8410: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
8420: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
8430: 43 54 45 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64  CTE */....#if !d
8440: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
8450: 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20  IT_TRIGGER).    
8460: 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 72  /* Discard the r
8470: 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73  esults.  This is
8480: 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54   used for SELECT
8490: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69   statements insi
84a0: 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f  de.    ** the bo
84b0: 64 79 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e  dy of a TRIGGER.
84c0: 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66    The purpose of
84d0: 20 73 75 63 68 20 73 65 6c 65 63 74 73 20 69 73   such selects is
84e0: 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20   to call.    ** 
84f0: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
8500: 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65  ctions that have
8510: 20 73 69 64 65 20 65 66 66 65 63 74 73 2e 20 20   side effects.  
8520: 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20  We do not care. 
8530: 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20     ** about the 
8540: 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f  actual results o
8550: 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20  f the select..  
8560: 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
8570: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
8580: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
8590: 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20 62 72  card );.      br
85a0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
85b0: 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  f.  }..  /* Jump
85c0: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
85d0: 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c  he loop if the L
85e0: 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e  IMIT is reached.
85f0: 20 20 45 78 63 65 70 74 2c 20 69 66 0a 20 20 2a    Except, if.  *
8600: 2a 20 74 68 65 72 65 20 69 73 20 61 20 73 6f 72  * there is a sor
8610: 74 65 72 2c 20 69 6e 20 77 68 69 63 68 20 63 61  ter, in which ca
8620: 73 65 20 74 68 65 20 73 6f 72 74 65 72 20 68 61  se the sorter ha
8630: 73 20 61 6c 72 65 61 64 79 20 6c 69 6d 69 74 65  s already limite
8640: 64 0a 20 20 2a 2a 20 74 68 65 20 6f 75 74 70 75  d.  ** the outpu
8650: 74 20 66 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a 20  t for us..  */. 
8660: 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 26 26   if( pSort==0 &&
8670: 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20   p->iLimit ){.  
8680: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8690: 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f  Op3(v, OP_IfZero
86a0: 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72  , p->iLimit, iBr
86b0: 65 61 6b 2c 20 2d 31 29 3b 20 56 64 62 65 43 6f  eak, -1); VdbeCo
86c0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 7d  verage(v);.  }.}
86d0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
86e0: 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63   a KeyInfo objec
86f0: 74 20 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72  t sufficient for
8700: 20 61 6e 20 69 6e 64 65 78 20 6f 66 20 4e 20 6b   an index of N k
8710: 65 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 0a 2a  ey columns and.*
8720: 2a 20 58 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e  * X extra column
8730: 73 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73  s..*/.KeyInfo *s
8740: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
8750: 6f 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  oc(sqlite3 *db, 
8760: 69 6e 74 20 4e 2c 20 69 6e 74 20 58 29 7b 0a 20  int N, int X){. 
8770: 20 4b 65 79 49 6e 66 6f 20 2a 70 20 3d 20 73 71   KeyInfo *p = sq
8780: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
8790: 6f 28 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  o(0, .          
87a0: 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
87b0: 4b 65 79 49 6e 66 6f 29 20 2b 20 28 4e 2b 58 29  KeyInfo) + (N+X)
87c0: 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  *(sizeof(CollSeq
87d0: 2a 29 2b 31 29 29 3b 0a 20 20 69 66 28 20 70 20  *)+1));.  if( p 
87e0: 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f  ){.    p->aSortO
87f0: 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e  rder = (u8*)&p->
8800: 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20 20 20  aColl[N+X];.    
8810: 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36  p->nField = (u16
8820: 29 4e 3b 0a 20 20 20 20 70 2d 3e 6e 58 46 69 65  )N;.    p->nXFie
8830: 6c 64 20 3d 20 28 75 31 36 29 58 3b 0a 20 20 20  ld = (u16)X;.   
8840: 20 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62   p->enc = ENC(db
8850: 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64  );.    p->db = d
8860: 62 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d  b;.    p->nRef =
8870: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
8880: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
8890: 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  d = 1;.  }.  ret
88a0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
88b0: 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79  Deallocate a Key
88c0: 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76  Info object.*/.v
88d0: 6f 69 64 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  oid sqlite3KeyIn
88e0: 66 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66 6f 20  foUnref(KeyInfo 
88f0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  *p){.  if( p ){.
8900: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
8910: 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e  Ref>0 );.    p->
8920: 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20  nRef--;.    if( 
8930: 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73 71 6c  p->nRef==0 ) sql
8940: 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 29  ite3DbFree(0, p)
8950: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ;.  }.}../*.** M
8960: 61 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e 74 65  ake a new pointe
8970: 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 6f  r to a KeyInfo o
8980: 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f  bject.*/.KeyInfo
8990: 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f   *sqlite3KeyInfo
89a0: 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b  Ref(KeyInfo *p){
89b0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
89c0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e  assert( p->nRef>
89d0: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66  0 );.    p->nRef
89e0: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
89f0: 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51   p;.}..#ifdef SQ
8a00: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
8a10: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
8a20: 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  a KeyInfo object
8a30: 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 2e 20   can be change. 
8a40: 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a   The KeyInfo obj
8a50: 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20  ect.** can only 
8a60: 62 65 20 63 68 61 6e 67 65 64 20 69 66 20 74 68  be changed if th
8a70: 69 73 20 69 73 20 6a 75 73 74 20 61 20 73 69 6e  is is just a sin
8a80: 67 6c 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  gle reference to
8a90: 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a   the object..**.
8aa0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8ab0: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e 73  is used only ins
8ac0: 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20  ide of assert() 
8ad0: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69  statements..*/.i
8ae0: 6e 74 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  nt sqlite3KeyInf
8af0: 6f 49 73 57 72 69 74 65 61 62 6c 65 28 4b 65 79  oIsWriteable(Key
8b00: 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75 72 6e  Info *p){ return
8b10: 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23   p->nRef==1; }.#
8b20: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
8b30: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
8b40: 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73  Given an express
8b50: 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61  ion list, genera
8b60: 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  te a KeyInfo str
8b70: 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63 6f  ucture that reco
8b80: 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61  rds.** the colla
8b90: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
8ba0: 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  r each expressio
8bb0: 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73  n in that expres
8bc0: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
8bd0: 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74   If the ExprList
8be0: 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
8bf0: 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  or GROUP BY clau
8c00: 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  se then the resu
8c10: 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f  lting.** KeyInfo
8c20: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70   structure is ap
8c30: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
8c40: 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72  itializing a vir
8c50: 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a  tual index to.**
8c60: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20   implement that 
8c70: 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 20  clause.  If the 
8c80: 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65 20  ExprList is the 
8c90: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20  result set of a 
8ca0: 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74  SELECT.** then t
8cb0: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
8cc0: 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69  ture is appropri
8cd0: 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69  ate for initiali
8ce0: 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a  zing a virtual.*
8cf0: 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65  * index to imple
8d00: 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20  ment a DISTINCT 
8d10: 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  test..**.** Spac
8d20: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65  e to hold the Ke
8d30: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
8d40: 69 73 20 6f 62 74 61 69 6e 20 66 72 6f 6d 20 6d  is obtain from m
8d50: 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c  alloc.  The call
8d60: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ing.** function 
8d70: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
8d80: 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20 74  or seeing that t
8d90: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
8da0: 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66   eventually.** f
8db0: 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  reed..*/.static 
8dc0: 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f  KeyInfo *keyInfo
8dd0: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20  FromExprList(.  
8de0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
8df0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
8e00: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
8e10: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
8e20: 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65    /* Form the Ke
8e30: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f  yInfo object fro
8e40: 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73 74 20  m this ExprList 
8e50: 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c  */.  int iStart,
8e60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67            /* Beg
8e70: 69 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f 6c  in with this col
8e80: 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a  umn of pList */.
8e90: 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20 20    int nExtra    
8ea0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
8eb0: 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63 6f  is many extra co
8ec0: 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e 64  lumns to the end
8ed0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 78   */.){.  int nEx
8ee0: 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  pr;.  KeyInfo *p
8ef0: 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45  Info;.  struct E
8f00: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
8f10: 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  tem;.  sqlite3 *
8f20: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
8f30: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78  .  int i;..  nEx
8f40: 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  pr = pList->nExp
8f50: 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c  r;.  pInfo = sql
8f60: 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
8f70: 28 64 62 2c 20 6e 45 78 70 72 2b 6e 45 78 74 72  (db, nExpr+nExtr
8f80: 61 2d 69 53 74 61 72 74 2c 20 31 29 3b 0a 20 20  a-iStart, 1);.  
8f90: 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20  if( pInfo ){.   
8fa0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8fb0: 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
8fc0: 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20 20  le(pInfo) );.   
8fd0: 20 66 6f 72 28 69 3d 69 53 74 61 72 74 2c 20 70   for(i=iStart, p
8fe0: 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2b 69 53  Item=pList->a+iS
8ff0: 74 61 72 74 3b 20 69 3c 6e 45 78 70 72 3b 20 69  tart; i<nExpr; i
9000: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
9010: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
9020: 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20  ll;.      pColl 
9030: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
9040: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74  lSeq(pParse, pIt
9050: 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
9060: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
9070: 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
9080: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66  Coll;.      pInf
9090: 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74 61 72  o->aColl[i-iStar
90a0: 74 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  t] = pColl;.    
90b0: 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72    pInfo->aSortOr
90c0: 64 65 72 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20  der[i-iStart] = 
90d0: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
90e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
90f0: 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 23  turn pInfo;.}..#
9100: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9110: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
9120: 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66  CT./*.** Name of
9130: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
9140: 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66  operator, used f
9150: 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  or error message
9160: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  s..*/.static con
9170: 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f  st char *selectO
9180: 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20  pName(int id){. 
9190: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74   char *z;.  swit
91a0: 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61  ch( id ){.    ca
91b0: 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20  se TK_ALL:      
91c0: 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22   z = "UNION ALL"
91d0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
91e0: 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  ase TK_INTERSECT
91f0: 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54  : z = "INTERSECT
9200: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
9210: 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20  case TK_EXCEPT: 
9220: 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b     z = "EXCEPT";
9230: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9240: 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20   default:       
9250: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b      z = "UNION";
9260: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9270: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  }.  return z;.}.
9280: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
9290: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
92a0: 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65  ELECT */..#ifnde
92b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
92c0: 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65  PLAIN./*.** Unle
92d0: 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51  ss an "EXPLAIN Q
92e0: 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61  UERY PLAN" comma
92f0: 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63  nd is being proc
9300: 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63  essed, this func
9310: 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  tion.** is a no-
9320: 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  op. Otherwise, i
9330: 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20  t adds a single 
9340: 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f  row of output to
9350: 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c   the EQP result,
9360: 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61  .** where the ca
9370: 70 74 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ption is of the 
9380: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55  form:.**.**   "U
9390: 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46  SE TEMP B-TREE F
93a0: 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68  OR xxx".**.** wh
93b0: 65 72 65 20 78 78 78 20 69 73 20 6f 6e 65 20 6f  ere xxx is one o
93c0: 66 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22 4f  f "DISTINCT", "O
93d0: 52 44 45 52 20 42 59 22 20 6f 72 20 22 47 52 4f  RDER BY" or "GRO
93e0: 55 50 20 42 59 22 2e 20 45 78 61 63 74 6c 79 20  UP BY". Exactly 
93f0: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 65 74 65  which.** is dete
9400: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 7a 55  rmined by the zU
9410: 73 61 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  sage argument..*
9420: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
9430: 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 50  plainTempTable(P
9440: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
9450: 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67 65  nst char *zUsage
9460: 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
9470: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20  >explain==2 ){. 
9480: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61     Vdbe *v = pPa
9490: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20  rse->pVdbe;.    
94a0: 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c  char *zMsg = sql
94b0: 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72  ite3MPrintf(pPar
94c0: 73 65 2d 3e 64 62 2c 20 22 55 53 45 20 54 45 4d  se->db, "USE TEM
94d0: 50 20 42 2d 54 52 45 45 20 46 4f 52 20 25 73 22  P B-TREE FOR %s"
94e0: 2c 20 7a 55 73 61 67 65 29 3b 0a 20 20 20 20 73  , zUsage);.    s
94f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
9500: 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
9510: 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
9520: 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50  d, 0, 0, zMsg, P
9530: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
9540: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
9550: 65 78 70 72 65 73 73 69 6f 6e 20 62 20 74 6f 20  expression b to 
9560: 6c 76 61 6c 75 65 20 61 2e 20 41 20 73 65 63 6f  lvalue a. A seco
9570: 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72 73 69  nd, no-op, versi
9580: 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f  on of this macro
9590: 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64 65 64 20  .** is provided 
95a0: 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4d 49 54  when SQLITE_OMIT
95b0: 5f 45 58 50 4c 41 49 4e 20 69 73 20 64 65 66 69  _EXPLAIN is defi
95c0: 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73  ned. This allows
95d0: 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 69 6e 20   the code.** in 
95e0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20  sqlite3Select() 
95f0: 74 6f 20 61 73 73 69 67 6e 20 76 61 6c 75 65 73  to assign values
9600: 20 74 6f 20 73 74 72 75 63 74 75 72 65 20 6d 65   to structure me
9610: 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73 20 74  mber variables t
9620: 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69 73  hat.** only exis
9630: 74 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  t if SQLITE_OMIT
9640: 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e 6f 74 20  _EXPLAIN is not 
9650: 64 65 66 69 6e 65 64 20 77 69 74 68 6f 75 74 20  defined without 
9660: 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65 0a 2a 2a  polluting the.**
9670: 20 63 6f 64 65 20 77 69 74 68 20 23 69 66 6e 64   code with #ifnd
9680: 65 66 20 64 69 72 65 63 74 69 76 65 73 2e 0a 2a  ef directives..*
9690: 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  /.# define expla
96a0: 69 6e 53 65 74 49 6e 74 65 67 65 72 28 61 2c 20  inSetInteger(a, 
96b0: 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c 73 65 0a  b) a = b..#else.
96c0: 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e  /* No-op version
96d0: 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e  s of the explain
96e0: 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  XXX() functions 
96f0: 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23  and macros. */.#
9700: 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 54   define explainT
9710: 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29 0a 23 20  empTable(y,z).# 
9720: 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65  define explainSe
9730: 74 49 6e 74 65 67 65 72 28 79 2c 7a 29 0a 23 65  tInteger(y,z).#e
9740: 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
9750: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ed(SQLITE_OMIT_E
9760: 58 50 4c 41 49 4e 29 20 26 26 20 21 64 65 66 69  XPLAIN) && !defi
9770: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
9780: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29  COMPOUND_SELECT)
9790: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e  ./*.** Unless an
97a0: 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20   "EXPLAIN QUERY 
97b0: 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73  PLAN" command is
97c0: 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64   being processed
97d0: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
97e0: 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f  ** is a no-op. O
97f0: 74 68 65 72 77 69 73 65 2c 20 69 74 20 61 64 64  therwise, it add
9800: 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  s a single row o
9810: 66 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20  f output to the 
9820: 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77  EQP result,.** w
9830: 68 65 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e  here the caption
9840: 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68   is of one of th
9850: 65 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a 0a  e two forms:.**.
9860: 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45 20  **   "COMPOSITE 
9870: 53 55 42 51 55 45 52 49 45 53 20 69 53 75 62 31  SUBQUERIES iSub1
9880: 20 61 6e 64 20 69 53 75 62 32 20 28 6f 70 29 22   and iSub2 (op)"
9890: 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45  .**   "COMPOSITE
98a0: 20 53 55 42 51 55 45 52 49 45 53 20 69 53 75 62   SUBQUERIES iSub
98b0: 31 20 61 6e 64 20 69 53 75 62 32 20 55 53 49 4e  1 and iSub2 USIN
98c0: 47 20 54 45 4d 50 20 42 2d 54 52 45 45 20 28 6f  G TEMP B-TREE (o
98d0: 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  p)".**.** where 
98e0: 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20  iSub1 and iSub2 
98f0: 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 73  are the integers
9900: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 63   passed as the c
9910: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
9920: 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74  function paramet
9930: 65 72 73 2c 20 61 6e 64 20 6f 70 20 69 73 20 74  ers, and op is t
9940: 68 65 20 74 65 78 74 20 72 65 70 72 65 73 65 6e  he text represen
9950: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  tation of the pa
9960: 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68  rameter.** of th
9970: 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 54 68 65  e same name. The
9980: 20 70 61 72 61 6d 65 74 65 72 20 22 6f 70 22 20   parameter "op" 
9990: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 54  must be one of T
99a0: 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45  K_UNION, TK_EXCE
99b0: 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54 45 52 53  PT,.** TK_INTERS
99c0: 45 43 54 20 6f 72 20 54 4b 5f 41 4c 4c 2e 20 54  ECT or TK_ALL. T
99d0: 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 69 73  he first form is
99e0: 20 75 73 65 64 20 69 66 20 61 72 67 75 6d 65 6e   used if argumen
99f0: 74 20 62 55 73 65 54 6d 70 20 69 73 20 0a 2a 2a  t bUseTmp is .**
9a00: 20 66 61 6c 73 65 2c 20 6f 72 20 74 68 65 20 73   false, or the s
9a10: 65 63 6f 6e 64 20 66 6f 72 6d 20 69 66 20 69 74  econd form if it
9a20: 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61   is true..*/.sta
9a30: 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
9a40: 43 6f 6d 70 6f 73 69 74 65 28 0a 20 20 50 61 72  Composite(.  Par
9a50: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
9a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9a70: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
9a80: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9aa0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f     /* One of TK_
9ab0: 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54  UNION, TK_EXCEPT
9ac0: 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 69   etc. */.  int i
9ad0: 53 75 62 31 2c 20 20 20 20 20 20 20 20 20 20 20  Sub1,           
9ae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
9af0: 62 71 75 65 72 79 20 69 64 20 31 20 2a 2f 0a 20  bquery id 1 */. 
9b00: 20 69 6e 74 20 69 53 75 62 32 2c 20 20 20 20 20   int iSub2,     
9b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b20: 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64 20   /* Subquery id 
9b30: 32 20 2a 2f 0a 20 20 69 6e 74 20 62 55 73 65 54  2 */.  int bUseT
9b40: 6d 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  mp              
9b50: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
9b60: 66 20 61 20 74 65 6d 70 20 74 61 62 6c 65 20 77  f a temp table w
9b70: 61 73 20 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20  as used */.){.  
9b80: 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 55  assert( op==TK_U
9b90: 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 45  NION || op==TK_E
9ba0: 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  XCEPT || op==TK_
9bb0: 49 4e 54 45 52 53 45 43 54 20 7c 7c 20 6f 70 3d  INTERSECT || op=
9bc0: 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20 69 66 28  =TK_ALL );.  if(
9bd0: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
9be0: 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20  ==2 ){.    Vdbe 
9bf0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
9c00: 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d  be;.    char *zM
9c10: 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
9c20: 6e 74 66 28 0a 20 20 20 20 20 20 20 20 70 50 61  ntf(.        pPa
9c30: 72 73 65 2d 3e 64 62 2c 20 22 43 4f 4d 50 4f 55  rse->db, "COMPOU
9c40: 4e 44 20 53 55 42 51 55 45 52 49 45 53 20 25 64  ND SUBQUERIES %d
9c50: 20 41 4e 44 20 25 64 20 25 73 28 25 73 29 22 2c   AND %d %s(%s)",
9c60: 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 0a 20   iSub1, iSub2,. 
9c70: 20 20 20 20 20 20 20 62 55 73 65 54 6d 70 3f 22         bUseTmp?"
9c80: 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45  USING TEMP B-TRE
9c90: 45 20 22 3a 22 22 2c 20 73 65 6c 65 63 74 4f 70  E ":"", selectOp
9ca0: 4e 61 6d 65 28 6f 70 29 0a 20 20 20 20 29 3b 0a  Name(op).    );.
9cb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9cc0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c  ddOp4(v, OP_Expl
9cd0: 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65  ain, pParse->iSe
9ce0: 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d  lectId, 0, 0, zM
9cf0: 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  sg, P4_DYNAMIC);
9d00: 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 20  .  }.}.#else./* 
9d10: 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f  No-op versions o
9d20: 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58 58  f the explainXXX
9d30: 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64  () functions and
9d40: 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65   macros. */.# de
9d50: 66 69 6e 65 20 65 78 70 6c 61 69 6e 43 6f 6d 70  fine explainComp
9d60: 6f 73 69 74 65 28 76 2c 77 2c 78 2c 79 2c 7a 29  osite(v,w,x,y,z)
9d70: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
9d80: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
9d90: 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 75   was generated u
9da0: 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20  sing a non-null 
9db0: 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e  pOrderBy argumen
9dc0: 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72  t,.** then the r
9dd0: 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63  esults were plac
9de0: 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20  ed in a sorter. 
9df0: 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20   After the loop 
9e00: 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a  is terminated.**
9e10: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20   we need to run 
9e20: 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f  the sorter and o
9e30: 75 74 70 75 74 20 74 68 65 20 72 65 73 75 6c 74  utput the result
9e40: 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
9e50: 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e  g.** routine gen
9e60: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
9e70: 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61  needed to do tha
9e80: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
9e90: 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61  d generateSortTa
9ea0: 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  il(.  Parse *pPa
9eb0: 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
9ec0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
9ed0: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
9ee0: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
9ef0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53  statement */.  S
9f00: 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20  ortCtx *pSort,  
9f10: 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
9f20: 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  on the ORDER BY 
9f30: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
9f40: 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a  nColumn,      /*
9f50: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
9f60: 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20  ns of data */.  
9f70: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
9f80: 74 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73  t /* Write the s
9f90: 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20 68 65  orted results he
9fa0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  re */.){.  Vdbe 
9fb0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
9fc0: 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  be;             
9fd0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
9fe0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
9ff0: 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42  t */.  int addrB
a000: 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
a010: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20  beMakeLabel(v); 
a020: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
a030: 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f   to exit loop */
a040: 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69  .  int addrConti
a050: 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nue = sqlite3Vdb
a060: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20  eMakeLabel(v);  
a070: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72  /* Jump here for
a080: 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20   next cycle */. 
a090: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74   int addr;.  int
a0a0: 20 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b 0a 20   addrOnce = 0;. 
a0b0: 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 45 78 70   int iTab;.  Exp
a0c0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
a0d0: 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42  = pSort->pOrderB
a0e0: 79 3b 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  y;.  int eDest =
a0f0: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20   pDest->eDest;. 
a100: 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65   int iParm = pDe
a110: 73 74 2d 3e 69 53 44 50 61 72 6d 3b 0a 20 20 69  st->iSDParm;.  i
a120: 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74  nt regRow;.  int
a130: 20 72 65 67 52 6f 77 69 64 3b 0a 20 20 69 6e 74   regRowid;.  int
a140: 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 53 6f   nKey;.  int iSo
a150: 72 74 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  rtTab;          
a160: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74           /* Sort
a170: 65 72 20 63 75 72 73 6f 72 20 74 6f 20 72 65 61  er cursor to rea
a180: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  d from */.  int 
a190: 6e 53 6f 72 74 44 61 74 61 3b 20 20 20 20 20 20  nSortData;      
a1a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a1b0: 72 61 69 6c 69 6e 67 20 76 61 6c 75 65 73 20 74  railing values t
a1c0: 6f 20 72 65 61 64 20 66 72 6f 6d 20 73 6f 72 74  o read from sort
a1d0: 65 72 20 2a 2f 0a 20 20 75 38 20 70 35 3b 20 20  er */.  u8 p5;  
a1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1f0: 20 20 20 20 20 20 20 20 2f 2a 20 70 35 20 70 61          /* p5 pa
a200: 72 61 6d 65 74 65 72 20 66 6f 72 20 31 73 74 20  rameter for 1st 
a210: 4f 50 5f 43 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69  OP_Column */.  i
a220: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 53 65 71  nt i;.  int bSeq
a230: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a240: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
a250: 69 66 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  if sorter record
a260: 20 69 6e 63 6c 75 64 65 73 20 73 65 71 2e 20 6e   includes seq. n
a270: 6f 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  o. */.#ifdef SQL
a280: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
a290: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 73 74  IN_COMMENTS.  st
a2a0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
a2b0: 65 6d 20 2a 61 4f 75 74 45 78 20 3d 20 70 2d 3e  em *aOutEx = p->
a2c0: 70 45 4c 69 73 74 2d 3e 61 3b 0a 23 65 6e 64 69  pEList->a;.#endi
a2d0: 66 0a 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e  f..  if( pSort->
a2e0: 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20  labelBkOut ){.  
a2f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a300: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
a310: 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72   pSort->regRetur
a320: 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42  n, pSort->labelB
a330: 6b 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  kOut);.    sqlit
a340: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a350: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
a360: 42 72 65 61 6b 29 3b 0a 20 20 20 20 73 71 6c 69  Break);.    sqli
a370: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
a380: 62 65 6c 28 76 2c 20 70 53 6f 72 74 2d 3e 6c 61  bel(v, pSort->la
a390: 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 7d 0a 20  belBkOut);.  }. 
a3a0: 20 69 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e 69   iTab = pSort->i
a3b0: 45 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 65  ECursor;.  if( e
a3c0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
a3d0: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
a3e0: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
a3f0: 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20  regRowid = 0;.  
a400: 20 20 72 65 67 52 6f 77 20 3d 20 70 44 65 73 74    regRow = pDest
a410: 2d 3e 69 53 64 73 74 3b 0a 20 20 20 20 6e 53 6f  ->iSdst;.    nSo
a420: 72 74 44 61 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e  rtData = nColumn
a430: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
a440: 65 67 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65  egRowid = sqlite
a450: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
a460: 73 65 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 20  se);.    regRow 
a470: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
a480: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
a490: 20 6e 53 6f 72 74 44 61 74 61 20 3d 20 31 3b 0a   nSortData = 1;.
a4a0: 20 20 7d 0a 20 20 6e 4b 65 79 20 3d 20 70 4f 72    }.  nKey = pOr
a4b0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2d 20 70  derBy->nExpr - p
a4c0: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20  Sort->nOBSat;.  
a4d0: 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46  if( pSort->sortF
a4e0: 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f  lags & SORTFLAG_
a4f0: 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20  UseSorter ){.   
a500: 20 69 6e 74 20 72 65 67 53 6f 72 74 4f 75 74 20   int regSortOut 
a510: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
a520: 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d  ;.    iSortTab =
a530: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
a540: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e  .    if( pSort->
a550: 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20  labelBkOut ){.  
a560: 20 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73      addrOnce = s
a570: 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70  qlite3CodeOnce(p
a580: 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65  Parse); VdbeCove
a590: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20  rage(v);.    }. 
a5a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a5b0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp3(v, OP_OpenP
a5c0: 73 65 75 64 6f 2c 20 69 53 6f 72 74 54 61 62 2c  seudo, iSortTab,
a5d0: 20 72 65 67 53 6f 72 74 4f 75 74 2c 20 6e 4b 65   regSortOut, nKe
a5e0: 79 2b 31 2b 6e 53 6f 72 74 44 61 74 61 29 3b 0a  y+1+nSortData);.
a5f0: 20 20 20 20 69 66 28 20 61 64 64 72 4f 6e 63 65      if( addrOnce
a600: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75   ) sqlite3VdbeJu
a610: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4f 6e  mpHere(v, addrOn
a620: 63 65 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20  ce);.    addr = 
a630: 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 + sqlite3VdbeA
a640: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
a650: 65 72 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64  erSort, iTab, ad
a660: 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64  drBreak);.    Vd
a670: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
a680: 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c     codeOffset(v,
a690: 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64   p->iOffset, add
a6a0: 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  rContinue);.    
a6b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a6c0: 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61  2(v, OP_SorterDa
a6d0: 74 61 2c 20 69 54 61 62 2c 20 72 65 67 53 6f 72  ta, iTab, regSor
a6e0: 74 4f 75 74 29 3b 0a 20 20 20 20 70 35 20 3d 20  tOut);.    p5 = 
a6f0: 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43 48  OPFLAG_CLEARCACH
a700: 45 3b 0a 20 20 20 20 62 53 65 71 20 3d 20 30 3b  E;.    bSeq = 0;
a710: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64  .  }else{.    ad
a720: 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33  dr = 1 + sqlite3
a730: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
a740: 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64  _Sort, iTab, add
a750: 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  rBreak); VdbeCov
a760: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f  erage(v);.    co
a770: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69  deOffset(v, p->i
a780: 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74  Offset, addrCont
a790: 69 6e 75 65 29 3b 0a 20 20 20 20 69 53 6f 72 74  inue);.    iSort
a7a0: 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  Tab = iTab;.    
a7b0: 70 35 20 3d 20 30 3b 0a 20 20 20 20 62 53 65 71  p5 = 0;.    bSeq
a7c0: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28   = 1;.  }.  for(
a7d0: 69 3d 30 3b 20 69 3c 6e 53 6f 72 74 44 61 74 61  i=0; i<nSortData
a7e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
a7f0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
a800: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72   OP_Column, iSor
a810: 74 54 61 62 2c 20 6e 4b 65 79 2b 62 53 65 71 2b  tTab, nKey+bSeq+
a820: 69 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20 20  i, regRow+i);.  
a830: 20 20 69 66 28 20 69 3d 3d 30 20 29 20 73 71 6c    if( i==0 ) sql
a840: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
a850: 28 76 2c 20 70 35 29 3b 0a 20 20 20 20 56 64 62  (v, p5);.    Vdb
a860: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
a870: 22 2c 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61  ", aOutEx[i].zNa
a880: 6d 65 20 3f 20 61 4f 75 74 45 78 5b 69 5d 2e 7a  me ? aOutEx[i].z
a890: 4e 61 6d 65 20 3a 20 61 4f 75 74 45 78 5b 69 5d  Name : aOutEx[i]
a8a0: 2e 7a 53 70 61 6e 29 29 3b 0a 20 20 7d 0a 20 20  .zSpan));.  }.  
a8b0: 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b  switch( eDest ){
a8c0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
a8d0: 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
a8e0: 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20  T_EphemTab: {.  
a8f0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
a900: 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29  est==SRT_Table )
a910: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
a920: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ( eDest==SRT_Eph
a930: 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 73  emTab );.      s
a940: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a950: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
a960: 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64   iParm, regRowid
a970: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
a980: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
a990: 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  _Insert, iParm, 
a9a0: 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64  regRow, regRowid
a9b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
a9c0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
a9d0: 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
a9e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a9f0: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
aa00: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
aa10: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
aa20: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
aa30: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
aa40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
aa50: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
aa60: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77  keRecord, regRow
aa70: 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 2c 0a 20  , 1, regRowid,. 
aa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa90: 20 20 20 20 20 20 20 26 70 44 65 73 74 2d 3e 61         &pDest->a
aaa0: 66 66 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20  ffSdst, 1);.    
aab0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
aac0: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
aad0: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c  (pParse, regRow,
aae0: 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
aaf0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ab00: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
ab10: 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  arm, regRowid);.
ab20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ab30: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f   }.    case SRT_
ab40: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Mem: {.      ass
ab50: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  ert( nColumn==1 
ab60: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ab70: 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
ab80: 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 69 50 61  rse, regRow, iPa
ab90: 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a  rm, 1);.      /*
aba0: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
abb0: 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65  e will terminate
abc0: 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
abd0: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
abe0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
abf0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
ac00: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
ac10: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20  ==SRT_Output || 
ac20: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
ac30: 74 69 6e 65 20 29 3b 20 0a 20 20 20 20 20 20 74  tine ); .      t
ac40: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
ac50: 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20  SRT_Output );.  
ac60: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
ac70: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
ac80: 6e 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ne );.      if( 
ac90: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
aca0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
acb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
acc0: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
acd0: 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43  pDest->iSdst, nC
ace0: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20  olumn);.        
acf0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
ad00: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
ad10: 50 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69 53  Parse, pDest->iS
ad20: 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  dst, nColumn);. 
ad30: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ad40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ad50: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
ad60: 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
ad70: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
ad80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
ad90: 20 7d 0a 20 20 69 66 28 20 72 65 67 52 6f 77 69   }.  if( regRowi
ada0: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
adb0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
adc0: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a  Parse, regRow);.
add0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
ade0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
adf0: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 7d  , regRowid);.  }
ae00: 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d  .  /* The bottom
ae10: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a   of the loop.  *
ae20: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
ae30: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
ae40: 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  ddrContinue);.  
ae50: 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46  if( pSort->sortF
ae60: 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f  lags & SORTFLAG_
ae70: 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20  UseSorter ){.   
ae80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ae90: 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e  p2(v, OP_SorterN
aea0: 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29  ext, iTab, addr)
aeb0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
aec0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
aed0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
aee0: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54  2(v, OP_Next, iT
aef0: 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62 65 43  ab, addr); VdbeC
af00: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
af10: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 72 65 67    if( pSort->reg
af20: 52 65 74 75 72 6e 20 29 20 73 71 6c 69 74 65 33  Return ) sqlite3
af30: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
af40: 5f 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e  _Return, pSort->
af50: 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 73 71  regReturn);.  sq
af60: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
af70: 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65  Label(v, addrBre
af80: 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ak);.}../*.** Re
af90: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
afa0: 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  o a string conta
afb0: 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c 61  ining the 'decla
afc0: 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66 20  ration type' of 
afd0: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
afe0: 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73 74 72  n pExpr. The str
aff0: 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61 74  ing may be treat
b000: 65 64 20 61 73 20 73 74 61 74 69 63 20 62 79 20  ed as static by 
b010: 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  the caller..**.*
b020: 2a 20 41 6c 73 6f 20 74 72 79 20 74 6f 20 65 73  * Also try to es
b030: 74 69 6d 61 74 65 20 74 68 65 20 73 69 7a 65 20  timate the size 
b040: 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  of the returned 
b050: 76 61 6c 75 65 20 61 6e 64 20 72 65 74 75 72 6e  value and return
b060: 20 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20   that.** result 
b070: 69 6e 20 2a 70 45 73 74 57 69 64 74 68 2e 0a 2a  in *pEstWidth..*
b080: 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61  *.** The declara
b090: 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65  tion type is the
b0a0: 20 65 78 61 63 74 20 64 61 74 61 74 79 70 65 20   exact datatype 
b0b0: 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61  definition extra
b0c0: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  cted from the.**
b0d0: 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45   original CREATE
b0e0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
b0f0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
b100: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20  on is a column. 
b110: 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69  The.** declarati
b120: 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f  on type for a RO
b130: 57 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54  WID field is INT
b140: 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68  EGER. Exactly wh
b150: 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  en an expression
b160: 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
b170: 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62  d a column can b
b180: 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65  e complex in the
b190: 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62   presence of sub
b1a0: 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20  queries. The.** 
b1b0: 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65  result-set expre
b1c0: 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20  ssion in all of 
b1d0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45  the following SE
b1e0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
b1f0: 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65  is .** considere
b200: 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68  d a column by th
b210: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
b220: 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20  **   SELECT col 
b230: 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53  FROM tbl;.**   S
b240: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f  ELECT (SELECT co
b250: 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20  l FROM tbl;.**  
b260: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
b270: 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a  col FROM tbl);.*
b280: 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63 20 46  *   SELECT abc F
b290: 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20  ROM (SELECT col 
b2a0: 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29  AS abc FROM tbl)
b2b0: 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63  ;.** .** The dec
b2c0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f  laration type fo
b2d0: 72 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  r any expression
b2e0: 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f   other than a co
b2f0: 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  lumn is NULL..**
b300: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
b310: 20 68 61 73 20 65 69 74 68 65 72 20 33 20 6f 72   has either 3 or
b320: 20 36 20 70 61 72 61 6d 65 74 65 72 73 20 64 65   6 parameters de
b330: 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
b340: 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65  er or not.** the
b350: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
b360: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 63  OLUMN_METADATA c
b370: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
b380: 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 23  on is used..*/.#
b390: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
b3a0: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
b3b0: 41 54 41 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c  ATA.# define col
b3c0: 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c  umnType(A,B,C,D,
b3d0: 45 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49  E,F) columnTypeI
b3e0: 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29  mpl(A,B,C,D,E,F)
b3f0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
b400: 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d  ar *columnTypeIm
b410: 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  pl(.  NameContex
b420: 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20  t *pNC, .  Expr 
b430: 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20  *pExpr,.  const 
b440: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c  char **pzOrigDb,
b450: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
b460: 70 7a 4f 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e  pzOrigTab,.  con
b470: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67  st char **pzOrig
b480: 43 6f 6c 2c 0a 20 20 75 38 20 2a 70 45 73 74 57  Col,.  u8 *pEstW
b490: 69 64 74 68 0a 29 7b 0a 20 20 63 68 61 72 20 63  idth.){.  char c
b4a0: 6f 6e 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20  onst *zOrigDb = 
b4b0: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
b4c0: 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20  *zOrigTab = 0;. 
b4d0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72   char const *zOr
b4e0: 69 67 43 6f 6c 20 3d 20 30 3b 0a 23 65 6c 73 65  igCol = 0;.#else
b4f0: 20 2f 2a 20 69 66 20 21 64 65 66 69 6e 65 64 28   /* if !defined(
b500: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
b510: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a  LUMN_METADATA) *
b520: 2f 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d  /.# define colum
b530: 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c  nType(A,B,C,D,E,
b540: 46 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70  F) columnTypeImp
b550: 6c 28 41 2c 42 2c 46 29 0a 73 74 61 74 69 63 20  l(A,B,F).static 
b560: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75  const char *colu
b570: 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61  mnTypeImpl(.  Na
b580: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
b590: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a  .  Expr *pExpr,.
b5a0: 20 20 75 38 20 2a 70 45 73 74 57 69 64 74 68 0a    u8 *pEstWidth.
b5b0: 29 7b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  ){.#endif /* !de
b5c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
b5d0: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
b5e0: 41 54 41 29 20 2a 2f 0a 20 20 63 68 61 72 20 63  ATA) */.  char c
b5f0: 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b  onst *zType = 0;
b600: 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 75 38 20 65  .  int j;.  u8 e
b610: 73 74 57 69 64 74 68 20 3d 20 31 3b 0a 0a 20 20  stWidth = 1;..  
b620: 69 66 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d  if( NEVER(pExpr=
b630: 3d 30 29 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63  =0) || pNC->pSrc
b640: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
b650: 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45   0;.  switch( pE
b660: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
b670: 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  ase TK_AGG_COLUM
b680: 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  N:.    case TK_C
b690: 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f  OLUMN: {.      /
b6a0: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
b6b0: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f   is a column. Lo
b6c0: 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 74  cate the table t
b6d0: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69  he column is bei
b6e0: 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72  ng.      ** extr
b6f0: 61 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61  acted from in Na
b700: 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69  meContext.pSrcLi
b710: 73 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d  st. This table m
b720: 61 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20  ay be real.     
b730: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61 62   ** database tab
b740: 6c 65 20 6f 72 20 61 20 73 75 62 71 75 65 72 79  le or a subquery
b750: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
b760: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30   Table *pTab = 0
b770: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
b780: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
b790: 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63  column is extrac
b7a0: 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20  ted from */.    
b7b0: 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30    Select *pS = 0
b7c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
b7d0: 20 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75   Select the colu
b7e0: 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20  mn is extracted 
b7f0: 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e  from */.      in
b800: 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e  t iCol = pExpr->
b810: 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64  iColumn;  /* Ind
b820: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20  ex of column in 
b830: 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 74 65  pTab */.      te
b840: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
b850: 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
b860: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
b870: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
b880: 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
b890: 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20    while( pNC && 
b8a0: 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  !pTab ){.       
b8b0: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
b8c0: 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69  st = pNC->pSrcLi
b8d0: 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  st;.        for(
b8e0: 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  j=0;j<pTabList->
b8f0: 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74  nSrc && pTabList
b900: 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d  ->a[j].iCursor!=
b910: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b  pExpr->iTable;j+
b920: 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +);.        if( 
b930: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
b940: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54   ){.          pT
b950: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
b960: 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [j].pTab;.      
b970: 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69 73      pS = pTabLis
b980: 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b  t->a[j].pSelect;
b990: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
b9a0: 20 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d 20            pNC = 
b9b0: 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pNC->pNext;.    
b9c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
b9d0: 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
b9e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
b9f0: 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f 64 65  t one time, code
ba00: 20 73 75 63 68 20 61 73 20 22 53 45 4c 45 43 54   such as "SELECT
ba10: 20 6e 65 77 2e 78 22 20 77 69 74 68 69 6e 20 61   new.x" within a
ba20: 20 74 72 69 67 67 65 72 20 77 6f 75 6c 64 0a 20   trigger would. 
ba30: 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20         ** cause 
ba40: 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 74  this condition t
ba50: 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65 20 74 68  o run.  Since th
ba60: 65 6e 2c 20 77 65 20 68 61 76 65 20 72 65 73 74  en, we have rest
ba70: 72 75 63 74 75 72 65 64 20 68 6f 77 0a 20 20 20  ructured how.   
ba80: 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20       ** trigger 
ba90: 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65  code is generate
baa0: 64 20 61 6e 64 20 73 6f 20 74 68 69 73 20 63 6f  d and so this co
bab0: 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f  ndition is no lo
bac0: 6e 67 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a  nger .        **
bad0: 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65 76   possible. Howev
bae0: 65 72 2c 20 69 74 20 63 61 6e 20 73 74 69 6c 6c  er, it can still
baf0: 20 62 65 20 74 72 75 65 20 66 6f 72 20 73 74 61   be true for sta
bb00: 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20 20  tements like.   
bb10: 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c       ** the foll
bb20: 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20 20 20 2a  owing:.        *
bb30: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 43  *.        **   C
bb40: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 63  REATE TABLE t1(c
bb50: 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 20  ol INTEGER);.   
bb60: 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54       **   SELECT
bb70: 20 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29   (SELECT t1.col)
bb80: 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a 20   FROM FROM t1;. 
bb90: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
bba0: 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75 6d 6e    ** when column
bbb0: 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64  Type() is called
bbc0: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
bbd0: 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e 20 74  on "t1.col" in t
bbe0: 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  he .        ** s
bbf0: 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20 74 68  ub-select. In th
bc00: 69 73 20 63 61 73 65 2c 20 73 65 74 20 74 68 65  is case, set the
bc10: 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74 6f 20   column type to 
bc20: 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20 20 20  NULL, even.     
bc30: 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 69 74 20     ** though it 
bc40: 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20 62 65  should really be
bc50: 20 22 49 4e 54 45 47 45 52 22 2e 0a 20 20 20 20   "INTEGER"..    
bc60: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
bc70: 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
bc80: 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68 65 20  problem, as the 
bc90: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66 20 22  column type of "
bca0: 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76 65 72  t1.col" is never
bcb0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 64  .        ** used
bcc0: 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70  . When columnTyp
bcd0: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
bce0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
bcf0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 28 53 45  .        ** "(SE
bd00: 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c 20 74  LECT t1.col)", t
bd10: 68 65 20 63 6f 72 72 65 63 74 20 74 79 70 65 20  he correct type 
bd20: 69 73 20 72 65 74 75 72 6e 65 64 20 28 73 65 65  is returned (see
bd30: 20 74 68 65 20 54 4b 5f 53 45 4c 45 43 54 0a 20   the TK_SELECT. 
bd40: 20 20 20 20 20 20 20 2a 2a 20 62 72 61 6e 63 68         ** branch
bd50: 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20   below.  */.    
bd60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bd70: 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
bd80: 28 20 70 54 61 62 20 26 26 20 70 45 78 70 72 2d  ( pTab && pExpr-
bd90: 3e 70 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20  >pTab==pTab );. 
bda0: 20 20 20 20 20 69 66 28 20 70 53 20 29 7b 0a 20       if( pS ){. 
bdb0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 74         /* The "t
bdc0: 61 62 6c 65 22 20 69 73 20 61 63 74 75 61 6c 6c  able" is actuall
bdd0: 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  y a sub-select o
bde0: 72 20 61 20 76 69 65 77 20 69 6e 20 74 68 65 20  r a view in the 
bdf0: 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20  FROM clause.    
be00: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 53 45      ** of the SE
be10: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
be20: 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61  Return the decla
be30: 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 20  ration type and 
be40: 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20 20 2a  origin.        *
be50: 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 72  * data for the r
be60: 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e  esult-set column
be70: 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65   of the sub-sele
be80: 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ct..        */. 
be90: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e         if( iCol>
bea0: 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69 43 6f  =0 && ALWAYS(iCo
beb0: 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  l<pS->pEList->nE
bec0: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
bed0: 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20    /* If iCol is 
bee0: 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
bef0: 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
bf00: 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68 65  ion requests the
bf10: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f  .          ** ro
bf20: 77 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73  wid of the sub-s
bf30: 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54  elect or view. T
bf40: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69  his expression i
bf50: 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20  s legal (see .  
bf60: 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20          ** test 
bf70: 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20  case misc2.2.2) 
bf80: 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c  - it always eval
bf90: 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20  uates to NULL.. 
bfa0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
bfb0: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
bfc0: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20  t sNC;.         
bfd0: 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70   Expr *p = pS->p
bfe0: 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70  EList->a[iCol].p
bff0: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
c000: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
c010: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20  S->pSrc;.       
c020: 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70     sNC.pNext = p
c030: 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  NC;.          sN
c040: 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e  C.pParse = pNC->
c050: 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20  pParse;.        
c060: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
c070: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f  Type(&sNC, p,&zO
c080: 72 69 67 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c  rigDb,&zOrigTab,
c090: 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65 73 74 57  &zOrigCol, &estW
c0a0: 69 64 74 68 29 3b 20 0a 20 20 20 20 20 20 20 20  idth); .        
c0b0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
c0c0: 28 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ( pTab->pSchema 
c0d0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ){.        /* A 
c0e0: 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  real table */.  
c0f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
c100: 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  S );.        if(
c110: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
c120: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
c130: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
c140: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
c150: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
c160: 3e 6e 43 6f 6c 29 20 29 3b 0a 23 69 66 64 65 66  >nCol) );.#ifdef
c170: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
c180: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
c190: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
c1a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  0 ){.          z
c1b0: 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22  Type = "INTEGER"
c1c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
c1d0: 67 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a  gCol = "rowid";.
c1e0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
c1f0: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
c200: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
c210: 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20  ].zType;.       
c220: 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54     zOrigCol = pT
c230: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
c240: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
c250: 65 73 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d  estWidth = pTab-
c260: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73  >aCol[iCol].szEs
c270: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
c280: 20 20 20 20 20 7a 4f 72 69 67 54 61 62 20 3d 20       zOrigTab = 
c290: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
c2a0: 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50       if( pNC->pP
c2b0: 61 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  arse ){.        
c2c0: 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
c2d0: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
c2e0: 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62  (pNC->pParse->db
c2f0: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
c300: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
c310: 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  gDb = pNC->pPars
c320: 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
c330: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d  zName;.        }
c340: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69  .#else.        i
c350: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
c360: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22         zType = "
c370: 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20  INTEGER";.      
c380: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c390: 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d     zType = pTab-
c3a0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70  >aCol[iCol].zTyp
c3b0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73 74  e;.          est
c3c0: 57 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43  Width = pTab->aC
c3d0: 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a  ol[iCol].szEst;.
c3e0: 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
c3f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
c400: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
c410: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c420: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
c430: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
c440: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
c450: 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d  ession is a sub-
c460: 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74  select. Return t
c470: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
c480: 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ype and.      **
c490: 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72   origin info for
c4a0: 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75   the single colu
c4b0: 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  mn in the result
c4c0: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
c4d0: 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  CT.      ** stat
c4e0: 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ement..      */.
c4f0: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
c500: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c  t sNC;.      Sel
c510: 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d  ect *pS = pExpr-
c520: 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  >x.pSelect;.    
c530: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e    Expr *p = pS->
c540: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
c550: 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
c560: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
c570: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
c580: 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
c590: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
c5a0: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73  S->pSrc;.      s
c5b0: 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a  NC.pNext = pNC;.
c5c0: 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65        sNC.pParse
c5d0: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
c5e0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f        zType = co
c5f0: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
c600: 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72  , &zOrigDb, &zOr
c610: 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c  igTab, &zOrigCol
c620: 2c 20 26 65 73 74 57 69 64 74 68 29 3b 20 0a 20  , &estWidth); . 
c630: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c640: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69  }.#endif.  }..#i
c650: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
c660: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
c670: 54 41 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69  TA  .  if( pzOri
c680: 67 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  gDb ){.    asser
c690: 74 28 20 70 7a 4f 72 69 67 54 61 62 20 26 26 20  t( pzOrigTab && 
c6a0: 70 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20  pzOrigCol );.   
c6b0: 20 2a 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72   *pzOrigDb = zOr
c6c0: 69 67 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  igDb;.    *pzOri
c6d0: 67 54 61 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b  gTab = zOrigTab;
c6e0: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20  .    *pzOrigCol 
c6f0: 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a  = zOrigCol;.  }.
c700: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 45 73  #endif.  if( pEs
c710: 74 57 69 64 74 68 20 29 20 2a 70 45 73 74 57 69  tWidth ) *pEstWi
c720: 64 74 68 20 3d 20 65 73 74 57 69 64 74 68 3b 0a  dth = estWidth;.
c730: 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a    return zType;.
c740: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
c750: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
c760: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
c770: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
c780: 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a  ypes of columns.
c790: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
c7a0: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
c7b0: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
c7c0: 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73  umnTypes(.  Pars
c7d0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
c7e0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
c7f0: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
c800: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
c810: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
c820: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
c830: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
c840: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
c850: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
c860: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
c870: 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a  E_OMIT_DECLTYPE.
c880: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
c890: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
c8a0: 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
c8b0: 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72  t sNC;.  sNC.pSr
c8c0: 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  cList = pTabList
c8d0: 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d  ;.  sNC.pParse =
c8e0: 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69   pParse;.  for(i
c8f0: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
c900: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
c910: 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d  xpr *p = pEList-
c920: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
c930: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
c940: 70 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  pe;.#ifdef SQLIT
c950: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
c960: 4d 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e  METADATA.    con
c970: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62  st char *zOrigDb
c980: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
c990: 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d  char *zOrigTab =
c9a0: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
c9b0: 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30  ar *zOrigCol = 0
c9c0: 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  ;.    zType = co
c9d0: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
c9e0: 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72  , &zOrigDb, &zOr
c9f0: 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c  igTab, &zOrigCol
ca00: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  , 0);..    /* Th
ca10: 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65  e vdbe must make
ca20: 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66   its own copy of
ca30: 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65   the column-type
ca40: 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20   and other .    
ca50: 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66  ** column specif
ca60: 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63  ic strings, in c
ca70: 61 73 65 20 74 68 65 20 73 63 68 65 6d 61 20 69  ase the schema i
ca80: 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74  s reset before t
ca90: 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75  his.    ** virtu
caa0: 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65  al machine is de
cab0: 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
cac0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
cad0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
cae0: 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20  LNAME_DATABASE, 
caf0: 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49 54 45 5f  zOrigDb, SQLITE_
cb00: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
cb10: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
cb20: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
cb30: 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67  AME_TABLE, zOrig
cb40: 54 61 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Tab, SQLITE_TRAN
cb50: 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
cb60: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
cb70: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
cb80: 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c  COLUMN, zOrigCol
cb90: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
cba0: 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a  NT);.#else.    z
cbb0: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
cbc0: 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c  e(&sNC, p, 0, 0,
cbd0: 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20   0, 0);.#endif. 
cbe0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
cbf0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
cc00: 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c  OLNAME_DECLTYPE,
cc10: 20 7a 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54   zType, SQLITE_T
cc20: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23  RANSIENT);.  }.#
cc30: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
cc40: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  d(SQLITE_OMIT_DE
cc50: 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 2f 2a  CLTYPE) */.}../*
cc60: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
cc70: 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c  e that will tell
cc80: 20 74 68 65 20 56 44 42 45 20 74 68 65 20 6e 61   the VDBE the na
cc90: 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  mes of columns.*
cca0: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
ccb0: 73 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  set.  This infor
ccc0: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  mation is used t
ccd0: 6f 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a  o provide the.**
cce0: 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20   azCol[] values 
ccf0: 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e  in the callback.
cd00: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
cd10: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
cd20: 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  mes(.  Parse *pP
cd30: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
cd40: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
cd50: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
cd60: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
cd70: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70   tables */.  Exp
cd80: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
cd90: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
cda0: 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73  defining the res
cdb0: 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20  ult set */.){.  
cdc0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
cdd0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
cde0: 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  , j;.  sqlite3 *
cdf0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
ce00: 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73  .  int fullNames
ce10: 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23  , shortNames;..#
ce20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ce30: 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20  IT_EXPLAIN.  /* 
ce40: 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58  If this is an EX
ce50: 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73  PLAIN, skip this
ce60: 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70   step */.  if( p
ce70: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
ce80: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
ce90: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
cea0: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
ceb0: 53 65 74 20 7c 7c 20 4e 45 56 45 52 28 76 3d 3d  Set || NEVER(v==
cec0: 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  0) || db->malloc
ced0: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
cee0: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61  .  pParse->colNa
cef0: 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75  mesSet = 1;.  fu
cf00: 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66  llNames = (db->f
cf10: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
cf20: 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a  llColNames)!=0;.
cf30: 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28    shortNames = (
cf40: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
cf50: 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
cf60: 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56  )!=0;.  sqlite3V
cf70: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
cf80: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
cf90: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
cfa0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
cfb0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a  ){.    Expr *p;.
cfc0: 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e      p = pEList->
cfd0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
cfe0: 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
cff0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
d000: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
d010: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
d020: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45  char *zName = pE
d030: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
d040: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d050: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
d060: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
d070: 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
d080: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
d090: 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f 70  }else if( (p->op
d0a0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  ==TK_COLUMN || p
d0b0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
d0c0: 55 4d 4e 29 20 26 26 20 70 54 61 62 4c 69 73 74  UMN) && pTabList
d0d0: 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20   ){.      Table 
d0e0: 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61  *pTab;.      cha
d0f0: 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69  r *zCol;.      i
d100: 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f  nt iCol = p->iCo
d110: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28  lumn;.      for(
d120: 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70 54  j=0; ALWAYS(j<pT
d130: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 20 6a  abList->nSrc); j
d140: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
d150: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
d160: 69 43 75 72 73 6f 72 3d 3d 70 2d 3e 69 54 61 62  iCursor==p->iTab
d170: 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  le ) break;.    
d180: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
d190: 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ( j<pTabList->nS
d1a0: 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  rc );.      pTab
d1b0: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
d1c0: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66  ].pTab;.      if
d1d0: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
d1e0: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
d1f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
d200: 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
d210: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
d220: 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69  nCol) );.      i
d230: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
d240: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77       zCol = "row
d250: 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id";.      }else
d260: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
d270: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
d280: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  ].zName;.      }
d290: 0a 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72  .      if( !shor
d2a0: 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e  tNames && !fullN
d2b0: 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
d2c0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
d2d0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
d2e0: 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20  AME_NAME, .     
d2f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
d300: 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73  StrDup(db, pELis
d310: 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20  t->a[i].zSpan), 
d320: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
d330: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
d340: 20 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20   fullNames ){.  
d350: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
d360: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a  e = 0;.        z
d370: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
d380: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
d390: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
d3a0: 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  zCol);.        s
d3b0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
d3c0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
d3d0: 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20  ME_NAME, zName, 
d3e0: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
d3f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
d400: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d410: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
d420: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
d430: 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41  zCol, SQLITE_TRA
d440: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d  NSIENT);.      }
d450: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d460: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
d470: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
d480: 53 70 61 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20  Span;.      z = 
d490: 7a 3d 3d 30 20 3f 20 73 71 6c 69 74 65 33 4d 50  z==0 ? sqlite3MP
d4a0: 72 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d  rintf(db, "colum
d4b0: 6e 25 64 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c  n%d", i+1) : sql
d4c0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
d4d0: 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   z);.      sqlit
d4e0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
d4f0: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
d500: 41 4d 45 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44  AME, z, SQLITE_D
d510: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20  YNAMIC);.    }. 
d520: 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c   }.  generateCol
d530: 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c  umnTypes(pParse,
d540: 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
d550: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  t);.}../*.** Giv
d560: 65 6e 20 61 20 61 6e 20 65 78 70 72 65 73 73 69  en a an expressi
d570: 6f 6e 20 6c 69 73 74 20 28 77 68 69 63 68 20 69  on list (which i
d580: 73 20 72 65 61 6c 6c 79 20 74 68 65 20 6c 69 73  s really the lis
d590: 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
d5a0: 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20 74 68  .** that form th
d5b0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
d5c0: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
d5d0: 6e 74 29 20 63 6f 6d 70 75 74 65 20 61 70 70 72  nt) compute appr
d5e0: 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d  opriate.** colum
d5f0: 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 74 61  n names for a ta
d600: 62 6c 65 20 74 68 61 74 20 77 6f 75 6c 64 20 68  ble that would h
d610: 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69  old the expressi
d620: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41  on list..**.** A
d630: 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ll column names 
d640: 77 69 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a  will be unique..
d650: 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63  **.** Only the c
d660: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20  olumn names are 
d670: 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d  computed.  Colum
d680: 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e  n.zType, Column.
d690: 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74  zColl,.** and ot
d6a0: 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 43 6f  her fields of Co
d6b0: 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e  lumn are zeroed.
d6c0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
d6d0: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
d6e0: 73 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79  ss.  If a memory
d6f0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
d700: 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f  r occurs,.** sto
d710: 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f  re NULL in *paCo
d720: 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f  l and 0 in *pnCo
d730: 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  l and return SQL
d740: 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74  ITE_NOMEM..*/.st
d750: 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 43  atic int selectC
d760: 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
d770: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
d780: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
d790: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
d7a0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
d7b0: 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  pEList,       /*
d7c0: 20 45 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20   Expr list from 
d7d0: 77 68 69 63 68 20 74 6f 20 64 65 72 69 76 65 20  which to derive 
d7e0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
d7f0: 20 20 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20    i16 *pnCol,   
d800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
d810: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
d820: 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f   columns here */
d830: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f  .  Column **paCo
d840: 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  l          /* Wr
d850: 69 74 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75  ite the new colu
d860: 6d 6e 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a  mn list here */.
d870: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
d880: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
d890: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
d8a0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
d8b0: 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
d8c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
d8d0: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
d8e0: 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20  nt cnt;         
d8f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
d900: 64 65 78 20 61 64 64 65 64 20 74 6f 20 6d 61 6b  dex added to mak
d910: 65 20 74 68 65 20 6e 61 6d 65 20 75 6e 69 71 75  e the name uniqu
d920: 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61  e */.  Column *a
d930: 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20  Col, *pCol;     
d940: 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
d950: 67 20 6f 76 65 72 20 72 65 73 75 6c 74 20 63 6f  g over result co
d960: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  lumns */.  int n
d970: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
d980: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
d990: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
d9a0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
d9b0: 0a 20 20 45 78 70 72 20 2a 70 3b 20 20 20 20 20  .  Expr *p;     
d9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d9d0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72  * Expression for
d9e0: 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74   a single result
d9f0: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61   column */.  cha
da00: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
da10: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
da20: 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  mn name */.  int
da30: 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
da40: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
da50: 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d   of name in zNam
da60: 65 5b 5d 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45  e[] */..  if( pE
da70: 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c  List ){.    nCol
da80: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
da90: 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c  ;.    aCol = sql
daa0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
dab0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c  (db, sizeof(aCol
dac0: 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20  [0])*nCol);.    
dad0: 74 65 73 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d  testcase( aCol==
dae0: 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 );.  }else{.  
daf0: 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20    nCol = 0;.    
db00: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  aCol = 0;.  }.  
db10: 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20  *pnCol = nCol;. 
db20: 20 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a   *paCol = aCol;.
db30: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c  .  for(i=0, pCol
db40: 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69  =aCol; i<nCol; i
db50: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
db60: 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f   /* Get an appro
db70: 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20  priate name for 
db80: 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a  the column.    *
db90: 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  /.    p = sqlite
dba0: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
dbb0: 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  (pEList->a[i].pE
dbc0: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 28 7a  xpr);.    if( (z
dbd0: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
dbe0: 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  [i].zName)!=0 ){
dbf0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
dc00: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
dc10: 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20   an "AS <name>" 
dc20: 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d  phrase, use <nam
dc30: 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a  e> as the name *
dc40: 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  /.      zName = 
dc50: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
dc60: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
dc70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
dc80: 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b  r *pColExpr = p;
dc90: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
dca0: 69 6f 6e 20 74 68 61 74 20 69 73 20 74 68 65 20  ion that is the 
dcb0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61  result column na
dcc0: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c  me */.      Tabl
dcd0: 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
dce0: 20 2f 2a 20 54 61 62 6c 65 20 61 73 73 6f 63 69   /* Table associ
dcf0: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 65  ated with this e
dd00: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
dd10: 20 20 20 77 68 69 6c 65 28 20 70 43 6f 6c 45 78     while( pColEx
dd20: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29  pr->op==TK_DOT )
dd30: 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 45 78  {.        pColEx
dd40: 70 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70  pr = pColExpr->p
dd50: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61  Right;.        a
dd60: 73 73 65 72 74 28 20 70 43 6f 6c 45 78 70 72 21  ssert( pColExpr!
dd70: 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
dd80: 20 20 20 20 69 66 28 20 70 43 6f 6c 45 78 70 72      if( pColExpr
dd90: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
dda0: 26 26 20 41 4c 57 41 59 53 28 70 43 6f 6c 45 78  && ALWAYS(pColEx
ddb0: 70 72 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a  pr->pTab!=0) ){.
ddc0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63          /* For c
ddd0: 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20 63  olumns use the c
dde0: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20  olumn name name 
ddf0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
de00: 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e  Col = pColExpr->
de10: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  iColumn;.       
de20: 20 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70 72   pTab = pColExpr
de30: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
de40: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
de50: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
de60: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
de70: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
de80: 64 62 2c 20 22 25 73 22 2c 0a 20 20 20 20 20 20  db, "%s",.      
de90: 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 3e             iCol>
dea0: 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  =0 ? pTab->aCol[
deb0: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72  iCol].zName : "r
dec0: 6f 77 69 64 22 29 3b 0a 20 20 20 20 20 20 7d 65  owid");.      }e
ded0: 6c 73 65 20 69 66 28 20 70 43 6f 6c 45 78 70 72  lse if( pColExpr
dee0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20  ->op==TK_ID ){. 
def0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
df00: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
df10: 70 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74  pColExpr, EP_Int
df20: 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
df30: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
df40: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
df50: 22 2c 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a  ", pColExpr->u.z
df60: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65  Token);.      }e
df70: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
df80: 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  Use the original
df90: 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c   text of the col
dfa0: 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61  umn expression a
dfb0: 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20  s its name */.  
dfc0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
dfd0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
dfe0: 20 22 25 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61   "%s", pEList->a
dff0: 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  [i].zSpan);.    
e000: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
e010: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
e020: 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ed ){.      sqli
e030: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
e040: 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ame);.      brea
e050: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
e060: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
e070: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e  olumn name is un
e080: 69 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61  ique.  If the na
e090: 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65  me is not unique
e0a0: 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20  ,.    ** append 
e0b0: 61 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65  a integer to the
e0c0: 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74   name so that it
e0d0: 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e   becomes unique.
e0e0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d  .    */.    nNam
e0f0: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
e100: 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  n30(zName);.    
e110: 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69  for(j=cnt=0; j<i
e120: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
e130: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
e140: 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  (aCol[j].zName, 
e150: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
e160: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e       char *zNewN
e170: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ame;.        int
e180: 20 6b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   k;.        for(
e190: 6b 3d 6e 4e 61 6d 65 2d 31 3b 20 6b 3e 31 20 26  k=nName-1; k>1 &
e1a0: 26 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74  & sqlite3Isdigit
e1b0: 28 7a 4e 61 6d 65 5b 6b 5d 29 3b 20 6b 2d 2d 29  (zName[k]); k--)
e1c0: 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b  {}.        if( k
e1d0: 3e 3d 30 20 26 26 20 7a 4e 61 6d 65 5b 6b 5d 3d  >=0 && zName[k]=
e1e0: 3d 27 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6b  =':' ) nName = k
e1f0: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b  ;.        zName[
e200: 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20  nName] = 0;.    
e210: 20 20 20 20 7a 4e 65 77 4e 61 6d 65 20 3d 20 73      zNewName = s
e220: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
e230: 2c 20 22 25 73 3a 25 64 22 2c 20 7a 4e 61 6d 65  , "%s:%d", zName
e240: 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20  , ++cnt);.      
e250: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
e260: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
e270: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77      zName = zNew
e280: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 6a 20  Name;.        j 
e290: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66  = -1;.        if
e2a0: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65  ( zName==0 ) bre
e2b0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
e2c0: 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  }.    pCol->zNam
e2d0: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20  e = zName;.  }. 
e2e0: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
e2f0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72  ailed ){.    for
e300: 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b  (j=0; j<i; j++){
e310: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
e320: 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d  Free(db, aCol[j]
e330: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  .zName);.    }. 
e340: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
e350: 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20  (db, aCol);.    
e360: 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  *paCol = 0;.    
e370: 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  *pnCol = 0;.    
e380: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
e390: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  MEM;.  }.  retur
e3a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
e3b0: 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61  /*.** Add type a
e3c0: 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66  nd collation inf
e3d0: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f  ormation to a co
e3e0: 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20  lumn list based 
e3f0: 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73  on.** a SELECT s
e400: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a  tatement..** .**
e410: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   The column list
e420: 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65   presumably came
e430: 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75   from selectColu
e440: 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c  mnNamesFromExprL
e450: 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f  ist()..** The co
e460: 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e  lumn list has on
e470: 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79  ly names, not ty
e480: 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e  pes or collation
e490: 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  s.  This.** rout
e4a0: 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68  ine goes through
e4b0: 20 61 6e 64 20 61 64 64 73 20 74 68 65 20 74 79   and adds the ty
e4c0: 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  pes and collatio
e4d0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ns..**.** This r
e4e0: 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65 73 20  outine requires 
e4f0: 74 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66  that all identif
e500: 69 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45  iers in the SELE
e510: 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  CT.** statement 
e520: 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a  be resolved..*/.
e530: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
e540: 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41  ctAddColumnTypeA
e550: 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50  ndCollation(.  P
e560: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
e570: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
e580: 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54 61  contexts */.  Ta
e590: 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
e5a0: 20 20 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d      /* Add colum
e5b0: 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d 61 74 69  n type informati
e5c0: 6f 6e 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  on to this table
e5d0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
e5e0: 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53  elect       /* S
e5f0: 45 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64 65  ELECT used to de
e600: 74 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e  termine types an
e610: 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a  d collations */.
e620: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
e630: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
e640: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
e650: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
e660: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
e670: 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45  ll;.  int i;.  E
e680: 78 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74  xpr *p;.  struct
e690: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
e6a0: 61 3b 0a 20 20 75 36 34 20 73 7a 41 6c 6c 20 3d  a;.  u64 szAll =
e6b0: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
e6c0: 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61  Select!=0 );.  a
e6d0: 73 73 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d  ssert( (pSelect-
e6e0: 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
e6f0: 65 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20  esolved)!=0 );. 
e700: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
e710: 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45  Col==pSelect->pE
e720: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64  List->nExpr || d
e730: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
e740: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
e750: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
e760: 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e  rn;.  memset(&sN
e770: 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
e780: 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  ));.  sNC.pSrcLi
e790: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53  st = pSelect->pS
e7a0: 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63  rc;.  a = pSelec
e7b0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20  t->pEList->a;.  
e7c0: 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54  for(i=0, pCol=pT
e7d0: 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62  ab->aCol; i<pTab
e7e0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
e7f0: 6c 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 5b  l++){.    p = a[
e800: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 43  i].pExpr;.    pC
e810: 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69  ol->zType = sqli
e820: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
e830: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
e840: 20 70 2c 30 2c 30 2c 30 2c 20 26 70 43 6f 6c 2d   p,0,0,0, &pCol-
e850: 3e 73 7a 45 73 74 29 29 3b 0a 20 20 20 20 73 7a  >szEst));.    sz
e860: 41 6c 6c 20 2b 3d 20 70 43 6f 6c 2d 3e 73 7a 45  All += pCol->szE
e870: 73 74 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66  st;.    pCol->af
e880: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
e890: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b  ExprAffinity(p);
e8a0: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61  .    if( pCol->a
e8b0: 66 66 69 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f  ffinity==0 ) pCo
e8c0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  l->affinity = SQ
e8d0: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
e8e0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
e8f0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
e900: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66  arse, p);.    if
e910: 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
e920: 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73   pCol->zColl = s
e930: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
e940: 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  b, pColl->zName)
e950: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54  ;.    }.  }.  pT
e960: 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73  ab->szTabRow = s
e970: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 73 7a 41  qlite3LogEst(szA
e980: 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ll*4);.}../*.** 
e990: 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73  Given a SELECT s
e9a0: 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61  tatement, genera
e9b0: 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  te a Table struc
e9c0: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
e9d0: 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  bes.** the resul
e9e0: 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45  t set of that SE
e9f0: 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  LECT..*/.Table *
ea00: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
ea10: 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a  OfSelect(Parse *
ea20: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
ea30: 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c  pSelect){.  Tabl
ea40: 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  e *pTab;.  sqlit
ea50: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
ea60: 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64  >db;.  int saved
ea70: 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46  Flags;..  savedF
ea80: 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73  lags = db->flags
ea90: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
eaa0: 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c   ~SQLITE_FullCol
eab0: 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61  Names;.  db->fla
eac0: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f  gs |= SQLITE_Sho
ead0: 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71  rtColNames;.  sq
eae0: 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
eaf0: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
eb00: 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73   0);.  if( pPars
eb10: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
eb20: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65   0;.  while( pSe
eb30: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  lect->pPrior ) p
eb40: 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
eb50: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e  ->pPrior;.  db->
eb60: 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61  flags = savedFla
eb70: 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  gs;.  pTab = sql
eb80: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
eb90: 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
eba0: 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  e) );.  if( pTab
ebb0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
ebc0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68  n 0;.  }.  /* Th
ebd0: 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  e sqlite3ResultS
ebe0: 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20  etOfSelect() is 
ebf0: 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74  only used n cont
ec00: 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61  exts where looka
ec10: 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73  side.  ** is dis
ec20: 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  abled */.  asser
ec30: 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  t( db->lookaside
ec40: 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20 29 3b 0a  .bEnabled==0 );.
ec50: 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31    pTab->nRef = 1
ec60: 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20  ;.  pTab->zName 
ec70: 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f  = 0;.  pTab->nRo
ec80: 77 45 73 74 20 3d 20 31 30 34 38 35 37 36 3b 0a  wEst = 1048576;.
ec90: 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46    selectColumnsF
eca0: 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
ecb0: 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  se, pSelect->pEL
ecc0: 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c  ist, &pTab->nCol
ecd0: 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  , &pTab->aCol);.
ece0: 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d    selectAddColum
ecf0: 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
ed00: 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  n(pParse, pTab, 
ed10: 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62  pSelect);.  pTab
ed20: 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
ed30: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
ed40: 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
ed50: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
ed60: 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 72 65  b, pTab);.    re
ed70: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
ed80: 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
ed90: 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66  .** Get a VDBE f
eda0: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72  or the given par
edb0: 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72  ser context.  Cr
edc0: 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
edd0: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
ede0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
edf0: 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  rs, return NULL 
ee00: 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73  and leave a mess
ee10: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  age in pParse..*
ee20: 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47  /.Vdbe *sqlite3G
ee30: 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50  etVdbe(Parse *pP
ee40: 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
ee50: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
ee60: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a  ;.  if( v==0 ){.
ee70: 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e      v = pParse->
ee80: 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56  pVdbe = sqlite3V
ee90: 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65  dbeCreate(pParse
eea0: 29 3b 0a 20 20 20 20 69 66 28 20 76 20 29 20 73  );.    if( v ) s
eeb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
eec0: 28 76 2c 20 4f 50 5f 49 6e 69 74 29 3b 0a 20 20  (v, OP_Init);.  
eed0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 54    if( pParse->pT
eee0: 6f 70 6c 65 76 65 6c 3d 3d 30 0a 20 20 20 20 20  oplevel==0.     
eef0: 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
ef00: 6e 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64  nabled(pParse->d
ef10: 62 2c 53 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f  b,SQLITE_FactorO
ef20: 75 74 43 6f 6e 73 74 29 0a 20 20 20 20 29 7b 0a  utConst).    ){.
ef30: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6f 6b        pParse->ok
ef40: 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d 20 31 3b  ConstFactor = 1;
ef50: 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a 20 20 72 65  .    }..  }.  re
ef60: 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn v;.}.../*.*
ef70: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c  * Compute the iL
ef80: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
ef90: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53   fields of the S
efa0: 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74  ELECT based on t
efb0: 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64  he.** pLimit and
efc0: 20 70 4f 66 66 73 65 74 20 65 78 70 72 65 73 73   pOffset express
efd0: 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e  ions.  pLimit an
efe0: 64 20 70 4f 66 66 73 65 74 20 68 6f 6c 64 20 74  d pOffset hold t
eff0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  he expressions.*
f000: 2a 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  * that appear in
f010: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
f020: 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65  L statement afte
f030: 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20  r the LIMIT and 
f040: 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72  OFFSET.** keywor
f050: 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20  ds.  Or NULL if 
f060: 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61  those keywords a
f070: 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d  re omitted. iLim
f080: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a  it and iOffset .
f090: 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65 67  ** are the integ
f0a0: 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74  er memory regist
f0b0: 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63  er numbers for c
f0c0: 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20  ounters used to 
f0d0: 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20  compute .** the 
f0e0: 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74  limit and offset
f0f0: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
f100: 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f  o limit and/or o
f110: 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20  ffset, then .** 
f120: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
f130: 65 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e  et are negative.
f140: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
f150: 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65 20  ine changes the 
f160: 76 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69 74  values of iLimit
f170: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c   and iOffset onl
f180: 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20  y if.** a limit 
f190: 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64 65 66  or offset is def
f1a0: 69 6e 65 64 20 62 79 20 70 4c 69 6d 69 74 20 61  ined by pLimit a
f1b0: 6e 64 20 70 4f 66 66 73 65 74 2e 20 20 69 4c 69  nd pOffset.  iLi
f1c0: 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73  mit and.** iOffs
f1d0: 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  et should have b
f1e0: 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70  een preset to ap
f1f0: 70 72 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c  propriate defaul
f200: 74 20 76 61 6c 75 65 73 20 28 7a 65 72 6f 29 0a  t values (zero).
f210: 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ** prior to call
f220: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
f230: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 4f 66 66  ..**.** The iOff
f240: 73 65 74 20 72 65 67 69 73 74 65 72 20 28 69 66  set register (if
f250: 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20 69   it exists) is i
f260: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68  nitialized to th
f270: 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68  e value.** of th
f280: 65 20 4f 46 46 53 45 54 2e 20 20 54 68 65 20 69  e OFFSET.  The i
f290: 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 69  Limit register i
f2a0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
f2b0: 20 4c 49 4d 49 54 2e 20 20 52 65 67 69 73 74 65   LIMIT.  Registe
f2c0: 72 0a 2a 2a 20 69 4f 66 66 73 65 74 2b 31 20 69  r.** iOffset+1 i
f2d0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
f2e0: 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e 0a 2a   LIMIT+OFFSET..*
f2f0: 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69  *.** Only if pLi
f300: 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65  mit!=0 or pOffse
f310: 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69  t!=0 do the limi
f320: 74 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a  t registers get.
f330: 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54  ** redefined.  T
f340: 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
f350: 72 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20  rator uses this 
f360: 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63  property to forc
f370: 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f  e.** the reuse o
f380: 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74  f the same limit
f390: 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69   and offset regi
f3a0: 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c  sters across mul
f3b0: 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20  tiple.** SELECT 
f3c0: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73  statements..*/.s
f3d0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75  tatic void compu
f3e0: 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
f3f0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
f400: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
f410: 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a  Break){.  Vdbe *
f420: 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69  v = 0;.  int iLi
f430: 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  mit = 0;.  int i
f440: 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64  Offset;.  int ad
f450: 64 72 31 2c 20 6e 3b 0a 20 20 69 66 28 20 70 2d  dr1, n;.  if( p-
f460: 3e 69 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >iLimit ) return
f470: 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c  ;..  /* .  ** "L
f480: 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20  IMIT -1" always 
f490: 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20  shows all rows. 
f4a0: 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20   There is some. 
f4b0: 20 2a 2a 20 63 6f 6e 74 72 6f 76 65 72 73 79 20   ** controversy 
f4c0: 61 62 6f 75 74 20 77 68 61 74 20 74 68 65 20 63  about what the c
f4d0: 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20  orrect behavior 
f4e0: 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20  should be..  ** 
f4f0: 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  The current impl
f500: 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72  ementation inter
f510: 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20  prets "LIMIT 0" 
f520: 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20  to mean.  ** no 
f530: 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  rows..  */.  sql
f540: 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
f550: 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  ar(pParse);.  as
f560: 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74  sert( p->pOffset
f570: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74  ==0 || p->pLimit
f580: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  !=0 );.  if( p->
f590: 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d  pLimit ){.    p-
f5a0: 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74  >iLimit = iLimit
f5b0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
f5c0: 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  m;.    v = sqlit
f5d0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
f5e0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76  );.    assert( v
f5f0: 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 73  !=0 );.    if( s
f600: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
f610: 67 65 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 26  ger(p->pLimit, &
f620: 6e 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  n) ){.      sqli
f630: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f640: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20   OP_Integer, n, 
f650: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56  iLimit);.      V
f660: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
f670: 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29  LIMIT counter"))
f680: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30  ;.      if( n==0
f690: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
f6a0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f6b0: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72   OP_Goto, 0, iBr
f6c0: 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  eak);.      }els
f6d0: 65 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d  e if( n>=0 && p-
f6e0: 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 28 75 36 34  >nSelectRow>(u64
f6f0: 29 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  )n ){.        p-
f700: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 3b  >nSelectRow = n;
f710: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
f720: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
f730: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
f740: 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c 69  , p->pLimit, iLi
f750: 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  mit);.      sqli
f760: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
f770: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69   OP_MustBeInt, i
f780: 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65  Limit); VdbeCove
f790: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56  rage(v);.      V
f7a0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
f7b0: 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29  LIMIT counter"))
f7c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f7d0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f7e0: 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20  IfZero, iLimit, 
f7f0: 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  iBreak); VdbeCov
f800: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
f810: 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73      if( p->pOffs
f820: 65 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  et ){.      p->i
f830: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74  Offset = iOffset
f840: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
f850: 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  m;.      pParse-
f860: 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c  >nMem++;   /* Al
f870: 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61 20  locate an extra 
f880: 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d  register for lim
f890: 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20  it+offset */.   
f8a0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
f8b0: 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f  de(pParse, p->pO
f8c0: 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 29 3b  ffset, iOffset);
f8d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f8e0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d  beAddOp1(v, OP_M
f8f0: 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73 65  ustBeInt, iOffse
f900: 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
f910: 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  (v);.      VdbeC
f920: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53  omment((v, "OFFS
f930: 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  ET counter"));. 
f940: 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c       addr1 = sql
f950: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
f960: 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66  , OP_IfPos, iOff
f970: 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  set); VdbeCovera
f980: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
f990: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f9a0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
f9b0: 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20   iOffset);.     
f9c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
f9d0: 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
f9e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f9f0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64  eAddOp3(v, OP_Ad
fa00: 64 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73  d, iLimit, iOffs
fa10: 65 74 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a  et, iOffset+1);.
fa20: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
fa30: 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46  t((v, "LIMIT+OFF
fa40: 53 45 54 22 29 29 3b 0a 20 20 20 20 20 20 61 64  SET"));.      ad
fa50: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
fa60: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
fa70: 50 6f 73 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64  Pos, iLimit); Vd
fa80: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
fa90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
faa0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
fab0: 65 67 65 72 2c 20 2d 31 2c 20 69 4f 66 66 73 65  eger, -1, iOffse
fac0: 74 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t+1);.      sqli
fad0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
fae0: 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 7d  v, addr1);.    }
faf0: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
fb00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
fb10: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a  OUND_SELECT./*.*
fb20: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70  * Return the app
fb30: 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69  ropriate collati
fb40: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
fb50: 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  the iCol-th colu
fb60: 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73  mn of.** the res
fb70: 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65 20  ult set for the 
fb80: 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20  compound-select 
fb90: 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20  statement "p".  
fba0: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a  Return NULL if.*
fbb0: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73  * the column has
fbc0: 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c   no default coll
fbd0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a  ating sequence..
fbe0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74  **.** The collat
fbf0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
fc00: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
fc10: 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72  lect is taken fr
fc20: 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d  om the.** left-m
fc30: 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ost term of the 
fc40: 73 65 6c 65 63 74 20 74 68 61 74 20 68 61 73 20  select that has 
fc50: 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
fc60: 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ence..*/.static 
fc70: 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65  CollSeq *multiSe
fc80: 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73  lectCollSeq(Pars
fc90: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
fca0: 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b  t *p, int iCol){
fcb0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74  .  CollSeq *pRet
fcc0: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  ;.  if( p->pPrio
fcd0: 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  r ){.    pRet = 
fce0: 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
fcf0: 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50  eq(pParse, p->pP
fd00: 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d  rior, iCol);.  }
fd10: 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d  else{.    pRet =
fd20: 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
fd30: 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 69  ( iCol>=0 );.  i
fd40: 66 28 20 70 52 65 74 3d 3d 30 20 26 26 20 69 43  f( pRet==0 && iC
fd50: 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  ol<p->pEList->nE
fd60: 78 70 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20  xpr ){.    pRet 
fd70: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
fd80: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
fd90: 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
fda0: 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65  pExpr);.  }.  re
fdb0: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
fdc0: 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73  .** The select s
fdd0: 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
fde0: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  as the second pa
fdf0: 72 61 6d 65 74 65 72 20 69 73 20 61 20 63 6f 6d  rameter is a com
fe00: 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a 2a 2a 20  pound SELECT.** 
fe10: 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  with an ORDER BY
fe20: 20 63 6c 61 75 73 65 2e 20 54 68 69 73 20 66 75   clause. This fu
fe30: 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73  nction allocates
fe40: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 4b   and returns a K
fe50: 65 79 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74  eyInfo.** struct
fe60: 75 72 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ure suitable for
fe70: 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
fe80: 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2a 0a 2a  e ORDER BY..**.*
fe90: 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
fea0: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
feb0: 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e 65  cture is obtaine
fec0: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 54  d from malloc. T
fed0: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
fee0: 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e  nction is respon
fef0: 73 69 62 6c 65 20 66 6f 72 20 65 6e 73 75 72 69  sible for ensuri
ff00: 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72  ng that this str
ff10: 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75  ucture is eventu
ff20: 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a  ally.** freed..*
ff30: 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f  /.static KeyInfo
ff40: 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64   *multiSelectOrd
ff50: 65 72 42 79 4b 65 79 49 6e 66 6f 28 50 61 72 73  erByKeyInfo(Pars
ff60: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
ff70: 74 20 2a 70 2c 20 69 6e 74 20 6e 45 78 74 72 61  t *p, int nExtra
ff80: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
ff90: 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
ffa0: 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e 4f 72  derBy;.  int nOr
ffb0: 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
ffc0: 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 71  rBy->nExpr;.  sq
ffd0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
ffe0: 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79 49 6e 66  se->db;.  KeyInf
fff0: 6f 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65  o *pRet = sqlite
10000 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
10010 2c 20 6e 4f 72 64 65 72 42 79 2b 6e 45 78 74 72  , nOrderBy+nExtr
10020 61 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 52 65  a, 1);.  if( pRe
10030 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ){.    int i;.
10040 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
10050 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
10060 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
10070 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
10080 20 3d 20 26 70 4f 72 64 65 72 42 79 2d 3e 61 5b   = &pOrderBy->a[
10090 69 5d 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  i];.      Expr *
100a0 70 54 65 72 6d 20 3d 20 70 49 74 65 6d 2d 3e 70  pTerm = pItem->p
100b0 45 78 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c 6c  Expr;.      Coll
100c0 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 20  Seq *pColl;..   
100d0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c     if( pTerm->fl
100e0 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
100f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
10100 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
10110 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
10120 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Term);.      }el
10130 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  se{.        pCol
10140 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  l = multiSelectC
10150 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
10160 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  , pItem->u.x.iOr
10170 64 65 72 42 79 43 6f 6c 2d 31 29 3b 0a 20 20 20  derByCol-1);.   
10180 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d       if( pColl==
10190 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  0 ) pColl = db->
101a0 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
101b0 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69     pOrderBy->a[i
101c0 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20 20 20 20  ].pExpr =.      
101d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
101e0 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28  ddCollateString(
101f0 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
10200 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
10210 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
10220 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
10230 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 52  foIsWriteable(pR
10240 65 74 29 20 29 3b 0a 20 20 20 20 20 20 70 52 65  et) );.      pRe
10250 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43  t->aColl[i] = pC
10260 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 52 65 74 2d  oll;.      pRet-
10270 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
10280 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
10290 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d  sortOrder;.    }
102a0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
102b0 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  Ret;.}..#ifndef 
102c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
102d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
102e0 6e 65 20 67 65 6e 65 72 61 74 65 73 20 56 44 42  ne generates VDB
102f0 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74  E code to comput
10300 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
10310 20 61 20 57 49 54 48 20 52 45 43 55 52 53 49 56   a WITH RECURSIV
10320 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74 68  E.** query of th
10330 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
10340 3c 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65  <recursive-table
10350 3e 20 41 53 20 28 3c 73 65 74 75 70 2d 71 75 65  > AS (<setup-que
10360 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20  ry> UNION [ALL] 
10370 3c 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79  <recursive-query
10380 3e 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  >).**           
10390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f                \_
103a0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
103b0 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
103c0 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20  ________/.**    
103d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103e0 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
103f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10400 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a        p.**.**.**
10410 20 54 68 65 72 65 20 69 73 20 65 78 61 63 74 6c   There is exactl
10420 79 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20  y one reference 
10430 74 6f 20 74 68 65 20 72 65 63 75 72 73 69 76 65  to the recursive
10440 2d 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52  -table in the FR
10450 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 6f 66 20  OM clause.** of 
10460 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 2c  recursive-query,
10470 20 6d 61 72 6b 65 64 20 77 69 74 68 20 74 68 65   marked with the
10480 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d 2e 69 73   SrcList->a[].is
10490 52 65 63 75 72 73 69 76 65 20 66 6c 61 67 2e 0a  Recursive flag..
104a0 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 74 75 70 2d  **.** The setup-
104b0 71 75 65 72 79 20 72 75 6e 73 20 6f 6e 63 65 20  query runs once 
104c0 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20 69  to generate an i
104d0 6e 69 74 69 61 6c 20 73 65 74 20 6f 66 20 72 6f  nitial set of ro
104e0 77 73 20 74 68 61 74 20 67 6f 0a 2a 2a 20 69 6e  ws that go.** in
104f0 74 6f 20 61 20 51 75 65 75 65 20 74 61 62 6c 65  to a Queue table
10500 2e 20 20 52 6f 77 73 20 61 72 65 20 65 78 74 72  .  Rows are extr
10510 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 51  acted from the Q
10520 75 65 75 65 20 74 61 62 6c 65 20 6f 6e 65 20 62  ueue table one b
10530 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45 61 63 68 20  y.** one.  Each 
10540 72 6f 77 20 65 78 74 72 61 63 74 65 64 20 66 72  row extracted fr
10550 6f 6d 20 51 75 65 75 65 20 69 73 20 6f 75 74 70  om Queue is outp
10560 75 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68  ut to pDest.  Th
10570 65 6e 20 74 68 65 20 73 69 6e 67 6c 65 0a 2a 2a  en the single.**
10580 20 65 78 74 72 61 63 74 65 64 20 72 6f 77 20 28   extracted row (
10590 6e 6f 77 20 69 6e 20 74 68 65 20 69 43 75 72 72  now in the iCurr
105a0 65 6e 74 20 74 61 62 6c 65 29 20 62 65 63 6f 6d  ent table) becom
105b0 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  es the content o
105c0 66 20 74 68 65 0a 2a 2a 20 72 65 63 75 72 73 69  f the.** recursi
105d0 76 65 2d 74 61 62 6c 65 20 66 6f 72 20 61 20 72  ve-table for a r
105e0 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 20 72  ecursive-query r
105f0 75 6e 2e 20 20 54 68 65 20 6f 75 74 70 75 74 20  un.  The output 
10600 6f 66 20 74 68 65 20 72 65 63 75 72 73 69 76 65  of the recursive
10610 2d 71 75 65 72 79 0a 2a 2a 20 69 73 20 61 64 64  -query.** is add
10620 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ed back into the
10630 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54   Queue table.  T
10640 68 65 6e 20 61 6e 6f 74 68 65 72 20 72 6f 77 20  hen another row 
10650 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
10660 6d 20 51 75 65 75 65 0a 2a 2a 20 61 6e 64 20 74  m Queue.** and t
10670 68 65 20 69 74 65 72 61 74 69 6f 6e 20 63 6f 6e  he iteration con
10680 74 69 6e 75 65 73 20 75 6e 74 69 6c 20 74 68 65  tinues until the
10690 20 51 75 65 75 65 20 74 61 62 6c 65 20 69 73 20   Queue table is 
106a0 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  empty..**.** If 
106b0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
106c0 72 79 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55  ry operator is U
106d0 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f 20 64 75 70  NION then no dup
106e0 6c 69 63 61 74 65 20 72 6f 77 73 20 61 72 65 20  licate rows are 
106f0 65 76 65 72 0a 2a 2a 20 69 6e 73 65 72 74 65 64  ever.** inserted
10700 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20   into the Queue 
10710 74 61 62 6c 65 2e 20 20 54 68 65 20 69 44 69 73  table.  The iDis
10720 74 69 6e 63 74 20 74 61 62 6c 65 20 6b 65 65 70  tinct table keep
10730 73 20 61 20 63 6f 70 79 20 6f 66 20 61 6c 6c 20  s a copy of all 
10740 72 6f 77 73 0a 2a 2a 20 74 68 61 74 20 68 61 76  rows.** that hav
10750 65 20 65 76 65 72 20 62 65 65 6e 20 69 6e 73 65  e ever been inse
10760 72 74 65 64 20 69 6e 74 6f 20 51 75 65 75 65 20  rted into Queue 
10770 61 6e 64 20 63 61 75 73 65 73 20 64 75 70 6c 69  and causes dupli
10780 63 61 74 65 73 20 74 6f 20 62 65 0a 2a 2a 20 64  cates to be.** d
10790 69 73 63 61 72 64 65 64 2e 20 20 49 66 20 74 68  iscarded.  If th
107a0 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e  e operator is UN
107b0 49 4f 4e 20 41 4c 4c 2c 20 74 68 65 6e 20 64 75  ION ALL, then du
107c0 70 6c 69 63 61 74 65 73 20 61 72 65 20 61 6c 6c  plicates are all
107d0 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  owed..** .** If 
107e0 74 68 65 20 71 75 65 72 79 20 68 61 73 20 61 6e  the query has an
107f0 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 6e 20   ORDER BY, then 
10800 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 51  entries in the Q
10810 75 65 75 65 20 74 61 62 6c 65 20 61 72 65 20 6b  ueue table are k
10820 65 70 74 20 69 6e 0a 2a 2a 20 4f 52 44 45 52 20  ept in.** ORDER 
10830 42 59 20 6f 72 64 65 72 20 61 6e 64 20 74 68 65  BY order and the
10840 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 73 20   first entry is 
10850 65 78 74 72 61 63 74 65 64 20 66 6f 72 20 65 61  extracted for ea
10860 63 68 20 63 79 63 6c 65 2e 20 20 57 69 74 68 6f  ch cycle.  Witho
10870 75 74 0a 2a 2a 20 61 6e 20 4f 52 44 45 52 20 42  ut.** an ORDER B
10880 59 2c 20 74 68 65 20 51 75 65 75 65 20 74 61 62  Y, the Queue tab
10890 6c 65 20 69 73 20 6a 75 73 74 20 61 20 46 49 46  le is just a FIF
108a0 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4c 49  O..**.** If a LI
108b0 4d 49 54 20 63 6c 61 75 73 65 20 69 73 20 70 72  MIT clause is pr
108c0 6f 76 69 64 65 64 2c 20 74 68 65 6e 20 74 68 65  ovided, then the
108d0 20 69 74 65 72 61 74 69 6f 6e 20 73 74 6f 70 73   iteration stops
108e0 20 61 66 74 65 72 20 4c 49 4d 49 54 20 72 6f 77   after LIMIT row
108f0 73 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 6f  s.** have been o
10900 75 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20  utput to pDest. 
10910 20 41 20 4c 49 4d 49 54 20 6f 66 20 7a 65 72 6f   A LIMIT of zero
10920 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70 75 74   means to output
10930 20 6e 6f 20 72 6f 77 73 20 61 6e 64 20 61 0a 2a   no rows and a.*
10940 2a 20 6e 65 67 61 74 69 76 65 20 4c 49 4d 49 54  * negative LIMIT
10950 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70 75 74   means to output
10960 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49 66 20 74   all rows.  If t
10970 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 6e 20  here is also an 
10980 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a 2a 2a  OFFSET clause.**
10990 20 77 69 74 68 20 61 20 70 6f 73 69 74 69 76 65   with a positive
109a0 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65   value, then the
109b0 20 66 69 72 73 74 20 4f 46 46 53 45 54 20 6f 75   first OFFSET ou
109c0 74 70 75 74 73 20 61 72 65 20 64 69 73 63 61 72  tputs are discar
109d0 64 65 64 20 72 61 74 68 65 72 0a 2a 2a 20 74 68  ded rather.** th
109e0 61 6e 20 62 65 69 6e 67 20 73 65 6e 74 20 74 6f  an being sent to
109f0 20 70 44 65 73 74 2e 20 20 54 68 65 20 4c 49 4d   pDest.  The LIM
10a00 49 54 20 63 6f 75 6e 74 20 64 6f 65 73 20 6e 6f  IT count does no
10a10 74 20 62 65 67 69 6e 20 75 6e 74 69 6c 20 61 66  t begin until af
10a20 74 65 72 20 4f 46 46 53 45 54 0a 2a 2a 20 72 6f  ter OFFSET.** ro
10a30 77 73 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69  ws have been ski
10a40 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pped..*/.static 
10a50 76 6f 69 64 20 67 65 6e 65 72 61 74 65 57 69 74  void generateWit
10a60 68 52 65 63 75 72 73 69 76 65 51 75 65 72 79 28  hRecursiveQuery(
10a70 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
10a80 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
10a90 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
10aa0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
10ab0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
10ac0 63 75 72 73 69 76 65 20 53 45 4c 45 43 54 20 74  cursive SELECT t
10ad0 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
10ae0 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
10af0 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
10b00 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
10b10 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53  esults */.){.  S
10b20 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70  rcList *pSrc = p
10b30 2d 3e 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20  ->pSrc;      /* 
10b40 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
10b50 6f 66 20 74 68 65 20 72 65 63 75 72 73 69 76 65  of the recursive
10b60 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
10b70 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74  nCol = p->pEList
10b80 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a 20 4e 75 6d  ->nExpr;  /* Num
10b90 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
10ba0 6e 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  n the recursive 
10bb0 74 61 62 6c 65 20 2a 2f 0a 20 20 56 64 62 65 20  table */.  Vdbe 
10bc0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
10bd0 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  be;      /* The 
10be0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
10bf0 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  nt under constru
10c00 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63  ction */.  Selec
10c10 74 20 2a 70 53 65 74 75 70 20 3d 20 70 2d 3e 70  t *pSetup = p->p
10c20 50 72 69 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20  Prior;   /* The 
10c30 73 65 74 75 70 20 71 75 65 72 79 20 2a 2f 0a 20  setup query */. 
10c40 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20   int addrTop;   
10c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10c60 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  * Top of the loo
10c70 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
10c80 6f 6e 74 2c 20 61 64 64 72 42 72 65 61 6b 3b 20  ont, addrBreak; 
10c90 20 20 20 20 20 2f 2a 20 43 4f 4e 54 49 4e 55 45       /* CONTINUE
10ca0 20 61 6e 64 20 42 52 45 41 4b 20 61 64 64 72 65   and BREAK addre
10cb0 73 73 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  sses */.  int iC
10cc0 75 72 72 65 6e 74 20 3d 20 30 3b 20 20 20 20 20  urrent = 0;     
10cd0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 43          /* The C
10ce0 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a  urrent table */.
10cf0 20 20 69 6e 74 20 72 65 67 43 75 72 72 65 6e 74    int regCurrent
10d00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10d10 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
10d20 69 6e 67 20 43 75 72 72 65 6e 74 20 74 61 62 6c  ing Current tabl
10d30 65 20 2a 2f 0a 20 20 69 6e 74 20 69 51 75 65 75  e */.  int iQueu
10d40 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
10d50 20 20 20 20 20 2f 2a 20 54 68 65 20 51 75 65 75       /* The Queu
10d60 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
10d70 20 69 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 20   iDistinct = 0; 
10d80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
10d90 20 65 6e 73 75 72 65 20 75 6e 69 71 75 65 20 72   ensure unique r
10da0 65 73 75 6c 74 73 20 69 66 20 55 4e 49 4f 4e 20  esults if UNION 
10db0 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  */.  int eDest =
10dc0 20 53 52 54 5f 46 69 66 6f 3b 20 20 20 20 20 20   SRT_Fifo;      
10dd0 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 77 72 69     /* How to wri
10de0 74 65 20 74 6f 20 51 75 65 75 65 20 2a 2f 0a 20  te to Queue */. 
10df0 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
10e00 51 75 65 75 65 3b 20 20 20 20 20 20 20 20 20 2f  Queue;         /
10e10 2a 20 53 65 6c 65 63 74 44 65 73 74 20 74 61 72  * SelectDest tar
10e20 67 65 74 74 69 6e 67 20 74 68 65 20 51 75 65 75  getting the Queu
10e30 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
10e40 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
10e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
10e60 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
10e70 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
10e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10e90 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
10ea0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
10eb0 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 20 20  erBy;           
10ec0 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
10ed0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
10ee0 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73   *pLimit, *pOffs
10ef0 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76  et;       /* Sav
10f00 65 64 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  ed LIMIT and OFF
10f10 53 45 54 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  SET */.  int reg
10f20 4c 69 6d 69 74 2c 20 72 65 67 4f 66 66 73 65 74  Limit, regOffset
10f30 3b 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74  ;      /* Regist
10f40 65 72 73 20 75 73 65 64 20 62 79 20 4c 49 4d 49  ers used by LIMI
10f50 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a  T and OFFSET */.
10f60 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 75 74  .  /* Obtain aut
10f70 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 64 6f  horization to do
10f80 20 61 20 72 65 63 75 72 73 69 76 65 20 71 75 65   a recursive que
10f90 72 79 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  ry */.  if( sqli
10fa0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
10fb0 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 43 55  rse, SQLITE_RECU
10fc0 52 53 49 56 45 2c 20 30 2c 20 30 2c 20 30 29 20  RSIVE, 0, 0, 0) 
10fd0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
10fe0 50 72 6f 63 65 73 73 20 74 68 65 20 4c 49 4d 49  Process the LIMI
10ff0 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
11000 75 73 65 73 2c 20 69 66 20 74 68 65 79 20 65 78  uses, if they ex
11010 69 73 74 20 2a 2f 0a 20 20 61 64 64 72 42 72 65  ist */.  addrBre
11020 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
11030 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
11040 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
11050 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
11060 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 70   addrBreak);.  p
11070 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
11080 74 3b 0a 20 20 70 4f 66 66 73 65 74 20 3d 20 70  t;.  pOffset = p
11090 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 72 65 67  ->pOffset;.  reg
110a0 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69  Limit = p->iLimi
110b0 74 3b 0a 20 20 72 65 67 4f 66 66 73 65 74 20 3d  t;.  regOffset =
110c0 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70   p->iOffset;.  p
110d0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4f  ->pLimit = p->pO
110e0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  ffset = 0;.  p->
110f0 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66  iLimit = p->iOff
11100 73 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65  set = 0;.  pOrde
11110 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
11120 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20  y;..  /* Locate 
11130 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
11140 72 20 6f 66 20 74 68 65 20 43 75 72 72 65 6e 74  r of the Current
11150 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28   table */.  for(
11160 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 53  i=0; ALWAYS(i<pS
11170 72 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b  rc->nSrc); i++){
11180 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61  .    if( pSrc->a
11190 5b 69 5d 2e 69 73 52 65 63 75 72 73 69 76 65 20  [i].isRecursive 
111a0 29 7b 0a 20 20 20 20 20 20 69 43 75 72 72 65 6e  ){.      iCurren
111b0 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69  t = pSrc->a[i].i
111c0 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 62 72  Cursor;.      br
111d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
111e0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75    /* Allocate cu
111f0 72 73 6f 72 73 20 6e 75 6d 62 65 72 73 20 66 6f  rsors numbers fo
11200 72 20 51 75 65 75 65 20 61 6e 64 20 44 69 73 74  r Queue and Dist
11210 69 6e 63 74 2e 20 20 54 68 65 20 63 75 72 73 6f  inct.  The curso
11220 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20 20 2a  r number for.  *
11230 2a 20 74 68 65 20 44 69 73 74 69 6e 63 74 20 74  * the Distinct t
11240 61 62 6c 65 20 6d 75 73 74 20 62 65 20 65 78 61  able must be exa
11250 63 74 6c 79 20 6f 6e 65 20 67 72 65 61 74 65 72  ctly one greater
11260 20 74 68 61 6e 20 51 75 65 75 65 20 69 6e 20 6f   than Queue in o
11270 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68  rder.  ** for th
11280 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 20 61  e SRT_DistFifo a
11290 6e 64 20 53 52 54 5f 44 69 73 74 51 75 65 75 65  nd SRT_DistQueue
112a0 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 20 74 6f   destinations to
112b0 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51 75 65   work. */.  iQue
112c0 75 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ue = pParse->nTa
112d0 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70  b++;.  if( p->op
112e0 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
112f0 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72    eDest = pOrder
11300 42 79 20 3f 20 53 52 54 5f 44 69 73 74 51 75 65  By ? SRT_DistQue
11310 75 65 20 3a 20 53 52 54 5f 44 69 73 74 46 69 66  ue : SRT_DistFif
11320 6f 3b 0a 20 20 20 20 69 44 69 73 74 69 6e 63 74  o;.    iDistinct
11330 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
11340 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
11350 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79  eDest = pOrderBy
11360 20 3f 20 53 52 54 5f 51 75 65 75 65 20 3a 20 53   ? SRT_Queue : S
11370 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20 20 73  RT_Fifo;.  }.  s
11380 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
11390 49 6e 69 74 28 26 64 65 73 74 51 75 65 75 65 2c  Init(&destQueue,
113a0 20 65 44 65 73 74 2c 20 69 51 75 65 75 65 29 3b   eDest, iQueue);
113b0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
113c0 63 75 72 73 6f 72 73 20 66 6f 72 20 43 75 72 72  cursors for Curr
113d0 65 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e 64 20  ent, Queue, and 
113e0 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20 20 72  Distinct. */.  r
113f0 65 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b 70 50  egCurrent = ++pP
11400 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71  arse->nMem;.  sq
11410 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
11420 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
11430 2c 20 69 43 75 72 72 65 6e 74 2c 20 72 65 67 43  , iCurrent, regC
11440 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b 0a 20  urrent, nCol);. 
11450 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
11460 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
11470 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74 69 53 65  eyInfo = multiSe
11480 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
11490 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29  fo(pParse, p, 1)
114a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
114b0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
114c0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75  enEphemeral, iQu
114d0 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  eue, pOrderBy->n
114e0 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20  Expr+2, 0,.     
114f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11500 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
11510 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
11520 20 20 20 64 65 73 74 51 75 65 75 65 2e 70 4f 72     destQueue.pOr
11530 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
11540 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
11550 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11560 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
11570 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 6e 43  eral, iQueue, nC
11580 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62 65 43  ol);.  }.  VdbeC
11590 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75 65 75  omment((v, "Queu
115a0 65 20 74 61 62 6c 65 22 29 29 3b 0a 20 20 69 66  e table"));.  if
115b0 28 20 69 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  ( iDistinct ){. 
115c0 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
115d0 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 56  hm[0] = sqlite3V
115e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
115f0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
11600 44 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20  Distinct, 0);.  
11610 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
11620 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
11630 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74  l;.  }..  /* Det
11640 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ach the ORDER BY
11650 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65   clause from the
11660 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
11670 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42   */.  p->pOrderB
11680 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 74 6f  y = 0;..  /* Sto
11690 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  re the results o
116a0 66 20 74 68 65 20 73 65 74 75 70 2d 71 75 65 72  f the setup-quer
116b0 79 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f 0a 20  y in Queue. */. 
116c0 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d   pSetup->pNext =
116d0 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   0;.  rc = sqlit
116e0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
116f0 20 70 53 65 74 75 70 2c 20 26 64 65 73 74 51 75   pSetup, &destQu
11700 65 75 65 29 3b 0a 20 20 70 53 65 74 75 70 2d 3e  eue);.  pSetup->
11710 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 69 66 28  pNext = p;.  if(
11720 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f   rc ) goto end_o
11730 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65 72  f_recursive_quer
11740 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68  y;..  /* Find th
11750 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 74 68  e next row in th
11760 65 20 51 75 65 75 65 20 61 6e 64 20 6f 75 74 70  e Queue and outp
11770 75 74 20 74 68 61 74 20 72 6f 77 20 2a 2f 0a 20  ut that row */. 
11780 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
11790 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
117a0 4f 50 5f 52 65 77 69 6e 64 2c 20 69 51 75 65 75  OP_Rewind, iQueu
117b0 65 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56  e, addrBreak); V
117c0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
117d0 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74  .  /* Transfer t
117e0 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 51  he next row in Q
117f0 75 65 75 65 20 6f 76 65 72 20 74 6f 20 43 75 72  ueue over to Cur
11800 72 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rent */.  sqlite
11810 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
11820 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 75 72 72  P_NullRow, iCurr
11830 65 6e 74 29 3b 20 2f 2a 20 54 6f 20 72 65 73 65  ent); /* To rese
11840 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 2a  t column cache *
11850 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
11860 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11870 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
11880 43 6f 6c 75 6d 6e 2c 20 69 51 75 65 75 65 2c 20  Column, iQueue, 
11890 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b  pOrderBy->nExpr+
118a0 31 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a  1, regCurrent);.
118b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
118c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
118d0 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 69 51  , OP_RowData, iQ
118e0 75 65 75 65 2c 20 72 65 67 43 75 72 72 65 6e 74  ueue, regCurrent
118f0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
11900 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
11910 5f 44 65 6c 65 74 65 2c 20 69 51 75 65 75 65 29  _Delete, iQueue)
11920 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74  ;..  /* Output t
11930 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e  he single row in
11940 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 61 64   Current */.  ad
11950 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33  drCont = sqlite3
11960 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
11970 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76  ;.  codeOffset(v
11980 2c 20 72 65 67 4f 66 66 73 65 74 2c 20 61 64 64  , regOffset, add
11990 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c 65 63 74  rCont);.  select
119a0 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
119b0 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
119c0 69 43 75 72 72 65 6e 74 2c 0a 20 20 20 20 20 20  iCurrent,.      
119d0 30 2c 20 30 2c 20 70 44 65 73 74 2c 20 61 64 64  0, 0, pDest, add
119e0 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61 6b  rCont, addrBreak
119f0 29 3b 0a 20 20 69 66 28 20 72 65 67 4c 69 6d 69  );.  if( regLimi
11a00 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
11a10 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
11a20 5f 49 66 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69  _IfZero, regLimi
11a30 74 2c 20 61 64 64 72 42 72 65 61 6b 2c 20 2d 31  t, addrBreak, -1
11a40 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
11a50 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71  age(v);.  }.  sq
11a60 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
11a70 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e  Label(v, addrCon
11a80 74 29 3b 0a 0a 20 20 2f 2a 20 45 78 65 63 75 74  t);..  /* Execut
11a90 65 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  e the recursive 
11aa0 53 45 4c 45 43 54 20 74 61 6b 69 6e 67 20 74 68  SELECT taking th
11ab0 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20  e single row in 
11ac0 43 75 72 72 65 6e 74 20 61 73 0a 20 20 2a 2a 20  Current as.  ** 
11ad0 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68  the value for th
11ae0 65 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c  e recursive-tabl
11af0 65 2e 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  e. Store the res
11b00 75 6c 74 73 20 69 6e 20 74 68 65 20 51 75 65 75  ults in the Queu
11b10 65 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72  e..  */.  p->pPr
11b20 69 6f 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ior = 0;.  sqlit
11b30 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
11b40 20 70 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b   p, &destQueue);
11b50 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
11b60 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e  rior==0 );.  p->
11b70 70 50 72 69 6f 72 20 3d 20 70 53 65 74 75 70 3b  pPrior = pSetup;
11b80 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 72 75 6e 6e  ..  /* Keep runn
11b90 69 6e 67 20 74 68 65 20 6c 6f 6f 70 20 75 6e 74  ing the loop unt
11ba0 69 6c 20 74 68 65 20 51 75 65 75 65 20 69 73 20  il the Queue is 
11bb0 65 6d 70 74 79 20 2a 2f 0a 20 20 73 71 6c 69 74  empty */.  sqlit
11bc0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11bd0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
11be0 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Top);.  sqlite3V
11bf0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
11c00 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a  v, addrBreak);..
11c10 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65  end_of_recursive
11c20 5f 71 75 65 72 79 3a 0a 20 20 73 71 6c 69 74 65  _query:.  sqlite
11c30 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
11c40 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
11c50 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70  OrderBy);.  p->p
11c60 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
11c70 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20  By;.  p->pLimit 
11c80 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 70  = pLimit;.  p->p
11c90 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
11ca0 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65  ;.  return;.}.#e
11cb0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
11cc0 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 2f 2a 20 46  MIT_CTE */../* F
11cd0 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
11ce0 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
11cf0 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
11d00 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  By(.  Parse *pPa
11d10 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
11d20 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
11d30 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
11d40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11d50 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
11d60 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
11d70 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
11d80 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
11d90 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
11da0 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
11db0 2f 0a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  /.);.../*.** Thi
11dc0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
11dd0 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61  led to process a
11de0 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
11df0 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f  form from.** two
11e00 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74   or more separat
11e10 65 20 71 75 65 72 69 65 73 20 75 73 69 6e 67 20  e queries using 
11e20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c  UNION, UNION ALL
11e30 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20  , EXCEPT, or.** 
11e40 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20  INTERSECT.**.** 
11e50 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  "p" points to th
11e60 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
11e70 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e  the two queries.
11e80 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74    the query on t
11e90 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d  he.** left is p-
11ea0 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65  >pPrior.  The le
11eb0 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61  ft query could a
11ec0 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e  lso be a compoun
11ed0 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68  d query.** in wh
11ee0 69 63 68 20 63 61 73 65 20 74 68 69 73 20 72 6f  ich case this ro
11ef0 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61  utine will be ca
11f00 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
11f10 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  . .**.** The res
11f20 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61  ults of the tota
11f30 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f 20 62  l query are to b
11f40 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61  e written into a
11f50 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20   destination.** 
11f60 6f 66 20 74 79 70 65 20 65 44 65 73 74 20 77 69  of type eDest wi
11f70 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 50 61  th parameter iPa
11f80 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  rm..**.** Exampl
11f90 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61  e 1:  Consider a
11fa0 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f   three-way compo
11fb0 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  und SQL statemen
11fc0 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  t..**.**     SEL
11fd0 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e  ECT a FROM t1 UN
11fe0 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ION SELECT b FRO
11ff0 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t2 UNION SELEC
12000 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a  T c FROM t3.**.*
12010 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
12020 20 69 73 20 70 61 72 73 65 64 20 75 70 20 61 73   is parsed up as
12030 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
12040 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f      SELECT c FRO
12050 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a  M t3.**      |.*
12060 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20  *      `----->  
12070 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
12080 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
12090 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
120a0 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20         `------> 
120b0 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
120c0 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f  1.**.** The arro
120d0 77 73 20 69 6e 20 74 68 65 20 64 69 61 67 72 61  ws in the diagra
120e0 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e  m above represen
120f0 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72  t the Select.pPr
12100 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20  ior pointer..** 
12110 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
12120 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74  ne is called wit
12130 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65  h p equal to the
12140 20 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a   t3 query, then.
12150 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62  ** pPrior will b
12160 65 20 74 68 65 20 74 32 20 71 75 65 72 79 2e 20  e the t2 query. 
12170 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54   p->op will be T
12180 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20  K_UNION in this 
12190 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69  case..**.** Noti
121a0 63 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20  ce that because 
121b0 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c 69 74  of the way SQLit
121c0 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e  e parses compoun
121d0 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a  d SELECTs, the.*
121e0 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c  * individual sel
121f0 65 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75  ects always grou
12200 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  p from left to r
12210 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ight..*/.static 
12220 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  int multiSelect(
12230 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
12240 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
12250 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
12260 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
12270 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
12280 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
12290 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
122a0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
122b0 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
122c0 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
122d0 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
122e0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
122f0 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63  ITE_OK;   /* Suc
12300 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61  cess code from a
12310 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
12320 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b   Select *pPrior;
12330 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65         /* Anothe
12340 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61  r SELECT immedia
12350 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74  tely to our left
12360 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
12370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
12380 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
12390 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53  this VDBE */.  S
123a0 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20  electDest dest; 
123b0 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74       /* Alternat
123c0 69 76 65 20 64 61 74 61 20 64 65 73 74 69 6e 61  ive data destina
123d0 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tion */.  Select
123e0 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b 20 20   *pDelete = 0;  
123f0 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73 69 6d 70  /* Chain of simp
12400 6c 65 20 73 65 6c 65 63 74 73 20 74 6f 20 64 65  le selects to de
12410 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lete */.  sqlite
12420 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
12430 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
12440 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66 6e 64 65  ection */.#ifnde
12450 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
12460 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62  PLAIN.  int iSub
12470 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  1 = 0;        /*
12480 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d   EQP id of left-
12490 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20  hand query */.  
124a0 69 6e 74 20 69 53 75 62 32 20 3d 20 30 3b 20 20  int iSub2 = 0;  
124b0 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20        /* EQP id 
124c0 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75  of right-hand qu
124d0 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ery */.#endif.. 
124e0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
124f0 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
12500 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75  BY or LIMIT clau
12510 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45  se on prior SELE
12520 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20  CTs.  Only.  ** 
12530 74 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d  the last (right-
12540 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20  most) SELECT in 
12550 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68  the series may h
12560 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ave an ORDER BY 
12570 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20  or LIMIT..  */. 
12580 20 61 73 73 65 72 74 28 20 70 20 26 26 20 70 2d   assert( p && p-
12590 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43  >pPrior );  /* C
125a0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
125b0 67 75 61 72 61 6e 74 65 65 73 20 74 68 69 73 20  guarantees this 
125c0 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73 65 72 74  much */.  assert
125d0 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
125e0 20 53 46 5f 52 65 63 75 72 73 69 76 65 29 3d 3d   SF_Recursive)==
125f0 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41  0 || p->op==TK_A
12600 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  LL || p->op==TK_
12610 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62 20 3d 20  UNION );.  db = 
12620 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50  pParse->db;.  pP
12630 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
12640 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73  ;.  dest = *pDes
12650 74 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d  t;.  if( pPrior-
12660 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
12670 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
12680 28 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42  (pParse,"ORDER B
12690 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  Y clause should 
126a0 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f  come after %s no
126b0 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20  t before",.     
126c0 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
126d0 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
126e0 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
126f0 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
12700 7d 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  }.  if( pPrior->
12710 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  pLimit ){.    sq
12720 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
12730 61 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75  arse,"LIMIT clau
12740 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61  se should come a
12750 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f  fter %s not befo
12760 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63  re",.      selec
12770 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
12780 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
12790 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
127a0 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76  ct_end;.  }..  v
127b0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
127c0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  e(pParse);.  ass
127d0 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a  ert( v!=0 );  /*
127e0 20 54 68 65 20 56 44 42 45 20 61 6c 72 65 61 64   The VDBE alread
127f0 79 20 63 72 65 61 74 65 64 20 62 79 20 63 61 6c  y created by cal
12800 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ling function */
12810 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68  ..  /* Create th
12820 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65  e destination te
12830 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66  mporary table if
12840 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a   necessary.  */.
12850 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
12860 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
12870 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
12880 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73  >pEList );.    s
12890 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
128a0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
128b0 65 72 61 6c 2c 20 64 65 73 74 2e 69 53 44 50 61  eral, dest.iSDPa
128c0 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  rm, p->pEList->n
128d0 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
128e0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
128f0 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  , BTREE_UNORDERE
12900 44 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65  D);.    dest.eDe
12910 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a  st = SRT_Table;.
12920 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
12930 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20  ure all SELECTs 
12940 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
12950 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
12960 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
12970 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20  s.  ** in their 
12980 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a  result sets..  *
12990 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  /.  assert( p->p
129a0 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d  EList && pPrior-
129b0 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28  >pEList );.  if(
129c0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
129d0 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  r!=pPrior->pELis
129e0 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
129f0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
12a00 26 20 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20  & SF_Values ){. 
12a10 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
12a20 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 6c  rMsg(pParse, "al
12a30 6c 20 56 41 4c 55 45 53 20 6d 75 73 74 20 68 61  l VALUES must ha
12a40 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
12a50 65 72 20 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20  er of terms");. 
12a60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12a70 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
12a80 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73  pParse, "SELECTs
12a90 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64   to the left and
12aa0 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20   right of %s".  
12ab0 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68        " do not h
12ac0 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
12ad0 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
12ae0 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70  lumns", selectOp
12af0 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
12b00 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a    }.    rc = 1;.
12b10 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
12b20 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
12b30 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12b40 4d 49 54 5f 43 54 45 0a 20 20 69 66 28 20 70 2d  MIT_CTE.  if( p-
12b50 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
12b60 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
12b70 67 65 6e 65 72 61 74 65 57 69 74 68 52 65 63 75  generateWithRecu
12b80 72 73 69 76 65 51 75 65 72 79 28 70 50 61 72 73  rsiveQuery(pPars
12b90 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20  e, p, &dest);.  
12ba0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
12bb0 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  /* Compound SELE
12bc0 43 54 73 20 74 68 61 74 20 68 61 76 65 20 61 6e  CTs that have an
12bd0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
12be0 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70   are handled sep
12bf0 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  arately..  */.  
12c00 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
12c10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75  ){.    return mu
12c20 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
12c30 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73  (pParse, p, pDes
12c40 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f  t);.  }else..  /
12c50 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
12c60 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64  for the left and
12c70 20 72 69 67 68 74 20 53 45 4c 45 43 54 20 73 74   right SELECT st
12c80 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  atements..  */. 
12c90 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
12ca0 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c  {.    case TK_AL
12cb0 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  L: {.      int a
12cc0 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ddr = 0;.      i
12cd0 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20  nt nLimit;.     
12ce0 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72   assert( !pPrior
12cf0 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20  ->pLimit );.    
12d00 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74    pPrior->iLimit
12d10 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20   = p->iLimit;.  
12d20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66      pPrior->iOff
12d30 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74  set = p->iOffset
12d40 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
12d50 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
12d60 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  it;.      pPrior
12d70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70  ->pOffset = p->p
12d80 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 65 78  Offset;.      ex
12d90 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
12da0 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69  iSub1, pParse->i
12db0 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
12dc0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12dd0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
12de0 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a  pPrior, &dest);.
12df0 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
12e00 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  = 0;.      p->pO
12e10 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
12e20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
12e30 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
12e40 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
12e50 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  }.      p->pPrio
12e60 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  r = 0;.      p->
12e70 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d  iLimit = pPrior-
12e80 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >iLimit;.      p
12e90 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69  ->iOffset = pPri
12ea0 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20  or->iOffset;.   
12eb0 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74     if( p->iLimit
12ec0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72   ){.        addr
12ed0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
12ee0 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72  dOp1(v, OP_IfZer
12ef0 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 20 56  o, p->iLimit); V
12f00 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
12f10 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
12f20 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61 68  ent((v, "Jump ah
12f30 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61  ead if LIMIT rea
12f40 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20 7d  ched"));.      }
12f50 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
12f60 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20  tInteger(iSub2, 
12f70 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
12f80 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
12f90 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
12fa0 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
12fb0 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
12fc0 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
12fd0 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65  K );.      pDele
12fe0 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  te = p->pPrior;.
12ff0 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
13000 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
13010 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d  p->nSelectRow +=
13020 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
13030 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Row;.      if( p
13040 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a 20 20  Prior->pLimit.  
13050 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45       && sqlite3E
13060 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 50 72  xprIsInteger(pPr
13070 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 4c  ior->pLimit, &nL
13080 69 6d 69 74 29 0a 20 20 20 20 20 20 20 26 26 20  imit).       && 
13090 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e  nLimit>0 && p->n
130a0 53 65 6c 65 63 74 52 6f 77 20 3e 20 28 75 36 34  SelectRow > (u64
130b0 29 6e 4c 69 6d 69 74 20 0a 20 20 20 20 20 20 29  )nLimit .      )
130c0 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65  {.        p->nSe
130d0 6c 65 63 74 52 6f 77 20 3d 20 6e 4c 69 6d 69 74  lectRow = nLimit
130e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
130f0 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20  if( addr ){.    
13100 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
13110 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
13120 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13130 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
13140 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
13150 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49  .    case TK_UNI
13160 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ON: {.      int 
13170 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20  unionTab;    /* 
13180 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  Cursor number of
13190 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
131a0 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73  able holding res
131b0 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ult */.      u8 
131c0 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  op = 0;       /*
131d0 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f   One of the SRT_
131e0 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61   operations to a
131f0 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a  pply to self */.
13200 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f        int priorO
13210 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52  p;     /* The SR
13220 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  T_ operation to 
13230 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73  apply to prior s
13240 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20  elects */.      
13250 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70  Expr *pLimit, *p
13260 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64  Offset; /* Saved
13270 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c   values of p->nL
13280 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66  imit and p->nOff
13290 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  set */.      int
132a0 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c   addr;.      Sel
132b0 65 63 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73  ectDest uniondes
132c0 74 3b 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61  t;..      testca
132d0 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  se( p->op==TK_EX
132e0 43 45 50 54 20 29 3b 0a 20 20 20 20 20 20 74 65  CEPT );.      te
132f0 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
13300 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20  K_UNION );.     
13310 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55   priorOp = SRT_U
13320 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  nion;.      if( 
13330 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f  dest.eDest==prio
13340 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  rOp ){.        /
13350 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61  * We can reuse a
13360 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
13370 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20   generated by a 
13380 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20  SELECT to our.  
13390 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a        ** right..
133a0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
133b0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c     assert( p->pL
133c0 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20 20 20  imit==0 );      
133d0 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f  /* Not allowed o
133e0 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65  n leftward eleme
133f0 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  nts */.        a
13400 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65  ssert( p->pOffse
13410 74 3d 3d 30 20 29 3b 20 20 20 20 20 2f 2a 20 4e  t==0 );     /* N
13420 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65  ot allowed on le
13430 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20  ftward elements 
13440 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  */.        union
13450 54 61 62 20 3d 20 64 65 73 74 2e 69 53 44 50 61  Tab = dest.iSDPa
13460 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  rm;.      }else{
13470 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77  .        /* We w
13480 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61  ill need to crea
13490 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f  te our own tempo
134a0 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f  rary table to ho
134b0 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ld the.        *
134c0 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  * intermediate r
134d0 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20  esults..        
134e0 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  */.        union
134f0 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
13500 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ab++;.        as
13510 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
13520 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  y==0 );.        
13530 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
13540 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
13550 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e  penEphemeral, un
13560 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  ionTab, 0);.    
13570 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
13580 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
13590 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  = -1 );.        
135a0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
135b0 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  0] = addr;.     
135c0 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74     findRightmost
135d0 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  (p)->selFlags |=
135e0 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
135f0 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  l;.        asser
13600 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
13610 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
13620 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43  * Code the SELEC
13630 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
13640 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a  our left.      *
13650 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
13660 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42  !pPrior->pOrderB
13670 79 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  y );.      sqlit
13680 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
13690 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69  (&uniondest, pri
136a0 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b  orOp, unionTab);
136b0 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
136c0 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20  tInteger(iSub1, 
136d0 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
136e0 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
136f0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
13700 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
13710 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20   &uniondest);.  
13720 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
13730 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
13740 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
13750 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
13760 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ode the current 
13770 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
13780 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13790 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  if( p->op==TK_EX
137a0 43 45 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20  CEPT ){.        
137b0 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b  op = SRT_Except;
137c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
137d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
137e0 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
137f0 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52  .        op = SR
13800 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d  T_Union;.      }
13810 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
13820 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d   = 0;.      pLim
13830 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
13840 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
13850 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73  = 0;.      pOffs
13860 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
13870 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
13880 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e 69  t = 0;.      uni
13890 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d 20 6f  ondest.eDest = o
138a0 70 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  p;.      explain
138b0 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32  SetInteger(iSub2
138c0 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
138d0 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
138e0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
138f0 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75  ct(pParse, p, &u
13900 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20  niondest);.     
13910 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
13920 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
13930 20 20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74    /* Query flatt
13940 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33  ening in sqlite3
13950 53 65 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72  Select() might r
13960 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42  efill p->pOrderB
13970 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 20 73  y..      ** Be s
13980 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d  ure to delete p-
13990 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65  >pOrderBy, there
139a0 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61  fore, to avoid a
139b0 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f   memory leak. */
139c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
139d0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
139e0 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
139f0 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
13a00 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
13a10 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
13a20 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72  or;.      p->pOr
13a30 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
13a40 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55   if( p->op==TK_U
13a50 4e 49 4f 4e 20 29 20 70 2d 3e 6e 53 65 6c 65 63  NION ) p->nSelec
13a60 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e  tRow += pPrior->
13a70 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
13a80 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
13a90 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
13aa0 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
13ab0 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
13ac0 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
13ad0 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20   pOffset;.      
13ae0 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->iLimit = 0;. 
13af0 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20       p->iOffset 
13b00 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  = 0;..      /* C
13b10 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20  onvert the data 
13b20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
13b30 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74   table into what
13b40 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20  ever form.      
13b50 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20 77 65  ** it is that we
13b60 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e   currently need.
13b70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13b80 61 73 73 65 72 74 28 20 75 6e 69 6f 6e 54 61 62  assert( unionTab
13b90 3d 3d 64 65 73 74 2e 69 53 44 50 61 72 6d 20 7c  ==dest.iSDParm |
13ba0 7c 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72  | dest.eDest!=pr
13bb0 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20 20 69  iorOp );.      i
13bc0 66 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70  f( dest.eDest!=p
13bd0 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20  riorOp ){.      
13be0 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
13bf0 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
13c00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
13c10 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
13c20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
13c30 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
13c40 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74            Select
13c50 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20   *pFirst = p;.  
13c60 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
13c70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20  First->pPrior ) 
13c80 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
13c90 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
13ca0 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
13cb0 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30  nNames(pParse, 0
13cc0 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74  , pFirst->pEList
13cd0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
13ce0 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
13cf0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
13d00 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69  el(v);.        i
13d10 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
13d20 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
13d30 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c          computeL
13d40 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
13d50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29  arse, p, iBreak)
13d60 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
13d70 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13d80 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54  P_Rewind, unionT
13d90 61 62 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  ab, iBreak); Vdb
13da0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
13db0 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
13dc0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
13dd0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
13de0 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
13df0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
13e00 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62  pEList, unionTab
13e10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13e20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
13e30 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42  &dest, iCont, iB
13e40 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
13e50 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
13e60 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
13e70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
13e80 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13e90 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62  P_Next, unionTab
13ea0 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62 65 43  , iStart); VdbeC
13eb0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
13ec0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
13ed0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
13ee0 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
13ef0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13f00 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75  2(v, OP_Close, u
13f10 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
13f20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
13f30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
13f40 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70 2d 3e  ult: assert( p->
13f50 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
13f60 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20   ); {.      int 
13f70 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20  tab1, tab2;.    
13f80 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
13f90 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
13fa0 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c     Expr *pLimit,
13fb0 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20   *pOffset;.     
13fc0 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
13fd0 20 53 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65   SelectDest inte
13fe0 72 73 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20  rsectdest;.     
13ff0 20 69 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20 20   int r1;..      
14000 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20  /* INTERSECT is 
14010 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
14020 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20  he others since 
14030 69 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  it requires.    
14040 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61    ** two tempora
14050 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63  ry tables.  Henc
14060 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e  e it has its own
14070 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20   case.  Begin.  
14080 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61      ** by alloca
14090 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20  ting the tables 
140a0 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20  we will need..  
140b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62      */.      tab
140c0 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  1 = pParse->nTab
140d0 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d  ++;.      tab2 =
140e0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
140f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14100 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
14110 0a 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ..      addr = s
14120 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14130 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
14140 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a  eral, tab1, 0);.
14150 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
14160 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
14170 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
14180 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
14190 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  0] = addr;.     
141a0 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70   findRightmost(p
141b0 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  )->selFlags |= S
141c0 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
141d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
141e0 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20  ->pEList );..   
141f0 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53     /* Code the S
14200 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65  ELECTs to our le
14210 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72  ft into temporar
14220 79 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a  y table "tab1"..
14230 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
14240 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
14250 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63 74 64  Init(&intersectd
14260 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20  est, SRT_Union, 
14270 74 61 62 31 29 3b 0a 20 20 20 20 20 20 65 78 70  tab1);.      exp
14280 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
14290 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub1, pParse->iN
142a0 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
142b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
142c0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
142d0 50 72 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63  Prior, &intersec
142e0 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66  tdest);.      if
142f0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
14300 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
14310 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
14320 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
14330 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
14340 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
14350 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20  table "tab2".   
14360 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
14370 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
14380 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
14390 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20  phemeral, tab2, 
143a0 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
143b0 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
143c0 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[1] == -1 );.  
143d0 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
143e0 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[1] = addr;. 
143f0 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
14400 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74   0;.      pLimit
14410 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
14420 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
14430 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74  0;.      pOffset
14440 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
14450 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
14460 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 65 72  = 0;.      inter
14470 73 65 63 74 64 65 73 74 2e 69 53 44 50 61 72 6d  sectdest.iSDParm
14480 20 3d 20 74 61 62 32 3b 0a 20 20 20 20 20 20 65   = tab2;.      e
14490 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
144a0 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e  (iSub2, pParse->
144b0 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
144c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
144d0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
144e0 20 70 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65   p, &intersectde
144f0 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
14500 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
14510 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c  OK );.      pDel
14520 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ete = p->pPrior;
14530 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
14540 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
14550 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52   if( p->nSelectR
14560 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  ow>pPrior->nSele
14570 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65  ctRow ) p->nSele
14580 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e  ctRow = pPrior->
14590 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
145a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
145b0 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
145c0 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
145d0 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
145e0 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
145f0 20 70 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20   pOffset;..     
14600 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
14610 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e  e to take the in
14620 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68  tersection of th
14630 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a  e two temporary.
14640 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e        ** tables.
14650 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14660 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
14670 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  t );.      if( d
14680 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  est.eDest==SRT_O
14690 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20  utput ){.       
146a0 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20   Select *pFirst 
146b0 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 77 68 69  = p;.        whi
146c0 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
146d0 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
146e0 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
146f0 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f        generateCo
14700 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
14710 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c  , 0, pFirst->pEL
14720 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
14730 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
14740 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
14750 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e  l(v);.      iCon
14760 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
14770 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
14780 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
14790 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
147a0 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
147b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
147c0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
147d0 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29  d, tab1, iBreak)
147e0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
147f0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
14800 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
14810 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
14820 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
14830 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14840 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20 72 31  RowKey, tab1, r1
14850 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14860 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
14870 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61   OP_NotFound, ta
14880 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30  b2, iCont, r1, 0
14890 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
148a0 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
148b0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
148c0 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
148d0 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
148e0 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
148f0 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 0a 20  >pEList, tab1,. 
14900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14910 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74       0, 0, &dest
14920 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29  , iCont, iBreak)
14930 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
14940 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
14950 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
14960 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14970 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74  p2(v, OP_Next, t
14980 61 62 31 2c 20 69 53 74 61 72 74 29 3b 20 56 64  ab1, iStart); Vd
14990 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
149a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
149b0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
149c0 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
149d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
149e0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
149f0 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  b2, 0);.      sq
14a00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14a10 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
14a20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  1, 0);.      bre
14a30 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
14a40 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74   explainComposit
14a50 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c  e(pParse, p->op,
14a60 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20 70   iSub1, iSub2, p
14a70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a  ->op!=TK_ALL);..
14a80 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c    /* Compute col
14a90 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
14aa0 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74   used by .  ** t
14ab0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20  emporary tables 
14ac0 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d  needed to implem
14ad0 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  ent the compound
14ae0 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74   select..  ** At
14af0 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f  tach the KeyInfo
14b00 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c   structure to al
14b10 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  l temporary tabl
14b20 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
14b30 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75  is section is ru
14b40 6e 20 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d  n by the right-m
14b50 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
14b60 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20  ment only..  ** 
14b70 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
14b80 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c  s to the left al
14b90 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20 70  ways skip this p
14ba0 61 72 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d  art.  The right-
14bb0 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54  most.  ** SELECT
14bc0 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70   might also skip
14bd0 20 74 68 69 73 20 70 61 72 74 20 69 66 20 69 74   this part if it
14be0 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59   has no ORDER BY
14bf0 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a   clause and.  **
14c00 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20   no temp tables 
14c10 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20  are required..  
14c20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
14c30 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73 45 70  lags & SF_UsesEp
14c40 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69  hemeral ){.    i
14c50 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
14c60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14c70 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
14c80 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
14c90 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  yInfo;          
14ca0 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
14cb0 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
14cc0 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
14cd0 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b    Select *pLoop;
14ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cf0 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  /* For looping t
14d00 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74  hrough SELECT st
14d10 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  atements */.    
14d20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c  CollSeq **apColl
14d30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
14d40 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
14d50 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ough pKeyInfo->a
14d60 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e  Coll[] */.    in
14d70 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
14d80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
14d90 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
14da0 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a   in result set *
14db0 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  /..    assert( p
14dc0 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20  ->pNext==0 );.  
14dd0 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69    nCol = p->pELi
14de0 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70  st->nExpr;.    p
14df0 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
14e00 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
14e10 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20  , nCol, 1);.    
14e20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b  if( !pKeyInfo ){
14e30 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
14e40 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
14e50 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
14e60 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
14e70 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c   for(i=0, apColl
14e80 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  =pKeyInfo->aColl
14e90 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61  ; i<nCol; i++, a
14ea0 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20  pColl++){.      
14eb0 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53  *apColl = multiS
14ec0 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
14ed0 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20  rse, p, i);.    
14ee0 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c    if( 0==*apColl
14ef0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43   ){.        *apC
14f00 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
14f10 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
14f20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f   }..    for(pLoo
14f30 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  p=p; pLoop; pLoo
14f40 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29  p=pLoop->pPrior)
14f50 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
14f60 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<2; i++){.    
14f70 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70      int addr = p
14f80 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
14f90 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  hm[i];.        i
14fa0 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20  f( addr<0 ){.   
14fb0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d         /* If [0]
14fc0 20 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20   is unused then 
14fd0 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73  [1] is also unus
14fe0 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20  ed.  So we can. 
14ff0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61           ** alwa
15000 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20  ys safely abort 
15010 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66  as soon as the f
15020 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74  irst unused slot
15030 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20   is found */.   
15040 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
15050 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
15060 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20  hm[1]<0 );.     
15070 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15080 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
15090 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
150a0 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29  2(v, addr, nCol)
150b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
150c0 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
150d0 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 73 71   addr, (char*)sq
150e0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28  lite3KeyInfoRef(
150f0 70 4b 65 79 49 6e 66 6f 29 2c 0a 20 20 20 20 20  pKeyInfo),.     
15100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15110 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46         P4_KEYINF
15120 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f  O);.        pLoo
15130 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
15140 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  i] = -1;.      }
15150 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
15160 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
15170 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d  KeyInfo);.  }..m
15180 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a  ulti_select_end:
15190 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20  .  pDest->iSdst 
151a0 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20  = dest.iSdst;.  
151b0 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64  pDest->nSdst = d
151c0 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c  est.nSdst;.  sql
151d0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
151e0 28 64 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20  (db, pDelete);. 
151f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
15200 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
15210 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
15220 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ECT */../*.** Co
15230 64 65 20 61 6e 20 6f 75 74 70 75 74 20 73 75 62  de an output sub
15240 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20 63 6f  routine for a co
15250 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
15260 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53  tation of a.** S
15270 45 4c 45 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a  ELECT statment..
15280 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 20 74  **.** The data t
15290 6f 20 62 65 20 6f 75 74 70 75 74 20 69 73 20 63  o be output is c
152a0 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d  ontained in pIn-
152b0 3e 69 53 64 73 74 2e 20 20 54 68 65 72 65 20 61  >iSdst.  There a
152c0 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74  re.** pIn->nSdst
152d0 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f   columns to be o
152e0 75 74 70 75 74 2e 20 20 70 44 65 73 74 20 69 73  utput.  pDest is
152f0 20 77 68 65 72 65 20 74 68 65 20 6f 75 74 70 75   where the outpu
15300 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73  t should.** be s
15310 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65  ent..**.** regRe
15320 74 75 72 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  turn is the numb
15330 65 72 20 6f 66 20 74 68 65 20 72 65 67 69 73 74  er of the regist
15340 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  er holding the s
15350 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  ubroutine.** ret
15360 75 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a  urn address..**.
15370 2a 2a 20 49 66 20 72 65 67 50 72 65 76 3e 30 20  ** If regPrev>0 
15380 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 66  then it is the f
15390 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e  irst register in
153a0 20 61 20 76 65 63 74 6f 72 20 74 68 61 74 0a 2a   a vector that.*
153b0 2a 20 72 65 63 6f 72 64 73 20 74 68 65 20 70 72  * records the pr
153c0 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20  evious output.  
153d0 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20 69 73 20  mem[regPrev] is 
153e0 61 20 66 6c 61 67 20 74 68 61 74 20 69 73 20 66  a flag that is f
153f0 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65 72 65  alse.** if there
15400 20 68 61 73 20 62 65 65 6e 20 6e 6f 20 70 72 65   has been no pre
15410 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 49  vious output.  I
15420 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e  f regPrev>0 then
15430 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65   code is.** gene
15440 72 61 74 65 64 20 74 6f 20 73 75 70 70 72 65 73  rated to suppres
15450 73 20 64 75 70 6c 69 63 61 74 65 73 2e 20 20 70  s duplicates.  p
15460 4b 65 79 49 6e 66 6f 20 69 73 20 75 73 65 64 20  KeyInfo is used 
15470 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a  for comparing.**
15480 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   keys..**.** If 
15490 74 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20  the LIMIT found 
154a0 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20  in p->iLimit is 
154b0 72 65 61 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d  reached, jump im
154c0 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20  mediately to.** 
154d0 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69  iBreak..*/.stati
154e0 63 20 69 6e 74 20 67 65 6e 65 72 61 74 65 4f 75  c int generateOu
154f0 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 0a  tputSubroutine(.
15500 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
15510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
15520 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
15530 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
15540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15550 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
15560 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  t */.  SelectDes
15570 74 20 2a 70 49 6e 2c 20 20 20 20 20 20 20 20 2f  t *pIn,        /
15580 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73 75 70 70  * Coroutine supp
15590 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20  lying data */.  
155a0 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
155b0 74 2c 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65  t,      /* Where
155c0 20 74 6f 20 73 65 6e 64 20 74 68 65 20 64 61 74   to send the dat
155d0 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  a */.  int regRe
155e0 74 75 72 6e 2c 20 20 20 20 20 20 20 20 20 20 2f  turn,          /
155f0 2a 20 54 68 65 20 72 65 74 75 72 6e 20 61 64 64  * The return add
15600 72 65 73 73 20 72 65 67 69 73 74 65 72 20 2a 2f  ress register */
15610 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 2c 20  .  int regPrev, 
15620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
15630 65 76 69 6f 75 73 20 72 65 73 75 6c 74 20 72 65  evious result re
15640 67 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71  gister.  No uniq
15650 75 65 6e 65 73 73 20 69 66 20 30 20 2a 2f 0a 20  ueness if 0 */. 
15660 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
15670 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  fo,      /* For 
15680 63 6f 6d 70 61 72 69 6e 67 20 77 69 74 68 20 70  comparing with p
15690 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f  revious entry */
156a0 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20  .  int iBreak   
156b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
156c0 6d 70 20 68 65 72 65 20 69 66 20 77 65 20 68 69  mp here if we hi
156d0 74 20 74 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29  t the LIMIT */.)
156e0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
156f0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
15700 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  nt iContinue;.  
15710 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 61 64 64  int addr;..  add
15720 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
15730 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
15740 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c   iContinue = sql
15750 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
15760 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70  l(v);..  /* Supp
15770 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 20  ress duplicates 
15780 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  for UNION, EXCEP
15790 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54  T, and INTERSECT
157a0 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67   .  */.  if( reg
157b0 50 72 65 76 20 29 7b 0a 20 20 20 20 69 6e 74 20  Prev ){.    int 
157c0 6a 31 2c 20 6a 32 3b 0a 20 20 20 20 6a 31 20 3d  j1, j2;.    j1 =
157d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
157e0 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p1(v, OP_IfNot, 
157f0 72 65 67 50 72 65 76 29 3b 20 56 64 62 65 43 6f  regPrev); VdbeCo
15800 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 6a  verage(v);.    j
15810 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
15820 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
15830 61 72 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  are, pIn->iSdst,
15840 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d   regPrev+1, pIn-
15850 3e 6e 53 64 73 74 2c 0a 20 20 20 20 20 20 20 20  >nSdst,.        
15860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15870 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c        (char*)sql
15880 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70  ite3KeyInfoRef(p
15890 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59  KeyInfo), P4_KEY
158a0 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74  INFO);.    sqlit
158b0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
158c0 4f 50 5f 4a 75 6d 70 2c 20 6a 32 2b 32 2c 20 69  OP_Jump, j2+2, i
158d0 43 6f 6e 74 69 6e 75 65 2c 20 6a 32 2b 32 29 3b  Continue, j2+2);
158e0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
158f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15900 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
15910 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15920 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
15930 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  py, pIn->iSdst, 
15940 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e  regPrev+1, pIn->
15950 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20 20 73 71  nSdst-1);.    sq
15960 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15970 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
15980 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a  , regPrev);.  }.
15990 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
159a0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
159b0 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
159c0 20 53 75 70 70 72 65 73 73 20 74 68 65 20 66 69   Suppress the fi
159d0 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74 72 69  rst OFFSET entri
159e0 65 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  es if there is a
159f0 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a  n OFFSET clause.
15a00 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65    */.  codeOffse
15a10 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
15a20 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20   iContinue);..  
15a30 73 77 69 74 63 68 28 20 70 44 65 73 74 2d 3e 65  switch( pDest->e
15a40 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53  Dest ){.    /* S
15a50 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
15a60 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20  as data using a 
15a70 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20  unique key..    
15a80 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
15a90 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Table:.    case 
15aa0 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
15ab0 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
15ac0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
15ad0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
15ae0 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33  int r2 = sqlite3
15af0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
15b00 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
15b10 73 65 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  se( pDest->eDest
15b20 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20  ==SRT_Table );. 
15b30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
15b40 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
15b50 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20  _EphemTab );.   
15b60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15b70 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
15b80 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73  ecord, pIn->iSds
15b90 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72  t, pIn->nSdst, r
15ba0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
15bb0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15bc0 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73  P_NewRowid, pDes
15bd0 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 32 29 3b  t->iSDParm, r2);
15be0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15bf0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
15c00 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53  nsert, pDest->iS
15c10 44 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a  DParm, r1, r2);.
15c20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15c30 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
15c40 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
15c50 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
15c60 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
15c70 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r2);.      sqli
15c80 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
15c90 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
15ca0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15cb0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
15cc0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
15cd0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
15ce0 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
15cf0 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20  for an "expr IN 
15d00 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f  (SELECT ...)" co
15d10 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20  nstruct,.    ** 
15d20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c  then there shoul
15d30 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74  d be a single it
15d40 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  em on the stack.
15d50 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20    Write this.   
15d60 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68   ** item into th
15d70 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68  e set table with
15d80 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20   bogus data..   
15d90 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
15da0 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _Set: {.      in
15db0 74 20 72 31 3b 0a 20 20 20 20 20 20 61 73 73 65  t r1;.      asse
15dc0 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d  rt( pIn->nSdst==
15dd0 31 20 29 3b 0a 20 20 20 20 20 20 70 44 65 73 74  1 );.      pDest
15de0 2d 3e 61 66 66 53 64 73 74 20 3d 20 0a 20 20 20  ->affSdst = .   
15df0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d        sqlite3Com
15e00 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 2d 3e  pareAffinity(p->
15e10 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
15e20 70 72 2c 20 70 44 65 73 74 2d 3e 61 66 66 53 64  pr, pDest->affSd
15e30 73 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  st);.      r1 = 
15e40 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
15e50 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
15e60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15e70 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
15e80 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  ord, pIn->iSdst,
15e90 20 31 2c 20 72 31 2c 20 26 70 44 65 73 74 2d 3e   1, r1, &pDest->
15ea0 61 66 66 53 64 73 74 2c 31 29 3b 0a 20 20 20 20  affSdst,1);.    
15eb0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
15ec0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
15ed0 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
15ee0 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  dst, 1);.      s
15ef0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15f00 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
15f10 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
15f20 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
15f30 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
15f40 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
15f50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15f60 20 7d 0a 0a 23 69 66 20 30 20 20 2f 2a 20 4e 65   }..#if 0  /* Ne
15f70 76 65 72 20 6f 63 63 75 72 73 20 6f 6e 20 61 6e  ver occurs on an
15f80 20 4f 52 44 45 52 20 42 59 20 71 75 65 72 79 20   ORDER BY query 
15f90 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79  */.    /* If any
15fa0 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68   row exist in th
15fb0 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65  e result set, re
15fc0 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20 61  cord that fact a
15fd0 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f  nd abort..    */
15fe0 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78  .    case SRT_Ex
15ff0 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71  ists: {.      sq
16000 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16010 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
16020 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
16030 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
16040 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
16050 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  l terminate the 
16060 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
16070 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16080 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
16090 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63   If this is a sc
160a0 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74  alar select that
160b0 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
160c0 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a  xpression, then.
160d0 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65      ** store the
160e0 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
160f0 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f  appropriate memo
16100 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61  ry cell and brea
16110 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20  k out.    ** of 
16120 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  the scan loop.. 
16130 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
16140 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
16150 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64  assert( pIn->nSd
16160 73 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  st==1 );.      s
16170 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
16180 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ve(pParse, pIn->
16190 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53  iSdst, pDest->iS
161a0 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20  DParm, 1);.     
161b0 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
161c0 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f  ause will jump o
161d0 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66  ut of the loop f
161e0 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
161f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
16200 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
16210 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
16220 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68  RY */..    /* Th
16230 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74  e results are st
16240 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e  ored in a sequen
16250 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a  ce of registers.
16260 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20      ** starting 
16270 61 74 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2e  at pDest->iSdst.
16280 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f    Then the co-ro
16290 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20  utine yields..  
162a0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
162b0 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20  T_Coroutine: {. 
162c0 20 20 20 20 20 69 66 28 20 70 44 65 73 74 2d 3e       if( pDest->
162d0 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  iSdst==0 ){.    
162e0 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74      pDest->iSdst
162f0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
16300 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  pRange(pParse, p
16310 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20  In->nSdst);.    
16320 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74      pDest->nSdst
16330 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20   = pIn->nSdst;. 
16340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
16350 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
16360 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
16370 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 64 73  dst, pDest->iSds
16380 74 2c 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 29  t, pDest->nSdst)
16390 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
163a0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
163b0 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53  Yield, pDest->iS
163c0 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72  DParm);.      br
163d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
163e0 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68  /* If none of th
163f0 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68  e above, then th
16400 65 20 72 65 73 75 6c 74 20 64 65 73 74 69 6e 61  e result destina
16410 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20 20  tion must be.   
16420 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e 20   ** SRT_Output. 
16430 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
16440 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69   never called wi
16450 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 20  th any other.   
16460 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20   ** destination 
16470 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f  other than the o
16480 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62 6f 76  nes handled abov
16490 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2e  e or SRT_Output.
164a0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
164b0 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c 20 72  or SRT_Output, r
164c0 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
164d0 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20  d in a sequence 
164e0 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20 20 0a  of registers.  .
164f0 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20      ** Then the 
16500 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63  OP_ResultRow opc
16510 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f 20 63  ode is used to c
16520 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65  ause sqlite3_ste
16530 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65  p() to.    ** re
16540 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20 72 6f  turn the next ro
16550 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20  w of result..   
16560 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
16570 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
16580 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
16590 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
165a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
165b0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
165c0 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74  tRow, pIn->iSdst
165d0 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
165e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
165f0 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
16600 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  nge(pParse, pIn-
16610 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
16620 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
16630 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
16640 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  * Jump to the en
16650 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66  d of the loop if
16660 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65   the LIMIT is re
16670 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ached..  */.  if
16680 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ( p->iLimit ){. 
16690 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
166a0 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a 65 72  dOp3(v, OP_IfZer
166b0 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42  o, p->iLimit, iB
166c0 72 65 61 6b 2c 20 2d 31 29 3b 20 56 64 62 65 43  reak, -1); VdbeC
166d0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
166e0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74  .  /* Generate t
166f0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65  he subroutine re
16700 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  turn.  */.  sqli
16710 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
16720 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65  bel(v, iContinue
16730 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16740 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
16750 75 72 6e 2c 20 72 65 67 52 65 74 75 72 6e 29 3b  urn, regReturn);
16760 0a 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ..  return addr;
16770 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e  .}../*.** Altern
16780 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73  ative compound s
16790 65 6c 65 63 74 20 63 6f 64 65 20 67 65 6e 65 72  elect code gener
167a0 61 74 6f 72 20 66 6f 72 20 63 61 73 65 73 20 77  ator for cases w
167b0 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73 20  hen there.** is 
167c0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
167d0 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73  se..**.** We ass
167e0 75 6d 65 20 61 20 71 75 65 72 79 20 6f 66 20 74  ume a query of t
167f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72  he following for
16800 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73  m:.**.**      <s
16810 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72 61 74  electA>  <operat
16820 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20 20  or>  <selectB>  
16830 4f 52 44 45 52 20 42 59 20 3c 6f 72 64 65 72 62  ORDER BY <orderb
16840 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70  ylist>.**.** <op
16850 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f  erator> is one o
16860 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49  f UNION ALL, UNI
16870 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49  ON, EXCEPT, or I
16880 4e 54 45 52 53 45 43 54 2e 20 20 54 68 65 20 69  NTERSECT.  The i
16890 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64  dea.** is to cod
168a0 65 20 62 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e  e both <selectA>
168b0 20 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20 77   and <selectB> w
168c0 69 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ith the ORDER BY
168d0 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f   clause as.** co
168e0 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54 68 65 6e  -routines.  Then
168f0 20 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74   run the co-rout
16900 69 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c  ines in parallel
16910 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72   and merge the r
16920 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74  esults.** into t
16930 68 65 20 6f 75 74 70 75 74 2e 20 20 49 6e 20 61  he output.  In a
16940 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74  ddition to the t
16950 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 28 63  wo coroutines (c
16960 61 6c 6c 65 64 20 73 65 6c 65 63 74 41 20 61 6e  alled selectA an
16970 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20 74 68  d.** selectB) th
16980 65 72 65 20 61 72 65 20 37 20 73 75 62 72 6f 75  ere are 7 subrou
16990 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tines:.**.**    
169a0 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65 20 74 68  outA:    Move th
169b0 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20  e output of the 
169c0 73 65 6c 65 63 74 41 20 63 6f 72 6f 75 74 69 6e  selectA coroutin
169d0 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  e into the outpu
169e0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
169f0 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
16a00 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20   query..**.**   
16a10 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65 20 74   outB:    Move t
16a20 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65  he output of the
16a30 20 73 65 6c 65 63 74 42 20 63 6f 72 6f 75 74 69   selectB corouti
16a40 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  ne into the outp
16a50 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
16a60 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e    of the compoun
16a70 64 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20  d query.  (Only 
16a80 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 55 4e  generated for UN
16a90 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ION and.**      
16aa0 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
16ab0 2e 20 20 45 58 43 45 50 54 20 61 6e 64 20 49 4e  .  EXCEPT and IN
16ac0 53 45 52 54 53 45 43 54 20 6e 65 76 65 72 20 6f  SERTSECT never o
16ad0 75 74 70 75 74 20 61 20 72 6f 77 20 74 68 61 74  utput a row that
16ae0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
16af0 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20  appears only in 
16b00 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74  B.).**.**    Alt
16b10 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
16b20 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
16b30 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
16b40 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a  ines and A<B..**
16b50 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 20 20 20  .**    AeqB:    
16b60 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
16b70 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
16b80 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
16b90 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20  nd A==B..**.**  
16ba0 20 20 41 67 74 42 3a 20 20 20 20 43 61 6c 6c 65    AgtB:    Calle
16bb0 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
16bc0 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
16bd0 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3e  oroutines and A>
16be0 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41  B..**.**    EofA
16bf0 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
16c00 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
16c10 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e  ed from selectA.
16c20 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20  .**.**    EofB: 
16c30 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64     Called when d
16c40 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64  ata is exhausted
16c50 20 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a   from selectB..*
16c60 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
16c70 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  ntation of the l
16c80 61 74 74 65 72 20 66 69 76 65 20 73 75 62 72 6f  atter five subro
16c90 75 74 69 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e  utines depend on
16ca0 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72   which .** <oper
16cb0 61 74 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a  ator> is used:.*
16cc0 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  *.**.**         
16cd0 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20      UNION ALL   
16ce0 20 20 20 20 20 20 55 4e 49 4f 4e 20 20 20 20 20        UNION     
16cf0 20 20 20 20 20 20 20 45 58 43 45 50 54 20 20 20         EXCEPT   
16d00 20 20 20 20 20 20 20 49 4e 54 45 52 53 45 43 54         INTERSECT
16d10 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d 2d 2d  .**          ---
16d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ----------  ----
16d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
16d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
16d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16d60 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f 75  .**   AltB:   ou
16d70 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f  tA, nextA      o
16d80 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
16d90 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
16da0 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a       nextA.**.**
16db0 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74 41 2c     AeqB:   outA,
16dc0 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e   nextA         n
16dd0 65 78 74 41 20 20 20 20 20 20 20 20 20 20 20 20  extA            
16de0 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6f   nextA         o
16df0 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a  utA, nextA.**.**
16e00 20 20 20 41 67 74 42 3a 20 20 20 6f 75 74 42 2c     AgtB:   outB,
16e10 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42   nextB      outB
16e20 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20  , nextB         
16e30 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
16e40 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20    nextB.**.**   
16e50 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65  EofA:   outB, ne
16e60 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e  xtB      outB, n
16e70 65 78 74 42 20 20 20 20 20 20 20 20 20 20 68 61  extB          ha
16e80 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20 68  lt             h
16e90 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42  alt.**.**   EofB
16ea0 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20  :   outA, nextA 
16eb0 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
16ec0 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
16ed0 74 41 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a  tA         halt.
16ee0 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74  **.** In the Alt
16ef0 42 2c 20 41 65 71 42 2c 20 61 6e 64 20 41 67 74  B, AeqB, and Agt
16f00 42 20 73 75 62 72 6f 75 74 69 6e 65 73 2c 20 61  B subroutines, a
16f10 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f  n EOF on A follo
16f20 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61  wing nextA.** ca
16f30 75 73 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74  uses an immediat
16f40 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20 61  e jump to EofA a
16f50 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66  nd an EOF on B f
16f60 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20 63  ollowing nextB c
16f70 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65  auses.** an imme
16f80 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f  diate jump to Eo
16f90 66 42 2e 20 20 57 69 74 68 69 6e 20 45 6f 66 41  fB.  Within EofA
16fa0 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20 45   and EofB, and E
16fb0 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a  OF on entry or.*
16fc0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  * following next
16fd0 58 20 63 61 75 73 65 73 20 61 20 6a 75 6d 70 20  X causes a jump 
16fe0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
16ff0 65 20 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73  e select process
17000 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69  ing..**.** Dupli
17010 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20  cate removal in 
17020 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  the UNION, EXCEP
17030 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54  T, and INTERSECT
17040 20 63 61 73 65 73 20 69 73 20 68 61 6e 64 6c 65   cases is handle
17050 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  d.** within the 
17060 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
17070 65 2e 20 20 54 68 65 20 72 65 67 50 72 65 76 20  e.  The regPrev 
17080 72 65 67 69 73 74 65 72 20 73 65 74 20 68 6f 6c  register set hol
17090 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c  ds the previousl
170a0 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c 75  y.** output valu
170b0 65 2e 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e  e.  A comparison
170c0 20 69 73 20 6d 61 64 65 20 61 67 61 69 6e 73 74   is made against
170d0 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e 64 20   this value and 
170e0 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73  the output.** is
170f0 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
17100 6e 65 78 74 20 72 65 73 75 6c 74 73 20 77 6f 75  next results wou
17110 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ld be the same a
17120 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 0a  s the previous..
17130 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  **.** The implem
17140 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73  entation plan is
17150 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
17160 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73  e two coroutines
17170 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75   and seven.** su
17180 62 72 6f 75 74 69 6e 65 73 20 66 69 72 73 74 2c  broutines first,
17190 20 74 68 65 6e 20 70 75 74 20 74 68 65 20 63 6f   then put the co
171a0 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74  ntrol logic at t
171b0 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65  he bottom.  Like
171c0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
171d0 20 20 20 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a        goto Init.
171e0 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f  **     coA: coro
171f0 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 71  utine for left q
17200 75 65 72 79 20 28 41 29 0a 2a 2a 20 20 20 20 20  uery (A).**     
17210 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66  coB: coroutine f
17220 6f 72 20 72 69 67 68 74 20 71 75 65 72 79 20 28  or right query (
17230 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f  B).**    outA: o
17240 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66  utput one row of
17250 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f   A.**    outB: o
17260 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66  utput one row of
17270 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e   B (UNION and UN
17280 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a  ION ALL only).**
17290 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a      EofA: ....**
172a0 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a      EofB: ....**
172b0 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a      AltB: ....**
172c0 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a      AeqB: ....**
172d0 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a      AgtB: ....**
172e0 20 20 20 20 49 6e 69 74 3a 20 69 6e 69 74 69 61      Init: initia
172f0 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20 72  lize coroutine r
17300 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20  egisters.**     
17310 20 20 20 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a       yield coA.*
17320 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f  *          if eo
17330 66 28 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a  f(A) goto EofA.*
17340 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64  *          yield
17350 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20 20   coB.**         
17360 20 69 66 20 65 6f 66 28 42 29 20 67 6f 74 6f 20   if eof(B) goto 
17370 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a  EofB.**    Cmpr:
17380 20 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a   Compare A, B.**
17390 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20 41            Jump A
173a0 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 0a  ltB, AeqB, AgtB.
173b0 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a  **     End: ....
173c0 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c  **.** We call Al
173d0 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 2c 20  tB, AeqB, AgtB, 
173e0 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42 20 22  EofA, and EofB "
173f0 73 75 62 72 6f 75 74 69 6e 65 73 22 20 62 75 74  subroutines" but
17400 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a   they are not.**
17410 20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64   actually called
17420 20 75 73 69 6e 67 20 47 6f 73 75 62 20 61 6e 64   using Gosub and
17430 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 52 65 74   they do not Ret
17440 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20 45  urn.  EofA and E
17450 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69  ofB loop.** unti
17460 6c 20 61 6c 6c 20 64 61 74 61 20 69 73 20 65 78  l all data is ex
17470 68 61 75 73 74 65 64 20 74 68 65 6e 20 6a 75 6d  hausted then jum
17480 70 20 74 6f 20 74 68 65 20 22 65 6e 64 22 20 6c  p to the "end" l
17490 61 62 65 2e 20 20 41 6c 74 42 2c 20 41 65 71 42  abe.  AltB, AeqB
174a0 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a 75  ,.** and AgtB ju
174b0 6d 70 20 74 6f 20 65 69 74 68 65 72 20 4c 32 20  mp to either L2 
174c0 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66  or to one of Eof
174d0 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69  A or EofB..*/.#i
174e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
174f0 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
17500 54 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  T.static int mul
17510 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
17520 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
17530 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
17540 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
17550 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
17560 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
17570 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
17580 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
17590 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
175a0 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
175b0 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
175c0 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
175d0 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
175e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
175f0 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
17600 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20  Select *pPrior; 
17610 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72        /* Another
17620 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74   SELECT immediat
17630 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  ely to our left 
17640 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
17650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
17660 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
17670 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65  his VDBE */.  Se
17680 6c 65 63 74 44 65 73 74 20 64 65 73 74 41 3b 20  lectDest destA; 
17690 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69      /* Destinati
176a0 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65  on for coroutine
176b0 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65   A */.  SelectDe
176c0 73 74 20 64 65 73 74 42 3b 20 20 20 20 20 2f 2a  st destB;     /*
176d0 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72   Destination for
176e0 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a   coroutine B */.
176f0 20 20 69 6e 74 20 72 65 67 41 64 64 72 41 3b 20    int regAddrA; 
17700 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
17710 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
17720 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69  select-A corouti
17730 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41  ne */.  int regA
17740 64 64 72 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  ddrB;         /*
17750 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
17760 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 42 20 63  r for select-B c
17770 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
17780 74 20 61 64 64 72 53 65 6c 65 63 74 41 3b 20 20  t addrSelectA;  
17790 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
177a0 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 20 63  f the select-A c
177b0 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
177c0 74 20 61 64 64 72 53 65 6c 65 63 74 42 3b 20 20  t addrSelectB;  
177d0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
177e0 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 20 63  f the select-B c
177f0 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
17800 74 20 72 65 67 4f 75 74 41 3b 20 20 20 20 20 20  t regOutA;      
17810 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
17820 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20  egister for the 
17830 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74  output-A subrout
17840 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
17850 4f 75 74 42 3b 20 20 20 20 20 20 20 20 20 20 2f  OutB;          /
17860 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
17870 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75  er for the outpu
17880 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-B subroutine *
17890 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 41  /.  int addrOutA
178a0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
178b0 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70  ress of the outp
178c0 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-A subroutine 
178d0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74  */.  int addrOut
178e0 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41 64  B = 0;     /* Ad
178f0 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74  dress of the out
17900 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  put-B subroutine
17910 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f   */.  int addrEo
17920 66 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  fA;         /* A
17930 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
17940 6c 65 63 74 2d 41 2d 65 78 68 61 75 73 74 65 64  lect-A-exhausted
17950 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
17960 20 69 6e 74 20 61 64 64 72 45 6f 66 41 5f 6e 6f   int addrEofA_no
17970 42 3b 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e  B;     /* Altern
17980 61 74 65 20 61 64 64 72 45 6f 66 41 20 69 66 20  ate addrEofA if 
17990 42 20 69 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a  B is uninitializ
179a0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ed */.  int addr
179b0 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  EofB;         /*
179c0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
179d0 73 65 6c 65 63 74 2d 42 2d 65 78 68 61 75 73 74  select-B-exhaust
179e0 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ed subroutine */
179f0 0a 20 20 69 6e 74 20 61 64 64 72 41 6c 74 42 3b  .  int addrAltB;
17a00 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
17a10 65 73 73 20 6f 66 20 74 68 65 20 41 3c 42 20 73  ess of the A<B s
17a20 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
17a30 6e 74 20 61 64 64 72 41 65 71 42 3b 20 20 20 20  nt addrAeqB;    
17a40 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
17a50 6f 66 20 74 68 65 20 41 3d 3d 42 20 73 75 62 72  of the A==B subr
17a60 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
17a70 61 64 64 72 41 67 74 42 3b 20 20 20 20 20 20 20  addrAgtB;       
17a80 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
17a90 74 68 65 20 41 3e 42 20 73 75 62 72 6f 75 74 69  the A>B subrouti
17aa0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c  ne */.  int regL
17ab0 69 6d 69 74 41 3b 20 20 20 20 20 20 20 20 2f 2a  imitA;        /*
17ac0 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20   Limit register 
17ad0 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a  for select-A */.
17ae0 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b    int regLimitB;
17af0 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74          /* Limit
17b00 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
17b10 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20  lect-A */.  int 
17b20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20  regPrev;        
17b30 20 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66 20    /* A range of 
17b40 72 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c  registers to hol
17b50 64 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  d previous outpu
17b60 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64  t */.  int saved
17b70 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20  Limit;       /* 
17b80 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70  Saved value of p
17b90 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e  ->iLimit */.  in
17ba0 74 20 73 61 76 65 64 4f 66 66 73 65 74 3b 20 20  t savedOffset;  
17bb0 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c      /* Saved val
17bc0 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74  ue of p->iOffset
17bd0 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43   */.  int labelC
17be0 6d 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  mpr;        /* L
17bf0 61 62 65 6c 20 66 6f 72 20 74 68 65 20 73 74 61  abel for the sta
17c00 72 74 20 6f 66 20 74 68 65 20 6d 65 72 67 65 20  rt of the merge 
17c10 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69  algorithm */.  i
17c20 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20  nt labelEnd;    
17c30 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f       /* Label fo
17c40 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
17c50 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43 54 20   overall SELECT 
17c60 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 31  stmt */.  int j1
17c70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17c80 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75 63 74  /* Jump instruct
17c90 69 6f 6e 73 20 74 68 61 74 20 67 65 74 20 72 65  ions that get re
17ca0 74 61 72 67 65 74 74 65 64 20 2a 2f 0a 20 20 69  targetted */.  i
17cb0 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
17cc0 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54       /* One of T
17cd0 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c  K_ALL, TK_UNION,
17ce0 20 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49   TK_EXCEPT, TK_I
17cf0 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65  NTERSECT */.  Ke
17d00 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d  yInfo *pKeyDup =
17d10 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f   0; /* Compariso
17d20 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  n information fo
17d30 72 20 64 75 70 6c 69 63 61 74 65 20 72 65 6d 6f  r duplicate remo
17d40 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  val */.  KeyInfo
17d50 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f   *pKeyMerge;   /
17d60 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66  * Comparison inf
17d70 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72  ormation for mer
17d80 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73  ging rows */.  s
17d90 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
17da0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
17db0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
17dc0 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
17dd0 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52  rBy;   /* The OR
17de0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
17df0 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b  .  int nOrderBy;
17e00 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
17e10 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74  er of terms in t
17e20 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
17e30 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65  se */.  int *aPe
17e40 72 6d 75 74 65 3b 20 20 20 20 20 20 20 20 2f 2a  rmute;        /*
17e50 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52   Mapping from OR
17e60 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20  DER BY terms to 
17e70 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d  result set colum
17e80 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  ns */.#ifndef SQ
17e90 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
17ea0 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 3b 20 20  N.  int iSub1;  
17eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50            /* EQP
17ec0 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64   id of left-hand
17ed0 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
17ee0 69 53 75 62 32 3b 20 20 20 20 20 20 20 20 20 20  iSub2;          
17ef0 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72    /* EQP id of r
17f00 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20  ight-hand query 
17f10 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  */.#endif..  ass
17f20 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
17f30 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
17f40 20 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b 20 2f   pKeyDup==0 ); /
17f50 2a 20 22 4d 61 6e 61 67 65 64 22 20 63 6f 64 65  * "Managed" code
17f60 20 6e 65 65 64 73 20 74 68 69 73 2e 20 20 54 69   needs this.  Ti
17f70 63 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f 0a 20  cket #3382. */. 
17f80 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
17f90 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  v = pParse->
17fa0 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
17fb0 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f   v!=0 );       /
17fc0 2a 20 41 6c 72 65 61 64 79 20 74 68 72 6f 77 6e  * Already thrown
17fd0 20 74 68 65 20 65 72 72 6f 72 20 69 66 20 56 44   the error if VD
17fe0 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20  BE alloc failed 
17ff0 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20  */.  labelEnd = 
18000 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
18010 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c  abel(v);.  label
18020 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Cmpr = sqlite3Vd
18030 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
18040 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75 70 20  ..  /* Patch up 
18050 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
18060 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20  use.  */.  op = 
18070 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f  p->op;  .  pPrio
18080 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
18090 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d   assert( pPrior-
180a0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
180b0 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
180c0 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73 65  pOrderBy;.  asse
180d0 72 74 28 20 70 4f 72 64 65 72 42 79 20 29 3b 0a  rt( pOrderBy );.
180e0 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72    nOrderBy = pOr
180f0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20  derBy->nExpr;.. 
18100 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f 72   /* For operator
18110 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49  s other than UNI
18120 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20 74  ON ALL we have t
18130 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
18140 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20  .  ** the ORDER 
18150 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72 73  BY clause covers
18160 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74   every term of t
18170 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
18180 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74  Add.  ** terms t
18190 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
181a0 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73 73 61  lause as necessa
181b0 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ry..  */.  if( o
181c0 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p!=TK_ALL ){.   
181d0 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61   for(i=1; db->ma
181e0 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26  llocFailed==0 &&
181f0 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   i<=p->pEList->n
18200 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
18210 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
18220 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
18230 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49       for(j=0, pI
18240 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b  tem=pOrderBy->a;
18250 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b   j<nOrderBy; j++
18260 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
18270 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
18280 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
18290 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ol>0 );.        
182a0 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  if( pItem->u.x.i
182b0 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 69 20 29 20  OrderByCol==i ) 
182c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
182d0 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64       if( j==nOrd
182e0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
182f0 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c  Expr *pNew = sql
18300 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
18310 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20 20 20  INTEGER, 0);.   
18320 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30       if( pNew==0
18330 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
18340 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
18350 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
18360 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20  P_IntValue;.    
18370 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c      pNew->u.iVal
18380 75 65 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  ue = i;.        
18390 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
183a0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
183b0 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
183c0 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  y, pNew);.      
183d0 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
183e0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 4f 72   pOrderBy->a[nOr
183f0 64 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69 4f 72  derBy++].u.x.iOr
18400 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31 36 29  derByCol = (u16)
18410 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  i;.      }.    }
18420 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
18430 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  te the compariso
18440 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 61 6e  n permutation an
18450 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74 20 69  d keyinfo that i
18460 73 20 75 73 65 64 20 77 69 74 68 0a 20 20 2a 2a  s used with.  **
18470 20 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e   the permutation
18480 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
18490 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74 0a 20  ne if the next. 
184a0 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73 75 6c   ** row of resul
184b0 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73 65  ts comes from se
184c0 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63 74 42  lectA or selectB
184d0 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78 70 6c  .  Also add expl
184e0 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74  icit.  ** collat
184f0 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52 44 45  ions to the ORDE
18500 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d  R BY clause term
18510 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74  s so that when t
18520 68 65 20 73 75 62 71 75 65 72 69 65 73 0a 20 20  he subqueries.  
18530 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  ** to the right 
18540 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61 72 65  and the left are
18550 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68 65 79   evaluated, they
18560 20 75 73 65 20 74 68 65 20 63 6f 72 72 65 63 74   use the correct
18570 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e  .  ** collation.
18580 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74 65  .  */.  aPermute
18590 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
185a0 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
185b0 28 69 6e 74 29 2a 6e 4f 72 64 65 72 42 79 29 3b  (int)*nOrderBy);
185c0 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74 65 20  .  if( aPermute 
185d0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
185e0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
185f0 65 6d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  em;.    for(i=0,
18600 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d   pItem=pOrderBy-
18610 3e 61 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  >a; i<nOrderBy; 
18620 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
18630 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
18640 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
18650 43 6f 6c 3e 30 0a 20 20 20 20 20 20 20 20 20 20  Col>0.          
18660 26 26 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  && pItem->u.x.iO
18670 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45  rderByCol<=p->pE
18680 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
18690 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b 69 5d       aPermute[i]
186a0 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f   = pItem->u.x.iO
186b0 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b 0a 20  rderByCol - 1;. 
186c0 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72     }.    pKeyMer
186d0 67 65 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ge = multiSelect
186e0 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 70  OrderByKeyInfo(p
186f0 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20  Parse, p, 1);.  
18700 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d  }else{.    pKeyM
18710 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  erge = 0;.  }.. 
18720 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68 65   /* Reattach the
18730 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
18740 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a 20   to the query.. 
18750 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42   */.  p->pOrderB
18760 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
18770 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
18780 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
18790 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  stDup(pParse->db
187a0 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a  , pOrderBy, 0);.
187b0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
187c0 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72   range of tempor
187d0 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61 6e  ary registers an
187e0 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65  d the KeyInfo ne
187f0 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68  eded.  ** for th
18800 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65 6d  e logic that rem
18810 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65 20 72  oves duplicate r
18820 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e 20  esult rows when 
18830 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f  the.  ** operato
18840 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45  r is UNION, EXCE
18850 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
18860 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20   (but not UNION 
18870 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ALL)..  */.  if(
18880 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
18890 20 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b 0a     regPrev = 0;.
188a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
188b0 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   nExpr = p->pELi
188c0 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61  st->nExpr;.    a
188d0 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e  ssert( nOrderBy>
188e0 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61  =nExpr || db->ma
188f0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
18900 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72    regPrev = pPar
18910 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
18920 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
18930 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 73 71 6c  nExpr+1;.    sql
18940 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18950 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
18960 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20 70   regPrev);.    p
18970 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65 33  KeyDup = sqlite3
18980 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c  KeyInfoAlloc(db,
18990 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20 20   nExpr, 1);.    
189a0 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a 20  if( pKeyDup ){. 
189b0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
189c0 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
189d0 74 65 61 62 6c 65 28 70 4b 65 79 44 75 70 29 20  teable(pKeyDup) 
189e0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
189f0 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ; i<nExpr; i++){
18a00 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70  .        pKeyDup
18a10 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c  ->aColl[i] = mul
18a20 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
18a30 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
18a40 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e         pKeyDup->
18a50 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
18a60 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
18a70 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61  .  }. .  /* Sepa
18a80 72 61 74 65 20 74 68 65 20 6c 65 66 74 20 61 6e  rate the left an
18a90 64 20 74 68 65 20 72 69 67 68 74 20 71 75 65 72  d the right quer
18aa0 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68  y from one anoth
18ab0 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72  er.  */.  p->pPr
18ac0 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f  ior = 0;.  pPrio
18ad0 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  r->pNext = 0;.  
18ae0 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
18af0 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
18b00 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e, p, p->pOrderB
18b10 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 69  y, "ORDER");.  i
18b20 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f  f( pPrior->pPrio
18b30 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
18b40 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47  te3ResolveOrderG
18b50 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
18b60 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70  Prior, pPrior->p
18b70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22  OrderBy, "ORDER"
18b80 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d  );.  }..  /* Com
18b90 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20 72  pute the limit r
18ba0 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f  egisters */.  co
18bb0 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
18bc0 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 6c  ers(pParse, p, l
18bd0 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20  abelEnd);.  if( 
18be0 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d  p->iLimit && op=
18bf0 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72  =TK_ALL ){.    r
18c00 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61  egLimitA = ++pPa
18c10 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
18c20 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61  egLimitB = ++pPa
18c30 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
18c40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18c50 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e  (v, OP_Copy, p->
18c60 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66  iOffset ? p->iOf
18c70 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d  fset+1 : p->iLim
18c80 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  it,.            
18c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ca0 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74 41 29        regLimitA)
18cb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
18cc0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
18cd0 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20 72  py, regLimitA, r
18ce0 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c  egLimitB);.  }el
18cf0 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74  se{.    regLimit
18d00 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d 20  A = regLimitB = 
18d10 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
18d20 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
18d30 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e  ->pLimit);.  p->
18d40 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71  pLimit = 0;.  sq
18d50 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
18d60 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
18d70 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20  .  p->pOffset = 
18d80 30 3b 0a 0a 20 20 72 65 67 41 64 64 72 41 20 3d  0;..  regAddrA =
18d90 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
18da0 0a 20 20 72 65 67 41 64 64 72 42 20 3d 20 2b 2b  .  regAddrB = ++
18db0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
18dc0 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72  regOutA = ++pPar
18dd0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f  se->nMem;.  regO
18de0 75 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  utB = ++pParse->
18df0 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53  nMem;.  sqlite3S
18e00 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
18e10 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74  estA, SRT_Corout
18e20 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29 3b 0a  ine, regAddrA);.
18e30 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
18e40 65 73 74 49 6e 69 74 28 26 64 65 73 74 42 2c 20  estInit(&destB, 
18e50 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72  SRT_Coroutine, r
18e60 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20  egAddrB);..  /* 
18e70 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75  Generate a corou
18e80 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65  tine to evaluate
18e90 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
18ea0 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a  ement to the.  *
18eb0 2a 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63 6f  * left of the co
18ec0 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 20  mpound operator 
18ed0 2d 20 74 68 65 20 22 41 22 20 73 65 6c 65 63 74  - the "A" select
18ee0 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c  ..  */.  addrSel
18ef0 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33 56 64  ectA = sqlite3Vd
18f00 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
18f10 20 2b 20 31 3b 0a 20 20 6a 31 20 3d 20 73 71 6c   + 1;.  j1 = sql
18f20 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
18f30 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
18f40 6e 65 2c 20 72 65 67 41 64 64 72 41 2c 20 30 2c  ne, regAddrA, 0,
18f50 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20   addrSelectA);. 
18f60 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
18f70 20 22 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29   "left SELECT"))
18f80 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d  ;.  pPrior->iLim
18f90 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a  it = regLimitA;.
18fa0 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
18fb0 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
18fc0 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
18fd0 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
18fe0 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
18ff0 72 2c 20 26 64 65 73 74 41 29 3b 0a 20 20 73 71  r, &destA);.  sq
19000 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
19010 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69  v, OP_EndCorouti
19020 6e 65 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20  ne, regAddrA);. 
19030 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
19040 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20  Here(v, j1);..  
19050 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f  /* Generate a co
19060 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75  routine to evalu
19070 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ate the SELECT s
19080 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a  tatement on .  *
19090 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20 74 68  * the right - th
190a0 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20 20 2a  e "B" select.  *
190b0 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74 42 20  /.  addrSelectB 
190c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
190d0 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b  rentAddr(v) + 1;
190e0 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56  .  j1 = sqlite3V
190f0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
19100 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72  InitCoroutine, r
19110 65 67 41 64 64 72 42 2c 20 30 2c 20 61 64 64 72  egAddrB, 0, addr
19120 53 65 6c 65 63 74 42 29 3b 0a 20 20 56 64 62 65  SelectB);.  Vdbe
19130 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 69 67  Comment((v, "rig
19140 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20  ht SELECT"));.  
19150 73 61 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e  savedLimit = p->
19160 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f  iLimit;.  savedO
19170 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73  ffset = p->iOffs
19180 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20  et;.  p->iLimit 
19190 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70  = regLimitB;.  p
191a0 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 20 20  ->iOffset = 0;  
191b0 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74  .  explainSetInt
191c0 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72  eger(iSub2, pPar
191d0 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
191e0 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  d);.  sqlite3Sel
191f0 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
19200 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69  destB);.  p->iLi
19210 6d 69 74 20 3d 20 73 61 76 65 64 4c 69 6d 69 74  mit = savedLimit
19220 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  ;.  p->iOffset =
19230 20 73 61 76 65 64 4f 66 66 73 65 74 3b 0a 20 20   savedOffset;.  
19240 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19250 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75  1(v, OP_EndCorou
19260 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b  tine, regAddrB);
19270 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
19280 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
19290 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75  t outputs the cu
192a0 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65  rrent row of the
192b0 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61   A.  ** select a
192c0 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75  s the next outpu
192d0 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d  t row of the com
192e0 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
192f0 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
19300 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74  ment((v, "Output
19310 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29   routine for A")
19320 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20  );.  addrOutA = 
19330 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75  generateOutputSu
19340 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c  broutine(pParse,
19350 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19360 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65    p, &destA, pDe
19370 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20  st, regOutA,.   
19380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
19390 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20  gPrev, pKeyDup, 
193a0 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20  labelEnd);.  .  
193b0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
193c0 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
193d0 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e  tputs the curren
193e0 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a 20  t row of the B. 
193f0 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68   ** select as th
19400 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f  e next output ro
19410 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  w of the compoun
19420 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20  d select..  */. 
19430 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
19440 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  || op==TK_UNION 
19450 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43  ){.    VdbeNoopC
19460 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70  omment((v, "Outp
19470 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42  ut routine for B
19480 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75 74  "));.    addrOut
19490 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70  B = generateOutp
194a0 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61  utSubroutine(pPa
194b0 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
194c0 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 42 2c        p, &destB,
194d0 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42 2c   pDest, regOutB,
194e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
194f0 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44    regPrev, pKeyD
19500 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  up, labelEnd);. 
19510 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65 79 49   }.  sqlite3KeyI
19520 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 44 75 70  nfoUnref(pKeyDup
19530 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
19540 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
19550 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72  o run when the r
19560 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65  esults from sele
19570 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78  ct A.  ** are ex
19580 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79  hausted and only
19590 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20   data in select 
195a0 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a  B remains..  */.
195b0 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43    if( op==TK_EXC
195c0 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e  EPT || op==TK_IN
195d0 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
195e0 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 61 64  ddrEofA_noB = ad
195f0 64 72 45 6f 66 41 20 3d 20 6c 61 62 65 6c 45 6e  drEofA = labelEn
19600 64 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20  d;.  }else{  .  
19610 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
19620 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62  t((v, "eof-A sub
19630 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20  routine"));.    
19640 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74  addrEofA = sqlit
19650 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19660 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
19670 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20  B, addrOutB);.  
19680 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d    addrEofA_noB =
19690 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
196a0 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
196b0 72 65 67 41 64 64 72 42 2c 20 6c 61 62 65 6c 45  regAddrB, labelE
196c0 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nd);.           
196d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196e0 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
196f0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
19700 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19710 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
19720 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 70  addrEofA);.    p
19730 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20  ->nSelectRow += 
19740 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
19750 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  ow;.  }..  /* Ge
19760 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
19770 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20  ine to run when 
19780 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  the results from
19790 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61   select B.  ** a
197a0 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64  re exhausted and
197b0 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65   only data in se
197c0 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a  lect A remains..
197d0 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
197e0 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
197f0 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 61 64     addrEofB = ad
19800 64 72 45 6f 66 41 3b 0a 20 20 20 20 69 66 28 20  drEofA;.    if( 
19810 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20  p->nSelectRow > 
19820 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
19830 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ow ) p->nSelectR
19840 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  ow = pPrior->nSe
19850 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65  lectRow;.  }else
19860 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70  {  .    VdbeNoop
19870 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66  Comment((v, "eof
19880 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
19890 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d  ;.    addrEofB =
198a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
198b0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
198c0 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74  regOutA, addrOut
198d0 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
198e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
198f0 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c  Yield, regAddrA,
19900 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56 64 62 65   labelEnd); Vdbe
19910 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
19920 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19930 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
19940 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d  , addrEofB);.  }
19950 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
19960 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74  code to handle t
19970 68 65 20 63 61 73 65 20 6f 66 20 41 3c 42 0a 20  he case of A<B. 
19980 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
19990 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d  mment((v, "A-lt-
199a0 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
199b0 0a 20 20 61 64 64 72 41 6c 74 42 20 3d 20 73 71  .  addrAltB = sq
199c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
199d0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
199e0 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b  OutA, addrOutA);
199f0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
19a00 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
19a10 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72  , regAddrA, addr
19a20 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72  EofA); VdbeCover
19a30 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
19a40 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19a50 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c  P_Goto, 0, label
19a60 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  Cmpr);..  /* Gen
19a70 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
19a80 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
19a90 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28   A==B.  */.  if(
19aa0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
19ab0 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64     addrAeqB = ad
19ac0 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20  drAltB;.  }else 
19ad0 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52  if( op==TK_INTER
19ae0 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
19af0 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b  AeqB = addrAltB;
19b00 0a 20 20 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b  .    addrAltB++;
19b10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64  .  }else{.    Vd
19b20 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
19b30 2c 20 22 41 2d 65 71 2d 42 20 73 75 62 72 6f 75  , "A-eq-B subrou
19b40 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64  tine"));.    add
19b50 72 41 65 71 42 20 3d 0a 20 20 20 20 73 71 6c 69  rAeqB =.    sqli
19b60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19b70 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
19b80 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20  drA, addrEofA); 
19b90 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
19ba0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19bb0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
19bc0 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29  o, 0, labelCmpr)
19bd0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
19be0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e  rate code to han
19bf0 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20  dle the case of 
19c00 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  A>B.  */.  VdbeN
19c10 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
19c20 41 2d 67 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-gt-B subroutin
19c30 65 22 29 29 3b 0a 20 20 61 64 64 72 41 67 74 42  e"));.  addrAgtB
19c40 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
19c50 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
19c60 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  if( op==TK_ALL |
19c70 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  | op==TK_UNION )
19c80 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
19c90 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
19ca0 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64  sub, regOutB, ad
19cb0 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73  drOutB);.  }.  s
19cc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19cd0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
19ce0 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42  gAddrB, addrEofB
19cf0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
19d00 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
19d10 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
19d20 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72  to, 0, labelCmpr
19d30 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f  );..  /* This co
19d40 64 65 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20  de runs once to 
19d50 69 6e 69 74 69 61 6c 69 7a 65 20 65 76 65 72 79  initialize every
19d60 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71  thing..  */.  sq
19d70 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
19d80 65 28 76 2c 20 6a 31 29 3b 0a 20 20 73 71 6c 69  e(v, j1);.  sqli
19d90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19da0 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
19db0 64 72 41 2c 20 61 64 64 72 45 6f 66 41 5f 6e 6f  drA, addrEofA_no
19dc0 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  B); VdbeCoverage
19dd0 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
19de0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
19df0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20  ield, regAddrB, 
19e00 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43  addrEofB); VdbeC
19e10 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f  overage(v);..  /
19e20 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  * Implement the 
19e30 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a  main merge loop.
19e40 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
19e50 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
19e60 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20  , labelCmpr);.  
19e70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19e80 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74  4(v, OP_Permutat
19e90 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63  ion, 0, 0, 0, (c
19ea0 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50  har*)aPermute, P
19eb0 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73  4_INTARRAY);.  s
19ec0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
19ed0 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
19ee0 64 65 73 74 41 2e 69 53 64 73 74 2c 20 64 65 73  destA.iSdst, des
19ef0 74 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65 72  tB.iSdst, nOrder
19f00 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  By,.            
19f10 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
19f20 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50  ar*)pKeyMerge, P
19f30 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71  4_KEYINFO);.  sq
19f40 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
19f50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d  5(v, OPFLAG_PERM
19f60 55 54 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  UTE);.  sqlite3V
19f70 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
19f80 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20  Jump, addrAltB, 
19f90 61 64 64 72 41 65 71 42 2c 20 61 64 64 72 41 67  addrAeqB, addrAg
19fa0 74 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  tB); VdbeCoverag
19fb0 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  e(v);..  /* Jump
19fc0 20 74 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69   to the this poi
19fd0 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74  nt in order to t
19fe0 65 72 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65  erminate the que
19ff0 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ry..  */.  sqlit
1a000 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1a010 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  el(v, labelEnd);
1a020 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e  ..  /* Set the n
1a030 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
1a040 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69  columns.  */.  i
1a050 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  f( pDest->eDest=
1a060 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20  =SRT_Output ){. 
1a070 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73     Select *pFirs
1a080 74 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  t = pPrior;.    
1a090 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70  while( pFirst->p
1a0a0 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d  Prior ) pFirst =
1a0b0 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b   pFirst->pPrior;
1a0c0 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c  .    generateCol
1a0d0 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
1a0e0 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69   0, pFirst->pELi
1a0f0 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  st);.  }..  /* R
1a100 65 61 73 73 65 6d 62 6c 79 20 74 68 65 20 63 6f  eassembly the co
1a110 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 73 6f 20  mpound query so 
1a120 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20  that it will be 
1a130 66 72 65 65 64 20 63 6f 72 72 65 63 74 6c 79 0a  freed correctly.
1a140 20 20 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c    ** by the call
1a150 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ing function */.
1a160 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
1a170 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
1a180 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
1a190 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20  ->pPrior);.  }. 
1a1a0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
1a1b0 69 6f 72 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70  ior;.  pPrior->p
1a1c0 4e 65 78 74 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a  Next = p;..  /**
1a1d0 2a 20 54 42 44 3a 20 20 49 6e 73 65 72 74 20 73  * TBD:  Insert s
1a1e0 75 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20  ubroutine calls 
1a1f0 74 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73  to close cursors
1a200 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20   on incomplete. 
1a210 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69 65 73   **** subqueries
1a220 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61 69 6e   ****/.  explain
1a230 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65  Composite(pParse
1a240 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20  , p->op, iSub1, 
1a250 69 53 75 62 32 2c 20 30 29 3b 0a 20 20 72 65 74  iSub2, 0);.  ret
1a260 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1a270 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
1a280 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1a290 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
1a2a0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1a2b0 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 20 46 6f 72  MIT_VIEW)./* For
1a2c0 77 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e  ward Declaration
1a2d0 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s */.static void
1a2e0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 73   substExprList(s
1a2f0 71 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c 69 73  qlite3*, ExprLis
1a300 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73  t*, int, ExprLis
1a310 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  t*);.static void
1a320 20 73 75 62 73 74 53 65 6c 65 63 74 28 73 71 6c   substSelect(sql
1a330 69 74 65 33 2a 2c 20 53 65 6c 65 63 74 20 2a 2c  ite3*, Select *,
1a340 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 20 2a   int, ExprList *
1a350 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74  );../*.** Scan t
1a360 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72 65  hrough the expre
1a370 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65  ssion pExpr.  Re
1a380 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66 65  place every refe
1a390 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f  rence to.** a co
1a3a0 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75  lumn in table nu
1a3b0 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74 68  mber iTable with
1a3c0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69   a copy of the i
1a3d0 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74  Column-th.** ent
1a3e0 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28  ry in pEList.  (
1a3f0 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72 65  But leave refere
1a400 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49  nces to the ROWI
1a410 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63  D column .** unc
1a420 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54  hanged.).**.** T
1a430 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70  his routine is p
1a440 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74  art of the flatt
1a450 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e  ening procedure.
1a460 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20    A subquery.** 
1a470 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74  whose result set
1a480 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
1a490 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61 73  EList appears as
1a4a0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a   entry in the.**
1a4b0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1a4c0 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74 68  a SELECT such th
1a4d0 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72 73  at the VDBE curs
1a4e0 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  or assigned to t
1a4f0 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75  hat.** FORM clau
1a500 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61 62  se entry is iTab
1a510 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  le.  This routin
1a520 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73  e make the neces
1a530 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73  sary .** changes
1a540 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61   to pExpr so tha
1a550 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72 65  t it refers dire
1a560 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72  ctly to the sour
1a570 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74  ce table.** of t
1a580 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74 68  he subquery rath
1a590 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  er the result se
1a5a0 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
1a5b0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70  y..*/.static Exp
1a5c0 72 20 2a 73 75 62 73 74 45 78 70 72 28 0a 20 20  r *substExpr(.  
1a5d0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
1a5e0 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61      /* Report ma
1a5f0 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74 6f 20 74  lloc errors to t
1a600 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  his connection *
1a610 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
1a620 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20          /* Expr 
1a630 69 6e 20 77 68 69 63 68 20 73 75 62 73 74 69 74  in which substit
1a640 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a  ution occurs */.
1a650 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1a660 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
1a670 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64  o be substituted
1a680 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1a690 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 53 75 62  pEList    /* Sub
1a6a0 73 74 69 74 75 74 65 20 65 78 70 72 65 73 73 69  stitute expressi
1a6b0 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ons */.){.  if( 
1a6c0 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
1a6d0 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  n 0;.  if( pExpr
1a6e0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
1a6f0 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  && pExpr->iTable
1a700 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ==iTable ){.    
1a710 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
1a720 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45  mn<0 ){.      pE
1a730 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c  xpr->op = TK_NUL
1a740 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  L;.    }else{.  
1a750 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a      Expr *pNew;.
1a760 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1a770 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70 72  List!=0 && pExpr
1a780 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74  ->iColumn<pEList
1a790 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->nExpr );.     
1a7a0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1a7b0 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70  pLeft==0 && pExp
1a7c0 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
1a7d0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
1a7e0 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
1a7f0 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d  pEList->a[pExpr-
1a800 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 2c  >iColumn].pExpr,
1a810 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
1a820 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
1a830 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 70   pExpr);.      p
1a840 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Expr = pNew;.   
1a850 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1a860 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73  pExpr->pLeft = s
1a870 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 45 78  ubstExpr(db, pEx
1a880 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c  pr->pLeft, iTabl
1a890 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
1a8a0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20  pExpr->pRight = 
1a8b0 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 45  substExpr(db, pE
1a8c0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61  xpr->pRight, iTa
1a8d0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1a8e0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1a8f0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1a900 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
1a910 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28      substSelect(
1a920 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  db, pExpr->x.pSe
1a930 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  lect, iTable, pE
1a940 4c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  List);.    }else
1a950 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70  {.      substExp
1a960 72 4c 69 73 74 28 64 62 2c 20 70 45 78 70 72 2d  rList(db, pExpr-
1a970 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62 6c 65  >x.pList, iTable
1a980 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  , pEList);.    }
1a990 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45  .  }.  return pE
1a9a0 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  xpr;.}.static vo
1a9b0 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
1a9c0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1a9d0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f           /* Repo
1a9e0 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  rt malloc errors
1a9f0 20 68 65 72 65 20 2a 2f 0a 20 20 45 78 70 72 4c   here */.  ExprL
1aa00 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
1aa10 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63 61 6e 20  /* List to scan 
1aa20 61 6e 64 20 69 6e 20 77 68 69 63 68 20 74 6f 20  and in which to 
1aa30 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 65 73  make substitutes
1aa40 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
1aa50 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  ,          /* Ta
1aa60 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74 69  ble to be substi
1aa70 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  tuted */.  ExprL
1aa80 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20  ist *pEList     
1aa90 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61  /* Substitute va
1aaa0 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  lues */.){.  int
1aab0 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
1aac0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
1aad0 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1aae0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
1aaf0 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45    pList->a[i].pE
1ab00 78 70 72 20 3d 20 73 75 62 73 74 45 78 70 72 28  xpr = substExpr(
1ab10 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  db, pList->a[i].
1ab20 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70  pExpr, iTable, p
1ab30 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74  EList);.  }.}.st
1ab40 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53  atic void substS
1ab50 65 6c 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33  elect(.  sqlite3
1ab60 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a   *db,         /*
1ab70 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65   Report malloc e
1ab80 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20  rrors here */.  
1ab90 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
1aba0 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73       /* SELECT s
1abb0 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63  tatement in whic
1abc0 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69  h to make substi
1abd0 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  tutions */.  int
1abe0 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
1abf0 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65    /* Table to be
1ac00 20 72 65 70 6c 61 63 65 64 20 2a 2f 0a 20 20 45   replaced */.  E
1ac10 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
1ac20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
1ac30 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20  e values */.){. 
1ac40 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a   SrcList *pSrc;.
1ac50 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1ac60 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1ac70 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 70 20  int i;.  if( !p 
1ac80 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 75 62 73  ) return;.  subs
1ac90 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d  tExprList(db, p-
1aca0 3e 70 45 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c  >pEList, iTable,
1acb0 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
1acc0 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d  tExprList(db, p-
1acd0 3e 70 47 72 6f 75 70 42 79 2c 20 69 54 61 62 6c  >pGroupBy, iTabl
1ace0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
1acf0 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
1ad00 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 54 61  p->pOrderBy, iTa
1ad10 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1ad20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62  p->pHaving = sub
1ad30 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 48  stExpr(db, p->pH
1ad40 61 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20 70  aving, iTable, p
1ad50 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70 57 68  EList);.  p->pWh
1ad60 65 72 65 20 3d 20 73 75 62 73 74 45 78 70 72 28  ere = substExpr(
1ad70 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 69  db, p->pWhere, i
1ad80 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1ad90 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62    substSelect(db
1ada0 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 54 61  , p->pPrior, iTa
1adb0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1adc0 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
1add0 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29    assert( pSrc )
1ade0 3b 20 20 2f 2a 20 45 76 65 6e 20 66 6f 72 20 28  ;  /* Even for (
1adf0 53 45 4c 45 43 54 20 31 29 20 77 65 20 68 61 76  SELECT 1) we hav
1ae00 65 3a 20 70 53 72 63 21 3d 30 20 62 75 74 20 70  e: pSrc!=0 but p
1ae10 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 2a 2f 0a  Src->nSrc==0 */.
1ae20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 72    if( ALWAYS(pSr
1ae30 63 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  c) ){.    for(i=
1ae40 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74 65  pSrc->nSrc, pIte
1ae50 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b 20  m=pSrc->a; i>0; 
1ae60 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i--, pItem++){. 
1ae70 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74       substSelect
1ae80 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c  (db, pItem->pSel
1ae90 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ect, iTable, pEL
1aea0 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ist);.    }.  }.
1aeb0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
1aec0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1aed0 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1aee0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1aef0 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66  IT_VIEW) */..#if
1af00 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1af10 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
1af20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
1af30 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a  TE_OMIT_VIEW)./*
1af40 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1af50 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61   attempts to fla
1af60 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20  tten subqueries 
1af70 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  as a performance
1af80 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
1af90 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
1afa0 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d  eturns 1 if it m
1afb0 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64  akes changes and
1afc0 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e   0 if no flatten
1afd0 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ing occurs..**.*
1afe0 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20  * To understand 
1aff0 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66  the concept of f
1b000 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69  lattening, consi
1b010 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  der the followin
1b020 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a  g.** query:.**.*
1b030 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  *     SELECT a F
1b040 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20  ROM (SELECT x+y 
1b050 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
1b060 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20  RE z<100) WHERE 
1b070 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  a>5.**.** The de
1b080 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70  fault way of imp
1b090 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71  lementing this q
1b0a0 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63 75  uery is to execu
1b0b0 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65  te the.** subque
1b0c0 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f  ry first and sto
1b0d0 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
1b0e0 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
1b0f0 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e  ble, then.** run
1b100 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1b110 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61   on that tempora
1b120 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  ry table.  This 
1b130 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20  requires two.** 
1b140 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65 20  passes over the 
1b150 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f  data.  Furthermo
1b160 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20  re, because the 
1b170 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a  temporary table.
1b180 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65  ** has no indice
1b190 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  s, the WHERE cla
1b1a0 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72  use on the outer
1b1b0 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65   query cannot be
1b1c0 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a  .** optimized..*
1b1d0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1b1e0 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  e attempts to re
1b1f0 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73 75  write queries su
1b200 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65 20  ch as the above 
1b210 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  into.** a single
1b220 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69   flat select, li
1b230 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
1b240 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53     SELECT x+y AS
1b250 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
1b260 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a   z<100 AND a>5.*
1b270 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65  *.** The code ge
1b280 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69 73  nerated for this
1b290 20 73 69 6d 70 69 66 69 63 61 74 69 6f 6e 20 67   simpification g
1b2a0 69 76 65 73 20 74 68 65 20 73 61 6d 65 20 72 65  ives the same re
1b2b0 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79  sult.** but only
1b2c0 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65   has to scan the
1b2d0 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64   data once.  And
1b2e0 20 62 65 63 61 75 73 65 20 69 6e 64 69 63 65 73   because indices
1b2f0 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74   might .** exist
1b300 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31   on the table t1
1b310 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61  , a complete sca
1b320 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69  n of the data mi
1b330 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65  ght be.** avoide
1b340 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e  d..**.** Flatten
1b350 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74 74 65  ing is only atte
1b360 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f 66 20  mpted if all of 
1b370 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
1b380 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
1b390 28 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (1)  The subquer
1b3a0 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  y and the outer 
1b3b0 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74  query do not bot
1b3c0 68 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  h use aggregates
1b3d0 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54  ..**.**   (2)  T
1b3e0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
1b3f0 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
1b400 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1b410 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
1b420 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54  ..**.**   (3)  T
1b430 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
1b440 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  ot the right ope
1b450 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f  rand of a left o
1b460 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20  uter join.**    
1b470 20 20 20 20 28 4f 72 69 67 69 6e 61 6c 6c 79 20      (Originally 
1b480 74 69 63 6b 65 74 20 23 33 30 36 2e 20 20 53 74  ticket #306.  St
1b490 72 65 6e 67 74 68 65 6e 65 64 20 62 79 20 74 69  rengthened by ti
1b4a0 63 6b 65 74 20 23 33 33 30 30 29 0a 2a 2a 0a 2a  cket #3300).**.*
1b4b0 2a 20 20 20 28 34 29 20 20 54 68 65 20 73 75 62  *   (4)  The sub
1b4c0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53  query is not DIS
1b4d0 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  TINCT..**.**  (*
1b4e0 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74  *)  At one point
1b4f0 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34   restrictions (4
1b500 29 20 61 6e 64 20 28 35 29 20 64 65 66 69 6e 65  ) and (5) define
1b510 64 20 61 20 73 75 62 73 65 74 20 6f 66 20 44 49  d a subset of DI
1b520 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20 20 20  STINCT.**       
1b530 20 73 75 62 2d 71 75 65 72 69 65 73 20 74 68 61   sub-queries tha
1b540 74 20 77 65 72 65 20 65 78 63 6c 75 64 65 64 20  t were excluded 
1b550 66 72 6f 6d 20 74 68 69 73 20 6f 70 74 69 6d 69  from this optimi
1b560 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72 69 63 74  zation. Restrict
1b570 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 28  ion .**        (
1b580 34 29 20 68 61 73 20 73 69 6e 63 65 20 62 65 65  4) has since bee
1b590 6e 20 65 78 70 61 6e 64 65 64 20 74 6f 20 65 78  n expanded to ex
1b5a0 63 6c 75 64 65 20 61 6c 6c 20 44 49 53 54 49 4e  clude all DISTIN
1b5b0 43 54 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  CT subqueries..*
1b5c0 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20  *.**   (6)  The 
1b5d0 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
1b5e0 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  t use aggregates
1b5f0 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
1b600 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20  ery is not.**   
1b610 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a       DISTINCT..*
1b620 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20  *.**   (7)  The 
1b630 73 75 62 71 75 65 72 79 20 68 61 73 20 61 20 46  subquery has a F
1b640 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 4f 44  ROM clause.  TOD
1b650 4f 3a 20 20 46 6f 72 20 73 75 62 71 75 65 72 69  O:  For subqueri
1b660 65 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 20 20  es without.**   
1b670 20 20 20 20 20 41 20 46 52 4f 4d 20 63 6c 61 75       A FROM clau
1b680 73 65 2c 20 63 6f 6e 73 69 64 65 72 20 61 64 64  se, consider add
1b690 69 6e 67 20 61 20 46 52 4f 4d 20 63 6c 6f 73 65  ing a FROM close
1b6a0 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61   with the specia
1b6b0 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74 61 62 6c  l.**        tabl
1b6c0 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68  e sqlite_once th
1b6d0 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  at consists of a
1b6e0 20 73 69 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74   single row cont
1b6f0 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  aining a.**     
1b700 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a     single NULL..
1b710 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65  **.**   (8)  The
1b720 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
1b730 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
1b740 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1b750 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
1b760 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20  *.**   (9)  The 
1b770 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
1b780 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
1b790 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
1b7a0 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20  oes not use.**  
1b7b0 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73        aggregates
1b7c0 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54  ..**.**  (10)  T
1b7d0 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1b7e0 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61   not use aggrega
1b7f0 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72  tes or the outer
1b800 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a   query does not.
1b810 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20 4c 49  **        use LI
1b820 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29  MIT..**.**  (11)
1b830 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
1b840 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
1b850 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68  ry do not both h
1b860 61 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  ave ORDER BY cla
1b870 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  uses..**.**  (**
1b880 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74  )  Not implement
1b890 65 64 2e 20 20 53 75 62 73 75 6d 65 64 20 69 6e  ed.  Subsumed in
1b8a0 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28  to restriction (
1b8b0 33 29 2e 20 20 57 61 73 20 70 72 65 76 69 6f 75  3).  Was previou
1b8c0 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 61 20  sly.**        a 
1b8d0 73 65 70 61 72 61 74 65 20 72 65 73 74 72 69 63  separate restric
1b8e0 74 69 6f 6e 20 64 65 72 69 76 69 6e 67 20 66 72  tion deriving fr
1b8f0 6f 6d 20 74 69 63 6b 65 74 20 23 33 35 30 2e 0a  om ticket #350..
1b900 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65  **.**  (13)  The
1b910 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75   subquery and ou
1b920 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
1b930 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 2e   both use LIMIT.
1b940 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68  .**.**  (14)  Th
1b950 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
1b960 6e 6f 74 20 75 73 65 20 4f 46 46 53 45 54 2e 0a  not use OFFSET..
1b970 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20 54 68 65  **.**  (15)  The
1b980 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
1b990 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f  not part of a co
1b9a0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 6f 72  mpound select or
1b9b0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73   the.**        s
1b9c0 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1b9d0 20 68 61 76 65 20 61 20 4c 49 4d 49 54 20 63 6c   have a LIMIT cl
1b9e0 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ause..**        
1b9f0 28 53 65 65 20 74 69 63 6b 65 74 20 23 32 33 33  (See ticket #233
1ba00 39 20 61 6e 64 20 74 69 63 6b 65 74 20 5b 30 32  9 and ticket [02
1ba10 61 38 65 38 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a  a8e81d44])..**.*
1ba20 2a 20 20 28 31 36 29 20 20 54 68 65 20 6f 75 74  *  (16)  The out
1ba30 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
1ba40 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  an aggregate or 
1ba50 74 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  the subquery doe
1ba60 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e 6f 74 20  s.**        not 
1ba70 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59  contain ORDER BY
1ba80 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39 34 32  .  (Ticket #2942
1ba90 29 20 20 54 68 69 73 20 75 73 65 64 20 74 6f 20  )  This used to 
1baa0 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20  not matter.**   
1bab0 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e       until we in
1bac0 74 72 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f  troduced the gro
1bad0 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63  up_concat() func
1bae0 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28  tion.  .**.**  (
1baf0 31 37 29 20 20 54 68 65 20 73 75 62 2d 71 75 65  17)  The sub-que
1bb00 72 79 20 69 73 20 6e 6f 74 20 61 20 63 6f 6d 70  ry is not a comp
1bb10 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 6f 72 20  ound select, or 
1bb20 69 74 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c  it is a UNION AL
1bb30 4c 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d  L .**        com
1bb40 70 6f 75 6e 64 20 63 6c 61 75 73 65 20 6d 61 64  pound clause mad
1bb50 65 20 75 70 20 65 6e 74 69 72 65 6c 79 20 6f 66  e up entirely of
1bb60 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71   non-aggregate q
1bb70 75 65 72 69 65 73 2c 20 61 6e 64 20 0a 2a 2a 20  ueries, and .** 
1bb80 20 20 20 20 20 20 20 74 68 65 20 70 61 72 65 6e         the paren
1bb90 74 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  t query:.**.**  
1bba0 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74          * is not
1bbb0 20 69 74 73 65 6c 66 20 70 61 72 74 20 6f 66 20   itself part of 
1bbc0 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
1bbd0 74 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a  t,.**          *
1bbe0 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
1bbf0 67 61 74 65 20 6f 72 20 44 49 53 54 49 4e 43 54  gate or DISTINCT
1bc00 20 71 75 65 72 79 2c 20 61 6e 64 0a 2a 2a 20 20   query, and.**  
1bc10 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74          * is not
1bc20 20 61 20 6a 6f 69 6e 0a 2a 2a 0a 2a 2a 20 20 20   a join.**.**   
1bc30 20 20 20 20 20 54 68 65 20 70 61 72 65 6e 74 20       The parent 
1bc40 61 6e 64 20 73 75 62 2d 71 75 65 72 79 20 6d 61  and sub-query ma
1bc50 79 20 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 20  y contain WHERE 
1bc60 63 6c 61 75 73 65 73 2e 20 53 75 62 6a 65 63 74  clauses. Subject
1bc70 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 72 75   to.**        ru
1bc80 6c 65 73 20 28 31 31 29 2c 20 28 31 33 29 20 61  les (11), (13) a
1bc90 6e 64 20 28 31 34 29 2c 20 74 68 65 79 20 6d 61  nd (14), they ma
1bca0 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 4f  y also contain O
1bcb0 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20 20 20  RDER BY,.**     
1bcc0 20 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46     LIMIT and OFF
1bcd0 53 45 54 20 63 6c 61 75 73 65 73 2e 20 20 54 68  SET clauses.  Th
1bce0 65 20 73 75 62 71 75 65 72 79 20 63 61 6e 6e 6f  e subquery canno
1bcf0 74 20 75 73 65 20 61 6e 79 20 63 6f 6d 70 6f 75  t use any compou
1bd00 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65  nd.**        ope
1bd10 72 61 74 6f 72 20 6f 74 68 65 72 20 74 68 61 6e  rator other than
1bd20 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65 63 61 75   UNION ALL becau
1bd30 73 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72  se all the other
1bd40 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20   compound.**    
1bd50 20 20 20 20 6f 70 65 72 61 74 6f 72 73 20 68 61      operators ha
1bd60 76 65 20 61 6e 20 69 6d 70 6c 69 65 64 20 44 49  ve an implied DI
1bd70 53 54 49 4e 43 54 20 77 68 69 63 68 20 69 73 20  STINCT which is 
1bd80 64 69 73 61 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a  disallowed by.**
1bd90 20 20 20 20 20 20 20 20 72 65 73 74 72 69 63 74          restrict
1bda0 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a 20 20  ion (4)..**.**  
1bdb0 20 20 20 20 20 20 41 6c 73 6f 2c 20 65 61 63 68        Also, each
1bdc0 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 74 68   component of th
1bdd0 65 20 73 75 62 2d 71 75 65 72 79 20 6d 75 73 74  e sub-query must
1bde0 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
1bdf0 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20 20 20   number.**      
1be00 20 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75    of result colu
1be10 6d 6e 73 2e 20 54 68 69 73 20 69 73 20 61 63 74  mns. This is act
1be20 75 61 6c 6c 79 20 61 20 72 65 71 75 69 72 65 6d  ually a requirem
1be30 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 6f 6d 70  ent for any comp
1be40 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 53  ound.**        S
1be50 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
1be60 20 62 75 74 20 61 6c 6c 20 74 68 65 20 63 6f 64   but all the cod
1be70 65 20 68 65 72 65 20 64 6f 65 73 20 69 73 20 6d  e here does is m
1be80 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 6e 6f  ake sure that no
1be90 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 63 68 20  .**        such 
1bea0 28 69 6c 6c 65 67 61 6c 29 20 73 75 62 2d 71 75  (illegal) sub-qu
1beb0 65 72 79 20 69 73 20 66 6c 61 74 74 65 6e 65 64  ery is flattened
1bec0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
1bed0 6c 20 64 65 74 65 63 74 20 74 68 65 0a 2a 2a 20  l detect the.** 
1bee0 20 20 20 20 20 20 20 73 79 6e 74 61 78 20 65 72         syntax er
1bef0 72 6f 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ror and return a
1bf00 20 64 65 74 61 69 6c 65 64 20 6d 65 73 73 61 67   detailed messag
1bf10 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29 20 20  e..**.**  (18)  
1bf20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
1bf30 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   is a compound s
1bf40 65 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c 6c 20  elect, then all 
1bf50 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20  terms of the.** 
1bf60 20 20 20 20 20 20 20 4f 52 44 45 52 20 62 79 20         ORDER by 
1bf70 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 70 61  clause of the pa
1bf80 72 65 6e 74 20 6d 75 73 74 20 62 65 20 73 69 6d  rent must be sim
1bf90 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ple references t
1bfa0 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6c  o .**        col
1bfb0 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 75 62 2d  umns of the sub-
1bfc0 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  query..**.**  (1
1bfd0 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  9)  The subquery
1bfe0 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
1bff0 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
1c000 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a   query does not.
1c010 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 61  **        have a
1c020 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
1c030 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49 66 20 74  *.**  (20)  If t
1c040 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
1c050 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
1c060 74 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20  t, then it must 
1c070 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20  not use.**      
1c080 20 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c    an ORDER BY cl
1c090 61 75 73 65 2e 20 20 54 69 63 6b 65 74 20 23 33  ause.  Ticket #3
1c0a0 37 37 33 2e 20 20 57 65 20 63 6f 75 6c 64 20 72  773.  We could r
1c0b0 65 6c 61 78 20 74 68 69 73 20 63 6f 6e 73 74 72  elax this constr
1c0c0 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 73  aint.**        s
1c0d0 6f 6d 65 77 68 61 74 20 62 79 20 73 61 79 69 6e  omewhat by sayin
1c0e0 67 20 74 68 61 74 20 74 68 65 20 74 65 72 6d 73  g that the terms
1c0f0 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
1c100 20 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20   clause must.** 
1c110 20 20 20 20 20 20 20 61 70 70 65 61 72 20 61 73         appear as
1c120 20 75 6e 6d 6f 64 69 66 69 65 64 20 72 65 73 75   unmodified resu
1c130 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  lt columns in th
1c140 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20  e outer query.  
1c150 42 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20  But we.**       
1c160 20 68 61 76 65 20 6f 74 68 65 72 20 6f 70 74 69   have other opti
1c170 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e  mizations in min
1c180 64 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74  d to deal with t
1c190 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  hat case..**.** 
1c1a0 20 28 32 31 29 20 20 54 68 65 20 73 75 62 71 75   (21)  The subqu
1c1b0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
1c1c0 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75   LIMIT or the ou
1c1d0 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
1c1e0 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49  .**        DISTI
1c1f0 4e 43 54 2e 20 20 28 53 65 65 20 74 69 63 6b 65  NCT.  (See ticke
1c200 74 20 5b 37 35 32 65 31 36 34 36 66 63 5d 29 2e  t [752e1646fc]).
1c210 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20 54 68  .**.**  (22)  Th
1c220 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
1c230 74 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54  t a recursive CT
1c240 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 33 29 20 20  E..**.**  (23)  
1c250 54 68 65 20 70 61 72 65 6e 74 20 69 73 20 6e 6f  The parent is no
1c260 74 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54  t a recursive CT
1c270 45 2c 20 6f 72 20 74 68 65 20 73 75 62 2d 71 75  E, or the sub-qu
1c280 65 72 79 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20  ery is not a.** 
1c290 20 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20         compound 
1c2a0 71 75 65 72 79 2e 20 54 68 69 73 20 72 65 73 74  query. This rest
1c2b0 72 69 63 74 69 6f 6e 20 69 73 20 62 65 63 61 75  riction is becau
1c2c0 73 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20  se transforming 
1c2d0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 70 61  the.**        pa
1c2e0 72 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70 6f 75  rent to a compou
1c2f0 6e 64 20 71 75 65 72 79 20 63 6f 6e 66 75 73 65  nd query confuse
1c300 73 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  s the code that 
1c310 68 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20 20 20  handles.**      
1c320 20 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72    recursive quer
1c330 69 65 73 20 69 6e 20 6d 75 6c 74 69 53 65 6c 65  ies in multiSele
1c340 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49  ct()..**.**.** I
1c350 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  n this routine, 
1c360 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  the "p" paramete
1c370 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
1c380 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  o the outer quer
1c390 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65  y..** The subque
1c3a0 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61  ry is p->pSrc->a
1c3b0 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20  [iFrom].  isAgg 
1c3c0 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f  is true if the o
1c3d0 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73  uter query.** us
1c3e0 65 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e  es aggregates an
1c3f0 64 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  d subqueryIsAgg 
1c400 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73  is true if the s
1c410 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67  ubquery uses agg
1c420 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  regates..**.** I
1c430 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
1c440 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74  not attempted, t
1c450 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1c460 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72   no-op and retur
1c470 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74  ns 0..** If flat
1c480 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70  tening is attemp
1c490 74 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ted this routine
1c4a0 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a   returns 1..**.*
1c4b0 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70  * All of the exp
1c4c0 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
1c4d0 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62   must occur on b
1c4e0 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75  oth the outer qu
1c4f0 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73  ery and.** the s
1c500 75 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74  ubquery before t
1c510 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
1c520 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c530 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28  flattenSubquery(
1c540 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1c550 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
1c560 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1c570 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
1c580 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65       /* The pare
1c590 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45  nt or outer SELE
1c5a0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
1c5b0 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20    int iFrom,    
1c5c0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1c5d0 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20  in p->pSrc->a[] 
1c5e0 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62  of the inner sub
1c5f0 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
1c600 73 41 67 67 2c 20 20 20 20 20 20 20 20 20 20 20  sAgg,           
1c610 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65 72  /* True if outer
1c620 20 53 45 4c 45 43 54 20 75 73 65 73 20 61 67 67   SELECT uses agg
1c630 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
1c640 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65   */.  int subque
1c650 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72  ryIsAgg    /* Tr
1c660 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ue if the subque
1c670 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ry uses aggregat
1c680 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29  e functions */.)
1c690 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
1c6a0 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
1c6b0 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  t = pParse->zAut
1c6c0 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65  hContext;.  Sele
1c6d0 63 74 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20 53  ct *pParent;.  S
1c6e0 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20  elect *pSub;    
1c6f0 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20     /* The inner 
1c700 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75 65  query or "subque
1c710 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ry" */.  Select 
1c720 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a 20  *pSub1;      /* 
1c730 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72  Pointer to the r
1c740 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74 20  ightmost select 
1c750 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a  in sub-query */.
1c760 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
1c770 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
1c780 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1c790 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
1c7a0 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72   SrcList *pSubSr
1c7b0 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
1c7c0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
1c7d0 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70  ubquery */.  Exp
1c7e0 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20  rList *pList;   
1c7f0 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73   /* The result s
1c800 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  et of the outer 
1c810 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
1c820 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f  Parent;        /
1c830 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  * VDBE cursor nu
1c840 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53 75 62  mber of the pSub
1c850 20 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70   result set temp
1c860 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
1c870 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
1c880 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
1c890 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
1c8a0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1c8b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
1c8c0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
1c8d0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1c8e0 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20  em *pSubitem;   
1c8f0 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  /* The subquery 
1c900 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
1c910 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
1c920 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
1c930 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  e if flattening 
1c940 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52  is permitted.  R
1c950 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a  eturn 0 if not..
1c960 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
1c970 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
1c980 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b   p->pPrior==0 );
1c990 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20 66    /* Unable to f
1c9a0 6c 61 74 74 65 6e 20 63 6f 6d 70 6f 75 6e 64 20  latten compound 
1c9b0 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 66 28  queries */.  if(
1c9c0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73   OptimizationDis
1c9d0 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
1c9e0 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72 29  _QueryFlattener)
1c9f0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
1ca00 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
1ca10 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26 26   assert( pSrc &&
1ca20 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72   iFrom>=0 && iFr
1ca30 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b  om<pSrc->nSrc );
1ca40 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70  .  pSubitem = &p
1ca50 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20  Src->a[iFrom];. 
1ca60 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62 69   iParent = pSubi
1ca70 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
1ca80 70 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d 2d  pSub = pSubitem-
1ca90 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65  >pSelect;.  asse
1caa0 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20  rt( pSub!=0 );. 
1cab0 20 69 66 28 20 69 73 41 67 67 20 26 26 20 73 75   if( isAgg && su
1cac0 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65  bqueryIsAgg ) re
1cad0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1cae0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1caf0 69 63 74 69 6f 6e 20 28 31 29 20 20 2a 2f 0a 20  iction (1)  */. 
1cb00 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41   if( subqueryIsA
1cb10 67 67 20 26 26 20 70 53 72 63 2d 3e 6e 53 72 63  gg && pSrc->nSrc
1cb20 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  >1 ) return 0;  
1cb30 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1cb40 69 63 74 69 6f 6e 20 28 32 29 20 20 2a 2f 0a 20  iction (2)  */. 
1cb50 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d   pSubSrc = pSub-
1cb60 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
1cb70 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a   pSubSrc );.  /*
1cb80 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f   Prior to versio
1cb90 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49  n 3.1.2, when LI
1cba0 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 68  MIT and OFFSET h
1cbb0 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20  ad to be simple 
1cbc0 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20  constants,.  ** 
1cbd0 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20 65 78  not arbitrary ex
1cbe0 70 72 65 73 73 73 69 6f 6e 73 2c 20 77 65 20 61  presssions, we a
1cbf0 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62  llowed some comb
1cc00 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61  ining of LIMIT a
1cc10 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62  nd OFFSET.  ** b
1cc20 65 63 61 75 73 65 20 74 68 65 79 20 63 6f 75 6c  ecause they coul
1cc30 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61 74  d be computed at
1cc40 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20   compile-time.  
1cc50 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 61  But when LIMIT a
1cc60 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62  nd OFFSET.  ** b
1cc70 65 63 61 6d 65 20 61 72 62 69 74 72 61 72 79 20  ecame arbitrary 
1cc80 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20  expressions, we 
1cc90 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20 61  were forced to a
1cca0 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  dd restrictions 
1ccb0 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31  (13).  ** and (1
1ccc0 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  4). */.  if( pSu
1ccd0 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e  b->pLimit && p->
1cce0 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20  pLimit ) return 
1ccf0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1cd00 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1cd10 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  13) */.  if( pSu
1cd20 62 2d 3e 70 4f 66 66 73 65 74 20 29 20 72 65 74  b->pOffset ) ret
1cd30 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1cd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd50 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1cd60 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d  14) */.  if( (p-
1cd70 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43  >selFlags & SF_C
1cd80 6f 6d 70 6f 75 6e 64 29 21 3d 30 20 26 26 20 70  ompound)!=0 && p
1cd90 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  Sub->pLimit ){. 
1cda0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1cdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdd0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1cde0 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20  iction (15) */. 
1cdf0 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53 72 63   }.  if( pSubSrc
1ce00 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75  ->nSrc==0 ) retu
1ce10 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1ce20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1ce30 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20  estriction (7)  
1ce40 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73  */.  if( pSub->s
1ce50 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
1ce60 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30  tinct ) return 0
1ce70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
1ce80 65 73 74 72 69 63 74 69 6f 6e 20 28 35 29 20 20  estriction (5)  
1ce90 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1cea0 4c 69 6d 69 74 20 26 26 20 28 70 53 72 63 2d 3e  Limit && (pSrc->
1ceb0 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29  nSrc>1 || isAgg)
1cec0 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
1ced0 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;         /* Re
1cee0 73 74 72 69 63 74 69 6f 6e 73 20 28 38 29 28 39  strictions (8)(9
1cef0 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28  ) */.  }.  if( (
1cf00 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1cf10 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 26 26  _Distinct)!=0 &&
1cf20 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
1cf30 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
1cf40 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1cf50 72 69 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a  riction (6)  */.
1cf60 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72    }.  if( p->pOr
1cf70 64 65 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70  derBy && pSub->p
1cf80 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
1cf90 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1cfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfc0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1cfd0 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20  on (11) */.  }. 
1cfe0 20 69 66 28 20 69 73 41 67 67 20 26 26 20 70 53   if( isAgg && pS
1cff0 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72  ub->pOrderBy ) r
1d000 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1d010 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1d020 69 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20  iction (16) */. 
1d030 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
1d040 74 20 26 26 20 70 2d 3e 70 57 68 65 72 65 20 29  t && p->pWhere )
1d050 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1d060 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1d070 69 63 74 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20  iction (19) */. 
1d080 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
1d090 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67  t && (p->selFlag
1d0a0 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
1d0b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 72 65 74 75  !=0 ){.     retu
1d0c0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
1d0d0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 31   Restriction (21
1d0e0 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  ) */.  }.  if( p
1d0f0 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
1d100 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 20 72  SF_Recursive ) r
1d110 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1d120 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1d130 20 28 32 32 29 20 20 2a 2f 0a 20 20 69 66 28 20   (22)  */.  if( 
1d140 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1d150 46 5f 52 65 63 75 72 73 69 76 65 29 20 26 26 20  F_Recursive) && 
1d160 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 20 72  pSub->pPrior ) r
1d170 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 2f  eturn 0;       /
1d180 2a 20 28 32 33 29 20 20 2a 2f 0a 0a 20 20 2f 2a  * (23)  */..  /*
1d190 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e   OBSOLETE COMMEN
1d1a0 54 20 31 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69  T 1:.  ** Restri
1d1b0 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65  ction 3:  If the
1d1c0 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a   subquery is a j
1d1d0 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  oin, make sure t
1d1e0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 0a  he subquery is .
1d1f0 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73    ** not used as
1d200 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
1d210 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a  nd of an outer j
1d220 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f  oin.  Examples o
1d230 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20  f why this.  ** 
1d240 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a  is not allowed:.
1d250 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
1d260 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20    t1 LEFT OUTER 
1d270 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33  JOIN (t2 JOIN t3
1d280 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77  ).  **.  ** If w
1d290 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62  e flatten the ab
1d2a0 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65  ove, we would ge
1d2b0 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  t.  **.  **     
1d2c0 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54      (t1 LEFT OUT
1d2d0 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e  ER JOIN t2) JOIN
1d2e0 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68   t3.  **.  ** wh
1d2f0 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c  ich is not at al
1d300 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  l the same thing
1d310 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f  ..  **.  ** OBSO
1d320 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a  LETE COMMENT 2:.
1d330 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    ** Restriction
1d340 20 31 32 3a 20 20 49 66 20 74 68 65 20 73 75 62   12:  If the sub
1d350 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
1d360 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
1d370 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20  left outer.  ** 
1d380 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  join, make sure 
1d390 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  the subquery has
1d3a0 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
1d3b0 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c  ..  ** An exampl
1d3c0 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 20 69  es of why this i
1d3d0 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20  s not allowed:. 
1d3e0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
1d3f0 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a   t1 LEFT OUTER J
1d400 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52  OIN (SELECT * FR
1d410 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e 78  OM t2 WHERE t2.x
1d420 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  >0).  **.  ** If
1d430 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20   we flatten the 
1d440 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20  above, we would 
1d450 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  get.  **.  **   
1d460 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f        (t1 LEFT O
1d470 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48  UTER JOIN t2) WH
1d480 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a  ERE t2.x>0.  **.
1d490 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e    ** But the t2.
1d4a0 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c  x>0 test will al
1d4b0 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e  ways fail on a N
1d4c0 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77  ULL row of t2, w
1d4d0 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74  hich.  ** effect
1d4e0 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74  ively converts t
1d4f0 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e  he OUTER JOIN in
1d500 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e  to an INNER JOIN
1d510 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 48 49 53  ..  **.  ** THIS
1d520 20 4f 56 45 52 52 49 44 45 53 20 4f 42 53 4f 4c   OVERRIDES OBSOL
1d530 45 54 45 20 43 4f 4d 4d 45 4e 54 53 20 31 20 41  ETE COMMENTS 1 A
1d540 4e 44 20 32 20 41 42 4f 56 45 3a 0a 20 20 2a 2a  ND 2 ABOVE:.  **
1d550 20 54 69 63 6b 65 74 20 23 33 33 30 30 20 73 68   Ticket #3300 sh
1d560 6f 77 73 20 74 68 61 74 20 66 6c 61 74 74 65 6e  ows that flatten
1d570 69 6e 67 20 74 68 65 20 72 69 67 68 74 20 74 65  ing the right te
1d580 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  rm of a LEFT JOI
1d590 4e 0a 20 20 2a 2a 20 69 73 20 66 72 61 75 67 68  N.  ** is fraugh
1d5a0 74 20 77 69 74 68 20 64 61 6e 67 65 72 2e 20 20  t with danger.  
1d5b0 42 65 73 74 20 74 6f 20 61 76 6f 69 64 20 74 68  Best to avoid th
1d5c0 65 20 77 68 6f 6c 65 20 74 68 69 6e 67 2e 20 20  e whole thing.  
1d5d0 49 66 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  If the.  ** subq
1d5e0 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68  uery is the righ
1d5f0 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54  t term of a LEFT
1d600 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 64 6f 20 6e   JOIN, then do n
1d610 6f 74 20 66 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f  ot flatten..  */
1d620 0a 20 20 69 66 28 20 28 70 53 75 62 69 74 65 6d  .  if( (pSubitem
1d630 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
1d640 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20  OUTER)!=0 ){.   
1d650 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
1d660 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1d670 20 31 37 3a 20 49 66 20 74 68 65 20 73 75 62 2d   17: If the sub-
1d680 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
1d690 75 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e  und SELECT, then
1d6a0 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73   it must.  ** us
1d6b0 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e  e only the UNION
1d6c0 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41   ALL operator. A
1d6d0 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73  nd none of the s
1d6e0 69 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65  imple select que
1d6f0 72 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d  ries.  ** that m
1d700 61 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f  ake up the compo
1d710 75 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20 61  und SELECT are a
1d720 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67  llowed to be agg
1d730 72 65 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e  regate or distin
1d740 63 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e  ct.  ** queries.
1d750 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  .  */.  if( pSub
1d760 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
1d770 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  if( pSub->pOrder
1d780 42 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  By ){.      retu
1d790 72 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69  rn 0;  /* Restri
1d7a0 63 74 69 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20  ction 20 */.    
1d7b0 7d 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  }.    if( isAgg 
1d7c0 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  || (p->selFlags 
1d7d0 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d  & SF_Distinct)!=
1d7e0 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21  0 || pSrc->nSrc!
1d7f0 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =1 ){.      retu
1d800 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
1d810 66 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20  for(pSub1=pSub; 
1d820 70 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75  pSub1; pSub1=pSu
1d830 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  b1->pPrior){.   
1d840 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53     testcase( (pS
1d850 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
1d860 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
1d870 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
1d880 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
1d890 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75    testcase( (pSu
1d8a0 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
1d8b0 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
1d8c0 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41  ggregate))==SF_A
1d8d0 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20  ggregate );.    
1d8e0 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e    assert( pSub->
1d8f0 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 20  pSrc!=0 );.     
1d900 20 69 66 28 20 28 70 53 75 62 31 2d 3e 73 65 6c   if( (pSub1->sel
1d910 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
1d920 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
1d930 65 29 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c  e))!=0.       ||
1d940 20 28 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 20   (pSub1->pPrior 
1d950 26 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b  && pSub1->op!=TK
1d960 5f 41 4c 4c 29 20 0a 20 20 20 20 20 20 20 7c 7c  _ALL) .       ||
1d970 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53   pSub1->pSrc->nS
1d980 72 63 3c 31 0a 20 20 20 20 20 20 20 7c 7c 20 70  rc<1.       || p
1d990 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  Sub->pEList->nEx
1d9a0 70 72 21 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73  pr!=pSub1->pELis
1d9b0 74 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 29  t->nExpr.      )
1d9c0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1d9d0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1d9e0 20 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62    testcase( pSub
1d9f0 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  1->pSrc->nSrc>1 
1da00 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
1da10 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 38 2e   Restriction 18.
1da20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
1da30 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
1da40 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66   int ii;.      f
1da50 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70  or(ii=0; ii<p->p
1da60 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
1da70 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  ii++){.        i
1da80 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  f( p->pOrderBy->
1da90 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  a[ii].u.x.iOrder
1daa0 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72  ByCol==0 ) retur
1dab0 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
1dac0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a   }.  }..  /*****
1dad0 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
1dae0 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e  s point, flatten
1daf0 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
1db00 2e 20 2a 2a 2a 2a 2a 2f 0a 0a 20 20 2f 2a 20 41  . *****/..  /* A
1db10 75 74 68 6f 72 69 7a 65 20 74 68 65 20 73 75 62  uthorize the sub
1db20 71 75 65 72 79 20 2a 2f 0a 20 20 70 50 61 72 73  query */.  pPars
1db30 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
1db40 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d  = pSubitem->zNam
1db50 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 69 20  e;.  TESTONLY(i 
1db60 3d 29 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  =) sqlite3AuthCh
1db70 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1db80 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c  TE_SELECT, 0, 0,
1db90 20 30 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28   0);.  testcase(
1dba0 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20   i==SQLITE_DENY 
1dbb0 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75  );.  pParse->zAu
1dbc0 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76  thContext = zSav
1dbd0 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a  edAuthContext;..
1dbe0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d    /* If the sub-
1dbf0 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
1dc00 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
1dc10 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79 20 72  ment, then (by r
1dc20 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a  estrictions.  **
1dc30 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f 76 65   17 and 18 above
1dc40 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 20 55  ) it must be a U
1dc50 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65  NION ALL and the
1dc60 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 6d 75   parent query mu
1dc70 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74  st .  ** be of t
1dc80 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20  he form:.  **.  
1dc90 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 65  **     SELECT <e
1dca0 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28  xpr-list> FROM (
1dcb0 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c 77 68  <sub-query>) <wh
1dcc0 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a  ere-clause> .  *
1dcd0 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20  *.  ** followed 
1dce0 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c  by any ORDER BY,
1dcf0 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46   LIMIT and/or OF
1dd00 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68  FSET clauses. Th
1dd10 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72  is block.  ** cr
1dd20 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69 65 73  eates N-1 copies
1dd30 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 71   of the parent q
1dd40 75 65 72 79 20 77 69 74 68 6f 75 74 20 61 6e 79  uery without any
1dd50 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54   ORDER BY, LIMIT
1dd60 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54   or .  ** OFFSET
1dd70 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f 69   clauses and joi
1dd80 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20 6c  ns them to the l
1dd90 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66  eft-hand-side of
1dda0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20   the original.  
1ddb0 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41  ** using UNION A
1ddc0 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e  LL operators. In
1ddd0 20 74 68 69 73 20 63 61 73 65 20 4e 20 69 73 20   this case N is 
1dde0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  the number of si
1ddf0 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74  mple.  ** select
1de00 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74   statements in t
1de10 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d  he compound sub-
1de20 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  query..  **.  **
1de30 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   Example:.  **. 
1de40 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61   **     SELECT a
1de50 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20  +1 FROM (.  **  
1de60 20 20 20 20 20 20 53 45 4c 45 43 54 20 78 20 46        SELECT x F
1de70 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20  ROM tab.  **    
1de80 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
1de90 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
1dea0 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a   y FROM tab.  **
1deb0 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
1dec0 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  L.  **        SE
1ded0 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20 46 52  LECT abs(z*2) FR
1dee0 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20 20 20  OM tab2.  **    
1def0 20 29 20 57 48 45 52 45 20 61 21 3d 35 20 4f 52   ) WHERE a!=5 OR
1df00 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20  DER BY 1.  **.  
1df10 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69  ** Transformed i
1df20 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  nto:.  **.  **  
1df30 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20 46 52     SELECT x+1 FR
1df40 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78 2b 31  OM tab WHERE x+1
1df50 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49  !=5.  **     UNI
1df60 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
1df70 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d 20  SELECT y+1 FROM 
1df80 74 61 62 20 57 48 45 52 45 20 79 2b 31 21 3d 35  tab WHERE y+1!=5
1df90 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20  .  **     UNION 
1dfa0 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c  ALL.  **     SEL
1dfb0 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31 20 46  ECT abs(z*2)+1 F
1dfc0 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45 20 61  ROM tab2 WHERE a
1dfd0 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a  bs(z*2)+1!=5.  *
1dfe0 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 31  *     ORDER BY 1
1dff0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61  .  **.  ** We ca
1e000 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63 6f 6d  ll this the "com
1e010 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
1e020 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f  lattening"..  */
1e030 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53 75 62  .  for(pSub=pSub
1e040 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62 3b 20  ->pPrior; pSub; 
1e050 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f  pSub=pSub->pPrio
1e060 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  r){.    Select *
1e070 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 4c 69  pNew;.    ExprLi
1e080 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
1e090 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
1e0a0 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70  Expr *pLimit = p
1e0b0 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 45 78  ->pLimit;.    Ex
1e0c0 70 72 20 2a 70 4f 66 66 73 65 74 20 3d 20 70 2d  pr *pOffset = p-
1e0d0 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 53 65  >pOffset;.    Se
1e0e0 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70  lect *pPrior = p
1e0f0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d  ->pPrior;.    p-
1e100 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
1e110 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a     p->pSrc = 0;.
1e120 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
1e130 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  0;.    p->pLimit
1e140 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4f 66   = 0;.    p->pOf
1e150 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e  fset = 0;.    pN
1e160 65 77 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ew = sqlite3Sele
1e170 63 74 44 75 70 28 64 62 2c 20 70 2c 20 30 29 3b  ctDup(db, p, 0);
1e180 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20  .    p->pOffset 
1e190 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 70  = pOffset;.    p
1e1a0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
1e1b0 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  t;.    p->pOrder
1e1c0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
1e1d0 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72     p->pSrc = pSr
1e1e0 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54  c;.    p->op = T
1e1f0 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 70  K_ALL;.    if( p
1e200 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
1e210 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
1e220 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  or;.    }else{. 
1e230 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f       pNew->pPrio
1e240 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
1e250 20 20 69 66 28 20 70 50 72 69 6f 72 20 29 20 70    if( pPrior ) p
1e260 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Prior->pNext = p
1e270 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  New;.      pNew-
1e280 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20  >pNext = p;.    
1e290 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e    p->pPrior = pN
1e2a0 65 77 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ew;.    }.    if
1e2b0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1e2c0 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ed ) return 1;. 
1e2d0 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66   }..  /* Begin f
1e2e0 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46  lattening the iF
1e2f0 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20  rom-th entry of 
1e300 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1e310 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74  .  ** in the out
1e320 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  er query..  */. 
1e330 20 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20   pSub = pSub1 = 
1e340 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
1e350 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  t;..  /* Delete 
1e360 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61  the transient ta
1e370 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 73  ble structure as
1e380 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1e390 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a  e.  ** subquery.
1e3a0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62    */.  sqlite3Db
1e3b0 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
1e3c0 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
1e3d0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1e3e0 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61  b, pSubitem->zNa
1e3f0 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
1e400 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
1e410 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53  m->zAlias);.  pS
1e420 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
1e430 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65  e = 0;.  pSubite
1e440 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  m->zName = 0;.  
1e450 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73  pSubitem->zAlias
1e460 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
1e470 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a  ->pSelect = 0;..
1e480 20 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74    /* Defer delet
1e490 69 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62  ing the Table ob
1e4a0 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20  ject associated 
1e4b0 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75  with the.  ** su
1e4c0 62 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64  bquery until cod
1e4d0 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a  e generation is.
1e4e0 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73    ** complete, s
1e4f0 69 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20 73  ince there may s
1e500 74 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e  till exist Expr.
1e510 70 54 61 62 20 65 6e 74 72 69 65 73 20 74 68 61  pTab entries tha
1e520 74 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20  t.  ** refer to 
1e530 74 68 65 20 73 75 62 71 75 65 72 79 20 65 76 65  the subquery eve
1e540 6e 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69  n after flatteni
1e550 6e 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34  ng.  Ticket #334
1e560 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75  6..  **.  ** pSu
1e570 62 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20 61  bitem->pTab is a
1e580 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62  lways non-NULL b
1e590 79 20 74 65 73 74 20 72 65 73 74 72 69 63 74 69  y test restricti
1e5a0 6f 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61 62  ons and tests ab
1e5b0 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ove..  */.  if( 
1e5c0 41 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d 2d  ALWAYS(pSubitem-
1e5d0 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20  >pTab!=0) ){.   
1e5e0 20 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65   Table *pTabToDe
1e5f0 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54  l = pSubitem->pT
1e600 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ab;.    if( pTab
1e610 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d 31 20 29  ToDel->nRef==1 )
1e620 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20 2a 70  {.      Parse *p
1e630 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74  Toplevel = sqlit
1e640 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
1e650 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 70  pParse);.      p
1e660 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a  TabToDel->pNextZ
1e670 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65 76 65  ombie = pTopleve
1e680 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20  l->pZombieTab;. 
1e690 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e       pToplevel->
1e6a0 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70 54 61  pZombieTab = pTa
1e6b0 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73  bToDel;.    }els
1e6c0 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44  e{.      pTabToD
1e6d0 65 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  el->nRef--;.    
1e6e0 7d 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e  }.    pSubitem->
1e6f0 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  pTab = 0;.  }.. 
1e700 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
1e710 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65  g loop runs once
1e720 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69   for each term i
1e730 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  n a compound-sub
1e740 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74  query.  ** flatt
1e750 65 6e 69 6e 67 20 28 61 73 20 64 65 73 63 72 69  ening (as descri
1e760 62 65 64 20 61 62 6f 76 65 29 2e 20 20 49 66 20  bed above).  If 
1e770 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 64  we are doing a d
1e780 69 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20  ifferent kind.  
1e790 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** of flattening
1e7a0 20 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e 67 20   - a flattening 
1e7b0 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6d  other than a com
1e7c0 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
1e7d0 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a  lattening -.  **
1e7e0 20 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20   then this loop 
1e7f0 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a  only runs once..
1e800 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c    **.  ** This l
1e810 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66  oop moves all of
1e820 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e   the FROM elemen
1e830 74 73 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ts of the subque
1e840 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  ry into the.  **
1e850 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1e860 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
1e870 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69  ery.  Before doi
1e880 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65  ng this, remembe
1e890 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f  r.  ** the curso
1e8a0 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
1e8b0 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20   original outer 
1e8c0 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65  query FROM eleme
1e8d0 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65  nt in.  ** iPare
1e8e0 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74  nt.  The iParent
1e8f0 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76   cursor will nev
1e900 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75 62  er be used.  Sub
1e910 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a  sequent code.  *
1e920 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72  * will scan expr
1e930 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20  essions looking 
1e940 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66 65  for iParent refe
1e950 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61  rences and repla
1e960 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65  ce.  ** those re
1e970 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65 78  ferences with ex
1e980 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72  pressions that r
1e990 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75  esolve to the su
1e9a0 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a  bquery FROM.  **
1e9b0 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65   elements we are
1e9c0 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e   now copying in.
1e9d0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72  .  */.  for(pPar
1e9e0 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20  ent=p; pParent; 
1e9f0 70 50 61 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d  pParent=pParent-
1ea00 3e 70 50 72 69 6f 72 2c 20 70 53 75 62 3d 70 53  >pPrior, pSub=pS
1ea10 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  ub->pPrior){.   
1ea20 20 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20 20   int nSubSrc;.  
1ea30 20 20 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20    u8 jointype = 
1ea40 30 3b 0a 20 20 20 20 70 53 75 62 53 72 63 20 3d  0;.    pSubSrc =
1ea50 20 70 53 75 62 2d 3e 70 53 72 63 3b 20 20 20 20   pSub->pSrc;    
1ea60 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
1ea70 6f 66 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  of subquery */. 
1ea80 20 20 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75     nSubSrc = pSu
1ea90 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20  bSrc->nSrc;  /* 
1eaa0 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
1eab0 69 6e 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  in subquery FROM
1eac0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 70   clause */.    p
1ead0 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  Src = pParent->p
1eae0 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  Src;     /* FROM
1eaf0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
1eb00 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20  uter query */.. 
1eb10 20 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20     if( pSrc ){. 
1eb20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1eb30 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46  rent==p );  /* F
1eb40 69 72 73 74 20 74 69 6d 65 20 74 68 72 6f 75 67  irst time throug
1eb50 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  h the loop */.  
1eb60 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70      jointype = p
1eb70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  Subitem->jointyp
1eb80 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
1eb90 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1eba0 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e  ent!=p );  /* 2n
1ebb0 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
1ebc0 20 74 69 6d 65 73 20 74 68 72 6f 75 67 68 20 74   times through t
1ebd0 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  he loop */.     
1ebe0 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d   pSrc = pParent-
1ebf0 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  >pSrc = sqlite3S
1ec00 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c  rcListAppend(db,
1ec10 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
1ec20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a   if( pSrc==0 ){.
1ec30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1ec40 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1ec50 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   );.        brea
1ec60 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1ec70 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62  ..    /* The sub
1ec80 71 75 65 72 79 20 75 73 65 73 20 61 20 73 69 6e  query uses a sin
1ec90 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 20  gle slot of the 
1eca0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1ecb0 68 65 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20  he outer.    ** 
1ecc0 71 75 65 72 79 2e 20 20 49 66 20 74 68 65 20 73  query.  If the s
1ecd0 75 62 71 75 65 72 79 20 68 61 73 20 6d 6f 72 65  ubquery has more
1ece0 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e   than one elemen
1ecf0 74 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c  t in its FROM cl
1ed00 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ause,.    ** the
1ed10 6e 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74  n expand the out
1ed20 65 72 20 71 75 65 72 79 20 74 6f 20 6d 61 6b 65  er query to make
1ed30 20 73 70 61 63 65 20 66 6f 72 20 69 74 20 74 6f   space for it to
1ed40 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e   hold all elemen
1ed50 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ts.    ** of the
1ed60 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a   subquery..    *
1ed70 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65  *.    ** Example
1ed80 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
1ed90 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1eda0 20 74 61 62 41 2c 20 28 53 45 4c 45 43 54 20 2a   tabA, (SELECT *
1edb0 20 46 52 4f 4d 20 73 75 62 31 2c 20 73 75 62 32   FROM sub1, sub2
1edc0 29 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a  ), tabB;.    **.
1edd0 20 20 20 20 2a 2a 20 54 68 65 20 6f 75 74 65 72      ** The outer
1ede0 20 71 75 65 72 79 20 68 61 73 20 33 20 73 6c 6f   query has 3 slo
1edf0 74 73 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63  ts in its FROM c
1ee00 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74  lause.  One slot
1ee10 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f   of the.    ** o
1ee20 75 74 65 72 20 71 75 65 72 79 20 28 74 68 65 20  uter query (the 
1ee30 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20 69 73 20  middle slot) is 
1ee40 75 73 65 64 20 62 79 20 74 68 65 20 73 75 62 71  used by the subq
1ee50 75 65 72 79 2e 20 20 54 68 65 20 6e 65 78 74 0a  uery.  The next.
1ee60 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20      ** block of 
1ee70 63 6f 64 65 20 77 69 6c 6c 20 65 78 70 61 6e 64  code will expand
1ee80 20 74 68 65 20 6f 75 74 20 71 75 65 72 79 20 74   the out query t
1ee90 6f 20 34 20 73 6c 6f 74 73 2e 20 20 54 68 65 20  o 4 slots.  The 
1eea0 6d 69 64 64 6c 65 0a 20 20 20 20 2a 2a 20 73 6c  middle.    ** sl
1eeb0 6f 74 20 69 73 20 65 78 70 61 6e 64 65 64 20 74  ot is expanded t
1eec0 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f  o two slots in o
1eed0 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 70 61  rder to make spa
1eee0 63 65 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a  ce for the.    *
1eef0 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69  * two elements i
1ef00 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1ef10 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
1ef20 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
1ef30 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20  ( nSubSrc>1 ){. 
1ef40 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53       pParent->pS
1ef50 72 63 20 3d 20 70 53 72 63 20 3d 20 73 71 6c 69  rc = pSrc = sqli
1ef60 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
1ef70 65 28 64 62 2c 20 70 53 72 63 2c 20 6e 53 75 62  e(db, pSrc, nSub
1ef80 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a  Src-1,iFrom+1);.
1ef90 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
1efa0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
1efb0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1efc0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1efd0 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20  /* Transfer the 
1efe0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
1eff0 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75  s from the subqu
1f000 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ery into the.   
1f010 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 2e   ** outer query.
1f020 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
1f030 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20  i=0; i<nSubSrc; 
1f040 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
1f050 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
1f060 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46  db, pSrc->a[i+iF
1f070 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20  rom].pUsing);.  
1f080 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46      pSrc->a[i+iF
1f090 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e  rom] = pSubSrc->
1f0a0 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73  a[i];.      mems
1f0b0 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69  et(&pSubSrc->a[i
1f0c0 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75  ], 0, sizeof(pSu
1f0d0 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20  bSrc->a[i]));.  
1f0e0 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b    }.    pSrc->a[
1f0f0 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20  iFrom].jointype 
1f100 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20  = jointype;.  . 
1f110 20 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20     /* Now begin 
1f120 73 75 62 73 74 69 74 75 74 69 6e 67 20 73 75 62  substituting sub
1f130 71 75 65 72 79 20 72 65 73 75 6c 74 20 73 65 74  query result set
1f140 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72   expressions for
1f150 20 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e   .    ** referen
1f160 63 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65  ces to the iPare
1f170 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  nt in the outer 
1f180 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20  query..    ** . 
1f190 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20     ** Example:. 
1f1a0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53     **.    **   S
1f1b0 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20  ELECT a+5, b*10 
1f1c0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33  FROM (SELECT x*3
1f1d0 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62   AS a, y+10 AS b
1f1e0 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20   FROM t1) WHERE 
1f1f0 61 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20  a>b;.    **   \ 
1f200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f210 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
1f220 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f  __ subquery ____
1f230 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20  ______/         
1f240 20 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f   /.    **    \__
1f250 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1f260 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20  ___ outer query 
1f270 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1f280 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
1f290 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65      **.    ** We
1f2a0 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65   look at every e
1f2b0 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
1f2c0 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
1f2d0 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20   every place we 
1f2e0 73 65 65 0a 20 20 20 20 2a 2a 20 22 61 22 20 77  see.    ** "a" w
1f2f0 65 20 73 75 62 73 74 69 74 75 74 65 20 22 78 2a  e substitute "x*
1f300 33 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  3" and every pla
1f310 63 65 20 77 65 20 73 65 65 20 22 62 22 20 77 65  ce we see "b" we
1f320 20 73 75 62 73 74 69 74 75 74 65 20 22 79 2b 31   substitute "y+1
1f330 30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  0"..    */.    p
1f340 4c 69 73 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e  List = pParent->
1f350 70 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28  pEList;.    for(
1f360 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
1f370 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1f380 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d   if( pList->a[i]
1f390 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  .zName==0 ){.   
1f3a0 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
1f3b0 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
1f3c0 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  up(db, pList->a[
1f3d0 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20  i].zSpan);.     
1f3e0 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
1f3f0 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  e(zName);.      
1f400 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e    pList->a[i].zN
1f410 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
1f420 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
1f430 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
1f440 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74   pParent->pEList
1f450 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
1f460 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66  >pEList);.    if
1f470 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 20  ( isAgg ){.     
1f480 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
1f490 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f  b, pParent->pGro
1f4a0 75 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70  upBy, iParent, p
1f4b0 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
1f4c0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61      pParent->pHa
1f4d0 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72  ving = substExpr
1f4e0 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48  (db, pParent->pH
1f4f0 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20  aving, iParent, 
1f500 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
1f510 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75     }.    if( pSu
1f520 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
1f530 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1f540 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  rent->pOrderBy==
1f550 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  0 );.      pPare
1f560 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  nt->pOrderBy = p
1f570 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  Sub->pOrderBy;. 
1f580 20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65       pSub->pOrde
1f590 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  rBy = 0;.    }el
1f5a0 73 65 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e  se if( pParent->
1f5b0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
1f5c0 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1f5d0 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72  db, pParent->pOr
1f5e0 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c 20  derBy, iParent, 
1f5f0 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
1f600 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75     }.    if( pSu
1f610 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20  b->pWhere ){.   
1f620 20 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69     pWhere = sqli
1f630 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
1f640 53 75 62 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b  Sub->pWhere, 0);
1f650 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f660 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20    pWhere = 0;.  
1f670 20 20 7d 0a 20 20 20 20 69 66 28 20 73 75 62 71    }.    if( subq
1f680 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20  ueryIsAgg ){.   
1f690 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
1f6a0 6e 74 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29  nt->pHaving==0 )
1f6b0 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
1f6c0 3e 70 48 61 76 69 6e 67 20 3d 20 70 50 61 72 65  >pHaving = pPare
1f6d0 6e 74 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20  nt->pWhere;.    
1f6e0 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72    pParent->pWher
1f6f0 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20  e = pWhere;.    
1f700 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69    pParent->pHavi
1f710 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  ng = substExpr(d
1f720 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76  b, pParent->pHav
1f730 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ing, iParent, pS
1f740 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
1f750 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76     pParent->pHav
1f760 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ing = sqlite3Exp
1f770 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74  rAnd(db, pParent
1f780 2d 3e 70 48 61 76 69 6e 67 2c 20 0a 20 20 20 20  ->pHaving, .    
1f790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1f7b0 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
1f7c0 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 2c 20   pSub->pHaving, 
1f7d0 30 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0));.      asser
1f7e0 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f  t( pParent->pGro
1f7f0 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  upBy==0 );.     
1f800 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70   pParent->pGroup
1f810 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
1f820 4c 69 73 74 44 75 70 28 64 62 2c 20 70 53 75 62  ListDup(db, pSub
1f830 2d 3e 70 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a  ->pGroupBy, 0);.
1f840 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f850 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
1f860 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
1f870 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
1f880 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
1f890 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
1f8a0 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20  pParent->pWhere 
1f8b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
1f8c0 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57  (db, pParent->pW
1f8d0 68 65 72 65 2c 20 70 57 68 65 72 65 29 3b 0a 20  here, pWhere);. 
1f8e0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54     }.  .    /* T
1f8f0 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65  he flattened que
1f900 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 20 69  ry is distinct i
1f910 66 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e  f either the inn
1f920 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  er or the.    **
1f930 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
1f940 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a  distinct. .    *
1f950 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 73  /.    pParent->s
1f960 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d  elFlags |= pSub-
1f970 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
1f980 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20  istinct;.  .    
1f990 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  /*.    ** SELECT
1f9a0 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43   ... FROM (SELEC
1f9b0 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46  T ... LIMIT a OF
1f9c0 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20  FSET b) LIMIT x 
1f9d0 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a  OFFSET y;.    **
1f9e0 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74  .    ** One is t
1f9f0 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f  empted to try to
1fa00 20 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20   add a and b to 
1fa10 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69  combine the limi
1fa20 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20  ts.  But this.  
1fa30 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f    ** does not wo
1fa40 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d  rk if either lim
1fa50 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a  it is negative..
1fa60 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1fa70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  Sub->pLimit ){. 
1fa80 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c       pParent->pL
1fa90 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69  imit = pSub->pLi
1faa0 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75 62 2d  mit;.      pSub-
1fab0 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
1fac0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e   }.  }..  /* Fin
1fad0 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68  ially, delete wh
1fae0 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68  at is left of th
1faf0 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 72  e subquery and r
1fb00 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65  eturn.  ** succe
1fb10 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ss..  */.  sqlit
1fb20 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
1fb30 62 2c 20 70 53 75 62 31 29 3b 0a 0a 20 20 72 65  b, pSub1);..  re
1fb40 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
1fb50 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
1fb60 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1fb70 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
1fb80 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
1fb90 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 61 73 65 64   */../*.** Based
1fba0 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   on the contents
1fbb0 20 6f 66 20 74 68 65 20 41 67 67 49 6e 66 6f 20   of the AggInfo 
1fbc0 73 74 72 75 63 74 75 72 65 20 69 6e 64 69 63 61  structure indica
1fbd0 74 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74  ted by the first
1fbe0 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2c 20 74 68  .** argument, th
1fbf0 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63  is function chec
1fc00 6b 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ks if the follow
1fc10 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
1fc20 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 71 75 65  .**    * the que
1fc30 72 79 20 63 6f 6e 74 61 69 6e 73 20 6a 75 73 74  ry contains just
1fc40 20 61 20 73 69 6e 67 6c 65 20 61 67 67 72 65 67   a single aggreg
1fc50 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 0a 2a 2a  ate function,.**
1fc60 20 20 20 20 2a 20 74 68 65 20 61 67 67 72 65 67      * the aggreg
1fc70 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ate function is 
1fc80 65 69 74 68 65 72 20 6d 69 6e 28 29 20 6f 72 20  either min() or 
1fc90 6d 61 78 28 29 2c 20 61 6e 64 0a 2a 2a 20 20 20  max(), and.**   
1fca0 20 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20   * the argument 
1fcb0 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 65  to the aggregate
1fcc0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 63   function is a c
1fcd0 6f 6c 75 6d 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a  olumn value..**.
1fce0 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65  ** If all of the
1fcf0 20 61 62 6f 76 65 20 61 72 65 20 74 72 75 65 2c   above are true,
1fd00 20 74 68 65 6e 20 57 48 45 52 45 5f 4f 52 44 45   then WHERE_ORDE
1fd10 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45  RBY_MIN or WHERE
1fd20 5f 4f 52 44 45 52 42 59 5f 4d 41 58 0a 2a 2a 20  _ORDERBY_MAX.** 
1fd30 69 73 20 72 65 74 75 72 6e 65 64 20 61 73 20 61  is returned as a
1fd40 70 70 72 6f 70 72 69 61 74 65 2e 20 41 6c 73 6f  ppropriate. Also
1fd50 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20 73  , *ppMinMax is s
1fd60 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
1fd70 68 65 20 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 61  he .** list of a
1fd80 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20  rguments passed 
1fd90 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 65  to the aggregate
1fda0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
1fdb0 67 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20  g..**.** Or, if 
1fdc0 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61  the conditions a
1fdd0 62 6f 76 65 20 61 72 65 20 6e 6f 74 20 6d 65 74  bove are not met
1fde0 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20 73  , *ppMinMax is s
1fdf0 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 57  et to 0 and.** W
1fe00 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52  HERE_ORDERBY_NOR
1fe10 4d 41 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  MAL is returned.
1fe20 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 6d 69  .*/.static u8 mi
1fe30 6e 4d 61 78 51 75 65 72 79 28 41 67 67 49 6e 66  nMaxQuery(AggInf
1fe40 6f 20 2a 70 41 67 67 49 6e 66 6f 2c 20 45 78 70  o *pAggInfo, Exp
1fe50 72 4c 69 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78  rList **ppMinMax
1fe60 29 7b 0a 20 20 69 6e 74 20 65 52 65 74 20 3d 20  ){.  int eRet = 
1fe70 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f  WHERE_ORDERBY_NO
1fe80 52 4d 41 4c 3b 20 20 20 20 20 20 20 20 20 20 2f  RMAL;          /
1fe90 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a  * Return value *
1fea0 2f 0a 0a 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d  /..  *ppMinMax =
1feb0 20 30 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e   0;.  if( pAggIn
1fec0 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a  fo->nFunc==1 ){.
1fed0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
1fee0 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  = pAggInfo->aFun
1fef0 63 5b 30 5d 2e 70 45 78 70 72 3b 20 2f 2a 20 41  c[0].pExpr; /* A
1ff00 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1ff10 6e 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73  n */.    ExprLis
1ff20 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 45 78 70  t *pEList = pExp
1ff30 72 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20 20  r->x.pList;     
1ff40 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f   /* Arguments to
1ff50 20 61 67 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   agg function */
1ff60 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ..    assert( pE
1ff70 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
1ff80 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20  FUNCTION );.    
1ff90 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  if( pEList && pE
1ffa0 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 26  List->nExpr==1 &
1ffb0 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  & pEList->a[0].p
1ffc0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
1ffd0 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
1ffe0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
1fff0 6e 63 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54  nc = pExpr->u.zT
20000 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  oken;.      if( 
20010 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
20020 46 75 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20  Func, "min")==0 
20030 29 7b 0a 20 20 20 20 20 20 20 20 65 52 65 74 20  ){.        eRet 
20040 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
20050 4d 49 4e 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  MIN;.        *pp
20060 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b  MinMax = pEList;
20070 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
20080 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
20090 7a 46 75 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30  zFunc, "max")==0
200a0 20 29 7b 0a 20 20 20 20 20 20 20 20 65 52 65 74   ){.        eRet
200b0 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   = WHERE_ORDERBY
200c0 5f 4d 41 58 3b 0a 20 20 20 20 20 20 20 20 2a 70  _MAX;.        *p
200d0 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74  pMinMax = pEList
200e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
200f0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a    }..  assert( *
20100 70 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 28  ppMinMax==0 || (
20110 2a 70 70 4d 69 6e 4d 61 78 29 2d 3e 6e 45 78 70  *ppMinMax)->nExp
20120 72 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e  r==1 );.  return
20130 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   eRet;.}../*.** 
20140 54 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  The select state
20150 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74  ment passed as t
20160 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
20170 74 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74  t is an aggregat
20180 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20  e query..** The 
20190 73 65 63 6f 6e 64 20 61 72 67 6d 65 6e 74 20 69  second argment i
201a0 73 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  s the associated
201b0 20 61 67 67 72 65 67 61 74 65 2d 69 6e 66 6f 20   aggregate-info 
201c0 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a  object. This .**
201d0 20 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20   function tests 
201e0 69 66 20 74 68 65 20 53 45 4c 45 43 54 20 69 73  if the SELECT is
201f0 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
20200 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75  .**   SELECT cou
20210 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e  nt(*) FROM <tbl>
20220 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62  .**.** where tab
20230 6c 65 20 69 73 20 61 20 64 61 74 61 62 61 73 65  le is a database
20240 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75   table, not a su
20250 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77  b-select or view
20260 2e 20 49 66 20 74 68 65 20 71 75 65 72 79 0a 2a  . If the query.*
20270 2a 20 64 6f 65 73 20 6d 61 74 63 68 20 74 68 69  * does match thi
20280 73 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20  s pattern, then 
20290 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
202a0 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65   Table object re
202b0 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74  presenting.** <t
202c0 62 6c 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  bl> is returned.
202d0 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73   Otherwise, 0 is
202e0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
202f0 61 74 69 63 20 54 61 62 6c 65 20 2a 69 73 53 69  atic Table *isSi
20300 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63 74  mpleCount(Select
20310 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41   *p, AggInfo *pA
20320 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65  ggInfo){.  Table
20330 20 2a 70 54 61 62 3b 0a 20 20 45 78 70 72 20 2a   *pTab;.  Expr *
20340 70 45 78 70 72 3b 0a 0a 20 20 61 73 73 65 72 74  pExpr;..  assert
20350 28 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29  ( !p->pGroupBy )
20360 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65  ;..  if( p->pWhe
20370 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d  re || p->pEList-
20380 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c  >nExpr!=1 .   ||
20390 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d   p->pSrc->nSrc!=
203a0 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  1 || p->pSrc->a[
203b0 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a  0].pSelect.  ){.
203c0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
203d0 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53  }.  pTab = p->pS
203e0 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20  rc->a[0].pTab;. 
203f0 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   pExpr = p->pELi
20400 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
20410 20 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26    assert( pTab &
20420 26 20 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  & !pTab->pSelect
20430 20 26 26 20 70 45 78 70 72 20 29 3b 0a 0a 20 20   && pExpr );..  
20440 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
20450 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ab) ) return 0;.
20460 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
20470 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
20480 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
20490 66 28 20 4e 45 56 45 52 28 70 41 67 67 49 6e 66  f( NEVER(pAggInf
204a0 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72  o->nFunc==0) ) r
204b0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
204c0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
204d0 30 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c  0].pFunc->funcFl
204e0 61 67 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f  ags&SQLITE_FUNC_
204f0 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65 74 75  COUNT)==0 ) retu
20500 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
20510 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69 73 74  r->flags&EP_Dist
20520 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b  inct ) return 0;
20530 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  ..  return pTab;
20540 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
20550 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65   source-list ite
20560 6d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  m passed as an a
20570 72 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d  rgument was augm
20580 65 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a  ented with an.**
20590 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
205a0 73 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20  se, then try to 
205b0 6c 6f 63 61 74 65 20 74 68 65 20 73 70 65 63 69  locate the speci
205c0 66 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74  fied index. If t
205d0 68 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68  here.** was such
205e0 20 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68   a clause and th
205f0 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61  e named index ca
20600 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72  nnot be found, r
20610 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
20620 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65  _ERROR and leave
20630 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61   an error in pPa
20640 72 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rse. Otherwise, 
20650 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72  populate .** pFr
20660 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72  om->pIndex and r
20670 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
20680 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
20690 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50  ndexedByLookup(P
206a0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74  arse *pParse, st
206b0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
206c0 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28  m *pFrom){.  if(
206d0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20   pFrom->pTab && 
206e0 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 20 29 7b  pFrom->zIndex ){
206f0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
20700 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
20710 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78      char *zIndex
20720 20 3d 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78   = pFrom->zIndex
20730 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  ;.    Index *pId
20740 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  x;.    for(pIdx=
20750 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20  pTab->pIndex; . 
20760 20 20 20 20 20 20 20 70 49 64 78 20 26 26 20 73         pIdx && s
20770 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49  qlite3StrICmp(pI
20780 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65  dx->zName, zInde
20790 78 29 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64  x); .        pId
207a0 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20  x=pIdx->pNext.  
207b0 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49    );.    if( !pI
207c0 64 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  dx ){.      sqli
207d0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
207e0 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64  se, "no such ind
207f0 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 2c  ex: %s", zIndex,
20800 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73   0);.      pPars
20810 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
20820 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
20830 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
20840 20 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e     }.    pFrom->
20850 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20  pIndex = pIdx;. 
20860 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
20870 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44  TE_OK;.}./*.** D
20880 65 74 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53  etect compound S
20890 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
208a0 20 74 68 61 74 20 75 73 65 20 61 6e 20 4f 52 44   that use an ORD
208b0 45 52 20 42 59 20 63 6c 61 75 73 65 20 77 69 74  ER BY clause wit
208c0 68 20 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61  h .** an alterna
208d0 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  tive collating s
208e0 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  equence..**.**  
208f0 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f    SELECT ... FRO
20900 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45  M t1 EXCEPT SELE
20910 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f  CT ... FROM t2 O
20920 52 44 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41  RDER BY .. COLLA
20930 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  TE ....**.** The
20940 73 65 20 61 72 65 20 72 65 77 72 69 74 74 65 6e  se are rewritten
20950 20 61 73 20 61 20 73 75 62 71 75 65 72 79 3a 0a   as a subquery:.
20960 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
20970 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e  * FROM (SELECT .
20980 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50  .. FROM t1 EXCEP
20990 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  T SELECT ... FRO
209a0 4d 20 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44  M t2).**     ORD
209b0 45 52 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54  ER BY ... COLLAT
209c0 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  E ....**.** This
209d0 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
209e0 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65 63  is necessary bec
209f0 61 75 73 65 20 74 68 65 20 6d 75 6c 74 69 53 65  ause the multiSe
20a00 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 72 6f  lectOrderBy() ro
20a10 75 74 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74  utine.** above t
20a20 68 61 74 20 67 65 6e 65 72 61 74 65 73 20 74 68  hat generates th
20a30 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d  e code for a com
20a40 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 77 69 74  pound SELECT wit
20a50 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  h an ORDER BY cl
20a60 61 75 73 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d  ause.** uses a m
20a70 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 74  erge algorithm t
20a80 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65  hat requires the
20a90 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20   same collating 
20aa0 73 65 71 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a  sequence on the.
20ab0 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  ** result column
20ac0 73 20 61 73 20 6f 6e 20 74 68 65 20 4f 52 44 45  s as on the ORDE
20ad0 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 53 65  R BY clause.  Se
20ae0 65 20 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70  e ticket.** http
20af0 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72  ://www.sqlite.or
20b00 67 2f 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35  g/src/info/67095
20b10 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73  74d2a.**.** This
20b20 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
20b30 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66  is only needed f
20b40 6f 72 20 45 58 43 45 50 54 2c 20 49 4e 54 45 52  or EXCEPT, INTER
20b50 53 45 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e  SECT, and UNION.
20b60 0a 2a 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c  .** The UNION AL
20b70 4c 20 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b 73  L operator works
20b80 20 66 69 6e 65 20 77 69 74 68 20 6d 75 6c 74 69   fine with multi
20b90 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20  SelectOrderBy() 
20ba0 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65  even when.** the
20bb0 72 65 20 61 72 65 20 43 4f 4c 4c 41 54 45 20 74  re are COLLATE t
20bc0 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45  erms in the ORDE
20bd0 52 20 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  R BY..*/.static 
20be0 69 6e 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f  int convertCompo
20bf0 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75  undSelectToSubqu
20c00 65 72 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ery(Walker *pWal
20c10 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
20c20 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65  .  int i;.  Sele
20c30 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65  ct *pNew;.  Sele
20c40 63 74 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65  ct *pX;.  sqlite
20c50 33 20 2a 64 62 3b 0a 20 20 73 74 72 75 63 74 20  3 *db;.  struct 
20c60 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
20c70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65  ;.  SrcList *pNe
20c80 77 53 72 63 3b 0a 20 20 50 61 72 73 65 20 2a 70  wSrc;.  Parse *p
20c90 50 61 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64  Parse;.  Token d
20ca0 75 6d 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  ummy;..  if( p->
20cb0 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75  pPrior==0 ) retu
20cc0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
20cd0 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
20ce0 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  By==0 ) return W
20cf0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66  RC_Continue;.  f
20d00 6f 72 28 70 58 3d 70 3b 20 70 58 20 26 26 20 28  or(pX=p; pX && (
20d10 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  pX->op==TK_ALL |
20d20 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  | pX->op==TK_SEL
20d30 45 43 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72  ECT); pX=pX->pPr
20d40 69 6f 72 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d  ior){}.  if( pX=
20d50 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
20d60 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20  Continue;.  a = 
20d70 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a  p->pOrderBy->a;.
20d80 20 20 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65    for(i=p->pOrde
20d90 72 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e  rBy->nExpr-1; i>
20da0 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66  =0; i--){.    if
20db0 28 20 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c  ( a[i].pExpr->fl
20dc0 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
20dd0 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
20de0 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e  if( i<0 ) return
20df0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a   WRC_Continue;..
20e00 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
20e10 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61   this point, tha
20e20 74 20 6d 65 61 6e 73 20 74 68 65 20 74 72 61 6e  t means the tran
20e30 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65  sformation is re
20e40 71 75 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50  quired. */..  pP
20e50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
20e60 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70  pParse;.  db = p
20e70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65  Parse->db;.  pNe
20e80 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
20e90 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
20ea0 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
20eb0 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
20ec0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
20ed0 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20   memset(&dummy, 
20ee0 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29  0, sizeof(dummy)
20ef0 29 3b 0a 20 20 70 4e 65 77 53 72 63 20 3d 20 73  );.  pNewSrc = s
20f00 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
20f10 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72  endFromTerm(pPar
20f20 73 65 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c  se,0,0,0,&dummy,
20f30 70 4e 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28  pNew,0,0);.  if(
20f40 20 70 4e 65 77 53 72 63 3d 3d 30 20 29 20 72 65   pNewSrc==0 ) re
20f50 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
20f60 20 20 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20    *pNew = *p;.  
20f70 70 2d 3e 70 53 72 63 20 3d 20 70 4e 65 77 53 72  p->pSrc = pNewSr
20f80 63 3b 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d  c;.  p->pEList =
20f90 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
20fa0 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
20fb0 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  , sqlite3Expr(db
20fc0 2c 20 54 4b 5f 41 4c 4c 2c 20 30 29 29 3b 0a 20  , TK_ALL, 0));. 
20fd0 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45   p->op = TK_SELE
20fe0 43 54 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20  CT;.  p->pWhere 
20ff0 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72  = 0;.  pNew->pGr
21000 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65  oupBy = 0;.  pNe
21010 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a  w->pHaving = 0;.
21020 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
21030 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f   = 0;.  p->pPrio
21040 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e 65 78  r = 0;.  p->pNex
21050 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 73 65 6c 46  t = 0;.  p->selF
21060 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70  lags &= ~SF_Comp
21070 6f 75 6e 64 3b 0a 20 20 61 73 73 65 72 74 28 20  ound;.  assert( 
21080 70 4e 65 77 2d 3e 70 50 72 69 6f 72 21 3d 30 20  pNew->pPrior!=0 
21090 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f  );.  pNew->pPrio
210a0 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b  r->pNext = pNew;
210b0 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20  .  pNew->pLimit 
210c0 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66  = 0;.  pNew->pOf
210d0 66 73 65 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  fset = 0;.  retu
210e0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
210f0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
21100 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a  TE_OMIT_CTE./*.*
21110 2a 20 41 72 67 75 6d 65 6e 74 20 70 57 69 74 68  * Argument pWith
21120 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 4e   (which may be N
21130 55 4c 4c 29 20 70 6f 69 6e 74 73 20 74 6f 20 61  ULL) points to a
21140 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
21150 6e 65 73 74 65 64 20 0a 2a 2a 20 57 49 54 48 20  nested .** WITH 
21160 63 6f 6e 74 65 78 74 73 2c 20 66 72 6f 6d 20 69  contexts, from i
21170 6e 6e 65 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73  nner to outermos
21180 74 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  t. If the table 
21190 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 0a 2a  identified by .*
211a0 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c  * FROM clause el
211b0 65 6d 65 6e 74 20 70 49 74 65 6d 20 69 73 20 72  ement pItem is r
211c0 65 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74  eally a common-t
211d0 61 62 6c 65 2d 65 78 70 72 65 73 73 69 6f 6e 20  able-expression 
211e0 28 43 54 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72  (CTE) .** then r
211f0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
21200 74 6f 20 74 68 65 20 43 54 45 20 64 65 66 69 6e  to the CTE defin
21210 69 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 74  ition for that t
21220 61 62 6c 65 2e 20 4f 74 68 65 72 77 69 73 65 0a  able. Otherwise.
21230 2a 2a 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  ** return NULL..
21240 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e  **.** If a non-N
21250 55 4c 4c 20 76 61 6c 75 65 20 69 73 20 72 65 74  ULL value is ret
21260 75 72 6e 65 64 2c 20 73 65 74 20 2a 70 70 43 6f  urned, set *ppCo
21270 6e 74 65 78 74 20 74 6f 20 70 6f 69 6e 74 20 74  ntext to point t
21280 6f 20 74 68 65 20 57 69 74 68 0a 2a 2a 20 6f 62  o the With.** ob
21290 6a 65 63 74 20 74 68 61 74 20 74 68 65 20 72 65  ject that the re
212a0 74 75 72 6e 65 64 20 43 54 45 20 62 65 6c 6f 6e  turned CTE belon
212b0 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  gs to..*/.static
212c0 20 73 74 72 75 63 74 20 43 74 65 20 2a 73 65 61   struct Cte *sea
212d0 72 63 68 57 69 74 68 28 0a 20 20 57 69 74 68 20  rchWith(.  With 
212e0 2a 70 57 69 74 68 2c 20 20 20 20 20 20 20 20 20  *pWith,         
212f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
21300 72 72 65 6e 74 20 6f 75 74 65 72 6d 6f 73 74 20  rrent outermost 
21310 57 49 54 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20  WITH clause */. 
21320 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
21330 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20  item *pItem,    
21340 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
21350 65 6c 65 6d 65 6e 74 20 74 6f 20 72 65 73 6f 6c  element to resol
21360 76 65 20 2a 2f 0a 20 20 57 69 74 68 20 2a 2a 70  ve */.  With **p
21370 70 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20  pContext        
21380 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
21390 57 49 54 48 20 63 6c 61 75 73 65 20 72 65 74 75  WITH clause retu
213a0 72 6e 20 76 61 6c 75 65 20 62 65 6c 6f 6e 67 73  rn value belongs
213b0 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73   to */.){.  cons
213c0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
213d0 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74   if( pItem->zDat
213e0 61 62 61 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61  abase==0 && (zNa
213f0 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  me = pItem->zNam
21400 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 57 69 74  e)!=0 ){.    Wit
21410 68 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  h *p;.    for(p=
21420 70 57 69 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70  pWith; p; p=p->p
21430 4f 75 74 65 72 29 7b 0a 20 20 20 20 20 20 69 6e  Outer){.      in
21440 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t i;.      for(i
21450 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69  =0; i<p->nCte; i
21460 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
21470 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
21480 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a  zName, p->a[i].z
21490 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
214a0 20 20 20 20 20 20 2a 70 70 43 6f 6e 74 65 78 74        *ppContext
214b0 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
214c0 72 65 74 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b  return &p->a[i];
214d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
214e0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
214f0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54  eturn 0;.}../* T
21500 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
21510 72 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 73 74  r maintains a st
21520 61 63 6b 20 6f 66 20 61 63 74 69 76 65 20 57 49  ack of active WI
21530 54 48 20 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69  TH clauses.** wi
21540 74 68 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73  th the inner-mos
21550 74 20 57 49 54 48 20 63 6c 61 75 73 65 20 62 65  t WITH clause be
21560 69 6e 67 20 61 74 20 74 68 65 20 74 6f 70 20 6f  ing at the top o
21570 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a  f the stack..**.
21580 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
21590 70 75 73 68 65 73 20 74 68 65 20 57 49 54 48 20  pushes the WITH 
215a0 63 6c 61 75 73 65 20 70 61 73 73 65 64 20 61 73  clause passed as
215b0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
215c0 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65  ment.** onto the
215d0 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
215e0 6b 2e 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62  k. If argument b
215f0 46 72 65 65 20 69 73 20 74 72 75 65 2c 20 74 68  Free is true, th
21600 65 6e 20 74 68 69 73 0a 2a 2a 20 57 49 54 48 20  en this.** WITH 
21610 63 6c 61 75 73 65 20 77 69 6c 6c 20 6e 65 76 65  clause will neve
21620 72 20 62 65 20 70 6f 70 70 65 64 20 66 72 6f 6d  r be popped from
21630 20 74 68 65 20 73 74 61 63 6b 2e 20 49 6e 20 74   the stack. In t
21640 68 69 73 20 63 61 73 65 20 69 74 0a 2a 2a 20 73  his case it.** s
21650 68 6f 75 6c 64 20 62 65 20 66 72 65 65 64 20 61  hould be freed a
21660 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 50 61  long with the Pa
21670 72 73 65 20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f  rse object. In o
21680 74 68 65 72 20 63 61 73 65 73 2c 20 77 68 65 6e  ther cases, when
21690 0a 2a 2a 20 62 46 72 65 65 3d 3d 30 2c 20 74 68  .** bFree==0, th
216a0 65 20 57 69 74 68 20 6f 62 6a 65 63 74 20 77 69  e With object wi
216b0 6c 6c 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e  ll be freed alon
216c0 67 20 77 69 74 68 20 74 68 65 20 53 45 4c 45 43  g with the SELEC
216d0 54 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  T .** statement 
216e0 77 69 74 68 20 77 68 69 63 68 20 69 74 20 69 73  with which it is
216f0 20 61 73 73 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a   associated..*/.
21700 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 74 68  void sqlite3With
21710 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61 72  Push(Parse *pPar
21720 73 65 2c 20 57 69 74 68 20 2a 70 57 69 74 68 2c  se, With *pWith,
21730 20 75 38 20 62 46 72 65 65 29 7b 0a 20 20 61 73   u8 bFree){.  as
21740 73 65 72 74 28 20 62 46 72 65 65 3d 3d 30 20 7c  sert( bFree==0 |
21750 7c 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d  | pParse->pWith=
21760 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 57 69 74  =0 );.  if( pWit
21770 68 20 29 7b 0a 20 20 20 20 70 57 69 74 68 2d 3e  h ){.    pWith->
21780 70 4f 75 74 65 72 20 3d 20 70 50 61 72 73 65 2d  pOuter = pParse-
21790 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72  >pWith;.    pPar
217a0 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
217b0 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 62  h;.    pParse->b
217c0 46 72 65 65 57 69 74 68 20 3d 20 62 46 72 65 65  FreeWith = bFree
217d0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
217e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65  his function che
217f0 63 6b 73 20 69 66 20 61 72 67 75 6d 65 6e 74 20  cks if argument 
21800 70 46 72 6f 6d 20 72 65 66 65 72 73 20 74 6f 20  pFrom refers to 
21810 61 20 43 54 45 20 64 65 63 6c 61 72 65 64 20 62  a CTE declared b
21820 79 20 0a 2a 2a 20 61 20 57 49 54 48 20 63 6c 61  y .** a WITH cla
21830 75 73 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  use on the stack
21840 20 63 75 72 72 65 6e 74 6c 79 20 6d 61 69 6e 74   currently maint
21850 61 69 6e 65 64 20 62 79 20 74 68 65 20 70 61 72  ained by the par
21860 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66 20  ser. And,.** if 
21870 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73  currently proces
21880 73 69 6e 67 20 61 20 43 54 45 20 65 78 70 72 65  sing a CTE expre
21890 73 73 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20  ssion, if it is 
218a0 61 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 72  a recursive.** r
218b0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
218c0 63 75 72 72 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a  current CTE..**.
218d0 2a 2a 20 49 66 20 70 46 72 6f 6d 20 66 61 6c 6c  ** If pFrom fall
218e0 73 20 69 6e 74 6f 20 65 69 74 68 65 72 20 6f 66  s into either of
218f0 20 74 68 65 20 74 77 6f 20 63 61 74 65 67 6f 72   the two categor
21900 69 65 73 20 61 62 6f 76 65 2c 20 70 46 72 6f 6d  ies above, pFrom
21910 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e 64 20 6f 74  ->pTab.** and ot
21920 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 70  her fields are p
21930 6f 70 75 6c 61 74 65 64 20 61 63 63 6f 72 64 69  opulated accordi
21940 6e 67 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72  ngly. The caller
21950 20 73 68 6f 75 6c 64 20 63 68 65 63 6b 0a 2a 2a   should check.**
21960 20 28 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30   (pFrom->pTab!=0
21970 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  ) to determine w
21980 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
21990 73 75 63 63 65 73 73 66 75 6c 20 6d 61 74 63 68  successful match
219a0 0a 2a 2a 20 77 61 73 20 66 6f 75 6e 64 2e 0a 2a  .** was found..*
219b0 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
219c0 6e 6f 74 20 61 20 6d 61 74 63 68 20 69 73 20 66  not a match is f
219d0 6f 75 6e 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ound, SQLITE_OK 
219e0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
219f0 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72  o error.** occur
21a00 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64  s. If an error d
21a10 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e 20 65 72  oes occur, an er
21a20 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73  ror message is s
21a30 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  tored in the.** 
21a40 70 61 72 73 65 72 20 61 6e 64 20 73 6f 6d 65 20  parser and some 
21a50 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72  error code other
21a60 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   than SQLITE_OK 
21a70 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
21a80 74 69 63 20 69 6e 74 20 77 69 74 68 45 78 70 61  tic int withExpa
21a90 6e 64 28 0a 20 20 57 61 6c 6b 65 72 20 2a 70 57  nd(.  Walker *pW
21aa0 61 6c 6b 65 72 2c 20 0a 20 20 73 74 72 75 63 74  alker, .  struct
21ab0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
21ac0 46 72 6f 6d 0a 29 7b 0a 20 20 50 61 72 73 65 20  From.){.  Parse 
21ad0 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65  *pParse = pWalke
21ae0 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 71 6c  r->pParse;.  sql
21af0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
21b00 65 2d 3e 64 62 3b 0a 20 20 73 74 72 75 63 74 20  e->db;.  struct 
21b10 43 74 65 20 2a 70 43 74 65 3b 20 20 20 20 20 20  Cte *pCte;      
21b20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63           /* Matc
21b30 68 65 64 20 43 54 45 20 28 6f 72 20 4e 55 4c 4c  hed CTE (or NULL
21b40 20 69 66 20 6e 6f 20 6d 61 74 63 68 29 20 2a 2f   if no match) */
21b50 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 3b 20  .  With *pWith; 
21b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b70 20 20 20 2f 2a 20 57 49 54 48 20 63 6c 61 75 73     /* WITH claus
21b80 65 20 74 68 61 74 20 70 43 74 65 20 62 65 6c 6f  e that pCte belo
21b90 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73  ngs to */..  ass
21ba0 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
21bb0 3d 3d 30 20 29 3b 0a 0a 20 20 70 43 74 65 20 3d  ==0 );..  pCte =
21bc0 20 73 65 61 72 63 68 57 69 74 68 28 70 50 61 72   searchWith(pPar
21bd0 73 65 2d 3e 70 57 69 74 68 2c 20 70 46 72 6f 6d  se->pWith, pFrom
21be0 2c 20 26 70 57 69 74 68 29 3b 0a 20 20 69 66 28  , &pWith);.  if(
21bf0 20 70 43 74 65 20 29 7b 0a 20 20 20 20 54 61 62   pCte ){.    Tab
21c00 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 45 78  le *pTab;.    Ex
21c10 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
21c20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
21c30 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c  ;.    Select *pL
21c40 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  eft;            
21c50 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74      /* Left-most
21c60 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
21c70 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4d 61  t */.    int bMa
21c80 79 52 65 63 75 72 73 69 76 65 3b 20 20 20 20 20  yRecursive;     
21c90 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
21ca0 66 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65  f compound joine
21cb0 64 20 62 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d  d by UNION [ALL]
21cc0 20 2a 2f 0a 20 20 20 20 57 69 74 68 20 2a 70 53   */.    With *pS
21cd0 61 76 65 64 57 69 74 68 3b 20 20 20 20 20 20 20  avedWith;       
21ce0 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
21cf0 20 76 61 6c 75 65 20 6f 66 20 70 50 61 72 73 65   value of pParse
21d00 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a 20 20 20 20  ->pWith */..    
21d10 2f 2a 20 49 66 20 70 43 74 65 2d 3e 7a 45 72 72  /* If pCte->zErr
21d20 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20   is non-NULL at 
21d30 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
21d40 20 74 68 69 73 20 69 73 20 61 6e 20 69 6c 6c 65   this is an ille
21d50 67 61 6c 0a 20 20 20 20 2a 2a 20 72 65 63 75 72  gal.    ** recur
21d60 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 74  sive reference t
21d70 6f 20 43 54 45 20 70 43 74 65 2e 20 4c 65 61 76  o CTE pCte. Leav
21d80 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50  e an error in pP
21d90 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a  arse and return.
21da0 20 20 20 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66      ** early. If
21db0 20 70 43 74 65 2d 3e 7a 45 72 72 20 69 73 20 4e   pCte->zErr is N
21dc0 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 69  ULL, then this i
21dd0 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76  s not a recursiv
21de0 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 20 20 20  e reference..   
21df0 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
21e00 2c 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a 20  , proceed.  */. 
21e10 20 20 20 69 66 28 20 70 43 74 65 2d 3e 7a 45 72     if( pCte->zEr
21e20 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
21e30 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
21e40 65 2c 20 70 43 74 65 2d 3e 7a 45 72 72 2c 20 70  e, pCte->zErr, p
21e50 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Cte->zName);.   
21e60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
21e70 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
21e80 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
21e90 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
21ea0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
21eb0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
21ec0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
21ed0 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20  zeof(Table));.  
21ee0 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
21ef0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
21f00 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66  ;.    pTab->nRef
21f10 20 3d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e   = 1;.    pTab->
21f20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
21f30 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 74 65  bStrDup(db, pCte
21f40 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54  ->zName);.    pT
21f50 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
21f60 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73      pTab->nRowEs
21f70 74 20 3d 20 31 30 34 38 35 37 36 3b 0a 20 20 20  t = 1048576;.   
21f80 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
21f90 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b  |= TF_Ephemeral;
21fa0 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  .    pFrom->pSel
21fb0 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
21fc0 65 63 74 44 75 70 28 64 62 2c 20 70 43 74 65 2d  ectDup(db, pCte-
21fd0 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  >pSelect, 0);.  
21fe0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
21ff0 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
22000 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
22010 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
22020 3e 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20  >pSelect );..   
22030 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69   /* Check if thi
22040 73 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65  s is a recursive
22050 20 43 54 45 2e 20 2a 2f 0a 20 20 20 20 70 53 65   CTE. */.    pSe
22060 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  l = pFrom->pSele
22070 63 74 3b 0a 20 20 20 20 62 4d 61 79 52 65 63 75  ct;.    bMayRecu
22080 72 73 69 76 65 20 3d 20 28 20 70 53 65 6c 2d 3e  rsive = ( pSel->
22090 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53  op==TK_ALL || pS
220a0 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e  el->op==TK_UNION
220b0 20 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79   );.    if( bMay
220c0 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
220d0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
220e0 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20  SrcList *pSrc = 
220f0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e  pFrom->pSelect->
22100 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28  pSrc;.      for(
22110 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  i=0; i<pSrc->nSr
22120 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  c; i++){.       
22130 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
22140 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
22150 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
22160 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44     if( pItem->zD
22170 61 74 61 62 61 73 65 3d 3d 30 20 0a 20 20 20 20  atabase==0 .    
22180 20 20 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 7a       && pItem->z
22190 4e 61 6d 65 21 3d 30 20 0a 20 20 20 20 20 20 20  Name!=0 .       
221a0 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53    && 0==sqlite3S
221b0 74 72 49 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e  trICmp(pItem->zN
221c0 61 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  ame, pCte->zName
221d0 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
221e0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
221f0 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20  pTab = pTab;.   
22200 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 73         pItem->is
22210 52 65 63 75 72 73 69 76 65 20 3d 20 31 3b 0a 20  Recursive = 1;. 
22220 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e           pTab->n
22230 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Ref++;.         
22240 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20   pSel->selFlags 
22250 7c 3d 20 53 46 5f 52 65 63 75 72 73 69 76 65 3b  |= SF_Recursive;
22260 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22270 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
22280 20 4f 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72 73   Only one recurs
22290 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 69 73  ive reference is
222a0 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a   permitted. */ .
222b0 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 52      if( pTab->nR
222c0 65 66 3e 32 20 29 7b 0a 20 20 20 20 20 20 73 71  ef>2 ){.      sq
222d0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 0a 20  lite3ErrorMsg(. 
222e0 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c           pParse,
222f0 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 66 65 72   "multiple refer
22300 65 6e 63 65 73 20 74 6f 20 72 65 63 75 72 73 69  ences to recursi
22310 76 65 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 70  ve table: %s", p
22320 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20  Cte->zName.     
22330 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
22340 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
22350 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
22360 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 31 20 7c   pTab->nRef==1 |
22370 7c 20 28 28 70 53 65 6c 2d 3e 73 65 6c 46 6c 61  | ((pSel->selFla
22380 67 73 26 53 46 5f 52 65 63 75 72 73 69 76 65 29  gs&SF_Recursive)
22390 20 26 26 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d   && pTab->nRef==
223a0 32 20 29 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d  2 ));..    pCte-
223b0 3e 7a 45 72 72 20 3d 20 22 63 69 72 63 75 6c 61  >zErr = "circula
223c0 72 20 72 65 66 65 72 65 6e 63 65 3a 20 25 73 22  r reference: %s"
223d0 3b 0a 20 20 20 20 70 53 61 76 65 64 57 69 74 68  ;.    pSavedWith
223e0 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68   = pParse->pWith
223f0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57  ;.    pParse->pW
22400 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20  ith = pWith;.   
22410 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
22420 63 74 28 70 57 61 6c 6b 65 72 2c 20 62 4d 61 79  ct(pWalker, bMay
22430 52 65 63 75 72 73 69 76 65 20 3f 20 70 53 65 6c  Recursive ? pSel
22440 2d 3e 70 50 72 69 6f 72 20 3a 20 70 53 65 6c 29  ->pPrior : pSel)
22450 3b 0a 0a 20 20 20 20 66 6f 72 28 70 4c 65 66 74  ;..    for(pLeft
22460 3d 70 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70 50  =pSel; pLeft->pP
22470 72 69 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65 66  rior; pLeft=pLef
22480 74 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20 20  t->pPrior);.    
22490 70 45 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e  pEList = pLeft->
224a0 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20  pEList;.    if( 
224b0 70 43 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20  pCte->pCols ){. 
224c0 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d       if( pEList-
224d0 3e 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e 70 43  >nExpr!=pCte->pC
224e0 6f 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ols->nExpr ){.  
224f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
22500 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
22510 61 62 6c 65 20 25 73 20 68 61 73 20 25 64 20 76  able %s has %d v
22520 61 6c 75 65 73 20 66 6f 72 20 25 64 20 63 6f 6c  alues for %d col
22530 75 6d 6e 73 22 2c 0a 20 20 20 20 20 20 20 20 20  umns",.         
22540 20 20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20     pCte->zName, 
22550 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  pEList->nExpr, p
22560 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70  Cte->pCols->nExp
22570 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  r.        );.   
22580 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69       pParse->pWi
22590 74 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b  th = pSavedWith;
225a0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
225b0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
225c0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45 4c 69      }.      pELi
225d0 73 74 20 3d 20 70 43 74 65 2d 3e 70 43 6f 6c 73  st = pCte->pCols
225e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 6c  ;.    }..    sel
225f0 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  ectColumnsFromEx
22600 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
22610 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43  EList, &pTab->nC
22620 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29  ol, &pTab->aCol)
22630 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65  ;.    if( bMayRe
22640 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
22650 20 69 66 28 20 70 53 65 6c 2d 3e 73 65 6c 46 6c   if( pSel->selFl
22660 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
22670 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ve ){.        pC
22680 74 65 2d 3e 7a 45 72 72 20 3d 20 22 6d 75 6c 74  te->zErr = "mult
22690 69 70 6c 65 20 72 65 63 75 72 73 69 76 65 20 72  iple recursive r
226a0 65 66 65 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a  eferences: %s";.
226b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
226c0 20 20 20 20 20 70 43 74 65 2d 3e 7a 45 72 72 20       pCte->zErr 
226d0 3d 20 22 72 65 63 75 72 73 69 76 65 20 72 65 66  = "recursive ref
226e0 65 72 65 6e 63 65 20 69 6e 20 61 20 73 75 62 71  erence in a subq
226f0 75 65 72 79 3a 20 25 73 22 3b 0a 20 20 20 20 20  uery: %s";.     
22700 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
22710 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
22720 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d  er, pSel);.    }
22730 0a 20 20 20 20 70 43 74 65 2d 3e 7a 45 72 72 20  .    pCte->zErr 
22740 3d 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  = 0;.    pParse-
22750 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65 64 57  >pWith = pSavedW
22760 69 74 68 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ith;.  }..  retu
22770 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
22780 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
22790 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
227a0 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c  /*.** If the SEL
227b0 45 43 54 20 70 61 73 73 65 64 20 61 73 20 74 68  ECT passed as th
227c0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
227d0 74 20 68 61 73 20 61 6e 20 61 73 73 6f 63 69 61  t has an associa
227e0 74 65 64 20 57 49 54 48 20 0a 2a 2a 20 63 6c 61  ted WITH .** cla
227f0 75 73 65 2c 20 70 6f 70 20 69 74 20 66 72 6f 6d  use, pop it from
22800 20 74 68 65 20 73 74 61 63 6b 20 73 74 6f 72 65   the stack store
22810 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
22820 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a   Parse object..*
22830 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
22840 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20 74 68  on is used as th
22850 65 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  e xSelectCallbac
22860 6b 32 28 29 20 63 61 6c 6c 62 61 63 6b 20 62 79  k2() callback by
22870 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63  .** sqlite3Selec
22880 74 45 78 70 61 6e 64 28 29 20 77 68 65 6e 20 77  tExpand() when w
22890 61 6c 6b 69 6e 67 20 61 20 53 45 4c 45 43 54 20  alking a SELECT 
228a0 74 72 65 65 20 74 6f 20 72 65 73 6f 6c 76 65 20  tree to resolve 
228b0 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 61  table.** names a
228c0 6e 64 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c  nd other FROM cl
228d0 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 2e 20 0a  ause elements. .
228e0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
228f0 65 6c 65 63 74 50 6f 70 57 69 74 68 28 57 61 6c  electPopWith(Wal
22900 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
22910 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73  lect *p){.  Pars
22920 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
22930 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 57  ker->pParse;.  W
22940 69 74 68 20 2a 70 57 69 74 68 20 3d 20 66 69 6e  ith *pWith = fin
22950 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70  dRightmost(p)->p
22960 57 69 74 68 3b 0a 20 20 69 66 28 20 70 57 69 74  With;.  if( pWit
22970 68 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  h!=0 ){.    asse
22980 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74  rt( pParse->pWit
22990 68 3d 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20  h==pWith );.    
229a0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
229b0 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 3b 0a 20  pWith->pOuter;. 
229c0 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69   }.}.#else.#defi
229d0 6e 65 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68  ne selectPopWith
229e0 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
229f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
22a00 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61   a Walker callba
22a10 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e  ck for "expandin
22a20 67 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  g" a SELECT stat
22a30 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e  ement..** "Expan
22a40 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64  ding" means to d
22a50 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  o the following:
22a60 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d  .**.**    (1)  M
22a70 61 6b 65 20 73 75 72 65 20 56 44 42 45 20 63 75  ake sure VDBE cu
22a80 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76  rsor numbers hav
22a90 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20  e been assigned 
22aa0 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20  to every.**     
22ab0 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74      element of t
22ac0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
22ad0 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69  **.**    (2)  Fi
22ae0 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69  ll in the pTabLi
22af0 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65  st->a[].pTab fie
22b00 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69  lds in the SrcLi
22b10 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20  st that .**     
22b20 20 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d      defines FROM
22b30 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76   clause.  When v
22b40 69 65 77 73 20 61 70 70 65 61 72 20 69 6e 20 74  iews appear in t
22b50 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a  he FROM clause,.
22b60 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20  **         fill 
22b70 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53  pTabList->a[].pS
22b80 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70  elect with a cop
22b90 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  y of the SELECT 
22ba0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  statement.**    
22bb0 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d       that implem
22bc0 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20  ents the view.  
22bd0 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f  A copy is made o
22be0 66 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c  f the view's SEL
22bf0 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  ECT.**         s
22c00 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74  tatement so that
22c10 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d   we can freely m
22c20 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20  odify or delete 
22c30 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a  that statement.*
22c40 2a 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75  *         withou
22c50 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74  t worrying about
22c60 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20   messing up the 
22c70 70 72 65 73 69 73 74 65 6e 74 20 72 65 70 72 65  presistent repre
22c80 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20  sentation.**    
22c90 20 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77       of the view
22ca0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20  ..**.**    (3)  
22cb0 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65  Add terms to the
22cc0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
22cd0 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68 65 20   accomodate the 
22ce0 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a  NATURAL keyword.
22cf0 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f  **         on jo
22d00 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61  ins and the ON a
22d10 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  nd USING clause 
22d20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20  of joins..**.** 
22d30 20 20 20 28 34 29 20 20 53 63 61 6e 20 74 68 65     (4)  Scan the
22d40 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
22d50 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
22d60 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b  et (pEList) look
22d70 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  ing.**         f
22d80 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  or instances of 
22d90 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72  the "*" operator
22da0 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20   or the TABLE.* 
22db0 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20  operator..**    
22dc0 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65       If found, e
22dd0 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74  xpand each "*" t
22de0 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
22df0 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65  n in every table
22e00 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20  .**         and 
22e10 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76  TABLE.* to be ev
22e20 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41  ery column in TA
22e30 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  BLE..**.*/.stati
22e40 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61  c int selectExpa
22e50 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61  nder(Walker *pWa
22e60 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
22e70 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
22e80 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
22e90 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  rse;.  int i, j,
22ea0 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   k;.  SrcList *p
22eb0 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c  TabList;.  ExprL
22ec0 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73  ist *pEList;.  s
22ed0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
22ee0 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c  em *pFrom;.  sql
22ef0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
22f00 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70  e->db;.  Expr *p
22f10 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70 45 78  E, *pRight, *pEx
22f20 70 72 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c 61  pr;.  u16 selFla
22f30 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73  gs = p->selFlags
22f40 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ;..  p->selFlags
22f50 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b   |= SF_Expanded;
22f60 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
22f70 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20 20 20  cFailed  ){.    
22f80 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
22f90 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45 56 45  ;.  }.  if( NEVE
22fa0 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29 20 7c 7c  R(p->pSrc==0) ||
22fb0 20 28 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f   (selFlags & SF_
22fc0 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a  Expanded)!=0 ){.
22fd0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
22fe0 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rune;.  }.  pTab
22ff0 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
23000 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
23010 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 57  List;.  sqlite3W
23020 69 74 68 50 75 73 68 28 70 50 61 72 73 65 2c 20  ithPush(pParse, 
23030 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29  findRightmost(p)
23040 2d 3e 70 57 69 74 68 2c 20 30 29 3b 0a 0a 20 20  ->pWith, 0);..  
23050 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72  /* Make sure cur
23060 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65  sor numbers have
23070 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74   been assigned t
23080 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e  o all entries in
23090 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
230a0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c  lause of the SEL
230b0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  ECT statement.. 
230c0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63   */.  sqlite3Src
230d0 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
230e0 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
230f0 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  st);..  /* Look 
23100 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e  up every table n
23110 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d  amed in the FROM
23120 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
23130 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20  elect.  If.  ** 
23140 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  an entry of the 
23150 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61  FROM clause is a
23160 20 73 75 62 71 75 65 72 79 20 69 6e 73 74 65 61   subquery instea
23170 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  d of a table or 
23180 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  view,.  ** then 
23190 63 72 65 61 74 65 20 61 20 74 72 61 6e 73 69 65  create a transie
231a0 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
231b0 72 65 20 74 6f 20 64 65 73 63 72 69 62 65 20 74  re to describe t
231c0 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a  he subquery..  *
231d0 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72  /.  for(i=0, pFr
231e0 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
231f0 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
23200 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
23210 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
23220 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
23230 72 6f 6d 2d 3e 69 73 52 65 63 75 72 73 69 76 65  rom->isRecursive
23240 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54  ==0 || pFrom->pT
23250 61 62 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46  ab );.    if( pF
23260 72 6f 6d 2d 3e 69 73 52 65 63 75 72 73 69 76 65  rom->isRecursive
23270 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
23280 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
23290 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
232a0 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68  This statement h
232b0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
232c0 70 72 65 70 61 72 65 64 2e 20 20 54 68 65 72 65  prepared.  There
232d0 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20   is no need.    
232e0 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68    ** to go furth
232f0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  er. */.      ass
23300 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 23 69 66  ert( i==0 );.#if
23310 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
23320 5f 43 54 45 0a 20 20 20 20 20 20 73 65 6c 65 63  _CTE.      selec
23330 74 50 6f 70 57 69 74 68 28 70 57 61 6c 6b 65 72  tPopWith(pWalker
23340 2c 20 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , p);.#endif.   
23350 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
23360 75 6e 65 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  une;.    }.#ifnd
23370 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
23380 54 45 0a 20 20 20 20 69 66 28 20 77 69 74 68 45  TE.    if( withE
23390 78 70 61 6e 64 28 70 57 61 6c 6b 65 72 2c 20 70  xpand(pWalker, p
233a0 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 57  From) ) return W
233b0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69 66  RC_Abort;.    if
233c0 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29 20  ( pFrom->pTab ) 
233d0 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20  {} else.#endif. 
233e0 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e     if( pFrom->zN
233f0 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65  ame==0 ){.#ifnde
23400 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
23410 42 51 55 45 52 59 0a 20 20 20 20 20 20 53 65 6c  BQUERY.      Sel
23420 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f  ect *pSel = pFro
23430 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
23440 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79    /* A sub-query
23450 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
23460 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
23470 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
23480 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20   pSel!=0 );.    
23490 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
234a0 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20  >pTab==0 );.    
234b0 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
234c0 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65  ect(pWalker, pSe
234d0 6c 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d  l);.      pFrom-
234e0 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73  >pTab = pTab = s
234f0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
23500 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
23510 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ble));.      if(
23520 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
23530 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
23540 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20     pTab->nRef = 
23550 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  1;.      pTab->z
23560 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
23570 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74  rintf(db, "sqlit
23580 65 5f 73 71 5f 25 70 22 2c 20 28 76 6f 69 64 2a  e_sq_%p", (void*
23590 29 70 54 61 62 29 3b 0a 20 20 20 20 20 20 77 68  )pTab);.      wh
235a0 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f  ile( pSel->pPrio
235b0 72 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c  r ){ pSel = pSel
235c0 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20  ->pPrior; }.    
235d0 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46    selectColumnsF
235e0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
235f0 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74  se, pSel->pEList
23600 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26  , &pTab->nCol, &
23610 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20  pTab->aCol);.   
23620 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
23630 20 2d 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d   -1;.      pTab-
23640 3e 6e 52 6f 77 45 73 74 20 3d 20 31 30 34 38 35  >nRowEst = 10485
23650 37 36 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  76;.      pTab->
23660 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45  tabFlags |= TF_E
23670 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66  phemeral;.#endif
23680 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
23690 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79    /* An ordinary
236a0 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e   table or view n
236b0 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ame in the FROM 
236c0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
236d0 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
236e0 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab==0 );.      
236f0 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
23700 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
23710 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72  teTableItem(pPar
23720 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20  se, 0, pFrom);. 
23730 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
23740 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
23750 6f 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ort;.      if( p
23760 54 61 62 2d 3e 6e 52 65 66 3d 3d 30 78 66 66 66  Tab->nRef==0xfff
23770 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  f ){.        sql
23780 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
23790 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72  rse, "too many r
237a0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c 22 25  eferences to \"%
237b0 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35 22 2c  s\": max 65535",
237c0 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62  .           pTab
237d0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
237e0 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
237f0 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
23800 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
23810 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d     }.      pTab-
23820 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20 21 64 65  >nRef++;.#if !de
23830 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
23840 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
23850 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ned (SQLITE_OMIT
23860 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20  _VIRTUALTABLE). 
23870 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70       if( pTab->p
23880 53 65 6c 65 63 74 20 7c 7c 20 49 73 56 69 72 74  Select || IsVirt
23890 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
238a0 20 20 20 20 20 2f 2a 20 57 65 20 72 65 61 63 68       /* We reach
238b0 20 68 65 72 65 20 69 66 20 74 68 65 20 6e 61 6d   here if the nam
238c0 65 64 20 74 61 62 6c 65 20 69 73 20 61 20 72 65  ed table is a re
238d0 61 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a 20  ally a view */. 
238e0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
238f0 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
23900 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
23910 62 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  b) ) return WRC_
23920 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 61  Abort;.        a
23930 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53  ssert( pFrom->pS
23940 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20  elect==0 );.    
23950 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65      pFrom->pSele
23960 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
23970 63 74 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e  ctDup(db, pTab->
23980 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
23990 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
239a0 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
239b0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pFrom->pSelect);
239c0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
239d0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f      }..    /* Lo
239e0 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e  cate the index n
239f0 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44 45  amed by the INDE
23a00 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69  XED BY clause, i
23a10 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66  f any. */.    if
23a20 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64  ( sqlite3Indexed
23a30 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c  ByLookup(pParse,
23a40 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20   pFrom) ){.     
23a50 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
23a60 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
23a70 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52  /* Process NATUR
23a80 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64  AL keywords, and
23a90 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
23aa0 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a  auses of joins..
23ab0 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d    */.  if( db->m
23ac0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73  allocFailed || s
23ad0 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
23ae0 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20  (pParse, p) ){. 
23af0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
23b00 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ort;.  }..  /* F
23b10 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61  or every "*" tha
23b20 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  t occurs in the 
23b30 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73  column list, ins
23b40 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ert the names of
23b50 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e  .  ** all column
23b60 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e  s in all tables.
23b70 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20    And for every 
23b80 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74  TABLE.* insert t
23b90 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66  he names.  ** of
23ba0 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
23bb0 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73  TABLE.  The pars
23bc0 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70  er inserted a sp
23bd0 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e  ecial expression
23be0 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54  .  ** with the T
23bf0 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66  K_ALL operator f
23c00 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74  or each "*" that
23c10 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65   it found in the
23c20 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20   column list..  
23c30 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
23c40 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74   code just has t
23c50 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f  o locate the TK_
23c60 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ALL expressions 
23c70 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20  and expand.  ** 
23c80 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20  each one to the 
23c90 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75  list of all colu
23ca0 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
23cb0 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
23cc0 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74   first loop just
23cd0 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69   checks to see i
23ce0 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
23cf0 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20  "*" operators.  
23d00 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70  ** that need exp
23d10 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66  anding..  */.  f
23d20 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
23d30 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
23d40 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e     pE = pEList->
23d50 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[k].pExpr;.    
23d60 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41  if( pE->op==TK_A
23d70 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  LL ) break;.    
23d80 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d  assert( pE->op!=
23d90 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52  TK_DOT || pE->pR
23da0 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 61  ight!=0 );.    a
23db0 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54  ssert( pE->op!=T
23dc0 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c  K_DOT || (pE->pL
23dd0 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c  eft!=0 && pE->pL
23de0 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20  eft->op==TK_ID) 
23df0 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  );.    if( pE->o
23e00 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d  p==TK_DOT && pE-
23e10 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f  >pRight->op==TK_
23e20 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ALL ) break;.  }
23e30 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d  .  if( k<pEList-
23e40 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a  >nExpr ){.    /*
23e50 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65  .    ** If we ge
23e60 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20  t here it means 
23e70 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 63  the result set c
23e80 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
23e90 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f  ore "*".    ** o
23ea0 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65  perators that ne
23eb0 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
23ec0 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68  d.  Loop through
23ed0 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
23ee0 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72  .    ** in the r
23ef0 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78  esult set and ex
23f00 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79  pand them one by
23f10 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   one..    */.   
23f20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
23f30 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73  _item *a = pELis
23f40 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69  t->a;.    ExprLi
23f50 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20  st *pNew = 0;.  
23f60 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 50    int flags = pP
23f70 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b  arse->db->flags;
23f80 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d  .    int longNam
23f90 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  es = (flags & SQ
23fa0 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
23fb0 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  s)!=0.          
23fc0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
23fd0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
23fe0 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30  hortColNames)==0
23ff0 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 70  ;..    /* When p
24000 72 6f 63 65 73 73 69 6e 67 20 46 52 4f 4d 2d 63  rocessing FROM-c
24010 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73  lause subqueries
24020 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73 20 74  , it is always t
24030 68 65 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 74  he case.    ** t
24040 68 61 74 20 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f  hat full_column_
24050 6e 61 6d 65 73 3d 4f 46 46 20 61 6e 64 20 73 68  names=OFF and sh
24060 6f 72 74 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73  ort_column_names
24070 3d 4f 4e 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a  =ON.  The.    **
24080 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
24090 74 4f 66 53 65 6c 65 63 74 28 29 20 72 6f 75 74  tOfSelect() rout
240a0 69 6e 65 20 6d 61 6b 65 73 20 69 74 20 73 6f 2e  ine makes it so.
240b0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
240c0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
240d0 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30  F_NestedFrom)==0
240e0 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28  .          || ((
240f0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
24100 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 20  ullColNames)==0 
24110 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
24120 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
24130 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21  _ShortColNames)!
24140 3d 30 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28  =0) );..    for(
24150 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
24160 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
24170 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70    pE = a[k].pExp
24180 72 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20  r;.      pRight 
24190 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20 20  = pE->pRight;.  
241a0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
241b0 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52  op!=TK_DOT || pR
241c0 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  ight!=0 );.     
241d0 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f   if( pE->op!=TK_
241e0 41 4c 4c 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d  ALL && (pE->op!=
241f0 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74  TK_DOT || pRight
24200 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b  ->op!=TK_ALL) ){
24210 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
24220 20 70 61 72 74 69 63 75 6c 61 72 20 65 78 70 72   particular expr
24230 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  ession does not 
24240 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
24250 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ded..        */.
24260 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
24270 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
24280 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65  pend(pParse, pNe
24290 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a  w, a[k].pExpr);.
242a0 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
242b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
242c0 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
242d0 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b  r-1].zName = a[k
242e0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
242f0 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
24300 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20  >nExpr-1].zSpan 
24310 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20  = a[k].zSpan;.  
24320 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61          a[k].zNa
24330 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
24340 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30    a[k].zSpan = 0
24350 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
24360 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d      a[k].pExpr =
24370 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
24380 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
24390 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
243a0 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45   "*" or a "TABLE
243b0 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f  .*" and needs to
243c0 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65   be.        ** e
243d0 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20  xpanded. */.    
243e0 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65      int tableSee
243f0 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53  n = 0;      /* S
24400 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42  et to 1 when TAB
24410 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20  LE matches */.  
24420 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61        char *zTNa
24430 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  me = 0;       /*
24440 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66   text of name of
24450 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20   TABLE */.      
24460 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
24470 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20  _DOT ){.        
24480 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 70 4c    assert( pE->pL
24490 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  eft!=0 );.      
244a0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
244b0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2d  rHasProperty(pE-
244c0 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74 56 61  >pLeft, EP_IntVa
244d0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
244e0 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70    zTName = pE->p
244f0 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Left->u.zToken;.
24500 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24510 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
24520 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
24530 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
24540 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
24550 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a           Table *
24560 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
24570 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 53 65  ab;.          Se
24580 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 46 72  lect *pSub = pFr
24590 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
245a0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
245b0 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a  bName = pFrom->z
245c0 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20  Alias;.         
245d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63   const char *zSc
245e0 68 65 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  hemaName = 0;.  
245f0 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b          int iDb;
24600 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
24610 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  TabName==0 ){.  
24620 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61            zTabNa
24630 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  me = pTab->zName
24640 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
24650 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
24660 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62  mallocFailed ) b
24670 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
24680 69 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20 28  if( pSub==0 || (
24690 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
246a0 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d   SF_NestedFrom)=
246b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
246c0 20 20 70 53 75 62 20 3d 20 30 3b 0a 20 20 20 20    pSub = 0;.    
246d0 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
246e0 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  me && sqlite3Str
246f0 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61  ICmp(zTName, zTa
24700 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  bName)!=0 ){.   
24710 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
24720 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
24730 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
24740 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
24750 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
24760 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
24770 20 20 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d            zSchem
24780 61 4e 61 6d 65 20 3d 20 69 44 62 3e 3d 30 20 3f  aName = iDb>=0 ?
24790 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
247a0 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20  ame : "*";.     
247b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
247c0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
247d0 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
247e0 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
247f0 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43  zName = pTab->aC
24800 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol[j].zName;.   
24810 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
24820 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65  Colname;  /* The
24830 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e   computed column
24840 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
24850 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 46 72       char *zToFr
24860 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65  ee;   /* Malloce
24870 64 20 73 74 72 69 6e 67 20 74 68 61 74 20 6e 65  d string that ne
24880 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  eds to be freed 
24890 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  */.            T
248a0 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20  oken sColname;  
248b0 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75  /* Computed colu
248c0 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b  mn name as a tok
248d0 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20  en */..         
248e0 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65     assert( zName
248f0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
24900 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 70 53  if( zTName && pS
24910 75 62 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ub.             
24920 26 26 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53  && sqlite3MatchS
24930 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45  panName(pSub->pE
24940 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e  List->a[j].zSpan
24950 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d  , 0, zTName, 0)=
24960 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  =0.            )
24970 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
24980 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
24990 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
249a0 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c       /* If a col
249b0 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73  umn is marked as
249c0 20 27 68 69 64 64 65 6e 27 20 28 63 75 72 72 65   'hidden' (curre
249d0 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73 69 62  ntly only possib
249e0 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
249f0 2a 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74 61  * for virtual ta
24a00 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20 69 6e  bles), do not in
24a10 63 6c 75 64 65 20 69 74 20 69 6e 20 74 68 65 20  clude it in the 
24a20 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20  expanded.       
24a30 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73       ** result-s
24a40 65 74 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 20  et list..       
24a50 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
24a60 20 20 20 20 69 66 28 20 49 73 48 69 64 64 65 6e      if( IsHidden
24a70 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43  Column(&pTab->aC
24a80 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20  ol[j]) ){.      
24a90 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 49          assert(I
24aa0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 29 3b  sVirtual(pTab));
24ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
24ac0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
24ad0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
24ae0 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31     tableSeen = 1
24af0 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ;..            i
24b00 66 28 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65  f( i>0 && zTName
24b10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
24b20 20 20 20 20 20 69 66 28 20 28 70 46 72 6f 6d 2d       if( (pFrom-
24b30 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e  >jointype & JT_N
24b40 41 54 55 52 41 4c 29 21 3d 30 0a 20 20 20 20 20  ATURAL)!=0.     
24b50 20 20 20 20 20 20 20 20 20 20 20 26 26 20 74 61             && ta
24b60 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65  bleAndColumnInde
24b70 78 28 70 54 61 62 4c 69 73 74 2c 20 69 2c 20 7a  x(pTabList, i, z
24b80 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20 20 20 20  Name, 0, 0).    
24b90 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
24ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24bb0 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69  In a NATURAL joi
24bc0 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e  n, omit the join
24bd0 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68   columns from th
24be0 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e .             
24bf0 20 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20 74     ** table to t
24c00 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20  he right of the 
24c10 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  join */.        
24c20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
24c30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
24c40 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
24c50 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73  if( sqlite3IdLis
24c60 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d 3e 70 55  tIndex(pFrom->pU
24c70 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20  sing, zName)>=0 
24c80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
24c90 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20     /* In a join 
24ca0 77 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61  with a USING cla
24cb0 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e  use, omit column
24cc0 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20  s in the.       
24cd0 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e           ** usin
24ce0 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68  g clause from th
24cf0 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72  e table on the r
24d00 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ight. */.       
24d10 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
24d20 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
24d30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
24d40 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69  .            pRi
24d50 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
24d60 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61  r(db, TK_ID, zNa
24d70 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
24d80 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d   zColname = zNam
24d90 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  e;.            z
24da0 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  ToFree = 0;.    
24db0 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67          if( long
24dc0 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73  Names || pTabLis
24dd0 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20  t->nSrc>1 ){.   
24de0 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
24df0 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20  *pLeft;.        
24e00 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71        pLeft = sq
24e10 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
24e20 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a  _ID, zTabName);.
24e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
24e40 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
24e50 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f  pr(pParse, TK_DO
24e60 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  T, pLeft, pRight
24e70 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
24e80 20 20 20 20 69 66 28 20 7a 53 63 68 65 6d 61 4e      if( zSchemaN
24e90 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
24ea0 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73         pLeft = s
24eb0 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
24ec0 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61 4e 61 6d  K_ID, zSchemaNam
24ed0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
24ee0 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
24ef0 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
24f00 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20   TK_DOT, pLeft, 
24f10 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
24f20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24f30 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e           if( lon
24f40 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20  gNames ){.      
24f50 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61            zColna
24f60 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
24f70 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c  ntf(db, "%s.%s",
24f80 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65   zTabName, zName
24f90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
24fa0 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f     zToFree = zCo
24fb0 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  lname;.         
24fc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
24fd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24fe0 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
24ff0 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
25000 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
25010 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
25020 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
25030 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78  Parse, pNew, pEx
25040 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pr);.           
25050 20 73 43 6f 6c 6e 61 6d 65 2e 7a 20 3d 20 7a 43   sColname.z = zC
25060 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  olname;.        
25070 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 6e 20 3d      sColname.n =
25080 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
25090 28 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20  (zColname);.    
250a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
250b0 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70  xprListSetName(p
250c0 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43  Parse, pNew, &sC
250d0 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  olname, 0);.    
250e0 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
250f0 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   && (p->selFlags
25100 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d   & SF_NestedFrom
25110 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
25120 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
25130 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d  rList_item *pX =
25140 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e   &pNew->a[pNew->
25150 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20  nExpr-1];.      
25160 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
25170 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
25180 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20      pX->zSpan = 
25190 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
251a0 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  db, pSub->pEList
251b0 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20  ->a[j].zSpan);. 
251c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
251d0 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70  estcase( pX->zSp
251e0 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  an==0 );.       
251f0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
25200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58                pX
25210 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
25220 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
25230 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20  .%s.%s",.       
25240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25260 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c      zSchemaName,
25270 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e   zTabName, zColn
25280 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
25290 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
252a0 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a  pX->zSpan==0 );.
252b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
252c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58                pX
252d0 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31  ->bSpanIsTab = 1
252e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
252f0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
25300 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54  te3DbFree(db, zT
25310 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20  oFree);.        
25320 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
25330 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65        if( !table
25340 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Seen ){.        
25350 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a    if( zTName ){.
25360 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
25370 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
25380 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  se, "no such tab
25390 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29  le: %s", zTName)
253a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
253b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
253c0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
253d0 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65  Parse, "no table
253e0 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20  s specified");. 
253f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25400 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
25410 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
25420 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
25430 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d   pEList);.    p-
25440 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a  >pEList = pNew;.
25450 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
25460 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20  AX_COLUMN.  if( 
25470 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e  p->pEList && p->
25480 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62  pEList->nExpr>db
25490 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
254a0 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b  LIMIT_COLUMN] ){
254b0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
254c0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
254d0 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69  o many columns i
254e0 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a  n result set");.
254f0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
25500 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
25510 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70  ;.}../*.** No-op
25520 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65   routine for the
25530 20 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b   parse-tree walk
25540 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  er..**.** When t
25550 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
25560 68 65 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43  he Walker.xExprC
25570 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65 78 70  allback then exp
25580 72 65 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a  ression trees.**
25590 20 61 72 65 20 77 61 6c 6b 65 64 20 77 69 74 68   are walked with
255a0 6f 75 74 20 61 6e 79 20 61 63 74 69 6f 6e 73 20  out any actions 
255b0 62 65 69 6e 67 20 74 61 6b 65 6e 20 61 74 20 65  being taken at e
255c0 61 63 68 20 6e 6f 64 65 2e 20 20 50 72 65 73 75  ach node.  Presu
255d0 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74  mably,.** when t
255e0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
255f0 73 65 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78  sed for Walker.x
25600 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65  ExprCallback the
25610 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65  n .** Walker.xSe
25620 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 69 73 20  lectCallback is 
25630 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68  set to do someth
25640 69 6e 67 20 75 73 65 66 75 6c 20 66 6f 72 20 65  ing useful for e
25650 76 65 72 79 20 0a 2a 2a 20 73 75 62 71 75 65 72  very .** subquer
25660 79 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20  y in the parser 
25670 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
25680 69 6e 74 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70  int exprWalkNoop
25690 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64  (Walker *NotUsed
256a0 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73 65 64 32  , Expr *NotUsed2
256b0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
256c0 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
256d0 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74  NotUsed2);.  ret
256e0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
256f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
25700 72 6f 75 74 69 6e 65 20 22 65 78 70 61 6e 64 73  routine "expands
25710 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  " a SELECT state
25720 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20  ment and all of 
25730 69 74 73 20 73 75 62 71 75 65 72 69 65 73 2e 0a  its subqueries..
25740 2a 2a 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61  ** For additiona
25750 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  l information on
25760 20 77 68 61 74 20 69 74 20 6d 65 61 6e 73 20 74   what it means t
25770 6f 20 22 65 78 70 61 6e 64 22 20 61 20 53 45 4c  o "expand" a SEL
25780 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ECT.** statement
25790 2c 20 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  , see the commen
257a0 74 20 6f 6e 20 74 68 65 20 73 65 6c 65 63 74 45  t on the selectE
257b0 78 70 61 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c  xpand worker cal
257c0 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a  lback above..**.
257d0 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20 61 20 53  ** Expanding a S
257e0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
257f0 69 73 20 74 68 65 20 66 69 72 73 74 20 73 74 65  is the first ste
25800 70 20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  p in processing 
25810 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  a.** SELECT stat
25820 65 6d 65 6e 74 2e 20 20 54 68 65 20 53 45 4c 45  ement.  The SELE
25830 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d 75 73  CT statement mus
25840 74 20 62 65 20 65 78 70 61 6e 64 65 64 20 62 65  t be expanded be
25850 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73  fore.** name res
25860 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65 72 66 6f  olution is perfo
25870 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rmed..**.** If a
25880 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  nything goes wro
25890 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ng, an error mes
258a0 73 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  sage is written 
258b0 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20  into pParse..** 
258c0 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
258d0 74 69 6f 6e 20 63 61 6e 20 64 65 74 65 63 74 20  tion can detect 
258e0 74 68 65 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c  the problem by l
258f0 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61 72 73 65  ooking at pParse
25900 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72  ->nErr.** and/or
25910 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
25920 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74  locFailed..*/.st
25930 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
25940 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 50 61  3SelectExpand(Pa
25950 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
25960 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
25970 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d   Walker w;.  mem
25980 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
25990 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72  f(w));.  w.xExpr
259a0 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57  Callback = exprW
259b0 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61  alkNoop;.  w.pPa
259c0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
259d0 69 66 28 20 70 50 61 72 73 65 2d 3e 68 61 73 43  if( pParse->hasC
259e0 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 77  ompound ){.    w
259f0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
25a00 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75   = convertCompou
25a10 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65  ndSelectToSubque
25a20 72 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57  ry;.    sqlite3W
25a30 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
25a40 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e  elect);.  }.  w.
25a50 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
25a60 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  = selectExpander
25a70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
25a80 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 50  lback2 = selectP
25a90 6f 70 57 69 74 68 3b 0a 20 20 73 71 6c 69 74 65  opWith;.  sqlite
25aa0 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
25ab0 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69  pSelect);.}...#i
25ac0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
25ad0 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
25ae0 20 54 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65   This is a Walke
25af0 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  r.xSelectCallbac
25b00 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74  k callback for t
25b10 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  he sqlite3Select
25b20 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e  TypeInfo().** in
25b30 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46  terface..**.** F
25b40 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61  or each FROM-cla
25b50 75 73 65 20 73 75 62 71 75 65 72 79 2c 20 61 64  use subquery, ad
25b60 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61  d Column.zType a
25b70 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a  nd Column.zColl.
25b80 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  ** information t
25b90 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  o the Table stru
25ba0 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65  cture that repre
25bb0 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74  sents the result
25bc0 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20   set.** of that 
25bd0 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  subquery..**.** 
25be0 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  The Table struct
25bf0 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65  ure that represe
25c00 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  nts the result s
25c10 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74  et was construct
25c20 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74 45  ed.** by selectE
25c30 78 70 61 6e 64 65 72 28 29 20 62 75 74 20 74 68  xpander() but th
25c40 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61  e type and colla
25c50 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tion information
25c60 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20   was omitted.** 
25c70 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 62 65  at that point be
25c80 63 61 75 73 65 20 69 64 65 6e 74 69 66 69 65 72  cause identifier
25c90 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 62 65  s had not yet be
25ca0 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 54 68  en resolved.  Th
25cb0 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
25cc0 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 69 64   called after id
25cd0 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c 75 74  entifier resolut
25ce0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
25cf0 6f 69 64 20 73 65 6c 65 63 74 41 64 64 53 75 62  oid selectAddSub
25d00 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28 57 61  queryTypeInfo(Wa
25d10 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
25d20 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72  elect *p){.  Par
25d30 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e  se *pParse;.  in
25d40 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  t i;.  SrcList *
25d50 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75  pTabList;.  stru
25d60 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
25d70 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72  *pFrom;..  asser
25d80 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  t( p->selFlags &
25d90 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a   SF_Resolved );.
25da0 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
25db0 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49  gs & SF_HasTypeI
25dc0 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  nfo)==0 ){.    p
25dd0 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
25de0 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20  _HasTypeInfo;.  
25df0 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b    pParse = pWalk
25e00 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  er->pParse;.    
25e10 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
25e20 72 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  rc;.    for(i=0,
25e30 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
25e40 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
25e50 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
25e60 2b 2b 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  ++){.      Table
25e70 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
25e80 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
25e90 41 4c 57 41 59 53 28 70 54 61 62 21 3d 30 29 20  ALWAYS(pTab!=0) 
25ea0 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  && (pTab->tabFla
25eb0 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
25ec0 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)!=0 ){.       
25ed0 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
25ee0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
25ef0 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
25f00 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  /.        Select
25f10 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e   *pSel = pFrom->
25f20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20  pSelect;.       
25f30 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20   if( pSel ){.   
25f40 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
25f50 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  el->pPrior ) pSe
25f60 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  l = pSel->pPrior
25f70 3b 0a 20 20 20 20 20 20 20 20 20 20 73 65 6c 65  ;.          sele
25f80 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41  ctAddColumnTypeA
25f90 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72  ndCollation(pPar
25fa0 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 29 3b  se, pTab, pSel);
25fb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25fc0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23   }.    }.  }.}.#
25fd0 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
25fe0 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20  is routine adds 
25ff0 64 61 74 61 74 79 70 65 20 61 6e 64 20 63 6f 6c  datatype and col
26000 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
26010 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a  information to.*
26020 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  * the Table stru
26030 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20 46 52  ctures of all FR
26040 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
26050 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c  ries in a.** SEL
26060 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
26070 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 72 6f  *.** Use this ro
26080 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61 6d 65  utine after name
26090 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a   resolution..*/.
260a0 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
260b0 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65  te3SelectAddType
260c0 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  Info(Parse *pPar
260d0 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
260e0 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  ect){.#ifndef SQ
260f0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
26100 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  RY.  Walker w;. 
26110 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
26120 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78  izeof(w));.  w.x
26130 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
26140 3d 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75  = selectAddSubqu
26150 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77  eryTypeInfo;.  w
26160 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
26170 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20   exprWalkNoop;. 
26180 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
26190 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  se;.  sqlite3Wal
261a0 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c  kSelect(&w, pSel
261b0 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ect);.#endif.}..
261c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
261d0 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 53 45  ine sets up a SE
261e0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66  LECT statement f
261f0 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  or processing.  
26200 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  The.** following
26210 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64   is accomplished
26220 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56  :.**.**     *  V
26230 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65  DBE Cursor numbe
26240 72 73 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  rs are assigned 
26250 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  to all FROM-clau
26260 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20  se terms..**    
26270 20 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54 61   *  Ephemeral Ta
26280 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20  ble objects are 
26290 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20  created for all 
262a0 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
262b0 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a  ueries..**     *
262c0 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63    ON and USING c
262d0 6c 61 75 73 65 73 20 61 72 65 20 73 68 69 66 74  lauses are shift
262e0 65 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73 74  ed into WHERE st
262f0 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20  atements.**     
26300 2a 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a 22  *  Wildcards "*"
26310 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20 69   and "TABLE.*" i
26320 6e 20 72 65 73 75 6c 74 20 73 65 74 73 20 61 72  n result sets ar
26330 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20  e expanded..**  
26340 20 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65 72     *  Identifier
26350 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s in expression 
26360 61 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20 74  are matched to t
26370 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ables..**.** Thi
26380 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 72  s routine acts r
26390 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c  ecursively on al
263a0 6c 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74  l subqueries wit
263b0 68 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 0a  hin the SELECT..
263c0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
263d0 65 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61 72  electPrep(.  Par
263e0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
263f0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
26400 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
26410 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
26420 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
26430 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
26440 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20  ing coded. */.  
26450 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75  NameContext *pOu
26460 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63  terNC  /* Name c
26470 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74 61  ontext for conta
26480 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  iner */.){.  sql
26490 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
264a0 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65  NEVER(p==0) ) re
264b0 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 50 61  turn;.  db = pPa
264c0 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64  rse->db;.  if( d
264d0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
264e0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
264f0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
26500 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72  _HasTypeInfo ) r
26510 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
26520 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70 50 61  SelectExpand(pPa
26530 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70  rse, p);.  if( p
26540 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
26550 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
26560 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
26570 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74  te3ResolveSelect
26580 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2c  Names(pParse, p,
26590 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69 66   pOuterNC);.  if
265a0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
265b0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
265c0 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  ed ) return;.  s
265d0 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54  qlite3SelectAddT
265e0 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  ypeInfo(pParse, 
265f0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  p);.}../*.** Res
26600 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74 65  et the aggregate
26610 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a   accumulator..**
26620 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61 74  .** The aggregat
26630 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73  e accumulator is
26640 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79   a set of memory
26650 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64   cells that hold
26660 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65  .** intermediate
26670 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63   results while c
26680 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67  alculating an ag
26690 67 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a  gregate.  This.*
266a0 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  * routine genera
266b0 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 73 74  tes code that st
266c0 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c  ores NULLs in al
266d0 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72  l of those memor
266e0 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73  y.** cells..*/.s
266f0 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 65 74  tatic void reset
26700 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73  Accumulator(Pars
26710 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
26720 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
26730 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
26740 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
26750 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  i;.  struct AggI
26760 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b  nfo_func *pFunc;
26770 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d 20 70 41  .  int nReg = pA
26780 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b 20  ggInfo->nFunc + 
26790 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
267a0 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 30  n;.  if( nReg==0
267b0 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 64 65   ) return;.#ifde
267c0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
267d0 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
267e0 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65 67 69  all AggInfo regi
267f0 73 74 65 72 73 20 61 72 65 20 77 69 74 68 69 6e  sters are within
26800 20 74 68 65 20 72 61 6e 67 65 20 73 70 65 63 69   the range speci
26810 66 69 65 64 20 62 79 0a 20 20 2a 2a 20 41 67 67  fied by.  ** Agg
26820 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67 49  Info.mnReg..AggI
26830 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20 20 61  nfo.mxReg */.  a
26840 73 73 65 72 74 28 20 6e 52 65 67 3d 3d 70 41 67  ssert( nReg==pAg
26850 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70 41 67  gInfo->mxReg-pAg
26860 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20 29  gInfo->mnReg+1 )
26870 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
26880 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
26890 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
268a0 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  rt( pAggInfo->aC
268b0 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67  ol[i].iMem>=pAgg
268c0 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20  Info->mnReg.    
268d0 20 20 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f       && pAggInfo
268e0 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d  ->aCol[i].iMem<=
268f0 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20  pAggInfo->mxReg 
26900 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
26910 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
26920 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  unc; i++){.    a
26930 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d  ssert( pAggInfo-
26940 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e 3d  >aFunc[i].iMem>=
26950 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a  pAggInfo->mnReg.
26960 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67           && pAgg
26970 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69  Info->aFunc[i].i
26980 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Mem<=pAggInfo->m
26990 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  xReg );.  }.#end
269a0 69 66 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  if.  sqlite3Vdbe
269b0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp3(v, OP_Nul
269c0 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e  l, 0, pAggInfo->
269d0 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e 66 6f 2d  mnReg, pAggInfo-
269e0 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72 28 70  >mxReg);.  for(p
269f0 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  Func=pAggInfo->a
26a00 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67  Func, i=0; i<pAg
26a10 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
26a20 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20  +, pFunc++){.   
26a30 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73   if( pFunc->iDis
26a40 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
26a50 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75    Expr *pE = pFu
26a60 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  nc->pExpr;.     
26a70 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
26a80 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  sProperty(pE, EP
26a90 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
26aa0 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78 2e 70       if( pE->x.p
26ab0 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78  List==0 || pE->x
26ac0 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  .pList->nExpr!=1
26ad0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
26ae0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
26af0 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20 61 67  se, "DISTINCT ag
26b00 67 72 65 67 61 74 65 73 20 6d 75 73 74 20 68 61  gregates must ha
26b10 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 22  ve exactly one "
26b20 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 72 67  .           "arg
26b30 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20 20 20  ument");.       
26b40 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
26b50 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  t = -1;.      }e
26b60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79  lse{.        Key
26b70 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
26b80 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
26b90 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d  List(pParse, pE-
26ba0 3e 78 2e 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b  >x.pList, 0, 0);
26bb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26bc0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
26bd0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
26be0 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
26bf0 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
26c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c10 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
26c20 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
26c30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
26c40 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
26c50 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61  e the OP_AggFina
26c60 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20  lize opcode for 
26c70 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65 20  every aggregate 
26c80 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  function.** in t
26c90 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63  he AggInfo struc
26ca0 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
26cb0 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67  void finalizeAgg
26cc0 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20  Functions(Parse 
26cd0 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
26ce0 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
26cf0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
26d00 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
26d10 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
26d20 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f  o_func *pF;.  fo
26d30 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
26d40 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
26d50 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
26d60 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78  +, pF++){.    Ex
26d70 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
26d80 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  pF->pExpr->x.pLi
26d90 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
26da0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
26db0 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78  (pF->pExpr, EP_x
26dc0 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
26dd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
26de0 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61  p4(v, OP_AggFina
26df0 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69  l, pF->iMem, pLi
26e00 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
26e10 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  r : 0, 0,.      
26e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e30 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63  (void*)pF->pFunc
26e40 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
26e50 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61   }.}../*.** Upda
26e60 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  te the accumulat
26e70 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  or memory cells 
26e80 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65  for an aggregate
26e90 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65   based on.** the
26ea0 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
26eb0 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  position..*/.sta
26ec0 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41  tic void updateA
26ed0 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
26ee0 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
26ef0 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
26f00 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
26f10 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
26f20 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20 3d  ;.  int regHit =
26f30 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48 69   0;.  int addrHi
26f40 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74 72  tTest = 0;.  str
26f50 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
26f60 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41   *pF;.  struct A
26f70 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a  ggInfo_col *pC;.
26f80 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
26f90 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66  ectMode = 1;.  f
26fa0 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
26fb0 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
26fc0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
26fd0 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69  ++, pF++){.    i
26fe0 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74  nt nArg;.    int
26ff0 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20   addrNext = 0;. 
27000 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20     int regAgg;. 
27010 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
27020 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
27030 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73  x.pList;.    ass
27040 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
27050 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c  perty(pF->pExpr,
27060 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
27070 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20  ;.    if( pList 
27080 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  ){.      nArg = 
27090 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
270a0 20 20 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c      regAgg = sql
270b0 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
270c0 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a  (pParse, nArg);.
270d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
270e0 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
270f0 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67  arse, pList, reg
27100 41 67 67 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c  Agg, SQLITE_ECEL
27110 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65  _DUP);.    }else
27120 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30  {.      nArg = 0
27130 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d  ;.      regAgg =
27140 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
27150 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e  ( pF->iDistinct>
27160 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  =0 ){.      addr
27170 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Next = sqlite3Vd
27180 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
27190 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 41        assert( nA
271a0 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 63  rg==1 );.      c
271b0 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72  odeDistinct(pPar
271c0 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63  se, pF->iDistinc
271d0 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20  t, addrNext, 1, 
271e0 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20  regAgg);.    }. 
271f0 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63     if( pF->pFunc
27200 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
27210 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
27220 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  LL ){.      Coll
27230 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
27240 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
27250 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
27260 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  m;.      int j;.
27270 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
27280 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c  ist!=0 );  /* pL
27290 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46  ist!=0 if pF->pF
272a0 75 6e 63 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c  unc has NEEDCOLL
272b0 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   */.      for(j=
272c0 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
272d0 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e  a; !pColl && j<n
272e0 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  Arg; j++, pItem+
272f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  +){.        pCol
27300 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
27310 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
27320 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
27330 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
27340 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
27350 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65    pColl = pParse
27360 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
27370 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
27380 66 28 20 72 65 67 48 69 74 3d 3d 30 20 26 26 20  f( regHit==0 && 
27390 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d  pAggInfo->nAccum
273a0 75 6c 61 74 6f 72 20 29 20 72 65 67 48 69 74 20  ulator ) regHit 
273b0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
273c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
273d0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
273e0 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48 69 74 2c  CollSeq, regHit,
273f0 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
27400 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
27410 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
27420 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
27430 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 30 2c  , OP_AggStep, 0,
27440 20 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65   regAgg, pF->iMe
27450 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m,.             
27460 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
27470 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55  pF->pFunc, P4_FU
27480 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69  NCDEF);.    sqli
27490 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
274a0 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20  v, (u8)nArg);.  
274b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
274c0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
274d0 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c  (pParse, regAgg,
274e0 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69   nArg);.    sqli
274f0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
27500 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41  nge(pParse, regA
27510 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69  gg, nArg);.    i
27520 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20  f( addrNext ){. 
27530 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
27540 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
27550 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20  addrNext);.     
27560 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
27570 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
27580 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
27590 42 65 66 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e  Before populatin
275a0 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  g the accumulato
275b0 72 20 72 65 67 69 73 74 65 72 73 2c 20 63 6c 65  r registers, cle
275c0 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  ar the column ca
275d0 63 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77  che..  ** Otherw
275e0 69 73 65 2c 20 69 66 20 61 6e 79 20 6f 66 20 74  ise, if any of t
275f0 68 65 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75  he required colu
27600 6d 6e 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c  mn values are al
27610 72 65 61 64 79 20 70 72 65 73 65 6e 74 20 0a 20  ready present . 
27620 20 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73   ** in registers
27630 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  , sqlite3ExprCod
27640 65 28 29 20 6d 61 79 20 75 73 65 20 4f 50 5f 53  e() may use OP_S
27650 43 6f 70 79 20 74 6f 20 63 6f 70 79 20 74 68 65  Copy to copy the
27660 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70   value.  ** to p
27670 43 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79 20  C->iMem. But by 
27680 74 68 65 20 74 69 6d 65 20 74 68 65 20 76 61 6c  the time the val
27690 75 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 20  ue is used, the 
276a0 6f 72 69 67 69 6e 61 6c 20 72 65 67 69 73 74 65  original registe
276b0 72 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20  r.  ** may have 
276c0 62 65 65 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c  been used, inval
276d0 69 64 61 74 69 6e 67 20 74 68 65 20 75 6e 64 65  idating the unde
276e0 72 6c 79 69 6e 67 20 62 75 66 66 65 72 20 68 6f  rlying buffer ho
276f0 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74  lding the.  ** t
27700 65 78 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75  ext or blob valu
27710 65 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b 38  e. See ticket [8
27720 38 33 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a  83034dcb5]..  **
27730 0a 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f  .  ** Another so
27740 6c 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20  lution would be 
27750 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50  to change the OP
27760 5f 53 43 6f 70 79 20 75 73 65 64 20 74 6f 20 63  _SCopy used to c
27770 6f 70 79 20 63 61 63 68 65 64 0a 20 20 2a 2a 20  opy cached.  ** 
27780 76 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f  values to an OP_
27790 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  Copy..  */.  if(
277a0 20 72 65 67 48 69 74 20 29 7b 0a 20 20 20 20 61   regHit ){.    a
277b0 64 64 72 48 69 74 54 65 73 74 20 3d 20 73 71 6c  ddrHitTest = sql
277c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
277d0 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48 69 74 29  , OP_If, regHit)
277e0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
277f0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
27800 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
27810 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d  Parse);.  for(i=
27820 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pC=pAggInfo->
27830 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f  aCol; i<pAggInfo
27840 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20  ->nAccumulator; 
27850 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20  i++, pC++){.    
27860 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
27870 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70  pParse, pC->pExp
27880 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20  r, pC->iMem);.  
27890 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69  }.  pAggInfo->di
278a0 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20  rectMode = 0;.  
278b0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
278c0 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
278d0 20 69 66 28 20 61 64 64 72 48 69 74 54 65 73 74   if( addrHitTest
278e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
278f0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
27900 64 64 72 48 69 74 54 65 73 74 29 3b 0a 20 20 7d  ddrHitTest);.  }
27910 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
27920 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69  single OP_Explai
27930 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  n instruction to
27940 20 74 68 65 20 56 44 42 45 20 74 6f 20 65 78 70   the VDBE to exp
27950 6c 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a  lain a simple.**
27960 20 63 6f 75 6e 74 28 2a 29 20 71 75 65 72 79 20   count(*) query 
27970 28 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  ("SELECT count(*
27980 29 20 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a  ) FROM pTab")..*
27990 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
279a0 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74  _OMIT_EXPLAIN.st
279b0 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
279c0 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20  nSimpleCount(.  
279d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
279e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279f0 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
27a00 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
27a10 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
27a20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62        /* Table b
27a30 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a  eing queried */.
27a40 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
27a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a60 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20    /* Index used 
27a70 74 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e  to optimize scan
27a80 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  , or NULL */.){.
27a90 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
27aa0 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
27ab0 63 68 61 72 20 2a 7a 45 71 70 20 3d 20 73 71 6c  char *zEqp = sql
27ac0 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72  ite3MPrintf(pPar
27ad0 73 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20 54 41  se->db, "SCAN TA
27ae0 42 4c 45 20 25 73 25 73 25 73 22 2c 0a 20 20 20  BLE %s%s%s",.   
27af0 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
27b00 2c 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20  , .        pIdx 
27b10 3f 20 22 20 55 53 49 4e 47 20 43 4f 56 45 52 49  ? " USING COVERI
27b20 4e 47 20 49 4e 44 45 58 20 22 20 3a 20 22 22 2c  NG INDEX " : "",
27b30 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 3f 20  .        pIdx ? 
27b40 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22  pIdx->zName : ""
27b50 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
27b60 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20  te3VdbeAddOp4(. 
27b70 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70         pParse->p
27b80 56 64 62 65 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  Vdbe, OP_Explain
27b90 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  , pParse->iSelec
27ba0 74 49 64 2c 20 30 2c 20 30 2c 20 7a 45 71 70 2c  tId, 0, 0, zEqp,
27bb0 20 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20 20   P4_DYNAMIC.    
27bc0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
27bd0 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53   define explainS
27be0 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63  impleCount(a,b,c
27bf0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
27c00 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
27c10 72 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  r the SELECT sta
27c20 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20  tement given in 
27c30 74 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20  the p argument. 
27c40 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75   .**.** The resu
27c50 6c 74 73 20 61 72 65 20 72 65 74 75 72 6e 65 64  lts are returned
27c60 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
27c70 65 20 53 65 6c 65 63 74 44 65 73 74 20 73 74 72  e SelectDest str
27c80 75 63 74 75 72 65 2e 0a 2a 2a 20 53 65 65 20 63  ucture..** See c
27c90 6f 6d 6d 65 6e 74 73 20 69 6e 20 73 71 6c 69 74  omments in sqlit
27ca0 65 49 6e 74 2e 68 20 66 6f 72 20 66 75 72 74 68  eInt.h for furth
27cb0 65 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  er information..
27cc0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
27cd0 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ne returns the n
27ce0 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
27cf0 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20    If any errors 
27d00 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72  are.** encounter
27d10 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72  ed, then an appr
27d20 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65  opriate error me
27d30 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e  ssage is left in
27d40 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72  .** pParse->zErr
27d50 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Msg..**.** This 
27d60 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54  routine does NOT
27d70 20 66 72 65 65 20 74 68 65 20 53 65 6c 65 63 74   free the Select
27d80 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
27d90 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61  d in.  The.** ca
27da0 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e  lling function n
27db0 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e  eeds to do that.
27dc0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53  .*/.int sqlite3S
27dd0 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
27de0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
27df0 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
27e00 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
27e10 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
27e20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
27e30 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
27e40 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65  coded. */.  Sele
27e50 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
27e60 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
27e70 20 77 69 74 68 20 74 68 65 20 71 75 65 72 79 20   with the query 
27e80 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20  results */.){.  
27e90 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
27ea0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
27eb0 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65  ounters */.  Whe
27ec0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
27ed0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72      /* Return fr
27ee0 6f 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  om sqlite3WhereB
27ef0 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65  egin() */.  Vdbe
27f00 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
27f10 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
27f20 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20  l machine under 
27f30 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
27f40 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20    int isAgg;    
27f50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
27f60 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74   for select list
27f70 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29  s like "count(*)
27f80 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  " */.  ExprList 
27f90 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a  *pEList;      /*
27fa0 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   List of columns
27fb0 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a   to extract. */.
27fc0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
27fd0 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74  ist;     /* List
27fe0 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65   of tables to se
27ff0 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45  lect from */.  E
28000 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20  xpr *pWhere;    
28010 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
28020 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  RE clause.  May 
28030 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
28040 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b  rList *pGroupBy;
28050 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50      /* The GROUP
28060 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79   BY clause.  May
28070 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
28080 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20  pr *pHaving;    
28090 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49       /* The HAVI
280a0 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  NG clause.  May 
280b0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
280c0 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20   rc = 1;        
280d0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
280e0 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73  return from this
280f0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44   function */.  D
28100 69 73 74 69 6e 63 74 43 74 78 20 73 44 69 73 74  istinctCtx sDist
28110 69 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e  inct; /* Info on
28120 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65   how to code the
28130 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
28140 64 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 73  d */.  SortCtx s
28150 53 6f 72 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  Sort;         /*
28160 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20   Info on how to 
28170 63 6f 64 65 20 74 68 65 20 4f 52 44 45 52 20 42  code the ORDER B
28180 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 41 67  Y clause */.  Ag
28190 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20  gInfo sAggInfo; 
281a0 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
281b0 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67 72  ion used by aggr
281c0 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f  egate queries */
281d0 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20  .  int iEnd;    
281e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
281f0 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20  ress of the end 
28200 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a  of the query */.
28210 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
28220 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
28230 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
28240 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ion */..#ifndef 
28250 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
28260 41 49 4e 0a 20 20 69 6e 74 20 69 52 65 73 74 6f  AIN.  int iResto
28270 72 65 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61  reSelectId = pPa
28280 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b 0a  rse->iSelectId;.
28290 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63    pParse->iSelec
282a0 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 4e  tId = pParse->iN
282b0 65 78 74 53 65 6c 65 63 74 49 64 2b 2b 3b 0a 23  extSelectId++;.#
282c0 65 6e 64 69 66 0a 0a 20 20 64 62 20 3d 20 70 50  endif..  db = pP
282d0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
282e0 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  p==0 || db->mall
282f0 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
28300 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
28310 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
28320 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
28330 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
28340 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30  ITE_SELECT, 0, 0
28350 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b  , 0) ) return 1;
28360 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49  .  memset(&sAggI
28370 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  nfo, 0, sizeof(s
28380 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 20 20 61 73  AggInfo));..  as
28390 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
283a0 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65  y==0 || pDest->e
283b0 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74 46 69  Dest!=SRT_DistFi
283c0 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  fo );.  assert( 
283d0 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c  p->pOrderBy==0 |
283e0 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d  | pDest->eDest!=
283f0 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 61 73  SRT_Fifo );.  as
28400 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
28410 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65  y==0 || pDest->e
28420 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74 51 75  Dest!=SRT_DistQu
28430 65 75 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  eue );.  assert(
28440 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
28450 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  || pDest->eDest!
28460 3d 53 52 54 5f 51 75 65 75 65 20 29 3b 0a 20 20  =SRT_Queue );.  
28470 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64  if( IgnorableOrd
28480 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20  erby(pDest) ){. 
28490 20 20 20 61 73 73 65 72 74 28 70 44 65 73 74 2d     assert(pDest-
284a0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73  >eDest==SRT_Exis
284b0 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  ts || pDest->eDe
284c0 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c  st==SRT_Union ||
284d0 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65   .           pDe
284e0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
284f0 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e  xcept || pDest->
28500 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61  eDest==SRT_Disca
28510 72 64 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  rd ||.          
28520 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
28530 52 54 5f 51 75 65 75 65 20 20 7c 7c 20 70 44 65  RT_Queue  || pDe
28540 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44  st->eDest==SRT_D
28550 69 73 74 46 69 66 6f 20 7c 7c 0a 20 20 20 20 20  istFifo ||.     
28560 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65        pDest->eDe
28570 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75  st==SRT_DistQueu
28580 65 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  e || pDest->eDes
28590 74 3d 3d 53 52 54 5f 46 69 66 6f 29 3b 0a 20 20  t==SRT_Fifo);.  
285a0 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20 42 59    /* If ORDER BY
285b0 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72   makes no differ
285c0 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75 74 70  ence in the outp
285d0 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65 72 20  ut then neither 
285e0 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49 53 54  does.    ** DIST
285f0 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e 20 62  INCT so it can b
28600 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a  e removed too. *
28610 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  /.    sqlite3Exp
28620 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
28630 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
28640 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
28650 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61  0;.    p->selFla
28660 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e  gs &= ~SF_Distin
28670 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ct;.  }.  sqlite
28680 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72  3SelectPrep(pPar
28690 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 6d 65 6d  se, p, 0);.  mem
286a0 73 65 74 28 26 73 53 6f 72 74 2c 20 30 2c 20 73  set(&sSort, 0, s
286b0 69 7a 65 6f 66 28 73 53 6f 72 74 29 29 3b 0a 20  izeof(sSort));. 
286c0 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
286d0 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
286e0 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
286f0 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  Src;.  pEList = 
28700 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
28710 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
28720 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
28730 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  d ){.    goto se
28740 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  lect_end;.  }.  
28750 69 73 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46  isAgg = (p->selF
28760 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
28770 61 74 65 29 21 3d 30 3b 0a 20 20 61 73 73 65 72  ate)!=0;.  asser
28780 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
28790 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65  .  /* Begin gene
287a0 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a  rating code..  *
287b0 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
287c0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
287d0 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
287e0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
287f0 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74   /* If writing t
28800 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65  o memory or gene
28810 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a  rating a set.  *
28820 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  * only a single 
28830 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75  column may be ou
28840 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  tput..  */.#ifnd
28850 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
28860 55 42 51 55 45 52 59 0a 20 20 69 66 28 20 63 68  UBQUERY.  if( ch
28870 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d  eckForMultiColum
28880 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61  nSelectError(pPa
28890 72 73 65 2c 20 70 44 65 73 74 2c 20 70 45 4c 69  rse, pDest, pELi
288a0 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20  st->nExpr) ){.  
288b0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
288c0 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  d;.  }.#endif.. 
288d0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
288e0 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75  e for all sub-qu
288f0 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  eries in the FRO
28900 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69  M clause.  */.#i
28910 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
28920 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
28930 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
28940 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20  ITE_OMIT_VIEW). 
28950 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50   for(i=0; !p->pP
28960 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69  rior && i<pTabLi
28970 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
28980 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
28990 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
289a0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d   &pTabList->a[i]
289b0 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73 74  ;.    SelectDest
289c0 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63   dest;.    Selec
289d0 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d  t *pSub = pItem-
289e0 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e  >pSelect;.    in
289f0 74 20 69 73 41 67 67 53 75 62 3b 0a 0a 20 20 20  t isAggSub;..   
28a00 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63   if( pSub==0 ) c
28a10 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
28a20 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 65 20 63   Sometimes the c
28a30 6f 64 65 20 66 6f 72 20 61 20 73 75 62 71 75 65  ode for a subque
28a40 72 79 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72  ry will be gener
28a50 61 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ated more than. 
28a60 20 20 20 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74     ** once, if t
28a70 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70  he subquery is p
28a80 61 72 74 20 6f 66 20 74 68 65 20 57 48 45 52 45  art of the WHERE
28a90 20 63 6c 61 75 73 65 20 69 6e 20 61 20 4c 45 46   clause in a LEF
28aa0 54 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66  T JOIN,.    ** f
28ab0 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20  or example.  In 
28ac0 74 68 61 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f  that case, do no
28ad0 74 20 72 65 67 65 6e 65 72 61 74 65 20 74 68 65  t regenerate the
28ae0 20 63 6f 64 65 20 74 6f 20 6d 61 6e 69 66 65 73   code to manifes
28af0 74 0a 20 20 20 20 2a 2a 20 61 20 76 69 65 77 20  t.    ** a view 
28b00 6f 72 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  or the co-routin
28b10 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  e to implement a
28b20 20 76 69 65 77 2e 20 20 54 68 65 20 66 69 72 73   view.  The firs
28b30 74 20 69 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a  t instance.    *
28b40 2a 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 2c  * is sufficient,
28b50 20 74 68 6f 75 67 68 20 74 68 65 20 73 75 62 72   though the subr
28b60 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65  outine to manife
28b70 73 74 20 74 68 65 20 76 69 65 77 20 64 6f 65 73  st the view does
28b80 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20   need.    ** to 
28b90 62 65 20 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e  be invoked again
28ba0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74  . */.    if( pIt
28bb0 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
28bc0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
28bd0 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65  em->viaCoroutine
28be0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
28bf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
28c00 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49  (v, OP_Gosub, pI
28c10 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  tem->regReturn, 
28c20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
28c30 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ub);.      }.   
28c40 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
28c50 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65   }..    /* Incre
28c60 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67  ment Parse.nHeig
28c70 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74  ht by the height
28c80 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20   of the largest 
28c90 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
28ca0 2a 20 74 72 65 65 20 72 65 66 65 72 72 65 64 20  * tree referred 
28cb0 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20  to by this, the 
28cc0 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54  parent select. T
28cd0 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a  he child select.
28ce0 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61      ** may conta
28cf0 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  in expression tr
28d00 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20  ees of at most. 
28d10 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41     ** (SQLITE_MA
28d20 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72  X_EXPR_DEPTH-Par
28d30 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67  se.nHeight) heig
28d40 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69  ht. This is a bi
28d50 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f  t.    ** more co
28d60 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20  nservative than 
28d70 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d  necessary, but m
28d80 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20  uch easier than 
28d90 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a  enforcing.    **
28da0 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e   an exact limit.
28db0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72  .    */.    pPar
28dc0 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73  se->nHeight += s
28dd0 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
28de0 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20  Height(p);..    
28df0 69 73 41 67 67 53 75 62 20 3d 20 28 70 53 75 62  isAggSub = (pSub
28e00 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
28e10 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20  Aggregate)!=0;. 
28e20 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53 75     if( flattenSu
28e30 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 70  bquery(pParse, p
28e40 2c 20 69 2c 20 69 73 41 67 67 2c 20 69 73 41 67  , i, isAgg, isAg
28e50 67 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20 2f  gSub) ){.      /
28e60 2a 20 54 68 69 73 20 73 75 62 71 75 65 72 79 20  * This subquery 
28e70 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20  can be absorbed 
28e80 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e  into its parent.
28e90 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73   */.      if( is
28ea0 41 67 67 53 75 62 20 29 7b 0a 20 20 20 20 20 20  AggSub ){.      
28eb0 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20    isAgg = 1;.   
28ec0 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73       p->selFlags
28ed0 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65   |= SF_Aggregate
28ee0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28ef0 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  i = -1;.    }els
28f00 65 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e  e if( pTabList->
28f10 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20  nSrc==1.        
28f20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
28f30 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
28f40 4c 49 54 45 5f 53 75 62 71 43 6f 72 6f 75 74 69  LITE_SubqCorouti
28f50 6e 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ne).    ){.     
28f60 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20   /* Implement a 
28f70 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20  co-routine that 
28f80 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 73 69  will return a si
28f90 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20  ngle row of the 
28fa0 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20  result.      ** 
28fb0 73 65 74 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f  set on each invo
28fc0 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  cation..      */
28fd0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
28fe0 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
28ff0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31  CurrentAddr(v)+1
29000 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  ;.      pItem->r
29010 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
29020 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
29030 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
29040 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
29050 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72  outine, pItem->r
29060 65 67 52 65 74 75 72 6e 2c 20 30 2c 20 61 64 64  egReturn, 0, add
29070 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 56 64 62  rTop);.      Vdb
29080 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
29090 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
290a0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 70  zName));.      p
290b0 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
290c0 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20 20  b = addrTop;.   
290d0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
290e0 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
290f0 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70  SRT_Coroutine, p
29100 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
29110 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
29120 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d  etInteger(pItem-
29130 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29  >iSelectId, (u8)
29140 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
29150 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71  ectId);.      sq
29160 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
29170 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
29180 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70  ;.      pItem->p
29190 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 28  Tab->nRowEst = (
291a0 75 6e 73 69 67 6e 65 64 29 70 53 75 62 2d 3e 6e  unsigned)pSub->n
291b0 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
291c0 20 70 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75   pItem->viaCorou
291d0 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  tine = 1;.      
291e0 70 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74  pItem->regResult
291f0 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20   = dest.iSdst;. 
29200 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
29210 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64  AddOp1(v, OP_End
29220 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d  Coroutine, pItem
29230 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
29240 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
29250 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
29260 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  op-1);.      sql
29270 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67  ite3ClearTempReg
29280 43 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20  Cache(pParse);. 
29290 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
292a0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
292b0 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  broutine that wi
292c0 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d  ll fill an ephem
292d0 65 72 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a  eral table with.
292e0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e        ** the con
292f0 74 65 6e 74 20 6f 66 20 74 68 69 73 20 73 75 62  tent of this sub
29300 71 75 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61  query.  pItem->a
29310 64 64 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20  ddrFillSub will 
29320 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74  point.      ** t
29330 6f 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  o the address of
29340 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 73   the generated s
29350 75 62 72 6f 75 74 69 6e 65 2e 20 20 70 49 74 65  ubroutine.  pIte
29360 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20 20 20  m->regReturn.   
29370 20 20 20 2a 2a 20 69 73 20 61 20 72 65 67 69 73     ** is a regis
29380 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f  ter allocated to
29390 20 68 6f 6c 64 20 74 68 65 20 73 75 62 72 6f 75   hold the subrou
293a0 74 69 6e 65 20 72 65 74 75 72 6e 20 61 64 64 72  tine return addr
293b0 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ess.      */.   
293c0 20 20 20 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a     int topAddr;.
293d0 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 41 64        int onceAd
293e0 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  dr = 0;.      in
293f0 74 20 72 65 74 41 64 64 72 3b 0a 20 20 20 20 20  t retAddr;.     
29400 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
29410 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30 20 29  addrFillSub==0 )
29420 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  ;.      pItem->r
29430 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
29440 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
29450 20 74 6f 70 41 64 64 72 20 3d 20 73 71 6c 69 74   topAddr = sqlit
29460 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
29470 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
29480 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
29490 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61  ;.      pItem->a
294a0 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 74 6f 70  ddrFillSub = top
294b0 41 64 64 72 2b 31 3b 0a 20 20 20 20 20 20 69 66  Addr+1;.      if
294c0 28 20 70 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65  ( pItem->isCorre
294d0 6c 61 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  lated==0 ){.    
294e0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75      /* If the su
294f0 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 63 6f  bquery is not co
29500 72 72 65 6c 61 74 65 64 20 61 6e 64 20 69 66 20  rrelated and if 
29510 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 73 69 64  we are not insid
29520 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  e of.        ** 
29530 61 20 74 72 69 67 67 65 72 2c 20 74 68 65 6e 20  a trigger, then 
29540 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20  we only need to 
29550 63 6f 6d 70 75 74 65 20 74 68 65 20 76 61 6c 75  compute the valu
29560 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
29570 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63  y.        ** onc
29580 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 6e  e. */.        on
29590 63 65 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33  ceAddr = sqlite3
295a0 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29  CodeOnce(pParse)
295b0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
295c0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
295d0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65  omment((v, "mate
295e0 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c  rialize \"%s\"",
295f0 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
29600 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ame));.      }el
29610 73 65 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65  se{.        Vdbe
29620 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
29630 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25  "materialize \"%
29640 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61  s\"", pItem->pTa
29650 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
29660 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
29670 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
29680 26 64 65 73 74 2c 20 53 52 54 5f 45 70 68 65 6d  &dest, SRT_Ephem
29690 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  Tab, pItem->iCur
296a0 73 6f 72 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  sor);.      expl
296b0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 49  ainSetInteger(pI
296c0 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  tem->iSelectId, 
296d0 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e 65 78  (u8)pParse->iNex
296e0 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
296f0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
29700 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64  pParse, pSub, &d
29710 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65  est);.      pIte
29720 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74  m->pTab->nRowEst
29730 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 70 53 75   = (unsigned)pSu
29740 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  b->nSelectRow;. 
29750 20 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64 64       if( onceAdd
29760 72 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  r ) sqlite3VdbeJ
29770 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65 41  umpHere(v, onceA
29780 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74 41  ddr);.      retA
29790 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
297a0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
297b0 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67  turn, pItem->reg
297c0 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 56  Return);.      V
297d0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
297e0 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e  end %s", pItem->
297f0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
29800 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
29810 43 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70 41  ChangeP1(v, topA
29820 64 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a 20  ddr, retAddr);. 
29830 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61       sqlite3Clea
29840 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50  rTempRegCache(pP
29850 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  arse);.    }.   
29860 20 69 66 28 20 2f 2a 70 50 61 72 73 65 2d 3e 6e   if( /*pParse->n
29870 45 72 72 20 7c 7c 2a 2f 20 64 62 2d 3e 6d 61 6c  Err ||*/ db->mal
29880 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
29890 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
298a0 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  nd;.    }.    pP
298b0 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d  arse->nHeight -=
298c0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
298d0 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20 20  prHeight(p);.   
298e0 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
298f0 53 72 63 3b 0a 20 20 20 20 69 66 28 20 21 49 67  Src;.    if( !Ig
29900 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70  norableOrderby(p
29910 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 73  Dest) ){.      s
29920 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
29930 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
29940 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20   }.  }.  pEList 
29950 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 23 65 6e  = p->pEList;.#en
29960 64 69 66 0a 20 20 70 57 68 65 72 65 20 3d 20 70  dif.  pWhere = p
29970 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f  ->pWhere;.  pGro
29980 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
29990 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20  By;.  pHaving = 
299a0 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44  p->pHaving;.  sD
299b0 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d  istinct.isTnct =
299c0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
299d0 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b  SF_Distinct)!=0;
299e0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
299f0 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
29a00 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20 74 68  ELECT.  /* If th
29a10 65 72 65 20 69 73 20 61 72 65 20 61 20 73 65 71  ere is are a seq
29a20 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73  uence of queries
29a30 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72  , do the earlier
29a40 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a   ones first..  *
29a50 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
29a60 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75  r ){.    rc = mu
29a70 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65  ltiSelect(pParse
29a80 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20  , p, pDest);.   
29a90 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
29aa0 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  er(pParse->iSele
29ab0 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65  ctId, iRestoreSe
29ac0 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 72 65 74  lectId);.    ret
29ad0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64  urn rc;.  }.#end
29ae0 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  if..  /* If the 
29af0 71 75 65 72 79 20 69 73 20 44 49 53 54 49 4e 43  query is DISTINC
29b00 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20  T with an ORDER 
29b10 42 59 20 62 75 74 20 69 73 20 6e 6f 74 20 61 6e  BY but is not an
29b20 20 61 67 67 72 65 67 61 74 65 2c 20 61 6e 64 20   aggregate, and 
29b30 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 73 65 6c  .  ** if the sel
29b40 65 63 74 2d 6c 69 73 74 20 69 73 20 74 68 65 20  ect-list is the 
29b50 73 61 6d 65 20 61 73 20 74 68 65 20 4f 52 44 45  same as the ORDE
29b60 52 20 42 59 20 6c 69 73 74 2c 20 74 68 65 6e 20  R BY list, then 
29b70 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2a 20  this query.  ** 
29b80 63 61 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e  can be rewritten
29b90 20 61 73 20 61 20 47 52 4f 55 50 20 42 59 2e 20   as a GROUP BY. 
29ba0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
29bb0 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this:.  **.  ** 
29bc0 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49      SELECT DISTI
29bd0 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e  NCT xyz FROM ...
29be0 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20   ORDER BY xyz.  
29bf0 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e 73  **.  ** is trans
29c00 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a  formed to:.  **.
29c10 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
29c20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f  xyz FROM ... GRO
29c30 55 50 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20  UP BY xyz.  **. 
29c40 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66   ** The second f
29c50 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72 65 64  orm is preferred
29c60 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64   as a single ind
29c70 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c  ex (or temp-tabl
29c80 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20  e) may be .  ** 
29c90 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68  used for both th
29ca0 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 44  e ORDER BY and D
29cb0 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69  ISTINCT processi
29cc0 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c  ng. As originall
29cd0 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20  y .  ** written 
29ce0 74 68 65 20 71 75 65 72 79 20 6d 75 73 74 20 75  the query must u
29cf0 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20  se a temp-table 
29d00 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  for at least one
29d10 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a 20   of the ORDER . 
29d20 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54 49   ** BY and DISTI
29d30 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65  NCT, and an inde
29d40 78 20 6f 72 20 73 65 70 61 72 61 74 65 20 74 65  x or separate te
29d50 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68 65  mp-table for the
29d60 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69   other..  */.  i
29d70 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
29d80 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
29d90 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
29da0 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20 26  F_Distinct .   &
29db0 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  & sqlite3ExprLis
29dc0 74 43 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e 70  tCompare(sSort.p
29dd0 4f 72 64 65 72 42 79 2c 20 70 2d 3e 70 45 4c 69  OrderBy, p->pELi
29de0 73 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a  st, -1)==0.  ){.
29df0 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
29e00 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b  &= ~SF_Distinct;
29e10 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79  .    p->pGroupBy
29e20 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
29e30 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c  stDup(db, p->pEL
29e40 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 70 47 72  ist, 0);.    pGr
29e50 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
29e60 70 42 79 3b 0a 20 20 20 20 73 53 6f 72 74 2e 70  pBy;.    sSort.p
29e70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
29e80 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20   /* Notice that 
29e90 65 76 65 6e 20 74 68 6f 75 67 68 74 20 53 46 5f  even thought SF_
29ea0 44 69 73 74 69 6e 63 74 20 68 61 73 20 62 65 65  Distinct has bee
29eb0 6e 20 63 6c 65 61 72 65 64 20 66 72 6f 6d 20 70  n cleared from p
29ec0 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20  ->selFlags,.    
29ed0 2a 2a 20 74 68 65 20 73 44 69 73 74 69 6e 63 74  ** the sDistinct
29ee0 2e 69 73 54 6e 63 74 20 69 73 20 73 74 69 6c 6c  .isTnct is still
29ef0 20 73 65 74 2e 20 20 48 65 6e 63 65 2c 20 69 73   set.  Hence, is
29f00 54 6e 63 74 20 72 65 70 72 65 73 65 6e 74 73 20  Tnct represents 
29f10 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67 69  the.    ** origi
29f20 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f 66 20 74  nal setting of t
29f30 68 65 20 53 46 5f 44 69 73 74 69 6e 63 74 20 66  he SF_Distinct f
29f40 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20 63 75 72  lag, not the cur
29f50 72 65 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f 0a  rent setting */.
29f60 20 20 20 20 61 73 73 65 72 74 28 20 73 44 69 73      assert( sDis
29f70 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b 0a  tinct.isTnct );.
29f80 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
29f90 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
29fa0 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74  Y clause, then t
29fb0 68 69 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a 2a  his sorting.  **
29fc0 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64   index might end
29fd0 20 75 70 20 62 65 69 6e 67 20 75 6e 75 73 65 64   up being unused
29fe0 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e   if the data can
29ff0 20 62 65 20 0a 20 20 2a 2a 20 65 78 74 72 61 63   be .  ** extrac
2a000 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65  ted in pre-sorte
2a010 64 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68 61  d order.  If tha
2a020 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  t is the case, t
2a030 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f  hen the.  ** OP_
2a040 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
2a050 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62  struction will b
2a060 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20  e changed to an 
2a070 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a  OP_Noop once.  *
2a080 2a 20 77 65 20 66 69 67 75 72 65 20 6f 75 74 20  * we figure out 
2a090 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67  that the sorting
2a0a0 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e 65   index is not ne
2a0b0 65 64 65 64 2e 20 20 54 68 65 20 61 64 64 72 53  eded.  The addrS
2a0c0 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61  ortIndex.  ** va
2a0d0 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
2a0e0 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 68 61  o facilitate tha
2a0f0 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20  t change..  */. 
2a100 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65   if( sSort.pOrde
2a110 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  rBy ){.    KeyIn
2a120 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
2a130 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
2a140 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
2a150 28 70 50 61 72 73 65 2c 20 73 53 6f 72 74 2e 70  (pParse, sSort.p
2a160 4f 72 64 65 72 42 79 2c 20 30 2c 20 30 29 3b 0a  OrderBy, 0, 0);.
2a170 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73      sSort.iECurs
2a180 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
2a190 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e 61  b++;.    sSort.a
2a1a0 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20  ddrSortIndex =. 
2a1b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2a1c0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
2a1d0 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20  nEphemeral,.    
2a1e0 20 20 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75        sSort.iECu
2a1f0 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72 64  rsor, sSort.pOrd
2a200 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70 45  erBy->nExpr+1+pE
2a210 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a  List->nExpr, 0,.
2a220 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
2a230 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
2a240 59 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a 20  YINFO.      );. 
2a250 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f 72   }else{.    sSor
2a260 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20  t.addrSortIndex 
2a270 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = -1;.  }..  /* 
2a280 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  If the output is
2a290 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20   destined for a 
2a2a0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
2a2b0 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65   open that table
2a2c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65  ..  */.  if( pDe
2a2d0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
2a2e0 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73  phemTab ){.    s
2a2f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2a300 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
2a310 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44  eral, pDest->iSD
2a320 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Parm, pEList->nE
2a330 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  xpr);.  }..  /* 
2a340 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e  Set the limiter.
2a350 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73  .  */.  iEnd = s
2a360 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
2a370 62 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65  bel(v);.  p->nSe
2a380 6c 65 63 74 52 6f 77 20 3d 20 4c 41 52 47 45 53  lectRow = LARGES
2a390 54 5f 49 4e 54 36 34 3b 0a 20 20 63 6f 6d 70 75  T_INT64;.  compu
2a3a0 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
2a3b0 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64  (pParse, p, iEnd
2a3c0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  );.  if( p->iLim
2a3d0 69 74 3d 3d 30 20 26 26 20 73 53 6f 72 74 2e 61  it==0 && sSort.a
2a3e0 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20  ddrSortIndex>=0 
2a3f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
2a400 62 65 47 65 74 4f 70 28 76 2c 20 73 53 6f 72 74  beGetOp(v, sSort
2a410 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 2d  .addrSortIndex)-
2a420 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 53 6f 72  >opcode = OP_Sor
2a430 74 65 72 4f 70 65 6e 3b 0a 20 20 20 20 73 53 6f  terOpen;.    sSo
2a440 72 74 2e 73 6f 72 74 46 6c 61 67 73 20 7c 3d 20  rt.sortFlags |= 
2a450 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
2a460 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70  er;.  }..  /* Op
2a470 65 6e 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64  en a virtual ind
2a480 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  ex to use for th
2a490 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a  e distinct set..
2a4a0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65    */.  if( p->se
2a4b0 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
2a4c0 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73  inct ){.    sDis
2a4d0 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20  tinct.tabTnct = 
2a4e0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
2a4f0 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64      sDistinct.ad
2a500 64 72 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33  drTnct = sqlite3
2a510 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
2a520 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a  _OpenEphemeral,.
2a530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a550 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63  sDistinct.tabTnc
2a560 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  t, 0, 0,.       
2a570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a580 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
2a590 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
2a5a0 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ist(pParse, p->p
2a5b0 45 4c 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20 20  EList,0,0),.    
2a5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5d0 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b              P4_K
2a5e0 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c  EYINFO);.    sql
2a5f0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
2a600 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45  (v, BTREE_UNORDE
2a610 52 45 44 29 3b 0a 20 20 20 20 73 44 69 73 74 69  RED);.    sDisti
2a620 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20  nct.eTnctType = 
2a630 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
2a640 4e 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73  NORDERED;.  }els
2a650 65 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  e{.    sDistinct
2a660 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45  .eTnctType = WHE
2a670 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50  RE_DISTINCT_NOOP
2a680 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73  ;.  }..  if( !is
2a690 41 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d  Agg && pGroupBy=
2a6a0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  =0 ){.    /* No 
2a6b0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
2a6c0 6f 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50  ons and no GROUP
2a6d0 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
2a6e0 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
2a6f0 20 3d 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73   = (sDistinct.is
2a700 54 6e 63 74 20 3f 20 57 48 45 52 45 5f 57 41 4e  Tnct ? WHERE_WAN
2a710 54 5f 44 49 53 54 49 4e 43 54 20 3a 20 30 29 3b  T_DISTINCT : 0);
2a720 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74  ..    /* Begin t
2a730 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
2a740 2e 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20  . */.    pWInfo 
2a750 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
2a760 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
2a770 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 73 53  List, pWhere, sS
2a780 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20  ort.pOrderBy,.  
2a790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
2a7b0 70 45 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c 61  pEList, wctrlFla
2a7c0 67 73 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  gs, 0);.    if( 
2a7d0 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
2a7e0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
2a7f0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
2a800 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28  eOutputRowCount(
2a810 70 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65  pWInfo) < p->nSe
2a820 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20  lectRow ){.     
2a830 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
2a840 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74   sqlite3WhereOut
2a850 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e  putRowCount(pWIn
2a860 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  fo);.    }.    i
2a870 66 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54  f( sDistinct.isT
2a880 6e 63 74 20 26 26 20 73 71 6c 69 74 65 33 57 68  nct && sqlite3Wh
2a890 65 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57  ereIsDistinct(pW
2a8a0 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 73  Info) ){.      s
2a8b0 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
2a8c0 70 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  pe = sqlite3Wher
2a8d0 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e  eIsDistinct(pWIn
2a8e0 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  fo);.    }.    i
2a8f0 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  f( sSort.pOrderB
2a900 79 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74  y ){.      sSort
2a910 2e 6e 4f 42 53 61 74 20 3d 20 73 71 6c 69 74 65  .nOBSat = sqlite
2a920 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
2a930 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69  pWInfo);.      i
2a940 66 28 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d  f( sSort.nOBSat=
2a950 3d 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d  =sSort.pOrderBy-
2a960 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
2a970 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
2a980 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
2a990 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73    }..    /* If s
2a9a0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  orting index tha
2a9b0 74 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79  t was created by
2a9c0 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e   a prior OP_Open
2a9d0 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a  Ephemeral .    *
2a9e0 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e  * instruction en
2a9f0 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67  ded up not being
2aa00 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68   needed, then ch
2aa10 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e  ange the OP_Open
2aa20 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a  Ephemeral.    **
2aa30 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70   into an OP_Noop
2aa40 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2aa50 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
2aa60 6e 64 65 78 3e 3d 30 20 26 26 20 73 53 6f 72 74  ndex>=0 && sSort
2aa70 2e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a  .pOrderBy==0 ){.
2aa80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2aa90 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
2aaa0 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
2aab0 6e 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ndex);.    }..  
2aac0 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61    /* Use the sta
2aad0 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70  ndard inner loop
2aae0 2e 20 2a 2f 0a 20 20 20 20 73 65 6c 65 63 74 49  . */.    selectI
2aaf0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
2ab00 20 70 2c 20 70 45 4c 69 73 74 2c 20 2d 31 2c 20   p, pEList, -1, 
2ab10 26 73 53 6f 72 74 2c 20 26 73 44 69 73 74 69 6e  &sSort, &sDistin
2ab20 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20  ct, pDest,.     
2ab30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2ab40 71 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69  qlite3WhereConti
2ab50 6e 75 65 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29  nueLabel(pWInfo)
2ab60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2ab70 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
2ab80 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49  reBreakLabel(pWI
2ab90 6e 66 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45  nfo));..    /* E
2aba0 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
2abb0 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a  scan loop..    *
2abc0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65  /.    sqlite3Whe
2abd0 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
2abe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
2abf0 68 69 73 20 63 61 73 65 20 77 68 65 6e 20 74 68  his case when th
2ac00 65 72 65 20 65 78 69 73 74 20 61 67 67 72 65 67  ere exist aggreg
2ac10 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72  ate functions or
2ac20 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75   a GROUP BY clau
2ac30 73 65 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74  se.    ** or bot
2ac40 68 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e  h */.    NameCon
2ac50 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20  text sNC;    /* 
2ac60 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72  Name context for
2ac70 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72   processing aggr
2ac80 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f  egate informatio
2ac90 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d  n */.    int iAM
2aca0 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em;          /* 
2acb0 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73  First Mem addres
2acc0 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75  s for storing cu
2acd0 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a  rrent GROUP BY *
2ace0 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b  /.    int iBMem;
2acf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
2ad00 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66  st Mem address f
2ad10 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55  or previous GROU
2ad20 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20  P BY */.    int 
2ad30 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20  iUseFlag;       
2ad40 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68  /* Mem address h
2ad50 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69  olding flag indi
2ad60 63 61 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c  cating that at l
2ad70 65 61 73 74 0a 20 20 20 20 20 20 20 20 20 20 20  east.           
2ad80 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
2ad90 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69  one row of the i
2ada0 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67 67 72  nput to the aggr
2adb0 65 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a  egator has been.
2adc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2add0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
2ade0 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ssed */.    int 
2adf0 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20  iAbortFlag;     
2ae00 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77  /* Mem address w
2ae10 68 69 63 68 20 63 61 75 73 65 73 20 71 75 65 72  hich causes quer
2ae20 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74  y abort if posit
2ae30 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67  ive */.    int g
2ae40 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f  roupBySort;    /
2ae50 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d  * Rows come from
2ae60 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50   source in GROUP
2ae70 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20   BY order */.   
2ae80 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20   int addrEnd;   
2ae90 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70       /* End of p
2aea0 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68  rocessing for th
2aeb0 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20  is SELECT */.   
2aec0 20 69 6e 74 20 73 6f 72 74 50 54 61 62 20 3d 20   int sortPTab = 
2aed0 30 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f 74 61  0;   /* Pseudota
2aee0 62 6c 65 20 75 73 65 64 20 74 6f 20 64 65 63 6f  ble used to deco
2aef0 64 65 20 73 6f 72 74 69 6e 67 20 72 65 73 75 6c  de sorting resul
2af00 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f  ts */.    int so
2af10 72 74 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a  rtOut = 0;    /*
2af20 20 4f 75 74 70 75 74 20 72 65 67 69 73 74 65 72   Output register
2af30 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72   from the sorter
2af40 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 72 64 65   */.    int orde
2af50 72 42 79 47 72 70 20 3d 20 30 3b 20 2f 2a 20 54  rByGrp = 0; /* T
2af60 72 75 65 20 69 66 20 74 68 65 20 47 52 4f 55 50  rue if the GROUP
2af70 20 42 59 20 61 6e 64 20 4f 52 44 45 52 20 42 59   BY and ORDER BY
2af80 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 2a 2f   are the same */
2af90 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20  ..    /* Remove 
2afa0 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61  any and all alia
2afb0 73 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20  ses between the 
2afc0 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74  result set and t
2afd0 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20  he.    ** GROUP 
2afe0 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a  BY clause..    *
2aff0 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
2b000 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  By ){.      int 
2b010 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
2b020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
2b030 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
2b040 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
2b050 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20  st_item *pItem; 
2b060 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
2b070 6f 76 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  over expression 
2b080 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20  in a list */..  
2b090 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c      for(k=p->pEL
2b0a0 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  ist->nExpr, pIte
2b0b0 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20  m=p->pEList->a; 
2b0c0 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b  k>0; k--, pItem+
2b0d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65  +){.        pIte
2b0e0 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20  m->u.x.iAlias = 
2b0f0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
2b100 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d   for(k=pGroupBy-
2b110 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47  >nExpr, pItem=pG
2b120 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20  roupBy->a; k>0; 
2b130 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  k--, pItem++){. 
2b140 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e         pItem->u.
2b150 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  x.iAlias = 0;.  
2b160 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2b170 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 31 30  p->nSelectRow>10
2b180 30 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  0 ) p->nSelectRo
2b190 77 20 3d 20 31 30 30 3b 0a 20 20 20 20 7d 65 6c  w = 100;.    }el
2b1a0 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65  se{.      p->nSe
2b1b0 6c 65 63 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20  lectRow = 1;.   
2b1c0 20 7d 0a 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74   }...    /* If t
2b1d0 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 20 47  here is both a G
2b1e0 52 4f 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f  ROUP BY and an O
2b1f0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
2b200 6e 64 20 74 68 65 79 20 61 72 65 0a 20 20 20 20  nd they are.    
2b210 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68  ** identical, th
2b220 65 6e 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73  en it may be pos
2b230 73 69 62 6c 65 20 74 6f 20 64 69 73 61 62 6c 65  sible to disable
2b240 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2b250 61 75 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20  ause .    ** on 
2b260 74 68 65 20 67 72 6f 75 6e 64 73 20 74 68 61 74  the grounds that
2b270 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 77 69   the GROUP BY wi
2b280 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74  ll cause element
2b290 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20  s to come out . 
2b2a0 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72     ** in the cor
2b2b0 72 65 63 74 20 6f 72 64 65 72 2e 20 49 74 20 61  rect order. It a
2b2c0 6c 73 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68  lso may not - th
2b2d0 65 20 47 52 4f 55 50 20 42 59 20 6d 61 79 20 75  e GROUP BY may u
2b2e0 73 65 20 61 0a 20 20 20 20 2a 2a 20 64 61 74 61  se a.    ** data
2b2f0 62 61 73 65 20 69 6e 64 65 78 20 74 68 61 74 20  base index that 
2b300 63 61 75 73 65 73 20 72 6f 77 73 20 74 6f 20 62  causes rows to b
2b310 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68  e grouped togeth
2b320 65 72 20 61 73 20 72 65 71 75 69 72 65 64 0a 20  er as required. 
2b330 20 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 61 63     ** but not ac
2b340 74 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e 20 45  tually sorted. E
2b350 69 74 68 65 72 20 77 61 79 2c 20 72 65 63 6f 72  ither way, recor
2b360 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
2b370 74 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44 45 52  the.    ** ORDER
2b380 20 42 59 20 61 6e 64 20 47 52 4f 55 50 20 42 59   BY and GROUP BY
2b390 20 63 6c 61 75 73 65 73 20 61 72 65 20 74 68 65   clauses are the
2b3a0 20 73 61 6d 65 20 62 79 20 73 65 74 74 69 6e 67   same by setting
2b3b0 20 74 68 65 20 6f 72 64 65 72 42 79 47 72 70 0a   the orderByGrp.
2b3c0 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e      ** variable.
2b3d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
2b3e0 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
2b3f0 61 72 65 28 70 47 72 6f 75 70 42 79 2c 20 73 53  are(pGroupBy, sS
2b400 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31  ort.pOrderBy, -1
2b410 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 72  )==0 ){.      or
2b420 64 65 72 42 79 47 72 70 20 3d 20 31 3b 0a 20 20  derByGrp = 1;.  
2b430 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65    }. .    /* Cre
2b440 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a  ate a label to j
2b450 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77  ump to when we w
2b460 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65  ant to abort the
2b470 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64   query */.    ad
2b480 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  drEnd = sqlite3V
2b490 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
2b4a0 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74  ..    /* Convert
2b4b0 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73   TK_COLUMN nodes
2b4c0 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c   into TK_AGG_COL
2b4d0 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74  UMN and make ent
2b4e0 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73  ries in.    ** s
2b4f0 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20  AggInfo for all 
2b500 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
2b510 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73  nodes in express
2b520 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ions of the.    
2b530 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
2b540 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ent..    */.    
2b550 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
2b560 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
2b570 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
2b580 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70  Parse;.    sNC.p
2b590 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  SrcList = pTabLi
2b5a0 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67  st;.    sNC.pAgg
2b5b0 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f  Info = &sAggInfo
2b5c0 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d  ;.    sAggInfo.m
2b5d0 6e 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nReg = pParse->n
2b5e0 4d 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49  Mem+1;.    sAggI
2b5f0 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
2b600 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20  mn = pGroupBy ? 
2b610 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20  pGroupBy->nExpr 
2b620 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66  : 0;.    sAggInf
2b630 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72  o.pGroupBy = pGr
2b640 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74  oupBy;.    sqlit
2b650 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2b660 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73  List(&sNC, pELis
2b670 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
2b680 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
2b690 74 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f  t(&sNC, sSort.pO
2b6a0 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28  rderBy);.    if(
2b6b0 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20   pHaving ){.    
2b6c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
2b6d0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26  lyzeAggregates(&
2b6e0 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20  sNC, pHaving);. 
2b6f0 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66     }.    sAggInf
2b700 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d  o.nAccumulator =
2b710 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d   sAggInfo.nColum
2b720 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  n;.    for(i=0; 
2b730 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63  i<sAggInfo.nFunc
2b740 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; i++){.      as
2b750 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2b760 6f 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e  operty(sAggInfo.
2b770 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20  aFunc[i].pExpr, 
2b780 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
2b790 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61  .      sNC.ncFla
2b7a0 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75  gs |= NC_InAggFu
2b7b0 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  nc;.      sqlite
2b7c0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
2b7d0 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e  ist(&sNC, sAggIn
2b7e0 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70  fo.aFunc[i].pExp
2b7f0 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  r->x.pList);.   
2b800 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26     sNC.ncFlags &
2b810 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b  = ~NC_InAggFunc;
2b820 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49  .    }.    sAggI
2b830 6e 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72  nfo.mxReg = pPar
2b840 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66  se->nMem;.    if
2b850 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
2b860 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  ed ) goto select
2b870 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72  _end;..    /* Pr
2b880 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67  ocessing for agg
2b890 72 65 67 61 74 65 73 20 77 69 74 68 20 47 52 4f  regates with GRO
2b8a0 55 50 20 42 59 20 69 73 20 76 65 72 79 20 64 69  UP BY is very di
2b8b0 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20  fferent and.    
2b8c0 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d  ** much more com
2b8d0 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65 67  plex than aggreg
2b8e0 61 74 65 73 20 77 69 74 68 6f 75 74 20 61 20 47  ates without a G
2b8f0 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a  ROUP BY..    */.
2b900 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
2b910 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   ){.      KeyInf
2b920 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a  o *pKeyInfo;  /*
2b930 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74   Keying informat
2b940 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75  ion for the grou
2b950 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20  p by clause */. 
2b960 20 20 20 20 20 69 6e 74 20 6a 31 3b 20 20 20 20       int j1;    
2b970 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73           /* A-vs
2b980 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a  -B comparision j
2b990 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ump */.      int
2b9a0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20   addrOutputRow; 
2b9b0 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62   /* Start of sub
2b9c0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
2b9d0 70 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f  puts a result ro
2b9e0 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  w */.      int r
2b9f0 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f  egOutputRow;   /
2ba00 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73  * Return address
2ba10 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75   register for ou
2ba20 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20  tput subroutine 
2ba30 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
2ba40 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20  rSetAbort;   /* 
2ba50 53 65 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c  Set the abort fl
2ba60 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f  ag and return */
2ba70 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
2ba80 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f  opOfLoop;  /* To
2ba90 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c  p of the input l
2baa0 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  oop */.      int
2bab0 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b   addrSortingIdx;
2bac0 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45   /* The OP_OpenE
2bad0 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65  phemeral for the
2bae0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a   sorting index *
2baf0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
2bb00 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53  Reset;      /* S
2bb10 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65  ubroutine for re
2bb20 73 65 74 74 69 6e 67 20 74 68 65 20 61 63 63 75  setting the accu
2bb30 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  mulator */.     
2bb40 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20   int regReset;  
2bb50 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61       /* Return a
2bb60 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
2bb70 66 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f 75  for reset subrou
2bb80 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  tine */..      /
2bb90 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
2bba0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
2bbb0 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20  we might need a 
2bbc0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f  sorting index to
2bbd0 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d  .      ** implem
2bbe0 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74  ent it.  Allocat
2bbf0 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69  e that sorting i
2bc00 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74  ndex now.  If it
2bc10 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20   turns out.     
2bc20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
2bc30 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74 65 72  ot need it after
2bc40 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72   all, the OP_Sor
2bc50 74 65 72 4f 70 65 6e 20 69 6e 73 74 72 75 63 74  terOpen instruct
2bc60 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c  ion.      ** wil
2bc70 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  l be converted i
2bc80 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20  nto a Noop.  .  
2bc90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67      */.      sAg
2bca0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
2bcb0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
2bcc0 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66  +;.      pKeyInf
2bcd0 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
2bce0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
2bcf0 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 30 29 3b  pGroupBy, 0, 0);
2bd00 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69  .      addrSorti
2bd10 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56  ngIdx = sqlite3V
2bd20 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
2bd30 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20  SorterOpen, .   
2bd40 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
2bd50 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67  sortingIdx, sAgg
2bd60 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c  Info.nSortingCol
2bd70 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  umn, .          
2bd80 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e  0, (char*)pKeyIn
2bd90 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
2bda0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69  ..      /* Initi
2bdb0 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63  alize memory loc
2bdc0 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47  ations used by G
2bdd0 52 4f 55 50 20 42 59 20 61 67 67 72 65 67 61 74  ROUP BY aggregat
2bde0 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20  e processing.   
2bdf0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65     */.      iUse
2be00 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Flag = ++pParse-
2be10 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62  >nMem;.      iAb
2be20 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72  ortFlag = ++pPar
2be30 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2be40 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b  regOutputRow = +
2be50 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2be60 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52       addrOutputR
2be70 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ow = sqlite3Vdbe
2be80 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
2be90 20 20 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b      regReset = +
2bea0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2beb0 20 20 20 20 20 61 64 64 72 52 65 73 65 74 20 3d       addrReset =
2bec0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
2bed0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
2bee0 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  iAMem = pParse->
2bef0 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20  nMem + 1;.      
2bf00 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
2bf10 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
2bf20 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70  .      iBMem = p
2bf30 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
2bf40 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
2bf50 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d  Mem += pGroupBy-
2bf60 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >nExpr;.      sq
2bf70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2bf80 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
2bf90 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20  , iAbortFlag);. 
2bfa0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2bfb0 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72  ((v, "clear abor
2bfc0 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
2bfd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2bfe0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
2bff0 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a  , 0, iUseFlag);.
2c000 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2c010 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20  t((v, "indicate 
2c020 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74  accumulator empt
2c030 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  y"));.      sqli
2c040 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2c050 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d   OP_Null, 0, iAM
2c060 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70  em, iAMem+pGroup
2c070 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20  By->nExpr-1);.. 
2c080 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20       /* Begin a 
2c090 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65  loop that will e
2c0a0 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63  xtract all sourc
2c0b0 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20  e rows in GROUP 
2c0c0 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20  BY order..      
2c0d0 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e  ** This might in
2c0e0 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61  volve two separa
2c0f0 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e  te loops with an
2c100 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77   OP_Sort in betw
2c110 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a  een, or.      **
2c120 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73   it might be a s
2c130 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20  ingle loop that 
2c140 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f  uses an index to
2c150 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61   extract informa
2c160 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e  tion.      ** in
2c170 20 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72   the right order
2c180 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a   to begin with..
2c190 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
2c1a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2c1b0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
2c1c0 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65  gReset, addrRese
2c1d0 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  t);.      pWInfo
2c1e0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
2c1f0 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
2c200 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70  bList, pWhere, p
2c210 47 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20 20  GroupBy, 0,.    
2c220 20 20 20 20 20 20 57 48 45 52 45 5f 47 52 4f 55        WHERE_GROU
2c230 50 42 59 20 7c 20 28 6f 72 64 65 72 42 79 47 72  PBY | (orderByGr
2c240 70 20 3f 20 57 48 45 52 45 5f 53 4f 52 54 42 59  p ? WHERE_SORTBY
2c250 47 52 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20 20  GROUP : 0), 0.  
2c260 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
2c270 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
2c280 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
2c290 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
2c2a0 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
2c2b0 49 6e 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79 2d  Info)==pGroupBy-
2c2c0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
2c2d0 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a    /* The optimiz
2c2e0 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65  er is able to de
2c2f0 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72  liver rows in gr
2c300 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a  oup by order so.
2c310 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f          ** we do
2c320 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72   not have to sor
2c330 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45  t.  The OP_OpenE
2c340 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77  phemeral table w
2c350 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
2c360 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65  * cancelled late
2c370 72 20 62 65 63 61 75 73 65 20 77 65 20 73 74 69  r because we sti
2c380 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74  ll need to use t
2c390 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20  he pKeyInfo.    
2c3a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67      */.        g
2c3b0 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a  roupBySort = 0;.
2c3c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2c3d0 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65       /* Rows are
2c3e0 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75   coming out in u
2c3f0 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65  ndetermined orde
2c400 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 70  r.  We have to p
2c410 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  ush.        ** e
2c420 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73  ach row into a s
2c430 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65  orting index, te
2c440 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72 73  rminate the firs
2c450 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20  t loop,.        
2c460 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65  ** then loop ove
2c470 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  r the sorting in
2c480 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  dex in order to 
2c490 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20  get the output. 
2c4a0 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72         ** in sor
2c4b0 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20  ted order.      
2c4c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
2c4d0 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20   regBase;.      
2c4e0 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b    int regRecord;
2c4f0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  .        int nCo
2c500 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  l;.        int n
2c510 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20  GroupBy;..      
2c520 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62    explainTempTab
2c530 6c 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  le(pParse, .    
2c540 20 20 20 20 20 20 20 20 28 73 44 69 73 74 69 6e          (sDistin
2c550 63 74 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d  ct.isTnct && (p-
2c560 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73  >selFlags&SF_Dis
2c570 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20  tinct)==0) ?.   
2c580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c590 20 22 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47   "DISTINCT" : "G
2c5a0 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20  ROUP BY");..    
2c5b0 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20      groupBySort 
2c5c0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72  = 1;.        nGr
2c5d0 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79  oupBy = pGroupBy
2c5e0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
2c5f0 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79   nCol = nGroupBy
2c600 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47  ;.        j = nG
2c610 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20  roupBy;.        
2c620 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
2c630 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  nfo.nColumn; i++
2c640 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2c650 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69   sAggInfo.aCol[i
2c660 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e  ].iSorterColumn>
2c670 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =j ){.          
2c680 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20    nCol++;.      
2c690 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
2c6a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2c6b0 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65  .        regBase
2c6c0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
2c6d0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
2c6e0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
2c6f0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
2c700 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
2c710 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2c720 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
2c730 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72  rse, pGroupBy, r
2c740 65 67 42 61 73 65 2c 20 30 29 3b 0a 20 20 20 20  egBase, 0);.    
2c750 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79      j = nGroupBy
2c760 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
2c770 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  0; i<sAggInfo.nC
2c780 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
2c790 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
2c7a0 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20  gInfo_col *pCol 
2c7b0 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  = &sAggInfo.aCol
2c7c0 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [i];.          i
2c7d0 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72  f( pCol->iSorter
2c7e0 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20  Column>=j ){.   
2c7f0 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20           int r1 
2c800 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20  = j + regBase;. 
2c810 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72             int r
2c820 32 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  2;..            
2c830 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
2c840 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50  CodeGetColumn(pP
2c850 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
2c860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c870 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62        pCol->pTab
2c880 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c  , pCol->iColumn,
2c890 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72   pCol->iTable, r
2c8a0 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  1, 0);.         
2c8b0 20 20 20 69 66 28 20 72 31 21 3d 72 32 20 29 7b     if( r1!=r2 ){
2c8c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
2c8d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2c8e0 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32  (v, OP_SCopy, r2
2c8f0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20  , r1);.         
2c900 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2c910 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   j++;.          
2c920 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2c930 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20      regRecord = 
2c940 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
2c950 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
2c960 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2c970 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
2c980 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20  ecord, regBase, 
2c990 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29  nCol, regRecord)
2c9a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2c9b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2c9c0 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20  P_SorterInsert, 
2c9d0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
2c9e0 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Idx, regRecord);
2c9f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2ca00 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
2ca10 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64  Parse, regRecord
2ca20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2ca30 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
2ca40 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  ge(pParse, regBa
2ca50 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  se, nCol);.     
2ca60 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
2ca70 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
2ca80 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72      sAggInfo.sor
2ca90 74 69 6e 67 49 64 78 50 54 61 62 20 3d 20 73 6f  tingIdxPTab = so
2caa0 72 74 50 54 61 62 20 3d 20 70 50 61 72 73 65 2d  rtPTab = pParse-
2cab0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
2cac0 20 73 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69 74   sortOut = sqlit
2cad0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
2cae0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
2caf0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2cb00 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
2cb10 2c 20 73 6f 72 74 50 54 61 62 2c 20 73 6f 72 74  , sortPTab, sort
2cb20 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  Out, nCol);.    
2cb30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2cb40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
2cb50 65 72 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f  erSort, sAggInfo
2cb60 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64  .sortingIdx, add
2cb70 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56  rEnd);.        V
2cb80 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2cb90 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29  GROUP BY sort"))
2cba0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
2cbb0 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49  );.        sAggI
2cbc0 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64  nfo.useSortingId
2cbd0 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73  x = 1;.        s
2cbe0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
2cbf0 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 0a 20  lear(pParse);.. 
2cc00 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
2cc10 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6f 72   If the index or
2cc20 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
2cc30 20 75 73 65 64 20 62 79 20 74 68 65 20 47 52 4f   used by the GRO
2cc40 55 50 20 42 59 20 73 6f 72 74 0a 20 20 20 20 20  UP BY sort.     
2cc50 20 2a 2a 20 77 69 6c 6c 20 6e 61 74 75 72 61 6c   ** will natural
2cc60 6c 79 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20  ly deliver rows 
2cc70 69 6e 20 74 68 65 20 6f 72 64 65 72 20 72 65 71  in the order req
2cc80 75 69 72 65 64 20 62 79 20 74 68 65 20 4f 52 44  uired by the ORD
2cc90 45 52 20 42 59 0a 20 20 20 20 20 20 2a 2a 20 63  ER BY.      ** c
2cca0 6c 61 75 73 65 2c 20 63 61 6e 63 65 6c 20 74 68  lause, cancel th
2ccb0 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  e ephemeral tabl
2ccc0 65 20 6f 70 65 6e 20 63 6f 64 65 64 20 65 61 72  e open coded ear
2ccd0 6c 69 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  lier..      **. 
2cce0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
2ccf0 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  an optimization 
2cd00 2d 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e  - the correct an
2cd10 73 77 65 72 20 73 68 6f 75 6c 64 20 72 65 73 75  swer should resu
2cd20 6c 74 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20  lt regardless.. 
2cd30 20 20 20 20 20 2a 2a 20 55 73 65 20 74 68 65 20       ** Use the 
2cd40 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72  SQLITE_GroupByOr
2cd50 64 65 72 20 66 6c 61 67 20 77 69 74 68 20 53 51  der flag with SQ
2cd60 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
2cd70 54 49 4d 49 5a 45 52 20 74 6f 20 0a 20 20 20 20  TIMIZER to .    
2cd80 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 69    ** disable thi
2cd90 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66  s optimization f
2cda0 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  or testing purpo
2cdb0 73 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ses.  */.      i
2cdc0 66 28 20 6f 72 64 65 72 42 79 47 72 70 20 26 26  f( orderByGrp &&
2cdd0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
2cde0 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
2cdf0 47 72 6f 75 70 42 79 4f 72 64 65 72 29 20 0a 20  GroupByOrder) . 
2ce00 20 20 20 20 20 20 26 26 20 28 67 72 6f 75 70 42        && (groupB
2ce10 79 53 6f 72 74 20 7c 7c 20 73 71 6c 69 74 65 33  ySort || sqlite3
2ce20 57 68 65 72 65 49 73 53 6f 72 74 65 64 28 70 57  WhereIsSorted(pW
2ce30 49 6e 66 6f 29 29 0a 20 20 20 20 20 20 29 7b 0a  Info)).      ){.
2ce40 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f          sSort.pO
2ce50 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
2ce60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2ce70 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73  hangeToNoop(v, s
2ce80 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
2ce90 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ex);.      }..  
2cea0 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20      /* Evaluate 
2ceb0 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
2cec0 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73  P BY terms and s
2ced0 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20  tore in b0, b1, 
2cee0 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28  b2....      ** (
2cef0 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63  b0 is memory loc
2cf00 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62  ation iBMem+0, b
2cf10 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e  1 is iBMem+1, an
2cf20 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20  d so forth).    
2cf30 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72    ** Then compar
2cf40 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52  e the current GR
2cf50 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 67 61  OUP BY terms aga
2cf60 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20 42  inst the GROUP B
2cf70 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a  Y terms.      **
2cf80 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f   from the previo
2cf90 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79  us row currently
2cfa0 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61   stored in a0, a
2cfb0 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a  1, a2....      *
2cfc0 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f  /.      addrTopO
2cfd0 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  fLoop = sqlite3V
2cfe0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2cff0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2d000 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
2d010 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66  Parse);.      if
2d020 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
2d030 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2d040 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2d050 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 73 41 67  _SorterData, sAg
2d060 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
2d070 2c 20 73 6f 72 74 4f 75 74 29 3b 0a 20 20 20 20  , sortOut);.    
2d080 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d    }.      for(j=
2d090 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; j<pGroupBy->n
2d0a0 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
2d0b0 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53      if( groupByS
2d0c0 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ort ){.         
2d0d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2d0e0 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
2d0f0 20 73 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69 42   sortPTab, j, iB
2d100 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20  Mem+j);.        
2d110 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 73 71 6c    if( j==0 ) sql
2d120 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
2d130 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52  (v, OPFLAG_CLEAR
2d140 43 41 43 48 45 29 3b 0a 20 20 20 20 20 20 20 20  CACHE);.        
2d150 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2d160 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74   sAggInfo.direct
2d170 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Mode = 1;.      
2d180 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2d190 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ode(pParse, pGro
2d1a0 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  upBy->a[j].pExpr
2d1b0 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20  , iBMem+j);.    
2d1c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2d1d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2d1e0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
2d1f0 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65  are, iAMem, iBMe
2d200 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  m, pGroupBy->nEx
2d210 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
2d220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
2d230 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49  har*)sqlite3KeyI
2d240 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29  nfoRef(pKeyInfo)
2d250 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
2d260 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65       j1 = sqlite
2d270 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
2d280 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
2d290 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2d2a0 4f 50 5f 4a 75 6d 70 2c 20 6a 31 2b 31 2c 20 30  OP_Jump, j1+1, 0
2d2b0 2c 20 6a 31 2b 31 29 3b 20 56 64 62 65 43 6f 76  , j1+1); VdbeCov
2d2c0 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20  erage(v);..     
2d2d0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
2d2e0 65 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e  e that runs when
2d2f0 65 76 65 72 20 74 68 65 20 47 52 4f 55 50 20 42  ever the GROUP B
2d300 59 20 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20  Y changes..     
2d310 20 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e 20 74   ** Changes in t
2d320 68 65 20 47 52 4f 55 50 20 42 59 20 61 72 65 20  he GROUP BY are 
2d330 64 65 74 65 63 74 65 64 20 62 79 20 74 68 65 20  detected by the 
2d340 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20  previous code.  
2d350 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49      ** block.  I
2d360 66 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20  f there were no 
2d370 63 68 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c  changes, this bl
2d380 6f 63 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a  ock is skipped..
2d390 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2d3a0 2a 20 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69  * This code copi
2d3b0 65 73 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70  es current group
2d3c0 20 62 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c   by terms in b0,
2d3d0 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20  b1,b2,....      
2d3e0 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31  ** over to a0,a1
2d3f0 2c 61 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61  ,a2.  It then ca
2d400 6c 6c 73 20 74 68 65 20 6f 75 74 70 75 74 20 73  lls the output s
2d410 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20  ubroutine.      
2d420 2a 2a 20 61 6e 64 20 72 65 73 65 74 73 20 74 68  ** and resets th
2d430 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
2d440 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72  mulator register
2d450 73 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e  s in preparation
2d460 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  .      ** for th
2d470 65 20 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20  e next GROUP BY 
2d480 62 61 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a  batch..      */.
2d490 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2d4a0 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
2d4b0 2c 20 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20  , iBMem, iAMem, 
2d4c0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29  pGroupBy->nExpr)
2d4d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2d4e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2d4f0 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74  Gosub, regOutput
2d500 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52  Row, addrOutputR
2d510 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ow);.      VdbeC
2d520 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70  omment((v, "outp
2d530 75 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20  ut one row"));. 
2d540 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2d550 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50  AddOp2(v, OP_IfP
2d560 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20  os, iAbortFlag, 
2d570 61 64 64 72 45 6e 64 29 3b 20 56 64 62 65 43 6f  addrEnd); VdbeCo
2d580 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
2d590 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2d5a0 20 22 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c   "check abort fl
2d5b0 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
2d5c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2d5d0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52  , OP_Gosub, regR
2d5e0 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29  eset, addrReset)
2d5f0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2d600 65 6e 74 28 28 76 2c 20 22 72 65 73 65 74 20 61  ent((v, "reset a
2d610 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a  ccumulator"));..
2d620 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
2d630 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
2d640 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64  cumulators based
2d650 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   on the content 
2d660 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
2d670 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20  current row.    
2d680 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
2d690 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
2d6a0 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20 75 70 64  , j1);.      upd
2d6b0 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  ateAccumulator(p
2d6c0 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
2d6d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2d6e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2d6f0 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73  _Integer, 1, iUs
2d700 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  eFlag);.      Vd
2d710 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
2d720 6e 64 69 63 61 74 65 20 64 61 74 61 20 69 6e 20  ndicate data in 
2d730 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a  accumulator"));.
2d740 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66  .      /* End of
2d750 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20   the loop.      
2d760 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f  */.      if( gro
2d770 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20  upBySort ){.    
2d780 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2d790 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
2d7a0 65 72 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f  erNext, sAggInfo
2d7b0 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64  .sortingIdx, add
2d7c0 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20  rTopOfLoop);.   
2d7d0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
2d7e0 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e(v);.      }els
2d7f0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
2d800 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
2d810 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
2d820 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
2d830 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 69  oop(v, addrSorti
2d840 6e 67 49 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a  ngIdx);.      }.
2d850 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74  .      /* Output
2d860 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f   the final row o
2d870 66 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  f result.      *
2d880 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
2d890 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2d8a0 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74  Gosub, regOutput
2d8b0 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52  Row, addrOutputR
2d8c0 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ow);.      VdbeC
2d8d0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70  omment((v, "outp
2d8e0 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b  ut final row"));
2d8f0 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  ..      /* Jump 
2d900 6f 76 65 72 20 74 68 65 20 73 75 62 72 6f 75 74  over the subrout
2d910 69 6e 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ines.      */.  
2d920 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2d930 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
2d940 2c 20 30 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a  , 0, addrEnd);..
2d950 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
2d960 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
2d970 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 73 69  hat outputs a si
2d980 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20  ngle row of the 
2d990 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20  result.      ** 
2d9a0 73 65 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f  set.  This subro
2d9b0 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b  utine first look
2d9c0 73 20 61 74 20 74 68 65 20 69 55 73 65 46 6c 61  s at the iUseFla
2d9d0 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a  g.  If iUseFlag.
2d9e0 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73        ** is less
2d9f0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
2da00 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72  o zero, the subr
2da10 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
2da20 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20  p.  If.      ** 
2da30 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63  the processing c
2da40 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65  alls for the que
2da50 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69  ry to abort, thi
2da60 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20  s subroutine.   
2da70 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73     ** increments
2da80 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20   the iAbortFlag 
2da90 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
2daa0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
2dab0 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64   in.      ** ord
2dac0 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65  er to signal the
2dad0 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74   caller to abort
2dae0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2daf0 20 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20   addrSetAbort = 
2db00 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2db10 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
2db20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2db30 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
2db40 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29  , 1, iAbortFlag)
2db50 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2db60 65 6e 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f  ent((v, "set abo
2db70 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
2db80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2db90 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
2dba0 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b  , regOutputRow);
2dbb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2dbc0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
2dbd0 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29  , addrOutputRow)
2dbe0 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70  ;.      addrOutp
2dbf0 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56  utRow = sqlite3V
2dc00 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2dc10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2dc20 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2dc30 5f 49 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67  _IfPos, iUseFlag
2dc40 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b  , addrOutputRow+
2dc50 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  2); VdbeCoverage
2dc60 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  (v);.      VdbeC
2dc70 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f 75  omment((v, "Grou
2dc80 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72  pby result gener
2dc90 61 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74  ator entry point
2dca0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
2dcb0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
2dcc0 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75  OP_Return, regOu
2dcd0 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
2dce0 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
2dcf0 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41  ions(pParse, &sA
2dd00 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  ggInfo);.      s
2dd10 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
2dd20 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e  e(pParse, pHavin
2dd30 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  g, addrOutputRow
2dd40 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  +1, SQLITE_JUMPI
2dd50 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65  FNULL);.      se
2dd60 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
2dd70 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
2dd80 73 74 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 0a  st, -1, &sSort,.
2dd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dda0 20 20 20 20 20 20 26 73 44 69 73 74 69 6e 63 74        &sDistinct
2ddb0 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20  , pDest,.       
2ddc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
2ddd0 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20  ddrOutputRow+1, 
2dde0 61 64 64 72 53 65 74 41 62 6f 72 74 29 3b 0a 20  addrSetAbort);. 
2ddf0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2de00 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
2de10 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  urn, regOutputRo
2de20 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  w);.      VdbeCo
2de30 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 67  mment((v, "end g
2de40 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65  roupby result ge
2de50 6e 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20  nerator"));..   
2de60 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
2de70 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
2de80 20 77 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20   will reset the 
2de90 67 72 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c  group-by accumul
2dea0 61 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ator.      */.  
2deb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
2dec0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
2ded0 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20  ddrReset);.     
2dee0 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f   resetAccumulato
2def0 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
2df00 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
2df10 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2df20 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52   OP_Return, regR
2df30 65 73 65 74 29 3b 0a 20 20 20 20 20 0a 20 20 20  eset);.     .   
2df40 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f   } /* endif pGro
2df50 75 70 42 79 2e 20 20 42 65 67 69 6e 20 61 67 67  upBy.  Begin agg
2df60 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 77  regate queries w
2df70 69 74 68 6f 75 74 20 47 52 4f 55 50 20 42 59 3a  ithout GROUP BY:
2df80 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20   */.    else {. 
2df90 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
2dfa0 44 65 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  Del = 0;.#ifndef
2dfb0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52   SQLITE_OMIT_BTR
2dfc0 45 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 54 61  EECOUNT.      Ta
2dfd0 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20  ble *pTab;.     
2dfe0 20 69 66 28 20 28 70 54 61 62 20 3d 20 69 73 53   if( (pTab = isS
2dff0 69 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73  impleCount(p, &s
2e000 41 67 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a  AggInfo))!=0 ){.
2e010 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73          /* If is
2e020 53 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72 65  SimpleCount() re
2e030 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
2e040 74 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  to a Table struc
2e050 74 75 72 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  ture, then.     
2e060 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74     ** the SQL st
2e070 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68  atement is of th
2e080 65 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20  e form:.        
2e090 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
2e0a0 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
2e0b0 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20  FROM <tbl>.     
2e0c0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
2e0d0 20 77 68 65 72 65 20 74 68 65 20 54 61 62 6c 65   where the Table
2e0e0 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72   structure retur
2e0f0 6e 65 64 20 72 65 70 72 65 73 65 6e 74 73 20 74  ned represents t
2e100 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20  able <tbl>..    
2e110 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2e120 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
2e130 20 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68   is so common th
2e140 61 74 20 69 74 20 69 73 20 6f 70 74 69 6d 69 7a  at it is optimiz
2e150 65 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 54 68  ed specially. Th
2e160 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f  e.        ** OP_
2e170 43 6f 75 6e 74 20 69 6e 73 74 72 75 63 74 69 6f  Count instructio
2e180 6e 20 69 73 20 65 78 65 63 75 74 65 64 20 65 69  n is executed ei
2e190 74 68 65 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b  ther on the intk
2e1a0 65 79 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20  ey table that.  
2e1b0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
2e1c0 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74  s the data for t
2e1d0 61 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e  able <tbl> or on
2e1e0 20 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e 64 65   one of its inde
2e1f0 78 65 73 2e 20 49 74 0a 20 20 20 20 20 20 20 20  xes. It.        
2e200 2a 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f 20  ** is better to 
2e210 65 78 65 63 75 74 65 20 74 68 65 20 6f 70 20 6f  execute the op o
2e220 6e 20 61 6e 20 69 6e 64 65 78 2c 20 61 73 20 69  n an index, as i
2e230 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6d 6f 73  ndexes are almos
2e240 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77  t.        ** alw
2e250 61 79 73 20 73 70 72 65 61 64 20 61 63 72 6f 73  ays spread acros
2e260 73 20 6c 65 73 73 20 70 61 67 65 73 20 74 68 61  s less pages tha
2e270 6e 20 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f  n their correspo
2e280 6e 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20  nding tables..  
2e290 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2e2a0 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 62 20 3d   const int iDb =
2e2b0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
2e2c0 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
2e2d0 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
2e2e0 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  ;.        const 
2e2f0 69 6e 74 20 69 43 73 72 20 3d 20 70 50 61 72 73  int iCsr = pPars
2e300 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f  e->nTab++;     /
2e310 2a 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e  * Cursor to scan
2e320 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20   b-tree */.     
2e330 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
2e340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e350 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
2e360 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
2e370 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20          KeyInfo 
2e380 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20  *pKeyInfo = 0;  
2e390 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e3a0 4b 65 79 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e  Keyinfo for scan
2e3b0 6e 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ned index */.   
2e3c0 20 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73       Index *pBes
2e3d0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
2e3e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73            /* Bes
2e3f0 74 20 69 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f  t index found so
2e400 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20   far */.        
2e410 69 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54 61 62  int iRoot = pTab
2e420 2d 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20  ->tnum;         
2e430 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
2e440 65 20 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d 74  e of scanned b-t
2e450 72 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ree */..        
2e460 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
2e470 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
2e480 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  iDb);.        sq
2e490 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
2e4a0 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
2e4b0 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
2e4c0 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20  >zName);..      
2e4d0 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
2e4e0 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 68  the index that h
2e4f0 61 73 20 74 68 65 20 6c 6f 77 65 73 74 20 73 63  as the lowest sc
2e500 61 6e 20 63 6f 73 74 2e 0a 20 20 20 20 20 20 20  an cost..       
2e510 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28   **.        ** (
2e520 32 30 31 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e  2011-04-15) Do n
2e530 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 73 63 61  ot do a full sca
2e540 6e 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72 65  n of an unordere
2e550 64 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  d index..       
2e560 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28   **.        ** (
2e570 32 30 31 33 2d 31 30 2d 30 33 29 20 44 6f 20 6e  2013-10-03) Do n
2e580 6f 74 20 63 6f 75 6e 74 20 74 68 65 20 65 6e 74  ot count the ent
2e590 72 69 65 73 20 69 6e 20 61 20 70 61 72 74 69 61  ries in a partia
2e5a0 6c 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  l index..       
2e5b0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49   **.        ** I
2e5c0 6e 20 70 72 61 63 74 69 63 65 20 74 68 65 20 4b  n practice the K
2e5d0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
2e5e0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65   will not be use
2e5f0 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20  d. It is only . 
2e600 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64         ** passed
2e610 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e   to keep OP_Open
2e620 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20  Read happy..    
2e630 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
2e640 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
2e650 62 29 20 29 20 70 42 65 73 74 20 3d 20 73 71 6c  b) ) pBest = sql
2e660 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
2e670 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20  dex(pTab);.     
2e680 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
2e690 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
2e6a0 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
2e6b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2e6c0 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65   pIdx->bUnordere
2e6d0 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  d==0.           
2e6e0 26 26 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f  && pIdx->szIdxRo
2e6f0 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77  w<pTab->szTabRow
2e700 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70  .           && p
2e710 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65  Idx->pPartIdxWhe
2e720 72 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  re==0.          
2e730 20 26 26 20 28 21 70 42 65 73 74 20 7c 7c 20 70   && (!pBest || p
2e740 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 42  Idx->szIdxRow<pB
2e750 65 73 74 2d 3e 73 7a 49 64 78 52 6f 77 29 0a 20  est->szIdxRow). 
2e760 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
2e770 20 20 20 20 20 20 20 20 70 42 65 73 74 20 3d 20          pBest = 
2e780 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  pIdx;.          
2e790 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2e7a0 20 20 20 20 69 66 28 20 70 42 65 73 74 20 29 7b      if( pBest ){
2e7b0 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f 6f 74  .          iRoot
2e7c0 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a   = pBest->tnum;.
2e7d0 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e            pKeyIn
2e7e0 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
2e7f0 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73  nfoOfIndex(pPars
2e800 65 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20  e, pBest);.     
2e810 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
2e820 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c   Open a read-onl
2e830 79 20 63 75 72 73 6f 72 2c 20 65 78 65 63 75 74  y cursor, execut
2e840 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20  e the OP_Count, 
2e850 63 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72  close the cursor
2e860 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  . */.        sql
2e870 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
2e880 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  t(v, OP_OpenRead
2e890 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69  , iCsr, iRoot, i
2e8a0 44 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  Db, 1);.        
2e8b0 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
2e8c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2e8d0 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
2e8e0 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 4b 65   -1, (char *)pKe
2e8f0 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
2e900 4f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  O);.        }.  
2e910 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2e920 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
2e930 75 6e 74 2c 20 69 43 73 72 2c 20 73 41 67 67 49  unt, iCsr, sAggI
2e940 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65  nfo.aFunc[0].iMe
2e950 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
2e960 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2e970 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29   OP_Close, iCsr)
2e980 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69  ;.        explai
2e990 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61  nSimpleCount(pPa
2e9a0 72 73 65 2c 20 70 54 61 62 2c 20 70 42 65 73 74  rse, pTab, pBest
2e9b0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  );.      }else.#
2e9c0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2e9d0 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20  OMIT_BTREECOUNT 
2e9e0 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  */.      {.     
2e9f0 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
2ea00 68 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 6f  he query is of o
2ea10 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
2ea20 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20  ing forms:.     
2ea30 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
2ea40 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29     SELECT min(x)
2ea50 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20   FROM ....      
2ea60 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61    **   SELECT ma
2ea70 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20  x(x) FROM ....  
2ea80 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2ea90 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68   ** If it is, th
2eaa0 65 6e 20 61 73 6b 20 74 68 65 20 63 6f 64 65 20  en ask the code 
2eab0 69 6e 20 77 68 65 72 65 2e 63 20 74 6f 20 61 74  in where.c to at
2eac0 74 65 6d 70 74 20 74 6f 20 73 6f 72 74 20 72 65  tempt to sort re
2ead0 73 75 6c 74 73 0a 20 20 20 20 20 20 20 20 2a 2a  sults.        **
2eae0 20 61 73 20 69 66 20 74 68 65 72 65 20 77 61 73   as if there was
2eaf0 20 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78 22   an "ORDER ON x"
2eb00 20 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20 78 20   or "ORDER ON x 
2eb10 44 45 53 43 22 20 63 6c 61 75 73 65 2e 20 0a 20  DESC" clause. . 
2eb20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77 68 65         ** If whe
2eb30 72 65 2e 63 20 69 73 20 61 62 6c 65 20 74 6f 20  re.c is able to 
2eb40 70 72 6f 64 75 63 65 20 72 65 73 75 6c 74 73 20  produce results 
2eb50 73 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20 6f  sorted in this o
2eb60 72 64 65 72 2c 20 74 68 65 6e 0a 20 20 20 20 20  rder, then.     
2eb70 20 20 20 2a 2a 20 61 64 64 20 76 64 62 65 20 63     ** add vdbe c
2eb80 6f 64 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  ode to break out
2eb90 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73 69   of the processi
2eba0 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72 20 74 68  ng loop after th
2ebb0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  e .        ** fi
2ebc0 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 28 73  rst iteration (s
2ebd0 69 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 69  ince the first i
2ebe0 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
2ebf0 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20 20 20 20  loop is .       
2ec00 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74   ** guaranteed t
2ec10 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
2ec20 20 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d 69   row with the mi
2ec30 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d  nimum or maximum
2ec40 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c   .        ** val
2ec50 75 65 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c  ue of x, the onl
2ec60 79 20 72 6f 77 20 72 65 71 75 69 72 65 64 29 2e  y row required).
2ec70 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2ec80 20 20 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c      ** A special
2ec90 20 66 6c 61 67 20 6d 75 73 74 20 62 65 20 70 61   flag must be pa
2eca0 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57  ssed to sqlite3W
2ecb0 68 65 72 65 42 65 67 69 6e 28 29 20 74 6f 20 73  hereBegin() to s
2ecc0 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20 20 20  lightly.        
2ecd0 2a 2a 20 6d 6f 64 69 66 79 20 62 65 68 61 76 69  ** modify behavi
2ece0 6f 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  or as follows:. 
2ecf0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2ed00 20 20 2a 2a 20 20 20 2b 20 49 66 20 74 68 65 20    **   + If the 
2ed10 71 75 65 72 79 20 69 73 20 61 20 22 53 45 4c 45  query is a "SELE
2ed20 43 54 20 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e  CT min(x)", then
2ed30 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20   the loop coded 
2ed40 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  by.        **   
2ed50 20 20 77 68 65 72 65 2e 63 20 73 68 6f 75 6c 64    where.c should
2ed60 20 6e 6f 74 20 69 74 65 72 61 74 65 20 6f 76 65   not iterate ove
2ed70 72 20 61 6e 79 20 76 61 6c 75 65 73 20 77 69 74  r any values wit
2ed80 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20  h a NULL value. 
2ed90 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 66 6f         **     fo
2eda0 72 20 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  r x..        **.
2edb0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 54          **   + T
2edc0 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64  he optimizer cod
2edd0 65 20 69 6e 20 77 68 65 72 65 2e 63 20 28 74 68  e in where.c (th
2ede0 65 20 74 68 69 6e 67 20 74 68 61 74 20 64 65 63  e thing that dec
2edf0 69 64 65 73 20 77 68 69 63 68 0a 20 20 20 20 20  ides which.     
2ee00 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20     **     index 
2ee10 6f 72 20 69 6e 64 69 63 65 73 20 74 6f 20 75 73  or indices to us
2ee20 65 29 20 73 68 6f 75 6c 64 20 70 6c 61 63 65 20  e) should place 
2ee30 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 69 6f  a different prio
2ee40 72 69 74 79 20 6f 6e 20 0a 20 20 20 20 20 20 20  rity on .       
2ee50 20 2a 2a 20 20 20 20 20 73 61 74 69 73 66 79 69   **     satisfyi
2ee60 6e 67 20 74 68 65 20 27 4f 52 44 45 52 20 42 59  ng the 'ORDER BY
2ee70 27 20 63 6c 61 75 73 65 20 74 68 61 6e 20 69 74  ' clause than it
2ee80 20 64 6f 65 73 20 69 6e 20 6f 74 68 65 72 20 63   does in other c
2ee90 61 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ases..        **
2eea0 20 20 20 20 20 52 65 66 65 72 20 74 6f 20 63 6f       Refer to co
2eeb0 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20  de and comments 
2eec0 69 6e 20 77 68 65 72 65 2e 63 20 66 6f 72 20 64  in where.c for d
2eed0 65 74 61 69 6c 73 2e 0a 20 20 20 20 20 20 20 20  etails..        
2eee0 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c  */.        ExprL
2eef0 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30  ist *pMinMax = 0
2ef00 3b 0a 20 20 20 20 20 20 20 20 75 38 20 66 6c 61  ;.        u8 fla
2ef10 67 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42  g = WHERE_ORDERB
2ef20 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20  Y_NORMAL;.      
2ef30 20 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72    .        asser
2ef40 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d  t( p->pGroupBy==
2ef50 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
2ef60 65 72 74 28 20 66 6c 61 67 3d 3d 30 20 29 3b 0a  ert( flag==0 );.
2ef70 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
2ef80 48 61 76 69 6e 67 3d 3d 30 20 29 7b 0a 20 20 20  Having==0 ){.   
2ef90 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 6d 69         flag = mi
2efa0 6e 4d 61 78 51 75 65 72 79 28 26 73 41 67 67 49  nMaxQuery(&sAggI
2efb0 6e 66 6f 2c 20 26 70 4d 69 6e 4d 61 78 29 3b 0a  nfo, &pMinMax);.
2efc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2efd0 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d    assert( flag==
2efe0 30 20 7c 7c 20 28 70 4d 69 6e 4d 61 78 21 3d 30  0 || (pMinMax!=0
2eff0 20 26 26 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78   && pMinMax->nEx
2f000 70 72 3d 3d 31 29 20 29 3b 0a 0a 20 20 20 20 20  pr==1) );..     
2f010 20 20 20 69 66 28 20 66 6c 61 67 20 29 7b 0a 20     if( flag ){. 
2f020 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78           pMinMax
2f030 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
2f040 73 74 44 75 70 28 64 62 2c 20 70 4d 69 6e 4d 61  stDup(db, pMinMa
2f050 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  x, 0);.         
2f060 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b   pDel = pMinMax;
2f070 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2f080 4d 69 6e 4d 61 78 20 26 26 20 21 64 62 2d 3e 6d  MinMax && !db->m
2f090 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
2f0a0 20 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d             pMinM
2f0b0 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64  ax->a[0].sortOrd
2f0c0 65 72 20 3d 20 66 6c 61 67 21 3d 57 48 45 52 45  er = flag!=WHERE
2f0d0 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 3f 31 3a  _ORDERBY_MIN ?1:
2f0e0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  0;.            p
2f0f0 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78  MinMax->a[0].pEx
2f100 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55  pr->op = TK_COLU
2f110 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  MN;.          }.
2f120 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20          }.  .   
2f130 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73       /* This cas
2f140 65 20 72 75 6e 73 20 69 66 20 74 68 65 20 61 67  e runs if the ag
2f150 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47  gregate has no G
2f160 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
2f170 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   The.        ** 
2f180 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75  processing is mu
2f190 63 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65  ch simpler since
2f1a0 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61   there is only a
2f1b0 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20   single row.    
2f1c0 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74      ** of output
2f1d0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2f1e0 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75       resetAccumu
2f1f0 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
2f200 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
2f210 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
2f220 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
2f230 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
2f240 57 68 65 72 65 2c 20 70 4d 69 6e 4d 61 78 2c 30  Where, pMinMax,0
2f250 2c 66 6c 61 67 2c 30 29 3b 0a 20 20 20 20 20 20  ,flag,0);.      
2f260 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
2f270 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
2f280 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
2f290 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20  te(db, pDel);.  
2f2a0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
2f2b0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
2f2c0 20 7d 0a 20 20 20 20 20 20 20 20 75 70 64 61 74   }.        updat
2f2d0 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  eAccumulator(pPa
2f2e0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
2f2f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2f300 20 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 70   pMinMax==0 || p
2f310 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31  MinMax->nExpr==1
2f320 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2f330 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72  sqlite3WhereIsOr
2f340 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3e 30 20  dered(pWInfo)>0 
2f350 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
2f360 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2f370 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 71  , OP_Goto, 0, sq
2f380 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c  lite3WhereBreakL
2f390 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 20  abel(pWInfo));. 
2f3a0 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d           VdbeCom
2f3b0 6d 65 6e 74 28 28 76 2c 20 22 25 73 28 29 20 62  ment((v, "%s() b
2f3c0 79 20 69 6e 64 65 78 22 2c 0a 20 20 20 20 20 20  y index",.      
2f3d0 20 20 20 20 20 20 20 20 20 20 28 66 6c 61 67 3d            (flag=
2f3e0 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  =WHERE_ORDERBY_M
2f3f0 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29  IN?"min":"max"))
2f400 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2f410 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
2f420 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
2f430 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67        finalizeAg
2f440 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73  gFunctions(pPars
2f450 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
2f460 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 53       }..      sS
2f470 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30  ort.pOrderBy = 0
2f480 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
2f490 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
2f4a0 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72  e, pHaving, addr
2f4b0 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  End, SQLITE_JUMP
2f4c0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
2f4d0 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
2f4e0 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
2f4f0 69 73 74 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 0a  ist, -1, 0, 0, .
2f500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f510 20 20 20 20 20 20 70 44 65 73 74 2c 20 61 64 64        pDest, add
2f520 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a  rEnd, addrEnd);.
2f530 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2f540 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
2f550 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pDel);.    }.   
2f560 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
2f570 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
2f580 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f  End);.    .  } /
2f590 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74  * endif aggregat
2f5a0 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66  e query */..  if
2f5b0 28 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63  ( sDistinct.eTnc
2f5c0 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53  tType==WHERE_DIS
2f5d0 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20  TINCT_UNORDERED 
2f5e0 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65  ){.    explainTe
2f5f0 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  mpTable(pParse, 
2f600 22 44 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d  "DISTINCT");.  }
2f610 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
2f620 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
2f630 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e  lause, then we n
2f640 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20  eed to sort the 
2f650 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64  results.  ** and
2f660 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68   send them to th
2f670 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62  e callback one b
2f680 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  y one..  */.  if
2f690 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  ( sSort.pOrderBy
2f6a0 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54   ){.    explainT
2f6b0 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  empTable(pParse,
2f6c0 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3e 30 20   sSort.nOBSat>0 
2f6d0 3f 20 22 52 49 47 48 54 20 50 41 52 54 20 4f 46  ? "RIGHT PART OF
2f6e0 20 4f 52 44 45 52 20 42 59 22 3a 22 4f 52 44 45   ORDER BY":"ORDE
2f6f0 52 20 42 59 22 29 3b 0a 20 20 20 20 67 65 6e 65  R BY");.    gene
2f700 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61  rateSortTail(pPa
2f710 72 73 65 2c 20 70 2c 20 26 73 53 6f 72 74 2c 20  rse, p, &sSort, 
2f720 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  pEList->nExpr, p
2f730 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Dest);.  }..  /*
2f740 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b   Jump here to sk
2f750 69 70 20 74 68 69 73 20 71 75 65 72 79 0a 20 20  ip this query.  
2f760 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
2f770 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
2f780 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  iEnd);..  /* The
2f790 20 53 45 4c 45 43 54 20 77 61 73 20 73 75 63 63   SELECT was succ
2f7a0 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20  essfully coded. 
2f7b0 20 20 53 65 74 20 74 68 65 20 72 65 74 75 72 6e    Set the return
2f7c0 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20   code to 0.  ** 
2f7d0 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20 65  to indicate no e
2f7e0 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  rrors..  */.  rc
2f7f0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74   = 0;..  /* Cont
2f800 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72  rol jumps to her
2f810 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73  e if an error is
2f820 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f   encountered abo
2f830 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a  ve, or upon.  **
2f840 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69   successful codi
2f850 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ng of the SELECT
2f860 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e  ..  */.select_en
2f870 64 3a 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49  d:.  explainSetI
2f880 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69  nteger(pParse->i
2f890 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f  SelectId, iResto
2f8a0 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 0a 20 20  reSelectId);..  
2f8b0 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75  /* Identify colu
2f8c0 6d 6e 20 6e 61 6d 65 73 20 69 66 20 72 65 73 75  mn names if resu
2f8d0 6c 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43  lts of the SELEC
2f8e0 54 20 61 72 65 20 74 6f 20 62 65 20 6f 75 74 70  T are to be outp
2f8f0 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ut..  */.  if( r
2f900 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2f910 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
2f920 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
2f930 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
2f940 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
2f950 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20  List, pEList);. 
2f960 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46   }..  sqlite3DbF
2f970 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f  ree(db, sAggInfo
2f980 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  .aCol);.  sqlite
2f990 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67  3DbFree(db, sAgg
2f9a0 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 20 20 72  Info.aFunc);.  r
2f9b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
2f9c0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2f9d0 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c  ENABLE_TREE_EXPL
2f9e0 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  AIN)./*.** Gener
2f9f0 61 74 65 20 61 20 68 75 6d 61 6e 2d 72 65 61 64  ate a human-read
2fa00 61 62 6c 65 20 64 65 73 63 72 69 70 74 69 6f 6e  able description
2fa10 20 6f 66 20 61 20 74 68 65 20 53 65 6c 65 63 74   of a the Select
2fa20 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
2fa30 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 4f  ic void explainO
2fa40 6e 65 53 65 6c 65 63 74 28 56 64 62 65 20 2a 70  neSelect(Vdbe *p
2fa50 56 64 62 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  Vdbe, Select *p)
2fa60 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61  {.  sqlite3Expla
2fa70 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
2fa80 22 53 45 4c 45 43 54 20 22 29 3b 0a 20 20 69 66  "SELECT ");.  if
2fa90 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
2faa0 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
2fab0 41 67 67 72 65 67 61 74 65 29 20 29 7b 0a 20 20  Aggregate) ){.  
2fac0 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
2fad0 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20  s & SF_Distinct 
2fae0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2faf0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
2fb00 64 62 65 2c 20 22 44 49 53 54 49 4e 43 54 20 22  dbe, "DISTINCT "
2fb10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2fb20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
2fb30 46 5f 41 67 67 72 65 67 61 74 65 20 29 7b 0a 20  F_Aggregate ){. 
2fb40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
2fb50 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2fb60 20 22 61 67 67 5f 66 6c 61 67 20 22 29 3b 0a 20   "agg_flag ");. 
2fb70 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2fb80 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29  ExplainNL(pVdbe)
2fb90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2fba0 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
2fbb0 2c 20 22 20 20 20 22 29 3b 0a 20 20 7d 0a 20 20  , "   ");.  }.  
2fbc0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
2fbd0 70 72 4c 69 73 74 28 70 56 64 62 65 2c 20 70 2d  prList(pVdbe, p-
2fbe0 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69  >pEList);.  sqli
2fbf0 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64  te3ExplainNL(pVd
2fc00 62 65 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53  be);.  if( p->pS
2fc10 72 63 20 26 26 20 70 2d 3e 70 53 72 63 2d 3e 6e  rc && p->pSrc->n
2fc20 53 72 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  Src ){.    int i
2fc30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2fc40 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
2fc50 2c 20 22 46 52 4f 4d 20 22 29 3b 0a 20 20 20 20  , "FROM ");.    
2fc60 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75  sqlite3ExplainPu
2fc70 73 68 28 70 56 64 62 65 29 3b 0a 20 20 20 20 66  sh(pVdbe);.    f
2fc80 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72  or(i=0; i<p->pSr
2fc90 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  c->nSrc; i++){. 
2fca0 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
2fcb0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
2fcc0 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d  = &p->pSrc->a[i]
2fcd0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
2fce0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
2fcf0 62 65 2c 20 22 7b 25 64 2c 2a 7d 20 3d 20 22 2c  be, "{%d,*} = ",
2fd00 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
2fd10 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
2fd20 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  m->pSelect ){.  
2fd30 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2fd40 6c 61 69 6e 53 65 6c 65 63 74 28 70 56 64 62 65  lainSelect(pVdbe
2fd50 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  , pItem->pSelect
2fd60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2fd70 49 74 65 6d 2d 3e 70 54 61 62 20 29 7b 0a 20 20  Item->pTab ){.  
2fd80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2fd90 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
2fda0 62 65 2c 20 22 20 28 74 61 62 6e 61 6d 65 3d 25  be, " (tabname=%
2fdb0 73 29 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  s)", pItem->pTab
2fdc0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
2fdd0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
2fde0 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  if( pItem->zName
2fdf0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2fe00 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2fe10 28 70 56 64 62 65 2c 20 22 25 73 22 2c 20 70 49  (pVdbe, "%s", pI
2fe20 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
2fe30 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
2fe40 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a  Item->zAlias ){.
2fe50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2fe60 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
2fe70 62 65 2c 20 22 20 28 41 53 20 25 73 29 22 2c 20  be, " (AS %s)", 
2fe80 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  pItem->zAlias);.
2fe90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2fea0 28 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  ( pItem->jointyp
2feb0 65 20 26 20 4a 54 5f 4c 45 46 54 20 29 7b 0a 20  e & JT_LEFT ){. 
2fec0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
2fed0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
2fee0 65 2c 20 22 20 4c 45 46 54 2d 4a 4f 49 4e 22 29  e, " LEFT-JOIN")
2fef0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2ff00 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c  sqlite3ExplainNL
2ff10 28 70 56 64 62 65 29 3b 0a 20 20 20 20 7d 0a 20  (pVdbe);.    }. 
2ff20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2ff30 6e 50 6f 70 28 70 56 64 62 65 29 3b 0a 20 20 7d  nPop(pVdbe);.  }
2ff40 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65  .  if( p->pWhere
2ff50 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
2ff60 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
2ff70 62 65 2c 20 22 57 48 45 52 45 20 22 29 3b 0a 20  be, "WHERE ");. 
2ff80 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2ff90 6e 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e  nExpr(pVdbe, p->
2ffa0 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c  pWhere);.    sql
2ffb0 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56  ite3ExplainNL(pV
2ffc0 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  dbe);.  }.  if( 
2ffd0 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  p->pGroupBy ){. 
2ffe0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2fff0 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
30000 47 52 4f 55 50 42 59 20 22 29 3b 0a 20 20 20 20  GROUPBY ");.    
30010 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
30020 70 72 4c 69 73 74 28 70 56 64 62 65 2c 20 70 2d  prList(pVdbe, p-
30030 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
30040 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c  sqlite3ExplainNL
30050 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69  (pVdbe);.  }.  i
30060 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b  f( p->pHaving ){
30070 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
30080 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
30090 20 22 48 41 56 49 4e 47 20 22 29 3b 0a 20 20 20   "HAVING ");.   
300a0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
300b0 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70 48  xpr(pVdbe, p->pH
300c0 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69  aving);.    sqli
300d0 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64  te3ExplainNL(pVd
300e0 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  be);.  }.  if( p
300f0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
30100 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
30110 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 4f  Printf(pVdbe, "O
30120 52 44 45 52 42 59 20 22 29 3b 0a 20 20 20 20 73  RDERBY ");.    s
30130 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
30140 72 4c 69 73 74 28 70 56 64 62 65 2c 20 70 2d 3e  rList(pVdbe, p->
30150 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73  pOrderBy);.    s
30160 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28  qlite3ExplainNL(
30170 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66  pVdbe);.  }.  if
30180 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  ( p->pLimit ){. 
30190 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
301a0 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
301b0 4c 49 4d 49 54 20 22 29 3b 0a 20 20 20 20 73 71  LIMIT ");.    sq
301c0 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
301d0 28 70 56 64 62 65 2c 20 70 2d 3e 70 4c 69 6d 69  (pVdbe, p->pLimi
301e0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
301f0 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b  xplainNL(pVdbe);
30200 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f  .  }.  if( p->pO
30210 66 66 73 65 74 20 29 7b 0a 20 20 20 20 73 71 6c  ffset ){.    sql
30220 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
30230 66 28 70 56 64 62 65 2c 20 22 4f 46 46 53 45 54  f(pVdbe, "OFFSET
30240 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
30250 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62  ExplainExpr(pVdb
30260 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a  e, p->pOffset);.
30270 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
30280 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d  inNL(pVdbe);.  }
30290 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  .}.void sqlite3E
302a0 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 56 64 62  xplainSelect(Vdb
302b0 65 20 2a 70 56 64 62 65 2c 20 53 65 6c 65 63 74  e *pVdbe, Select
302c0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30   *p){.  if( p==0
302d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
302e0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
302f0 62 65 2c 20 22 28 6e 75 6c 6c 2d 73 65 6c 65 63  be, "(null-selec
30300 74 29 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  t)");.    return
30310 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
30320 78 70 6c 61 69 6e 50 75 73 68 28 70 56 64 62 65  xplainPush(pVdbe
30330 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  );.  while( p ){
30340 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53  .    explainOneS
30350 65 6c 65 63 74 28 70 56 64 62 65 2c 20 70 29 3b  elect(pVdbe, p);
30360 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
30370 74 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  t;.    if( p==0 
30380 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 71 6c  ) break;.    sql
30390 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56  ite3ExplainNL(pV
303a0 64 62 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dbe);.    sqlite
303b0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
303c0 56 64 62 65 2c 20 22 25 73 5c 6e 22 2c 20 73 65  Vdbe, "%s\n", se
303d0 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
303e0 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ));.  }.  sqlite
303f0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
30400 56 64 62 65 2c 20 22 45 4e 44 22 29 3b 0a 20 20  Vdbe, "END");.  
30410 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f  sqlite3ExplainPo
30420 70 28 70 56 64 62 65 29 3b 0a 7d 0a 0a 2f 2a 20  p(pVdbe);.}../* 
30430 45 6e 64 20 6f 66 20 74 68 65 20 73 74 72 75 63  End of the struc
30440 74 75 72 65 20 64 65 62 75 67 20 70 72 69 6e 74  ture debug print
30450 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a  ing code.*******
30460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30470 2a 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 2f 0a 23 65 6e 64 69 66 20 2f  ******/.#endif /
304b0 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  * defined(SQLITE
304c0 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50  _ENABLE_TREE_EXP
304d0 4c 41 49 4e 29 20 2a 2f 0a                       LAIN) */.